| Index: dart/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
 | 
| diff --git a/dart/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart b/dart/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
 | 
| index 09e1d7ecfa5a284a5e1021071dd602c91bedcdcc..28dd43342be448bfed90c442ad168a87f55f5b72 100644
 | 
| --- a/dart/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
 | 
| +++ b/dart/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
 | 
| @@ -159,8 +159,10 @@ class OldEmitter implements Emitter {
 | 
|        => '${namer.isolateName}.\$finishIsolateConstructor';
 | 
|    String get isolatePropertiesName
 | 
|        => '${namer.isolateName}.${namer.isolatePropertiesName}';
 | 
| +  String get lazyInitializerProperty
 | 
| +      => r'$lazy';
 | 
|    String get lazyInitializerName
 | 
| -      => '${namer.isolateName}.\$lazy';
 | 
| +      => '${namer.isolateName}.${lazyInitializerProperty}';
 | 
|    String get initName => 'init';
 | 
|    String get makeConstListProperty
 | 
|        => namer.getMappedInstanceName('makeConstantList');
 | 
| @@ -688,9 +690,10 @@ class OldEmitter implements Emitter {
 | 
|      //
 | 
|      // We also copy over old values like the prototype, and the
 | 
|      // isolateProperties themselves.
 | 
| -    return js('''
 | 
| +    return js(
 | 
| +        """
 | 
|        function (oldIsolate) {
 | 
| -        var isolateProperties = oldIsolate.#;  // isolatePropertiesName
 | 
| +        var isolateProperties = oldIsolate.#isolatePropertiesName;
 | 
|          function Isolate() {
 | 
|            var hasOwnProperty = Object.prototype.hasOwnProperty;
 | 
|            for (var staticName in isolateProperties)
 | 
| @@ -722,17 +725,25 @@ class OldEmitter implements Emitter {
 | 
|          }
 | 
|          Isolate.prototype = oldIsolate.prototype;
 | 
|          Isolate.prototype.constructor = Isolate;
 | 
| -        Isolate.# = isolateProperties;  // isolatePropertiesName
 | 
| -        if (#)  // needsDefineClass.
 | 
| -          Isolate.# = oldIsolate.#;  // finishClassesProperty * 2
 | 
| -        if (#)  // outputContainsConstantList
 | 
| -          Isolate.# = oldIsolate.#; // makeConstListProperty * 2
 | 
| -        return Isolate;
 | 
| -      }''',
 | 
| -        [namer.isolatePropertiesName, namer.isolatePropertiesName,
 | 
| -         needsDefineClass, finishClassesProperty, finishClassesProperty,
 | 
| -         task.outputContainsConstantList,
 | 
| -         makeConstListProperty, makeConstListProperty ]);
 | 
| +        Isolate.#isolatePropertiesName = isolateProperties;
 | 
| +        if (#needsDefineClass)
 | 
| +          Isolate.#finishClassesProperty = oldIsolate.#finishClassesProperty;
 | 
| +        if (#outputContainsConstantList)
 | 
| +          Isolate.#makeConstListProperty = oldIsolate.#makeConstListProperty;
 | 
| +        if (#hasIncrementalSupport)
 | 
| +          Isolate.#lazyInitializerProperty =
 | 
| +              oldIsolate.#lazyInitializerProperty;
 | 
| +         return Isolate;
 | 
| +      }
 | 
| +""",
 | 
| +        { 'isolatePropertiesName': namer.isolatePropertiesName,
 | 
| +          'needsDefineClass': needsDefineClass,
 | 
| +          'finishClassesProperty': finishClassesProperty,
 | 
| +          'outputContainsConstantList': task.outputContainsConstantList,
 | 
| +          'makeConstListProperty': makeConstListProperty,
 | 
| +          'hasIncrementalSupport': compiler.hasIncrementalSupport,
 | 
| +          'lazyInitializerProperty': lazyInitializerProperty,
 | 
| +        });
 | 
|    }
 | 
|  
 | 
|    jsAst.Fun get lazyInitializerFunction {
 | 
| @@ -1023,30 +1034,37 @@ class OldEmitter implements Emitter {
 | 
|      if (!lazyFields.isEmpty) {
 | 
|        needsLazyInitializer = true;
 | 
|        for (VariableElement element in Elements.sortedByPosition(lazyFields)) {
 | 
| -        jsAst.Expression code = backend.generatedCode[element];
 | 
| -        // The code is null if we ended up not needing the lazily
 | 
| -        // initialized field after all because of constant folding
 | 
| -        // before code generation.
 | 
| -        if (code == null) continue;
 | 
| -        // The code only computes the initial value. We build the lazy-check
 | 
| -        // here:
 | 
| -        //   lazyInitializer(prototype, 'name', fieldName, getterName, initial);
 | 
| -        // The name is used for error reporting. The 'initial' must be a
 | 
| -        // closure that constructs the initial value.
 | 
| -        jsAst.Expression init = js('#(#,#,#,#,#)',
 | 
| -            [js(lazyInitializerName),
 | 
| -                js(isolateProperties),
 | 
| -                js.string(element.name),
 | 
| -                js.string(namer.getNameX(element)),
 | 
| -                js.string(namer.getLazyInitializerName(element)),
 | 
| -                code]);
 | 
| -        buffer.write(jsAst.prettyPrint(init, compiler,
 | 
| -                                       monitor: compiler.dumpInfoTask));
 | 
| +        jsAst.Expression init =
 | 
| +            buildLazilyInitializedStaticField(element, isolateProperties);
 | 
| +        if (init == null) continue;
 | 
| +        buffer.write(
 | 
| +            jsAst.prettyPrint(init, compiler, monitor: compiler.dumpInfoTask));
 | 
|          buffer.write("$N");
 | 
|        }
 | 
|      }
 | 
|    }
 | 
|  
 | 
| +  jsAst.Expression buildLazilyInitializedStaticField(
 | 
| +      VariableElement element, String isolateProperties) {
 | 
| +    jsAst.Expression code = backend.generatedCode[element];
 | 
| +    // The code is null if we ended up not needing the lazily
 | 
| +    // initialized field after all because of constant folding
 | 
| +    // before code generation.
 | 
| +    if (code == null) return null;
 | 
| +    // The code only computes the initial value. We build the lazy-check
 | 
| +    // here:
 | 
| +    //   lazyInitializer(prototype, 'name', fieldName, getterName, initial);
 | 
| +    // The name is used for error reporting. The 'initial' must be a
 | 
| +    // closure that constructs the initial value.
 | 
| +    return js('#(#,#,#,#,#)',
 | 
| +        [js(lazyInitializerName),
 | 
| +            js(isolateProperties),
 | 
| +            js.string(element.name),
 | 
| +            js.string(namer.getNameX(element)),
 | 
| +            js.string(namer.getLazyInitializerName(element)),
 | 
| +            code]);
 | 
| +  }
 | 
| +
 | 
|    bool isConstantInlinedOrAlreadyEmitted(ConstantValue constant) {
 | 
|      if (constant.isFunction) return true;    // Already emitted.
 | 
|      if (constant.isPrimitive) return true;   // Inlined.
 | 
| @@ -1598,7 +1616,8 @@ class OldEmitter implements Emitter {
 | 
|      emitStaticFunctions(task.outputStaticLists[mainOutputUnit]);
 | 
|  
 | 
|      // Only output the classesCollector if we actually have any classes.
 | 
| -    if (!(nativeClasses.isEmpty &&
 | 
| +    if (needsDefineClass ||
 | 
| +        !(nativeClasses.isEmpty &&
 | 
|            compiler.codegenWorld.staticFunctionsNeedingGetter.isEmpty &&
 | 
|            outputClassLists.values.every((classList) => classList.isEmpty) &&
 | 
|            typedefsNeededForReflection.isEmpty)) {
 | 
| 
 |