| 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)) {
|
|
|