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 e05d1df1d8847e3dc77fcabd367e338640a928f4..084289fbf3be6461d66cad2008c7d478381ff978 100644 |
| --- a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart |
| +++ b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart |
| @@ -854,7 +854,7 @@ class OldEmitter implements Emitter { |
| needsLazyInitializer = true; |
| for (VariableElement element in Elements.sortedByPosition(lazyFields)) { |
| jsAst.Expression init = |
| - buildLazilyInitializedStaticField(element, isolateProperties); |
| + buildLazilyInitializedStaticField(element); |
| if (init == null) continue; |
| output.addBuffer( |
| jsAst.prettyPrint(init, compiler, monitor: compiler.dumpInfoTask)); |
| @@ -864,7 +864,7 @@ class OldEmitter implements Emitter { |
| } |
| jsAst.Expression buildLazilyInitializedStaticField( |
| - VariableElement element, String isolateProperties) { |
| + 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 |
| @@ -875,13 +875,22 @@ class OldEmitter implements Emitter { |
| // 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('#(#,#,#,#,#)', |
| + if (isolateProperties != null) { |
| + return js('#(#,#,#,#,#)', |
| + [js(lazyInitializerName), |
| + js.string(element.name), |
| + js.string(namer.globalPropertyName(element)), |
| + js.string(namer.lazyInitializerName(element)), |
| + code, |
| + isolateProperties]); |
| + } |
| + |
| + return js('#(#,#,#,#)', |
| [js(lazyInitializerName), |
| - js(isolateProperties), |
| - js.string(element.name), |
| - js.string(namer.globalPropertyName(element)), |
| - js.string(namer.lazyInitializerName(element)), |
| - code]); |
| + js.string(element.name), |
| + js.string(namer.globalPropertyName(element)), |
| + js.string(namer.lazyInitializerName(element)), |
| + code]); |
| } |
| void emitMetadata(Program program, CodeOutput output) { |
| @@ -998,7 +1007,6 @@ class OldEmitter implements Emitter { |
| } |
| void emitInitFunction(CodeOutput output) { |
| - String isolate = namer.currentIsolate; |
| jsAst.Expression allClassesAccess = |
| generateEmbeddedGlobalAccess(embeddedNames.ALL_CLASSES); |
| jsAst.Expression getTypeFromNameAccess = |
| @@ -1024,28 +1032,29 @@ class OldEmitter implements Emitter { |
| #finishedClasses = Object.create(null); |
| if (#needsLazyInitializer) { |
|
herhut
2015/03/25 14:23:14
Please add a comment here that explains the specia
zarah
2015/03/25 14:46:04
Done.
|
| - $lazyInitializerName = function (prototype, staticName, fieldName, |
| - getterName, lazyValue) { |
| + $lazyInitializerName = function (staticName, fieldName, getterName, |
| + lazyValue, prototype) { |
| if (!#lazies) #lazies = Object.create(null); |
| #lazies[fieldName] = getterName; |
| + prototype = prototype || $isolateProperties; |
| var sentinelUndefined = {}; |
| var sentinelInProgress = {}; |
| prototype[fieldName] = sentinelUndefined; |
| prototype[getterName] = function () { |
| - var result = $isolate[fieldName]; |
| + var result = this[fieldName]; |
| try { |
| if (result === sentinelUndefined) { |
| - $isolate[fieldName] = sentinelInProgress; |
| + this[fieldName] = sentinelInProgress; |
| try { |
| - result = $isolate[fieldName] = lazyValue(); |
| + result = this[fieldName] = lazyValue(); |
| } finally { |
| // Use try-finally, not try-catch/throw as it destroys the |
| // stack trace. |
| if (result === sentinelUndefined) |
| - $isolate[fieldName] = null; |
| + this[fieldName] = null; |
| } |
| } else { |
| if (result === sentinelInProgress) |
| @@ -1054,7 +1063,7 @@ class OldEmitter implements Emitter { |
| return result; |
| } finally { |
| - $isolate[getterName] = function() { return this[fieldName]; }; |
| + this[getterName] = function() { return this[fieldName]; }; |
| } |
| } |
| } |