[dart2js] Adding additional initialization logic for runtime allocations
Fixes an issue where the allocations object was not always initialized for certain apps
Change-Id: I717bd20c1bef3e4a64d9d4243c4fe3d48178ae2a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/235441
Reviewed-by: Joshua Litt <joshualitt@google.com>
Commit-Queue: Mark Zhou <markzipan@google.com>
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index 0783eff..133789f 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -366,11 +366,19 @@
return js.Comment(generatedBy(_options, flavor: '$flavor'));
}
- js.Statement buildDeferredInitializerGlobal() {
- return js.js.statement(
- 'self.#deferredInitializers = '
- 'self.#deferredInitializers || Object.create(null);',
- {'deferredInitializers': deferredInitializersGlobal});
+ List<js.Statement> buildDeferredInitializerGlobal() {
+ return [
+ js.js.statement(
+ 'self.#deferredInitializers = '
+ 'self.#deferredInitializers || Object.create(null);',
+ {'deferredInitializers': deferredInitializersGlobal}),
+ if (_options.experimentalTrackAllocations)
+ js.js.statement(
+ 'self.#deferredInitializers["allocations"] = '
+ 'self.#deferredInitializers["allocations"] '
+ '|| Object.create(null)',
+ {'deferredInitializers': deferredInitializersGlobal})
+ ];
}
js.Statement buildStartupMetrics() {
@@ -421,7 +429,7 @@
js.Program program = js.Program([
buildGeneratedBy(),
js.Comment(HOOKS_API_USAGE),
- if (isSplit) buildDeferredInitializerGlobal(),
+ if (isSplit) ...buildDeferredInitializerGlobal(),
if (_closedWorld.backendUsage.requiresStartupMetrics)
buildStartupMetrics(),
code
@@ -556,7 +564,7 @@
js.Program program = js.Program([
if (isFirst) buildGeneratedBy(),
- if (isFirst) buildDeferredInitializerGlobal(),
+ if (isFirst) ...buildDeferredInitializerGlobal(),
if (_options.experimentalTrackAllocations)
js.js.statement("var allocations = #deferredGlobal['allocations']",
{'deferredGlobal': deferredInitializersGlobal}),