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 d573580ba52a0dbae6c201f292ef5f1ab4fba68f..258d5605b7f90b2d4c37cbd2e7518d1dc3fdcde2 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])) |
|
karlklose
2015/05/28 09:39:53
Consider adding type arguments when changing this
herhut
2015/06/01 12:09:42
Acknowledged.
|
| + ..add(js.statement('# = #;', [typesAccess, types])); |
| } else if (types != null) { |
| parts.add(js.statement('var ${namer.deferredTypesName} = #;', |
| - constructList(types))); |
| + types)); |
| } |
| return new jsAst.Block(parts); |
| } |
| @@ -1009,7 +1004,7 @@ class OldEmitter implements Emitter { |
| // method without its corresponding class. |
| initializer = new jsAst.ObjectInitializer([]); |
| } else { |
| - initializer = descriptor.toObjectInitializer(); |
| + initializer = descriptor.toObjectInitializer(compiler); |
| } |
| compiler.dumpInfoTask.registerElementAst(library, metadata); |
| @@ -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)); |
| @@ -1088,7 +1082,7 @@ class OldEmitter implements Emitter { |
| // classes. |
| assert(compiler.objectClass != null); |
| builder.superName = namer.className(compiler.objectClass); |
| - jsAst.Node declaration = builder.toObjectInitializer(); |
| + jsAst.Node declaration = builder.toObjectInitializer(compiler); |
| String mangledName = namer.globalPropertyName(typedef); |
| String reflectionName = getReflectionName(typedef, mangledName); |
| getElementDescriptor(library, mainFragment) |
| @@ -1266,29 +1260,16 @@ 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>[]; |
| statements..add(buildGeneratedBy()) |
| - ..add(js.comment(HOOKS_API_USAGE)); |
| + ..add(js.comment(HOOKS_API_USAGE)); |
|
karlklose
2015/05/28 09:39:53
Revert IDE's change. (also next two changes below)
herhut
2015/06/01 12:09:42
Done.
|
| if (isProgramSplit) { |
| /// For deferred loading we communicate the initializers via this global |
| @@ -1475,19 +1456,36 @@ class OldEmitter implements Emitter { |
| "staticNonFinalInitializers": buildStaticNonFinalFieldInitializations( |
| mainOutputUnit), |
| "typeToInterceptorMap": |
| - interceptorEmitter.buildTypeToInterceptorMap(program), |
| + interceptorEmitter.buildTypeToInterceptorMap(program), |
| "lazyStaticFields": buildLazilyInitializedStaticFields(), |
| "metadata": buildMetadata(program, mainOutputUnit), |
| "convertToFastObject": buildConvertToFastObjectFunction(), |
| "convertToSlowObject": buildConvertToSlowObjectFunction(), |
| "convertGlobalObjectsToFastObjects": |
| - buildConvertGlobalObjectToFastObjects(), |
| + buildConvertGlobalObjectToFastObjects(), |
| "debugFastObjects": buildDebugFastObjectCode(), |
| "init": buildInitFunction(), |
| "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,12 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) { |
| return outputs; |
| } |
| + void finalizeTokensInAst(jsAst.Program main, Iterable<jsAst.Program> parts) { |
|
karlklose
2015/05/28 09:39:53
'parts' -> 'deferredParts'? I think it feels stran
herhut
2015/06/01 12:09:42
Done.
|
| + task.metadataCollector.countTokensInProgram(main); |
| + parts.forEach(task.metadataCollector.countTokensInProgram); |
| + task.metadataCollector.finalizeTokens(); |
| + } |
| + |
| int emitProgram(ProgramBuilder programBuilder) { |
| Program program = programBuilder.buildProgram( |
| storeFunctionTypesInMetadata: true); |
| @@ -1664,6 +1668,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 +1688,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 +1738,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 +1772,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 +1792,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 +1855,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). |