Index: pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart |
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart |
index e47b9f1abbdbc1751a7ba40a782fa58029a99678..faa524458558685d4939bbbc3f80cac70608733d 100644 |
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart |
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart |
@@ -577,22 +577,19 @@ class Emitter extends js_emitter.EmitterBase { |
// constructor-functions and getter/setter functions can be stored in the |
// library-description table. Setting properties on these can be moved to |
// finishClasses. |
- return js.statement( |
- r""" |
+ return js.statement(r""" |
#precompiled = function ($collectedClasses$) { |
#norename; |
var $desc; |
#functions; |
return #result; |
- };""", |
- { |
- 'norename': new jsAst.Comment("// ::norenaming:: "), |
- 'precompiled': |
- generateEmbeddedGlobalAccess(embeddedNames.PRECOMPILED), |
- 'functions': cspPrecompiledFunctionFor(outputUnit), |
- 'result': new jsAst.ArrayInitializer( |
- cspPrecompiledConstructorNamesFor(outputUnit)) |
- }); |
+ };""", { |
+ 'norename': new jsAst.Comment("// ::norenaming:: "), |
+ 'precompiled': generateEmbeddedGlobalAccess(embeddedNames.PRECOMPILED), |
+ 'functions': cspPrecompiledFunctionFor(outputUnit), |
+ 'result': new jsAst.ArrayInitializer( |
+ cspPrecompiledConstructorNamesFor(outputUnit)) |
+ }); |
} else { |
return js.comment("Constructors are generated at runtime."); |
} |
@@ -671,8 +668,7 @@ class Emitter extends js_emitter.EmitterBase { |
needsLazyInitializer = true; |
List<jsAst.Expression> laziesInfo = |
buildLaziesInfo(lazyFields, isMainFragment); |
- return js.statement( |
- ''' |
+ return js.statement(''' |
(function(lazies) { |
for (var i = 0; i < lazies.length; ) { |
var fieldName = lazies[i++]; |
@@ -703,14 +699,13 @@ class Emitter extends js_emitter.EmitterBase { |
} |
} |
})(#laziesInfo) |
- ''', |
- { |
- 'notMinified': !compiler.options.enableMinification, |
- 'laziesInfo': new jsAst.ArrayInitializer(laziesInfo), |
- 'lazy': js(lazyInitializerName), |
- 'isMainFragment': isMainFragment, |
- 'isDeferredFragment': !isMainFragment |
- }); |
+ ''', { |
+ 'notMinified': !compiler.options.enableMinification, |
+ 'laziesInfo': new jsAst.ArrayInitializer(laziesInfo), |
+ 'lazy': js(lazyInitializerName), |
+ 'isMainFragment': isMainFragment, |
+ 'isDeferredFragment': !isMainFragment |
+ }); |
} else { |
return js.comment("No lazy statics."); |
} |
@@ -785,8 +780,7 @@ class Emitter extends js_emitter.EmitterBase { |
jsAst.Statement buildMakeConstantList(bool outputContainsConstantList) { |
if (outputContainsConstantList) { |
- return js.statement( |
- r''' |
+ return js.statement(r''' |
// Functions are stored in the hidden class and not as properties in |
// the object. We never actually look at the value, but only want |
// to know if the property exists. |
@@ -794,8 +788,7 @@ class Emitter extends js_emitter.EmitterBase { |
list.immutable$list = Array; |
list.fixed$length = Array; |
return list; |
- }''', |
- [namer.isolateName, makeConstListProperty]); |
+ }''', [namer.isolateName, makeConstListProperty]); |
} else { |
return js.comment("Output contains no constant list."); |
} |
@@ -819,18 +812,14 @@ class Emitter extends js_emitter.EmitterBase { |
if (NativeGenerator |
.needsIsolateAffinityTagInitialization(_closedWorld.backendUsage)) { |
parts.add(NativeGenerator.generateIsolateAffinityTagInitialization( |
- _closedWorld.backendUsage, |
- generateEmbeddedGlobalAccess, |
- js( |
- """ |
+ _closedWorld.backendUsage, generateEmbeddedGlobalAccess, js(""" |
// On V8, the 'intern' function converts a string to a symbol, which |
// makes property access much faster. |
function (s) { |
var o = {}; |
o[s] = 1; |
return Object.keys(convertToFastObject(o))[0]; |
- }""", |
- []))); |
+ }""", []))); |
} |
parts |
@@ -857,8 +846,7 @@ class Emitter extends js_emitter.EmitterBase { |
jsAst.Expression laziesAccess = |
generateEmbeddedGlobalAccess(embeddedNames.LAZIES); |
- return js.statement( |
- ''' |
+ return js.statement(''' |
function init() { |
$isolatePropertiesName = Object.create(null); |
#allClasses = map(); |
@@ -962,22 +950,21 @@ class Emitter extends js_emitter.EmitterBase { |
return Isolate; |
} |
- }''', |
- { |
- 'allClasses': allClassesAccess, |
- 'getTypeFromName': getTypeFromNameAccess, |
- 'interceptorsByTag': interceptorsByTagAccess, |
- 'leafTags': leafTagsAccess, |
- 'finishedClasses': finishedClassesAccess, |
- 'needsLazyInitializer': needsLazyInitializer, |
- 'lazies': laziesAccess, |
- 'cyclicThrow': cyclicThrow, |
- 'isolatePropertiesName': namer.isolatePropertiesName, |
- 'outputContainsConstantList': outputContainsConstantList, |
- 'makeConstListProperty': makeConstListProperty, |
- 'functionThatReturnsNullProperty': |
- backend.rtiEncoder.getFunctionThatReturnsNullName, |
- }); |
+ }''', { |
+ 'allClasses': allClassesAccess, |
+ 'getTypeFromName': getTypeFromNameAccess, |
+ 'interceptorsByTag': interceptorsByTagAccess, |
+ 'leafTags': leafTagsAccess, |
+ 'finishedClasses': finishedClassesAccess, |
+ 'needsLazyInitializer': needsLazyInitializer, |
+ 'lazies': laziesAccess, |
+ 'cyclicThrow': cyclicThrow, |
+ 'isolatePropertiesName': namer.isolatePropertiesName, |
+ 'outputContainsConstantList': outputContainsConstantList, |
+ 'makeConstListProperty': makeConstListProperty, |
+ 'functionThatReturnsNullProperty': |
+ backend.rtiEncoder.getFunctionThatReturnsNullName, |
+ }); |
} |
jsAst.Statement buildConvertToFastObjectFunction() { |
@@ -996,8 +983,7 @@ class Emitter extends js_emitter.EmitterBase { |
}''')); |
} |
- return js.statement( |
- r''' |
+ return js.statement(r''' |
function convertToFastObject(properties) { |
// Create an instance that uses 'properties' as prototype. This should |
// make 'properties' a fast object. |
@@ -1006,8 +992,7 @@ class Emitter extends js_emitter.EmitterBase { |
new MyClass(); |
#; |
return properties; |
- }''', |
- [debugCode]); |
+ }''', [debugCode]); |
} |
jsAst.Statement buildConvertToSlowObjectFunction() { |
@@ -1262,15 +1247,13 @@ class Emitter extends js_emitter.EmitterBase { |
''')); |
for (String object in Namer.userGlobalObjects) { |
- parts.add(js.statement( |
- ''' |
+ parts.add(js.statement(''' |
if (typeof print === "function") { |
print("Size of " + #objectString + ": " |
+ String(Object.getOwnPropertyNames(#object).length) |
+ ", fast properties " + HasFastProperties(#object)); |
} |
- ''', |
- {"object": object, "objectString": js.string(object)})); |
+ ''', {"object": object, "objectString": js.string(object)})); |
} |
} |
@@ -1403,8 +1386,7 @@ class Emitter extends js_emitter.EmitterBase { |
// Using a named function here produces easier to read stack traces in |
// Chrome/V8. |
- statements.add(js.statement( |
- """ |
+ statements.add(js.statement(""" |
(function() { |
// No renaming in the top-level function to save the locals for the |
// nested context where they will be used more. We have to put the |
@@ -1501,48 +1483,44 @@ class Emitter extends js_emitter.EmitterBase { |
#main; |
})(); |
- """, |
- { |
- "disableVariableRenaming": js.comment("/* ::norenaming:: */"), |
- "isProgramSplit": isProgramSplit, |
- "supportsDirectProtoAccess": buildSupportsDirectProtoAccess(), |
- "globalsHolder": globalsHolder, |
- "globalObjectSetup": buildGlobalObjectSetup(isProgramSplit), |
- "isolateName": namer.isolateName, |
- "isolatePropertiesName": js(isolatePropertiesName), |
- "initName": initName, |
- "functionThatReturnsNull": buildFunctionThatReturnsNull(), |
- "mangledNames": buildMangledNames(), |
- "setupProgram": buildSetupProgram( |
- program, compiler, backend, namer, this, _closedWorld), |
- "setupProgramName": setupProgramName, |
- "descriptors": descriptorsAst, |
- "cspPrecompiledFunctions": |
- buildCspPrecompiledFunctionFor(mainOutputUnit), |
- "getInterceptorMethods": |
- interceptorEmitter.buildGetInterceptorMethods(), |
- "oneShotInterceptors": interceptorEmitter.buildOneShotInterceptors(), |
- "makeConstantList": |
- buildMakeConstantList(program.outputContainsConstantList), |
- "compileTimeConstants": buildCompileTimeConstants( |
- mainFragment.constants, |
- isMainFragment: true), |
- "deferredBoilerPlate": buildDeferredBoilerPlate(deferredLoadHashes), |
- "staticNonFinalInitializers": |
- buildStaticNonFinalFieldInitializations(mainOutputUnit), |
- "typeToInterceptorMap": |
- interceptorEmitter.buildTypeToInterceptorMap(program), |
- "lazyStaticFields": buildLazilyInitializedStaticFields( |
- mainFragment.staticLazilyInitializedFields), |
- "metadata": buildMetadata(program, mainOutputUnit), |
- "convertToFastObject": buildConvertToFastObjectFunction(), |
- "convertToSlowObject": buildConvertToSlowObjectFunction(), |
- "convertGlobalObjectsToFastObjects": |
- buildConvertGlobalObjectToFastObjects(), |
- "debugFastObjects": buildDebugFastObjectCode(), |
- "init": buildInitFunction(program.outputContainsConstantList), |
- "main": buildMain(mainFragment.invokeMain) |
- })); |
+ """, { |
+ "disableVariableRenaming": js.comment("/* ::norenaming:: */"), |
+ "isProgramSplit": isProgramSplit, |
+ "supportsDirectProtoAccess": buildSupportsDirectProtoAccess(), |
+ "globalsHolder": globalsHolder, |
+ "globalObjectSetup": buildGlobalObjectSetup(isProgramSplit), |
+ "isolateName": namer.isolateName, |
+ "isolatePropertiesName": js(isolatePropertiesName), |
+ "initName": initName, |
+ "functionThatReturnsNull": buildFunctionThatReturnsNull(), |
+ "mangledNames": buildMangledNames(), |
+ "setupProgram": buildSetupProgram( |
+ program, compiler, backend, namer, this, _closedWorld), |
+ "setupProgramName": setupProgramName, |
+ "descriptors": descriptorsAst, |
+ "cspPrecompiledFunctions": buildCspPrecompiledFunctionFor(mainOutputUnit), |
+ "getInterceptorMethods": interceptorEmitter.buildGetInterceptorMethods(), |
+ "oneShotInterceptors": interceptorEmitter.buildOneShotInterceptors(), |
+ "makeConstantList": |
+ buildMakeConstantList(program.outputContainsConstantList), |
+ "compileTimeConstants": buildCompileTimeConstants(mainFragment.constants, |
+ isMainFragment: true), |
+ "deferredBoilerPlate": buildDeferredBoilerPlate(deferredLoadHashes), |
+ "staticNonFinalInitializers": |
+ buildStaticNonFinalFieldInitializations(mainOutputUnit), |
+ "typeToInterceptorMap": |
+ interceptorEmitter.buildTypeToInterceptorMap(program), |
+ "lazyStaticFields": buildLazilyInitializedStaticFields( |
+ mainFragment.staticLazilyInitializedFields), |
+ "metadata": buildMetadata(program, mainOutputUnit), |
+ "convertToFastObject": buildConvertToFastObjectFunction(), |
+ "convertToSlowObject": buildConvertToSlowObjectFunction(), |
+ "convertGlobalObjectsToFastObjects": |
+ buildConvertGlobalObjectToFastObjects(), |
+ "debugFastObjects": buildDebugFastObjectCode(), |
+ "init": buildInitFunction(program.outputContainsConstantList), |
+ "main": buildMain(mainFragment.invokeMain) |
+ })); |
return new jsAst.Program(statements); |
} |
@@ -1717,8 +1695,7 @@ class Emitter extends js_emitter.EmitterBase { |
Map<OutputUnit, _DeferredOutputUnitHash> deferredLoadHashes) { |
List<jsAst.Statement> parts = <jsAst.Statement>[]; |
- parts.add(js.statement( |
- ''' |
+ parts.add(js.statement(''' |
{ |
// Function for checking if a hunk is loaded given its hash. |
#isHunkLoaded = function(hunkHash) { |
@@ -1736,18 +1713,17 @@ class Emitter extends js_emitter.EmitterBase { |
#deferredInitialized[hunkHash] = true; |
}; |
} |
- ''', |
- { |
- "globalsHolder": globalsHolder, |
- "isHunkLoaded": |
- generateEmbeddedGlobalAccess(embeddedNames.IS_HUNK_LOADED), |
- "isHunkInitialized": |
- generateEmbeddedGlobalAccess(embeddedNames.IS_HUNK_INITIALIZED), |
- "initializeLoadedHunk": generateEmbeddedGlobalAccess( |
- embeddedNames.INITIALIZE_LOADED_HUNK), |
- "deferredInitialized": |
- generateEmbeddedGlobalAccess(embeddedNames.DEFERRED_INITIALIZED) |
- })); |
+ ''', { |
+ "globalsHolder": globalsHolder, |
+ "isHunkLoaded": |
+ generateEmbeddedGlobalAccess(embeddedNames.IS_HUNK_LOADED), |
+ "isHunkInitialized": |
+ generateEmbeddedGlobalAccess(embeddedNames.IS_HUNK_INITIALIZED), |
+ "initializeLoadedHunk": |
+ generateEmbeddedGlobalAccess(embeddedNames.INITIALIZE_LOADED_HUNK), |
+ "deferredInitialized": |
+ generateEmbeddedGlobalAccess(embeddedNames.DEFERRED_INITIALIZED) |
+ })); |
// Write a javascript mapping from Deferred import load ids (derrived |
// from the import prefix.) to a list of lists of uris of hunks to load, |