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 6b1ebbda42d9a5281e474e3f1436017ed7dc2c2d..b7324d637f434d8df5bc54e7d62d2f596e29dba8 100644 |
--- a/pkg/compiler/lib/src/js_backend/backend.dart |
+++ b/pkg/compiler/lib/src/js_backend/backend.dart |
@@ -1457,14 +1457,6 @@ class JavaScriptBackend extends Backend { |
super.registerClosureWithFreeTypeVariables(closure, enqueuer, registry); |
} |
- /// Call during codegen if an instance of [closure] is being created. |
- void registerInstantiatedClosure(LocalFunctionElement closure, |
- Registry registry) { |
- if (methodNeedsRti(closure)) { |
- registerComputeSignature(compiler.enqueuer.codegen, registry); |
- } |
- } |
- |
void registerBoundClosure(Enqueuer enqueuer) { |
boundClosureClass.ensureResolved(resolution); |
registerInstantiatedType( |
@@ -1497,41 +1489,6 @@ class JavaScriptBackend extends Backend { |
enqueueClass(enqueuer, coreClasses.listClass, registry); |
} |
- void registerIsCheckForCodegen(DartType type, |
- Enqueuer world, |
- Registry registry) { |
- assert(!registry.isForResolution); |
- type = type.unaliased; |
- enqueueClass(world, coreClasses.boolClass, registry); |
- bool inCheckedMode = compiler.enableTypeAssertions; |
- // [registerIsCheck] is also called for checked mode checks, so we |
- // need to register checked mode helpers. |
- if (inCheckedMode) { |
- // All helpers are added to resolution queue in enqueueHelpers. These |
- // calls to enqueueInResolution serve as assertions that the helper was |
- // in fact added. |
- // TODO(13155): Find a way to enqueue helpers lazily. |
- CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: false); |
- if (helper != null) { |
- enqueue(world, helper.getElement(compiler), registry); |
- } |
- // We also need the native variant of the check (for DOM types). |
- helper = getNativeCheckedModeHelper(type, typeCast: false); |
- if (helper != null) { |
- enqueue(world, helper.getElement(compiler), registry); |
- } |
- } |
- if (!type.treatAsRaw || type.containsTypeVariables) { |
- enqueueClass(world, coreClasses.listClass, registry); |
- } |
- if (type.element != null && isNative(type.element)) { |
- // We will neeed to add the "$is" and "$as" properties on the |
- // JavaScript object prototype, so we make sure |
- // [:defineProperty:] is compiled. |
- enqueue(world, findHelper('defineProperty'), registry); |
- } |
- } |
- |
void registerTypeVariableBoundsSubtypeCheck(DartType typeArgument, |
DartType bound) { |
rti.registerTypeVariableBoundsSubtypeCheck(typeArgument, bound); |
@@ -2812,33 +2769,6 @@ class JavaScriptBackend extends Backend { |
return "${outName}_$name$extension"; |
} |
- void registerAsyncMarker(FunctionElement element, |
- Enqueuer enqueuer, |
- Registry registry) { |
- if (element.asyncMarker == AsyncMarker.ASYNC) { |
- _registerAsync(enqueuer, registry); |
- } else if (element.asyncMarker == AsyncMarker.SYNC_STAR) { |
- _registerSyncStar(enqueuer, registry); |
- } else if (element.asyncMarker == AsyncMarker.ASYNC_STAR) { |
- _registerAsyncStar(enqueuer, registry); |
- } |
- } |
- |
- void _registerAsync(Enqueuer enqueuer, |
- Registry registry) { |
- enqueueImpact(enqueuer, impacts.asyncBody, registry); |
- } |
- |
- void _registerSyncStar(Enqueuer enqueuer, |
- Registry registry) { |
- enqueueImpact(enqueuer, impacts.syncStarBody, registry); |
- } |
- |
- void _registerAsyncStar(Enqueuer enqueuer, |
- Registry registry) { |
- enqueueImpact(enqueuer, impacts.asyncStarBody, registry); |
- } |
- |
@override |
bool enableDeferredLoadingIfSupported(Spannable node, Registry registry) { |
registerCheckDeferredIsLoaded(registry); |
@@ -3224,33 +3154,52 @@ class JavaScriptImpactTransformer extends ImpactTransformer { |
} |
} |
- @override |
- WorldImpact transformCodegenImpact(CodegenImpact impact) { |
- EagerRegistry registry = impact.registry; |
- Enqueuer world = registry.world; |
- |
- for (InterfaceType type in impact.instantiatedTypes) { |
- backend.registerInstantiatedType(type, world, registry); |
- } |
+ void onIsCheckForCodegen(DartType type, TransformedWorldImpact transformed) { |
+ type = type.unaliased; |
+ registerBackendImpact(transformed, impacts.typeCheck); |
- for (Element element in impact.staticUses) { |
- world.registerStaticUse(element); |
+ bool inCheckedMode = backend.compiler.enableTypeAssertions; |
+ // [registerIsCheck] is also called for checked mode checks, so we |
+ // need to register checked mode helpers. |
+ if (inCheckedMode) { |
+ // All helpers are added to resolution queue in enqueueHelpers. These |
+ // calls to enqueueInResolution serve as assertions that the helper was |
+ // in fact added. |
+ // TODO(13155): Find a way to enqueue helpers lazily. |
+ CheckedModeHelper helper = |
+ backend.getCheckedModeHelper(type, typeCast: false); |
+ if (helper != null) { |
+ Element helperElement = helper.getElement(backend.compiler); |
+ transformed.registerStaticUse(helperElement); |
+ backend.registerBackendUse(helperElement); |
+ } |
+ // We also need the native variant of the check (for DOM types). |
+ helper = backend.getNativeCheckedModeHelper(type, typeCast: false); |
+ if (helper != null) { |
+ Element helperElement = helper.getElement(backend.compiler); |
+ transformed.registerStaticUse(helperElement); |
+ backend.registerBackendUse(helperElement); |
+ } |
} |
- |
- for (UniverseSelector selector in impact.dynamicInvocations) { |
- world.registerDynamicInvocation(selector); |
+ if (!type.treatAsRaw || type.containsTypeVariables) { |
+ registerBackendImpact(transformed, impacts.genericIsCheck); |
} |
- |
- for (UniverseSelector selector in impact.dynamicGetters) { |
- world.registerDynamicGetter(selector); |
+ if (type.element != null && backend.isNative(type.element)) { |
+ // We will neeed to add the "$is" and "$as" properties on the |
+ // JavaScript object prototype, so we make sure |
+ // [:defineProperty:] is compiled. |
+ registerBackendImpact(transformed, impacts.nativeTypeCheck); |
} |
+ } |
- for (UniverseSelector selector in impact.dynamicSetters) { |
- world.registerDynamicSetter(selector); |
- } |
+ @override |
+ WorldImpact transformCodegenImpact(CodegenImpact impact) { |
+ TransformedWorldImpact transformed = new TransformedWorldImpact(impact); |
+ EagerRegistry registry = impact.registry; |
+ Enqueuer world = registry.world; |
- for (UniverseSelector selector in impact.dynamicSetters) { |
- world.registerDynamicSetter(selector); |
+ for (InterfaceType type in impact.instantiatedTypes) { |
+ backend.lookupMapAnalysis.registerInstantiatedType(type, registry); |
} |
for (Element element in impact.getterForSuperElements) { |
@@ -3266,8 +3215,7 @@ class JavaScriptImpactTransformer extends ImpactTransformer { |
} |
for (DartType type in impact.isChecks) { |
- world.registerIsCheck(type); |
- backend.registerIsCheckForCodegen(type, world, registry); |
+ onIsCheckForCodegen(type, transformed); |
} |
for (ConstantValue constant in impact.compileTimeConstants) { |
@@ -3281,11 +3229,9 @@ class JavaScriptImpactTransformer extends ImpactTransformer { |
} |
for (LocalFunctionElement element in impact.closures) { |
- backend.registerInstantiatedClosure(element, registry); |
- } |
- |
- for (Element element in impact.closurizedFunctions) { |
- world.registerGetOfStaticFunction(element); |
+ if (backend.methodNeedsRti(element)) { |
+ registerBackendImpact(transformed, impacts.computeSignature); |
+ } |
} |
for (String name in impact.constSymbols) { |
@@ -3301,16 +3247,26 @@ class JavaScriptImpactTransformer extends ImpactTransformer { |
} |
for (ClassElement element in impact.typeConstants) { |
- backend.customElementsAnalysis.registerTypeConstant(element, world); |
+ backend.customElementsAnalysis.registerTypeConstant(element); |
backend.lookupMapAnalysis.registerTypeConstant(element); |
} |
for (FunctionElement element in impact.asyncMarkers) { |
- backend.registerAsyncMarker(element, world, registry); |
+ switch (element.asyncMarker) { |
+ case AsyncMarker.ASYNC: |
+ registerBackendImpact(transformed, impacts.asyncBody); |
+ break; |
+ case AsyncMarker.SYNC_STAR: |
+ registerBackendImpact(transformed, impacts.syncStarBody); |
+ break; |
+ case AsyncMarker.ASYNC_STAR: |
+ registerBackendImpact(transformed, impacts.asyncStarBody); |
+ break; |
+ } |
} |
// TODO(johnniwinther): Remove eager registration. |
- return const WorldImpact(); |
+ return transformed; |
} |
} |