Index: pkg/compiler/lib/src/js_backend/backend.dart |
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart |
index 6898d6ace17dfb5a108f84d1ce990b53e7e52536..5bd42a15262408b0890760448a291889624241d7 100644 |
--- a/pkg/compiler/lib/src/js_backend/backend.dart |
+++ b/pkg/compiler/lib/src/js_backend/backend.dart |
@@ -581,6 +581,52 @@ class JavaScriptBackend extends Backend { |
new Namer(compiler); |
} |
+ /// The backend must *always* call this method when enqueuing an |
+ /// element. Calls done by the backend are not seen by global |
+ /// optimizations, so they would make these optimizations unsound. |
+ /// Therefore we need to collect the list of helpers the backend may |
+ /// use. |
+ // TODO(johnniwinther): Replace this with a more precise modelling; type |
+ // inference of these elements is disabled. |
+ Element registerBackendUse(Element element) { |
+ if (element != null) { |
+ bool registerUse = false; |
+ if (element == helpers.streamIteratorConstructor || |
+ element == helpers.compiler.symbolConstructor || |
+ element == helpers.compiler.symbolValidatedConstructor || |
+ element == helpers.syncCompleterConstructor || |
+ element == coreClasses.symbolClass || |
+ element == helpers.objectNoSuchMethod) { |
+ // TODO(johnniwinther): These are valid but we could be more precise. |
+ registerUse = true; |
+ } else if (element.implementationLibrary.isPatch || |
+ element.library == helpers.jsHelperLibrary || |
+ element.library == helpers.interceptorsLibrary || |
+ element.library == helpers.isolateHelperLibrary) { |
+ // TODO(johnniwinther): We should be more precise about these. |
+ registerUse = true; |
+ } else if (element == coreClasses.listClass || |
+ element == helpers.mapLiteralClass || |
+ element == coreClasses.functionClass || |
+ element == coreClasses.stringClass) { |
+ // TODO(johnniwinther): Avoid these. |
+ registerUse = true; |
+ } |
+ if (!registerUse) { |
+ assert(invariant(element, false, |
+ message: "Backend use of $element is not allowed.")); |
+ return element; |
+ } |
+ helpersUsed.add(element.declaration); |
+ if (element.isClass && element.isPatched) { |
+ // Both declaration and implementation may declare fields, so we |
+ // add both to the list of helpers. |
+ helpersUsed.add(element.implementation); |
+ } |
+ } |
+ return element; |
+ } |
+ |
bool usedByBackend(Element element) { |
if (element.isParameter |
|| element.isInitializingFormal |
@@ -1479,23 +1525,6 @@ class JavaScriptBackend extends Backend { |
compiler.enabledRuntimeType; |
} |
- /// The backend must *always* call this method when enqueuing an |
- /// element. Calls done by the backend are not seen by global |
- /// optimizations, so they would make these optimizations unsound. |
- /// Therefore we need to collect the list of helpers the backend may |
- /// use. |
- Element registerBackendUse(Element element) { |
- if (element != null) { |
- helpersUsed.add(element.declaration); |
- if (element.isClass && element.isPatched) { |
- // Both declaration and implementation may declare fields, so we |
- // add both to the list of helpers. |
- helpersUsed.add(element.implementation); |
- } |
- } |
- return element; |
- } |
- |
/// Enqueue [e] in [enqueuer]. |
/// |
/// This method calls [registerBackendUse]. |