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 1462ee77e74b4c763223f0ffcbc47645cc9cdde9..76d382a35ac40aeeb529cd34a2ffd6c80a23db01 100644 |
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart |
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart |
@@ -681,11 +681,7 @@ class OldEmitter implements Emitter { |
jsAst.Statement buildMetadata(Program program, OutputUnit outputUnit) { |
List<jsAst.Statement> parts = <jsAst.Statement>[]; |
- jsAst.Expression constructList(List<jsAst.Expression> list) { |
- return new jsAst.ArrayInitializer(list == null ? [] : list); |
- } |
- |
- List<jsAst.Expression> types = program.metadataTypes[outputUnit]; |
+ jsAst.Expression types = program.metadataTypesForOutputUnit(outputUnit); |
if (outputUnit == compiler.deferredLoadTask.mainOutputUnit) { |
jsAst.Expression metadataAccess = |
@@ -693,12 +689,11 @@ class OldEmitter implements Emitter { |
jsAst.Expression typesAccess = |
generateEmbeddedGlobalAccess(embeddedNames.TYPES); |
- parts..add(js.statement('# = #;', [metadataAccess, |
- constructList(program.metadata)])) |
- ..add(js.statement('# = #;', [typesAccess, constructList(types)])); |
+ parts..add(js.statement('# = #;', [metadataAccess, program.metadata])) |
+ ..add(js.statement('# = #;', [typesAccess, types])); |
} else if (types != null) { |
parts.add(js.statement('var ${namer.deferredTypesName} = #;', |
- constructList(types))); |
+ types)); |
} |
return new jsAst.Block(parts); |
} |
@@ -1075,11 +1070,10 @@ class OldEmitter implements Emitter { |
DartType type = typedef.alias; |
// TODO(zarah): reify type variables once reflection on type arguments of |
// typedefs is supported. |
- int typeIndex = |
+ jsAst.Expression typeIndex = |
task.metadataCollector.reifyType(type, ignoreTypeVariables: true); |
ClassBuilder builder = new ClassBuilder(typedef, namer); |
- builder.addProperty(embeddedNames.TYPEDEF_TYPE_PROPERTY_NAME, |
- js.number(typeIndex)); |
+ builder.addProperty(embeddedNames.TYPEDEF_TYPE_PROPERTY_NAME, typeIndex); |
builder.addProperty(embeddedNames.TYPEDEF_PREDICATE_PROPERTY_NAME, |
js.boolean(true)); |
@@ -1266,23 +1260,10 @@ class OldEmitter implements Emitter { |
assembleTypedefs(program); |
} |
- void emitMainOutputUnit(Program program, |
- Map<OutputUnit, String> deferredLoadHashes) { |
- MainFragment mainFragment = program.fragments.first; |
+ jsAst.Program buildOutputAstForMain(Program program, |
+ Map<OutputUnit, _DeferredOutputUnitHash> deferredLoadHashes) { |
+ MainFragment mainFragment = program.mainFragment; |
OutputUnit mainOutputUnit = mainFragment.outputUnit; |
- |
- LineColumnCollector lineColumnCollector; |
- List<CodeOutputListener> codeOutputListeners; |
- if (generateSourceMap) { |
- lineColumnCollector = new LineColumnCollector(); |
- codeOutputListeners = <CodeOutputListener>[lineColumnCollector]; |
- } |
- |
- CodeOutput mainOutput = |
- new StreamCodeOutput(compiler.outputProvider('', 'js'), |
- codeOutputListeners); |
- outputBuffers[mainOutputUnit] = mainOutput; |
- |
bool isProgramSplit = program.isSplit; |
List<jsAst.Statement> statements = <jsAst.Statement>[]; |
@@ -1487,7 +1468,24 @@ class OldEmitter implements Emitter { |
"main": buildMain(mainFragment.invokeMain) |
})); |
- mainOutput.addBuffer(jsAst.prettyPrint(new jsAst.Program(statements), |
+ return new jsAst.Program(statements); |
+ } |
+ |
+ void emitMainOutputUnit(OutputUnit mainOutputUnit, jsAst.Program program) { |
+ LineColumnCollector lineColumnCollector; |
+ List<CodeOutputListener> codeOutputListeners; |
+ if (generateSourceMap) { |
+ lineColumnCollector = new LineColumnCollector(); |
+ codeOutputListeners = <CodeOutputListener>[lineColumnCollector]; |
+ } |
+ |
+ CodeOutput mainOutput = |
+ new StreamCodeOutput(compiler.outputProvider('', 'js'), |
+ codeOutputListeners); |
+ outputBuffers[mainOutputUnit] = mainOutput; |
+ |
+ |
+ mainOutput.addBuffer(jsAst.prettyPrint(program, |
compiler, |
monitor: compiler.dumpInfoTask)); |
@@ -1654,6 +1652,13 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) { |
return outputs; |
} |
+ void finalizeTokensInAst(jsAst.Program main, |
+ Iterable<jsAst.Program> deferredParts) { |
+ task.metadataCollector.countTokensInProgram(main); |
+ deferredParts.forEach(task.metadataCollector.countTokensInProgram); |
+ task.metadataCollector.finalizeTokens(); |
+ } |
+ |
int emitProgram(ProgramBuilder programBuilder) { |
Program program = programBuilder.buildProgram( |
storeFunctionTypesInMetadata: true); |
@@ -1664,6 +1669,19 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) { |
Map<OutputUnit, jsAst.Program> deferredParts = |
buildOutputAstForDeferredCode(program); |
+ Map<OutputUnit, _DeferredOutputUnitHash> deferredHashTokens = |
+ new Map<OutputUnit, _DeferredOutputUnitHash>.fromIterables( |
+ deferredParts.keys, |
+ deferredParts.keys.map((OutputUnit unit) { |
+ return new _DeferredOutputUnitHash(unit); |
+ }) |
+ ); |
+ |
+ jsAst.Program mainOutput = |
+ buildOutputAstForMain(program, deferredHashTokens); |
+ |
+ finalizeTokensInAst(mainOutput, deferredParts.values); |
+ |
// Emit deferred units first, so we have their hashes. |
// Map from OutputUnit to a hash of its content. The hash uniquely |
// identifies the code of the output-unit. It does not include |
@@ -1671,7 +1689,11 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) { |
// itself. |
Map<OutputUnit, String> deferredLoadHashes = |
emitDeferredOutputUnits(deferredParts); |
- emitMainOutputUnit(program, deferredLoadHashes); |
+ |
+ deferredHashTokens.forEach((OutputUnit key, _DeferredOutputUnitHash token) { |
+ token.setHash(deferredLoadHashes[key]); |
+ }); |
+ emitMainOutputUnit(program.mainFragment.outputUnit, mainOutput); |
if (backend.requiresPreamble && |
!backend.htmlLibraryIsLoaded) { |
@@ -1717,7 +1739,7 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) { |
/// Emits support-code for deferred loading into [output]. |
jsAst.Statement buildDeferredBoilerPlate( |
- Map<OutputUnit, String> deferredLoadHashes) { |
+ Map<OutputUnit, _DeferredOutputUnitHash> deferredLoadHashes) { |
List<jsAst.Statement> parts = <jsAst.Statement>[]; |
parts.add(js.statement(''' |
@@ -1751,17 +1773,19 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) { |
// from the import prefix.) to a list of lists of uris of hunks to load, |
// and a corresponding mapping to a list of hashes used by |
// INITIALIZE_LOADED_HUNK and IS_HUNK_LOADED. |
- Map<String, List<String>> deferredLibraryUris = |
- new Map<String, List<String>>(); |
- Map<String, List<String>> deferredLibraryHashes = |
- new Map<String, List<String>>(); |
+ Map<String, List<jsAst.LiteralString>> deferredLibraryUris = |
+ new Map<String, List<jsAst.LiteralString>>(); |
+ Map<String, List<_DeferredOutputUnitHash>> deferredLibraryHashes = |
+ new Map<String, List<_DeferredOutputUnitHash>>(); |
compiler.deferredLoadTask.hunksToLoad.forEach( |
(String loadId, List<OutputUnit>outputUnits) { |
- List<String> uris = new List<String>(); |
- List<String> hashes = new List<String>(); |
- deferredLibraryHashes[loadId] = new List<String>(); |
+ List<jsAst.LiteralString> uris = new List<jsAst.LiteralString>(); |
+ List<_DeferredOutputUnitHash> hashes = |
+ new List<_DeferredOutputUnitHash>(); |
+ deferredLibraryHashes[loadId] = new List<_DeferredOutputUnitHash>(); |
for (OutputUnit outputUnit in outputUnits) { |
- uris.add(backend.deferredPartFileName(outputUnit.name)); |
+ uris.add(js.escapedString( |
+ backend.deferredPartFileName(outputUnit.name))); |
hashes.add(deferredLoadHashes[outputUnit]); |
} |
@@ -1769,12 +1793,11 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) { |
deferredLibraryHashes[loadId] = hashes; |
}); |
- void emitMapping(String name, Map<String, List<String>> mapping) { |
+ void emitMapping(String name, Map<String, List<jsAst.Expression>> mapping) { |
List<jsAst.Property> properties = new List<jsAst.Property>(); |
- mapping.forEach((String key, List<String> values) { |
+ mapping.forEach((String key, List<jsAst.Expression> values) { |
properties.add(new jsAst.Property(js.escapedString(key), |
- new jsAst.ArrayInitializer( |
- values.map(js.escapedString).toList()))); |
+ new jsAst.ArrayInitializer(values))); |
}); |
jsAst.Node initializer = |
new jsAst.ObjectInitializer(properties, isOneLiner: true); |
@@ -1833,11 +1856,9 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) { |
js.statement('$setupProgramName(dart, ${typesAccess}.length);')); |
} |
- if (task.metadataCollector.types[outputUnit] != null) { |
- body..add(buildMetadata(program, outputUnit)) |
- ..add(js.statement('${typesAccess}.push.apply(${typesAccess}, ' |
- '${namer.deferredTypesName});')); |
- } |
+ body..add(buildMetadata(program, outputUnit)) |
+ ..add(js.statement('${typesAccess}.push.apply(${typesAccess}, ' |
+ '${namer.deferredTypesName});')); |
// Set the currentIsolate variable to the current isolate (which is |
// provided as second argument). |