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

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

Issue 2728393005: Extract CodegenImpactTransformer from ImpactTransformer (Closed)
Patch Set: Updated cf. comments. Created 3 years, 9 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 | « pkg/compiler/lib/src/js_backend/backend.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/js_backend/impact_transformer.dart
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index 998b9d4b90a6cd857634de36e325e0bf291fc039..e3ab59eddf601b190d9a0558bd3abcec92713338 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -5,121 +5,146 @@
library js_backend.backend.impact_transformer;
import '../common.dart';
+import '../common_elements.dart';
import '../common/backend_api.dart' show ImpactTransformer;
import '../common/codegen.dart' show CodegenImpact;
-import '../common/resolution.dart' show ResolutionImpact;
+import '../common/resolution.dart' show Resolution, ResolutionImpact;
import '../constants/expressions.dart';
import '../constants/values.dart';
import '../common_elements.dart' show ElementEnvironment;
import '../elements/elements.dart';
import '../elements/resolution_types.dart';
import '../enqueue.dart' show ResolutionEnqueuer;
+import '../native/enqueue.dart';
import '../native/native.dart' as native;
+import '../options.dart';
import '../universe/feature.dart';
import '../universe/use.dart'
show StaticUse, StaticUseKind, TypeUse, TypeUseKind;
import '../universe/world_impact.dart' show TransformedWorldImpact, WorldImpact;
import '../util/util.dart';
import 'backend.dart';
+import 'backend_helpers.dart';
import 'backend_impact.dart';
import 'backend_usage.dart';
import 'checked_mode_helpers.dart';
+import 'custom_elements_analysis.dart';
+import 'interceptor_data.dart';
+import 'lookup_map_analysis.dart';
+import 'mirrors_data.dart';
+import 'namer.dart';
+import 'native_data.dart';
class JavaScriptImpactTransformer extends ImpactTransformer {
- final JavaScriptBackend backend;
-
- JavaScriptImpactTransformer(this.backend);
-
- BackendImpacts get impacts => backend.impacts;
-
- ElementEnvironment get elementEnvironment =>
- backend.compiler.elementEnvironment;
+ final CompilerOptions _options;
+ final Resolution _resolution;
+ final ElementEnvironment _elementEnvironment;
+ final CommonElements _commonElements;
+ final BackendImpacts _impacts;
+ final NativeClassData _nativeClassData;
+ final NativeResolutionEnqueuer _nativeResolutionEnqueuer;
+ final BackendUsageBuilder _backendUsageBuider;
+ final MirrorsData _mirrorsData;
+ final CustomElementsResolutionAnalysis _customElementsResolutionAnalysis;
+ final RuntimeTypesNeedBuilder _rtiNeedBuilder;
+
+ JavaScriptImpactTransformer(
+ this._options,
+ this._resolution,
+ this._elementEnvironment,
+ this._commonElements,
+ this._impacts,
+ this._nativeClassData,
+ this._nativeResolutionEnqueuer,
+ this._backendUsageBuider,
+ this._mirrorsData,
+ this._customElementsResolutionAnalysis,
+ this._rtiNeedBuilder);
@override
WorldImpact transformResolutionImpact(
ResolutionEnqueuer enqueuer, ResolutionImpact worldImpact) {
- BackendUsageBuilder backendUsage = backend.backendUsageBuilder;
TransformedWorldImpact transformed =
new TransformedWorldImpact(worldImpact);
void registerImpact(BackendImpact impact) {
- impact.registerImpact(transformed, elementEnvironment);
- backendUsage.processBackendImpact(impact);
+ impact.registerImpact(transformed, _elementEnvironment);
+ _backendUsageBuider.processBackendImpact(impact);
}
for (Feature feature in worldImpact.features) {
switch (feature) {
case Feature.ABSTRACT_CLASS_INSTANTIATION:
- registerImpact(impacts.abstractClassInstantiation);
+ registerImpact(_impacts.abstractClassInstantiation);
break;
case Feature.ASSERT:
- registerImpact(impacts.assertWithoutMessage);
+ registerImpact(_impacts.assertWithoutMessage);
break;
case Feature.ASSERT_WITH_MESSAGE:
- registerImpact(impacts.assertWithMessage);
+ registerImpact(_impacts.assertWithMessage);
break;
case Feature.ASYNC:
- registerImpact(impacts.asyncBody);
+ registerImpact(_impacts.asyncBody);
break;
case Feature.ASYNC_FOR_IN:
- registerImpact(impacts.asyncForIn);
+ registerImpact(_impacts.asyncForIn);
break;
case Feature.ASYNC_STAR:
- registerImpact(impacts.asyncStarBody);
+ registerImpact(_impacts.asyncStarBody);
break;
case Feature.CATCH_STATEMENT:
- registerImpact(impacts.catchStatement);
+ registerImpact(_impacts.catchStatement);
break;
case Feature.COMPILE_TIME_ERROR:
- if (backend.compiler.options.generateCodeWithCompileTimeErrors) {
+ if (_options.generateCodeWithCompileTimeErrors) {
// TODO(johnniwinther): This should have its own uncatchable error.
- registerImpact(impacts.throwRuntimeError);
+ registerImpact(_impacts.throwRuntimeError);
}
break;
case Feature.FALL_THROUGH_ERROR:
- registerImpact(impacts.fallThroughError);
+ registerImpact(_impacts.fallThroughError);
break;
case Feature.FIELD_WITHOUT_INITIALIZER:
case Feature.LOCAL_WITHOUT_INITIALIZER:
transformed.registerTypeUse(
- new TypeUse.instantiation(backend.commonElements.nullType));
- registerImpact(impacts.nullLiteral);
+ new TypeUse.instantiation(_commonElements.nullType));
+ registerImpact(_impacts.nullLiteral);
break;
case Feature.LAZY_FIELD:
- registerImpact(impacts.lazyField);
+ registerImpact(_impacts.lazyField);
break;
case Feature.STACK_TRACE_IN_CATCH:
- registerImpact(impacts.stackTraceInCatch);
+ registerImpact(_impacts.stackTraceInCatch);
break;
case Feature.STRING_INTERPOLATION:
- registerImpact(impacts.stringInterpolation);
+ registerImpact(_impacts.stringInterpolation);
break;
case Feature.STRING_JUXTAPOSITION:
- registerImpact(impacts.stringJuxtaposition);
+ registerImpact(_impacts.stringJuxtaposition);
break;
case Feature.SUPER_NO_SUCH_METHOD:
- registerImpact(impacts.superNoSuchMethod);
+ registerImpact(_impacts.superNoSuchMethod);
break;
case Feature.SYMBOL_CONSTRUCTOR:
- registerImpact(impacts.symbolConstructor);
+ registerImpact(_impacts.symbolConstructor);
break;
case Feature.SYNC_FOR_IN:
- registerImpact(impacts.syncForIn);
+ registerImpact(_impacts.syncForIn);
break;
case Feature.SYNC_STAR:
- registerImpact(impacts.syncStarBody);
+ registerImpact(_impacts.syncStarBody);
break;
case Feature.THROW_EXPRESSION:
- registerImpact(impacts.throwExpression);
+ registerImpact(_impacts.throwExpression);
break;
case Feature.THROW_NO_SUCH_METHOD:
- registerImpact(impacts.throwNoSuchMethod);
+ registerImpact(_impacts.throwNoSuchMethod);
break;
case Feature.THROW_RUNTIME_ERROR:
- registerImpact(impacts.throwRuntimeError);
+ registerImpact(_impacts.throwRuntimeError);
break;
case Feature.TYPE_VARIABLE_BOUNDS_CHECK:
- registerImpact(impacts.typeVariableBoundCheck);
+ registerImpact(_impacts.typeVariableBoundCheck);
break;
}
}
@@ -142,7 +167,7 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
hasAsCast = true;
break;
case TypeUseKind.CHECKED_MODE_CHECK:
- if (backend.compiler.options.enableTypeAssertions) {
+ if (_options.enableTypeAssertions) {
onIsCheck(type, transformed);
}
break;
@@ -150,7 +175,7 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
onIsCheck(type, transformed);
break;
case TypeUseKind.TYPE_LITERAL:
- backend.customElementsResolutionAnalysis.registerTypeLiteral(type);
+ _customElementsResolutionAnalysis.registerTypeLiteral(type);
if (type.isTypeVariable && type is! MethodTypeVariableType) {
// GENERIC_METHODS: The `is!` test above filters away method type
// variables, because they have the value `dynamic` with the
@@ -158,9 +183,8 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
// '--generic-method-syntax'. This must be revised in order to
// support generic methods fully.
ClassElement cls = type.element.enclosingClass;
- backend.rtiNeedBuilder
- .registerClassUsingTypeVariableExpression(cls);
- registerImpact(impacts.typeVariableExpression);
+ _rtiNeedBuilder.registerClassUsingTypeVariableExpression(cls);
+ registerImpact(_impacts.typeVariableExpression);
}
hasTypeLiteral = true;
break;
@@ -168,20 +192,20 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
}
if (hasAsCast) {
- registerImpact(impacts.asCheck);
+ registerImpact(_impacts.asCheck);
}
if (hasTypeLiteral) {
- transformed.registerTypeUse(
- new TypeUse.instantiation(backend.compiler.commonElements.typeType));
- registerImpact(impacts.typeLiteral);
+ transformed
+ .registerTypeUse(new TypeUse.instantiation(_commonElements.typeType));
+ registerImpact(_impacts.typeLiteral);
}
for (MapLiteralUse mapLiteralUse in worldImpact.mapLiterals) {
// TODO(johnniwinther): Use the [isEmpty] property when factory
// constructors are registered directly.
if (mapLiteralUse.isConstant) {
- registerImpact(impacts.constantMapLiteral);
+ registerImpact(_impacts.constantMapLiteral);
} else {
transformed
.registerTypeUse(new TypeUse.instantiation(mapLiteralUse.type));
@@ -200,19 +224,19 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
}
if (worldImpact.constSymbolNames.isNotEmpty) {
- registerImpact(impacts.constSymbol);
+ registerImpact(_impacts.constSymbol);
for (String constSymbolName in worldImpact.constSymbolNames) {
- backend.mirrorsData.registerConstSymbol(constSymbolName);
+ _mirrorsData.registerConstSymbol(constSymbolName);
}
}
for (StaticUse staticUse in worldImpact.staticUses) {
switch (staticUse.kind) {
case StaticUseKind.CLOSURE:
- registerImpact(impacts.closure);
+ registerImpact(_impacts.closure);
LocalFunctionElement closure = staticUse.element;
if (closure.type.containsTypeVariables) {
- registerImpact(impacts.computeSignature);
+ registerImpact(_impacts.computeSignature);
}
break;
case StaticUseKind.CONST_CONSTRUCTOR_INVOKE:
@@ -226,19 +250,19 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
for (ConstantExpression constant in worldImpact.constantLiterals) {
switch (constant.kind) {
case ConstantExpressionKind.NULL:
- registerImpact(impacts.nullLiteral);
+ registerImpact(_impacts.nullLiteral);
break;
case ConstantExpressionKind.BOOL:
- registerImpact(impacts.boolLiteral);
+ registerImpact(_impacts.boolLiteral);
break;
case ConstantExpressionKind.INT:
- registerImpact(impacts.intLiteral);
+ registerImpact(_impacts.intLiteral);
break;
case ConstantExpressionKind.DOUBLE:
- registerImpact(impacts.doubleLiteral);
+ registerImpact(_impacts.doubleLiteral);
break;
case ConstantExpressionKind.STRING:
- registerImpact(impacts.stringLiteral);
+ registerImpact(_impacts.stringLiteral);
break;
default:
assert(invariant(NO_LOCATION_SPANNABLE, false,
@@ -247,8 +271,8 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
}
for (native.NativeBehavior behavior in worldImpact.nativeData) {
- backend.nativeResolutionEnqueuer
- .registerNativeBehavior(transformed, behavior, worldImpact);
+ _nativeResolutionEnqueuer.registerNativeBehavior(
+ transformed, behavior, worldImpact);
}
return transformed;
@@ -264,59 +288,92 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
// then the class of the type variable does too.
ClassElement contextClass = Types.getClassContext(type);
if (contextClass != null) {
- backend.rtiNeedBuilder.registerRtiDependency(type.element, contextClass);
+ _rtiNeedBuilder.registerRtiDependency(type.element, contextClass);
}
}
// TODO(johnniwinther): Maybe split this into [onAssertType] and [onTestType].
void onIsCheck(ResolutionDartType type, TransformedWorldImpact transformed) {
- BackendUsageBuilder backendUsage = backend.backendUsageBuilder;
-
void registerImpact(BackendImpact impact) {
- impact.registerImpact(transformed, elementEnvironment);
- backendUsage.processBackendImpact(impact);
+ impact.registerImpact(transformed, _elementEnvironment);
+ _backendUsageBuider.processBackendImpact(impact);
}
registerRequiredType(type);
- type.computeUnaliased(backend.resolution);
+ type.computeUnaliased(_resolution);
type = type.unaliased;
- registerImpact(impacts.typeCheck);
+ registerImpact(_impacts.typeCheck);
- bool inCheckedMode = backend.compiler.options.enableTypeAssertions;
+ bool inCheckedMode = _options.enableTypeAssertions;
if (inCheckedMode) {
- registerImpact(impacts.checkedModeTypeCheck);
+ registerImpact(_impacts.checkedModeTypeCheck);
}
if (type.isMalformed) {
- registerImpact(impacts.malformedTypeCheck);
+ registerImpact(_impacts.malformedTypeCheck);
}
if (!type.treatAsRaw || type.containsTypeVariables || type.isFunctionType) {
- registerImpact(impacts.genericTypeCheck);
+ registerImpact(_impacts.genericTypeCheck);
if (inCheckedMode) {
- registerImpact(impacts.genericCheckedModeTypeCheck);
+ registerImpact(_impacts.genericCheckedModeTypeCheck);
}
if (type.isTypeVariable) {
- registerImpact(impacts.typeVariableTypeCheck);
+ registerImpact(_impacts.typeVariableTypeCheck);
if (inCheckedMode) {
- registerImpact(impacts.typeVariableCheckedModeTypeCheck);
+ registerImpact(_impacts.typeVariableCheckedModeTypeCheck);
}
}
}
if (type is ResolutionFunctionType) {
- registerImpact(impacts.functionTypeCheck);
+ registerImpact(_impacts.functionTypeCheck);
}
if (type is ResolutionInterfaceType &&
- backend.nativeClassData.isNativeClass(type.element)) {
- registerImpact(impacts.nativeTypeCheck);
+ _nativeClassData.isNativeClass(type.element)) {
+ registerImpact(_impacts.nativeTypeCheck);
}
}
+}
+
+class CodegenImpactTransformer {
+ // TODO(johnniwinther): Remove the need for this.
+ final JavaScriptBackend _backend;
+
+ final CompilerOptions _options;
+ final ElementEnvironment _elementEnvironment;
+ final BackendHelpers _helpers;
+ final BackendImpacts _impacts;
+ final CheckedModeHelpers _checkedModeHelpers;
+ final NativeData _nativeData;
+ final RuntimeTypesNeed _rtiNeed;
+ final NativeCodegenEnqueuer _nativeCodegenEnqueuer;
+ final Namer _namer;
+ final MirrorsData _mirrorsData;
+ final OneShotInterceptorData _oneShotInterceptorData;
+ final LookupMapAnalysis _lookupMapAnalysis;
+ final CustomElementsCodegenAnalysis _customElementsCodegenAnalysis;
+
+ CodegenImpactTransformer(
+ this._backend,
+ this._options,
+ this._elementEnvironment,
+ this._helpers,
+ this._impacts,
+ this._checkedModeHelpers,
+ this._nativeData,
+ this._rtiNeed,
+ this._nativeCodegenEnqueuer,
+ this._namer,
+ this._mirrorsData,
+ this._oneShotInterceptorData,
+ this._lookupMapAnalysis,
+ this._customElementsCodegenAnalysis);
void onIsCheckForCodegen(
ResolutionDartType type, TransformedWorldImpact transformed) {
if (type.isDynamic) return;
type = type.unaliased;
- impacts.typeCheck.registerImpact(transformed, elementEnvironment);
+ _impacts.typeCheck.registerImpact(transformed, _elementEnvironment);
- bool inCheckedMode = backend.compiler.options.enableTypeAssertions;
+ bool inCheckedMode = _options.enableTypeAssertions;
// [registerIsCheck] is also called for checked mode checks, so we
// need to register checked mode helpers.
if (inCheckedMode) {
@@ -324,29 +381,29 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
// calls to [enqueue] with the resolution enqueuer serve as assertions
// that the helper was in fact added.
// TODO(13155): Find a way to enqueue helpers lazily.
- CheckedModeHelper helper = backend.checkedModeHelpers
- .getCheckedModeHelper(type, typeCast: false);
+ CheckedModeHelper helper =
+ _checkedModeHelpers.getCheckedModeHelper(type, typeCast: false);
if (helper != null) {
- StaticUse staticUse = helper.getStaticUse(backend.helpers);
+ StaticUse staticUse = helper.getStaticUse(_helpers);
transformed.registerStaticUse(staticUse);
}
// We also need the native variant of the check (for DOM types).
- helper = backend.checkedModeHelpers
- .getNativeCheckedModeHelper(type, typeCast: false);
+ helper =
+ _checkedModeHelpers.getNativeCheckedModeHelper(type, typeCast: false);
if (helper != null) {
- StaticUse staticUse = helper.getStaticUse(backend.helpers);
+ StaticUse staticUse = helper.getStaticUse(_helpers);
transformed.registerStaticUse(staticUse);
}
}
if (!type.treatAsRaw || type.containsTypeVariables) {
- impacts.genericIsCheck.registerImpact(transformed, elementEnvironment);
+ _impacts.genericIsCheck.registerImpact(transformed, _elementEnvironment);
}
if (type is ResolutionInterfaceType &&
- backend.nativeData.isNativeClass(type.element)) {
+ _nativeData.isNativeClass(type.element)) {
// We will neeed to add the "$is" and "$as" properties on the
// JavaScript object prototype, so we make sure
// [:defineProperty:] is compiled.
- impacts.nativeTypeCheck.registerImpact(transformed, elementEnvironment);
+ _impacts.nativeTypeCheck.registerImpact(transformed, _elementEnvironment);
}
}
@@ -358,7 +415,7 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
ResolutionDartType type = typeUse.type;
switch (typeUse.kind) {
case TypeUseKind.INSTANTIATION:
- backend.lookupMapAnalysis.registerInstantiatedType(type);
+ _lookupMapAnalysis.registerInstantiatedType(type);
break;
case TypeUseKind.IS_CHECK:
onIsCheckForCodegen(type, transformed);
@@ -368,63 +425,66 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
}
for (ConstantValue constant in impact.compileTimeConstants) {
- backend.computeImpactForCompileTimeConstant(constant, transformed,
+ _backend.computeImpactForCompileTimeConstant(constant, transformed,
forResolution: false);
- backend.addCompileTimeConstantForEmission(constant);
+ _backend.addCompileTimeConstantForEmission(constant);
}
for (Pair<ResolutionDartType, ResolutionDartType> check
in impact.typeVariableBoundsSubtypeChecks) {
- backend.registerTypeVariableBoundsSubtypeCheck(check.a, check.b);
+ _backend.registerTypeVariableBoundsSubtypeCheck(check.a, check.b);
}
for (StaticUse staticUse in impact.staticUses) {
switch (staticUse.kind) {
case StaticUseKind.CLOSURE:
LocalFunctionElement closure = staticUse.element;
- if (backend.rtiNeed.localFunctionNeedsRti(closure)) {
- impacts.computeSignature
- .registerImpact(transformed, elementEnvironment);
+ if (_rtiNeed.localFunctionNeedsRti(closure)) {
+ _impacts.computeSignature
+ .registerImpact(transformed, _elementEnvironment);
}
break;
case StaticUseKind.CONST_CONSTRUCTOR_INVOKE:
case StaticUseKind.CONSTRUCTOR_INVOKE:
- backend.lookupMapAnalysis.registerInstantiatedType(staticUse.type);
+ _lookupMapAnalysis.registerInstantiatedType(staticUse.type);
break;
default:
}
}
for (String name in impact.constSymbols) {
- backend.mirrorsData.registerConstSymbol(name);
+ _mirrorsData.registerConstSymbol(name);
}
for (Set<ClassElement> classes in impact.specializedGetInterceptors) {
- backend.oneShotInterceptorData
- .registerSpecializedGetInterceptor(classes, backend.namer);
+ _oneShotInterceptorData.registerSpecializedGetInterceptor(
+ classes, _namer);
}
if (impact.usesInterceptor) {
- if (backend.nativeCodegenEnqueuer.hasInstantiatedNativeClasses) {
- impacts.interceptorUse.registerImpact(transformed, elementEnvironment);
+ if (_nativeCodegenEnqueuer.hasInstantiatedNativeClasses) {
+ _impacts.interceptorUse
+ .registerImpact(transformed, _elementEnvironment);
}
}
for (ClassElement element in impact.typeConstants) {
- backend.customElementsCodegenAnalysis.registerTypeConstant(element);
- backend.lookupMapAnalysis.registerTypeConstant(element);
+ _customElementsCodegenAnalysis.registerTypeConstant(element);
+ _lookupMapAnalysis.registerTypeConstant(element);
}
for (FunctionElement element in impact.asyncMarkers) {
switch (element.asyncMarker) {
case AsyncMarker.ASYNC:
- impacts.asyncBody.registerImpact(transformed, elementEnvironment);
+ _impacts.asyncBody.registerImpact(transformed, _elementEnvironment);
break;
case AsyncMarker.SYNC_STAR:
- impacts.syncStarBody.registerImpact(transformed, elementEnvironment);
+ _impacts.syncStarBody
+ .registerImpact(transformed, _elementEnvironment);
break;
case AsyncMarker.ASYNC_STAR:
- impacts.asyncStarBody.registerImpact(transformed, elementEnvironment);
+ _impacts.asyncStarBody
+ .registerImpact(transformed, _elementEnvironment);
break;
}
}
« no previous file with comments | « pkg/compiler/lib/src/js_backend/backend.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698