Chromium Code Reviews| Index: pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart |
| diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart |
| index 09e1d7ecfa5a284a5e1021071dd602c91bedcdcc..16d0cb49713055b43b81d5a9b5f3bdfe80a7004b 100644 |
| --- a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart |
| +++ b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart |
| @@ -994,7 +994,8 @@ class OldEmitter implements Emitter { |
| } |
| } |
| - void emitStaticNonFinalFieldInitializations(CodeBuffer buffer) { |
| + void emitStaticNonFinalFieldInitializations(CodeBuffer buffer, |
| + OutputUnit outputUnit) { |
| JavaScriptConstantCompiler handler = backend.constants; |
| Iterable<VariableElement> staticNonFinalFields = |
| handler.getStaticNonFinalFieldsForEmission(); |
| @@ -1004,11 +1005,25 @@ class OldEmitter implements Emitter { |
| // `mapTypeToInterceptor` is handled in [emitMapTypeToInterceptor]. |
| if (element == backend.mapTypeToInterceptor) continue; |
| compiler.withCurrentElement(element, () { |
| - ConstantValue initialValue = handler.getInitialValueFor(element).value; |
| + jsAst.Expression initialValue; |
| + // In the main output-unit we output a stub initializer for deferred |
| + // variables, such that `isolateProperties` stays a fast object. |
| + if (outputUnit != |
| + compiler.deferredLoadTask.outputUnitForElement(element)) { |
| + if (outputUnit == compiler.deferredLoadTask.mainOutputUnit) { |
| + initialValue = jsAst.number(0); |
|
floitsch
2014/12/11 13:37:30
Comment, on why we do this.
|
| + } else { |
| + // Don't output stubs outside the main output file. |
| + return; |
| + } |
| + } else { |
| + initialValue = constantEmitter.referenceInInitializationContext( |
| + handler.getInitialValueFor(element).value); |
| + |
| + } |
| jsAst.Expression init = |
| js('$isolateProperties.# = #', |
| - [namer.getNameOfGlobalField(element), |
| - constantEmitter.referenceInInitializationContext(initialValue)]); |
| + [namer.getNameOfGlobalField(element), initialValue]); |
| buffer.write(jsAst.prettyPrint(init, compiler, |
| monitor: compiler.dumpInfoTask)); |
| buffer.write('$N'); |
| @@ -1670,7 +1685,7 @@ class OldEmitter implements Emitter { |
| // Static field initializations require the classes and compile-time |
| // constants to be set up. |
| - emitStaticNonFinalFieldInitializations(mainBuffer); |
| + emitStaticNonFinalFieldInitializations(mainBuffer, mainOutputUnit); |
| interceptorEmitter.emitInterceptedNames(mainBuffer); |
| interceptorEmitter.emitMapTypeToInterceptor(mainBuffer); |
| emitLazilyInitializedStaticFields(mainBuffer); |
| @@ -2112,6 +2127,7 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) { |
| typeTestEmitter.emitRuntimeTypeSupport(outputBuffer, outputUnit); |
| emitCompileTimeConstants(outputBuffer, outputUnit); |
| + emitStaticNonFinalFieldInitializations(outputBuffer, outputUnit); |
| outputBuffer.write('}$N'); |
| if (compiler.useContentSecurityPolicy) { |