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

Unified Diff: pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart

Issue 1235973004: dart2js: Use the correct hashes for deferred code in the startup-emitter. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Reupload and probably some minor fixes. Created 5 years, 5 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/startup_emitter/fragment_emitter.dart
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index c4b9d12353ca9ffe28228febd1e3036d467959c0..f1bd2ca59e347f0e29a9f148daf61b12975f9f14 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -263,8 +263,6 @@ var #staticStateDeclaration = {};
/// For example, once the holders have been created, they are included into
/// the main holders.
const String deferredBoilerplate = '''
-{
-#deferredInitializers.current =
function(inherit, mixin, lazy, makeConstList, installTearOff,
updateHolder, updateTypes,
setOrUpdateInterceptorsByTag, setOrUpdateLeafTags,
@@ -299,10 +297,6 @@ updateTypes(#types);
// Native-support uses setOrUpdateInterceptorsByTag and setOrUpdateLeafTags.
#nativeSupport;
-};
-// TODO(floitsch): this last line should be outside the AST, since it
-// requires to know the hash of the part of the code above this comment.
-#deferredInitializers[#hash] = #deferredInitializers.current;
}''';
/**
@@ -333,7 +327,9 @@ class FragmentEmitter {
return js.js('#.#', [cls.holder.name, cls.name]);
}
- js.Statement emitMainFragment(Program program) {
+ js.Statement emitMainFragment(
+ Program program,
+ Map<DeferredFragment, _DeferredFragmentHash> deferredLoadHashes) {
MainFragment fragment = program.fragments.first;
return js.js.statement(mainBoilerplate,
@@ -365,7 +361,7 @@ class FragmentEmitter {
'constants': emitConstants(fragment),
'staticNonFinalFields': emitStaticNonFinalFields(fragment),
'lazyStatics': emitLazilyInitializedStatics(fragment),
- 'embeddedGlobals': emitEmbeddedGlobals(program),
+ 'embeddedGlobals': emitEmbeddedGlobals(program, deferredLoadHashes),
'nativeSupport': program.needsNativeSupport
? emitNativeSupport(fragment)
: new js.EmptyStatement(),
@@ -373,7 +369,7 @@ class FragmentEmitter {
});
}
- js.Statement emitDeferredFragment(DeferredFragment fragment,
+ js.Expression emitDeferredFragment(DeferredFragment fragment,
js.Expression deferredTypes,
List<Holder> holders) {
List<js.Statement> updateHolderAssignments = <js.Statement>[];
@@ -389,24 +385,21 @@ class FragmentEmitter {
// TODO(floitsch): if name is not set, run through all functions and set the
// name for IE.
// TODO(floitsch): don't just reference 'init'.
- return js.js.statement(deferredBoilerplate,
- {'deferredInitializers':
- js.js('#', ModelEmitter.deferredInitializersGlobal),
- 'embeddedGlobalsObject': new js.Parameter('init'),
- 'staticState': new js.Parameter(namer.staticStateHolder),
- 'holders': emitHolders(holders, fragment),
- 'updateHolders': new js.Block(updateHolderAssignments),
- 'prototypes': emitPrototypes(fragment),
- 'inheritance': emitInheritance(fragment),
- 'aliases': emitInstanceMethodAliases(fragment),
- 'tearOffs': emitInstallTearOffs(fragment),
- 'constants': emitConstants(fragment),
- 'staticNonFinalFields': emitStaticNonFinalFields(fragment),
- 'lazyStatics': emitLazilyInitializedStatics(fragment),
- 'types': deferredTypes,
- // TODO(floitsch): only call emitNativeSupport if we need native.
- 'nativeSupport': emitNativeSupport(fragment),
- 'hash': js.number(fragment.hashCode),
+ return js.js(deferredBoilerplate,
+ {'embeddedGlobalsObject': new js.Parameter('init'),
+ 'staticState': new js.Parameter(namer.staticStateHolder),
+ 'holders': emitHolders(holders, fragment),
+ 'updateHolders': new js.Block(updateHolderAssignments),
+ 'prototypes': emitPrototypes(fragment),
+ 'inheritance': emitInheritance(fragment),
+ 'aliases': emitInstanceMethodAliases(fragment),
+ 'tearOffs': emitInstallTearOffs(fragment),
+ 'constants': emitConstants(fragment),
+ 'staticNonFinalFields': emitStaticNonFinalFields(fragment),
+ 'lazyStatics': emitLazilyInitializedStatics(fragment),
+ 'types': deferredTypes,
+ // TODO(floitsch): only call emitNativeSupport if we need native.
+ 'nativeSupport': emitNativeSupport(fragment),
});
}
@@ -870,7 +863,8 @@ class FragmentEmitter {
/// to the list of generated fragments that must be installed when the
/// deferred library is loaded.
Iterable<js.Property> emitEmbeddedGlobalsForDeferredLoading(
- Map<String, List<Fragment>> loadMap) {
+ Map<String, List<Fragment>> loadMap,
+ Map<DeferredFragment, _DeferredFragmentHash> deferredLoadHashes) {
if (loadMap.isEmpty) return [];
List<js.Property> globals = <js.Property>[];
@@ -880,9 +874,10 @@ class FragmentEmitter {
"${fragment.outputFileName}.$deferredExtension"));
}
js.ArrayInitializer fragmentHashes(List<Fragment> fragments) {
- // TODO(floitsch): the hash must depend on the generated code.
- return js.numArray(
- fragments.map((DeferredFragment fragment) => fragment.hashCode));
+ return new js.ArrayInitializer(
+ fragments
+ .map((fragment) => deferredLoadHashes[fragment])
+ .toList(growable: false));
}
List<js.Property> uris = new List<js.Property>(loadMap.length);
@@ -996,11 +991,14 @@ class FragmentEmitter {
}
/// Emits all embedded globals.
- js.Block emitEmbeddedGlobals(Program program) {
+ js.Block emitEmbeddedGlobals(
+ Program program,
+ Map<DeferredFragment, _DeferredFragmentHash> deferredLoadHashes) {
List<js.Property> globals = <js.Property>[];
if (program.loadMap.isNotEmpty) {
- globals.addAll(emitEmbeddedGlobalsForDeferredLoading(program.loadMap));
+ globals.addAll(emitEmbeddedGlobalsForDeferredLoading(
+ program.loadMap, deferredLoadHashes));
}
if (program.typeToInterceptorMap != null) {

Powered by Google App Engine
This is Rietveld 408576698