[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}),