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

Unified Diff: pkg/compiler/lib/src/js_backend/backend.dart

Issue 1410313005: Move most codegen registrations into WorldImpact. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comment. Created 5 years, 2 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
« no previous file with comments | « no previous file | pkg/compiler/lib/src/js_backend/backend_impact.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
}
« no previous file with comments | « no previous file | pkg/compiler/lib/src/js_backend/backend_impact.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698