Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(273)

Unified Diff: pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart

Issue 1153243003: dart2js: Use frequency of occurence to sort metadata indices. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Addressed sra's comments Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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).

Powered by Google App Engine
This is Rietveld 408576698