Index: dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
diff --git a/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
index c25a335ce8c54ed34d04910912117b1dc10d6ff3..f44f0b40fd44799f1edc2032652e1676e5ce3939 100644 |
--- a/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
+++ b/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
@@ -59,6 +59,7 @@ class CodeEmitterTask extends CompilerTask { |
NativeEmitter nativeEmitter; |
CodeBuffer boundClosureBuffer; |
CodeBuffer mainBuffer; |
+ final CodeBuffer deferredBuffer = new CodeBuffer(); |
/** Shorter access to [isolatePropertiesName]. Both here in the code, as |
well as in the generated code. */ |
String isolateProperties; |
@@ -1368,6 +1369,7 @@ $lazyInitializerLogic |
} |
for (ClassElement element in sortedClasses) { |
+ if (isDeferred(element)) continue; |
generateClass(element, buffer); |
} |
@@ -1396,7 +1398,7 @@ $lazyInitializerLogic |
buffer.add('$N$n'); |
} |
- void emitStaticFunctions(CodeBuffer buffer) { |
+ void emitStaticFunctions(CodeBuffer eagerBuffer) { |
bool isStaticFunction(Element element) => |
!element.isInstanceMember() && !element.isField(); |
@@ -1408,6 +1410,7 @@ $lazyInitializerLogic |
.toSet(); |
for (Element element in Elements.sortedByPosition(elements)) { |
+ CodeBuffer buffer = isDeferred(element) ? deferredBuffer : eagerBuffer; |
js.Expression code = compiler.codegenWorld.generatedCode[element]; |
emitStaticFunction(buffer, namer.getName(element), code); |
js.Expression bailoutCode = |
@@ -1421,6 +1424,7 @@ $lazyInitializerLogic |
// Is it possible the primary function was inlined but the bailout was not? |
for (Element element in |
Elements.sortedByPosition(pendingElementsWithBailouts)) { |
+ CodeBuffer buffer = isDeferred(element) ? deferredBuffer : eagerBuffer; |
js.Expression bailoutCode = |
compiler.codegenWorld.generatedBailoutCode[element]; |
emitStaticFunction(buffer, namer.getBailoutName(element), bailoutCode); |
@@ -1432,6 +1436,7 @@ $lazyInitializerLogic |
compiler.codegenWorld.staticFunctionsNeedingGetter; |
for (FunctionElement element in |
Elements.sortedByPosition(functionsNeedingGetter)) { |
+ if (isDeferred(element)) continue; |
// The static function does not have the correct name. Since |
// [addParameterStubs] use the name to create its stubs we simply |
// create a fake element with the correct name. |
@@ -2322,13 +2327,15 @@ if (typeof document !== 'undefined' && document.readyState !== 'complete') { |
mainBuffer.add('}\n'); |
compiler.assembledCode = mainBuffer.getText(); |
- if (generateSourceMap) { |
- SourceFile compiledFile = new SourceFile(null, compiler.assembledCode); |
- String sourceMap = buildSourceMap(mainBuffer, compiledFile); |
- compiler.outputProvider('', 'js.map') |
- ..add(sourceMap) |
+ if (!deferredBuffer.isEmpty) { |
+ String code = deferredBuffer.getText(); |
+ compiler.outputProvider('part', 'js') |
+ ..add(code) |
..close(); |
+ outputSourceMap(deferredBuffer, compiler.assembledCode, 'part'); |
} |
+ |
+ outputSourceMap(mainBuffer, compiler.assembledCode, ''); |
}); |
return compiler.assembledCode; |
} |
@@ -2338,6 +2345,19 @@ if (typeof document !== 'undefined' && document.readyState !== 'complete') { |
buffer.forEachSourceLocation(sourceMapBuilder.addMapping); |
return sourceMapBuilder.build(compiledFile); |
} |
+ |
+ void outputSourceMap(CodeBuffer buffer, String code, String name) { |
+ if (!generateSourceMap) return; |
+ SourceFile compiledFile = new SourceFile(null, compiler.assembledCode); |
+ String sourceMap = buildSourceMap(mainBuffer, compiledFile); |
+ compiler.outputProvider(name, 'js.map') |
+ ..add(sourceMap) |
+ ..close(); |
+ } |
+ |
+ bool isDeferred(Element element) { |
+ return compiler.deferredLoadTask.isDeferred(element); |
+ } |
} |
const String GENERATED_BY = """ |