| Index: lib/compiler/implementation/native_emitter.dart
 | 
| ===================================================================
 | 
| --- lib/compiler/implementation/native_emitter.dart	(revision 6623)
 | 
| +++ lib/compiler/implementation/native_emitter.dart	(working copy)
 | 
| @@ -14,9 +14,12 @@
 | 
|    // Native classes found in the application.
 | 
|    Set<ClassElement> nativeClasses;
 | 
|  
 | 
| -  // Caches the direct native subtypes of a native class.
 | 
| +  // Caches the native subtypes of a native class.
 | 
|    Map<ClassElement, List<ClassElement>> subtypes;
 | 
|  
 | 
| +  // Caches the direct native subtypes of a native class.
 | 
| +  Map<ClassElement, List<ClassElement>> directSubtypes;
 | 
| +
 | 
|    // Caches the native methods that are overridden by a native class.
 | 
|    // Note that the method that overrides does not have to be native:
 | 
|    // it's the overridden method that must make sure it will dispatch
 | 
| @@ -27,6 +30,7 @@
 | 
|        : classesWithDynamicDispatch = new Set<ClassElement>(),
 | 
|          nativeClasses = new Set<ClassElement>(),
 | 
|          subtypes = new Map<ClassElement, List<ClassElement>>(),
 | 
| +        directSubtypes = new Map<ClassElement, List<ClassElement>>(),
 | 
|          overriddenMethods = new Set<FunctionElement>(),
 | 
|          buffer = new StringBuffer();
 | 
|  
 | 
| @@ -132,9 +136,8 @@
 | 
|    }
 | 
|  
 | 
|    List<ClassElement> getDirectSubclasses(ClassElement cls) {
 | 
| -    List<ClassElement> result = subtypes[cls];
 | 
| -    if (result === null) result = const<ClassElement>[];
 | 
| -    return result;
 | 
| +    List<ClassElement> result = directSubtypes[cls];
 | 
| +    return result === null ? const<ClassElement>[] : result;
 | 
|    }
 | 
|  
 | 
|    void potentiallyConvertDartClosuresToJs(StringBuffer code,
 | 
| 
 |