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

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

Issue 2742283002: Add ConstantUse to WorldImpact (Closed)
Patch Set: Cleanup. 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
Index: pkg/compiler/lib/src/js_backend/resolution_listener.dart
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index 152610aa8c85f63485d851750a693aaa9ad3098d..91702a4dfb00b308a7f5b702bcc968f9b3ac95ec 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -4,8 +4,10 @@
library js_backend.backend.resolution_listener;
+import '../common/backend_api.dart';
import '../common/names.dart' show Identifiers, Uris;
import '../common_elements.dart' show CommonElements, ElementEnvironment;
+import '../constants/values.dart';
import '../elements/elements.dart';
import '../elements/entities.dart';
import '../elements/types.dart';
@@ -36,10 +38,11 @@ class ResolutionEnqueuerListener extends EnqueuerListener {
final KernelTask _kernelTask;
final CompilerOptions _options;
+ final ElementEnvironment _elementEnvironment;
final CommonElements _commonElements;
final BackendHelpers _helpers;
final BackendImpacts _impacts;
- final ElementEnvironment _elementEnvironment;
+ final BackendClasses _backendClasses;
final NativeClassData _nativeData;
final InterceptorDataBuilder _interceptorData;
@@ -65,6 +68,7 @@ class ResolutionEnqueuerListener extends EnqueuerListener {
this._commonElements,
this._helpers,
this._impacts,
+ this._backendClasses,
this._nativeData,
this._interceptorData,
this._backendUsage,
@@ -217,6 +221,65 @@ class ResolutionEnqueuerListener extends EnqueuerListener {
return true;
}
+ /// Adds the impact of [constant] to [impactBuilder].
+ void _computeImpactForCompileTimeConstant(
+ ConstantValue constant, WorldImpactBuilder impactBuilder) {
+ _computeImpactForCompileTimeConstantInternal(constant, impactBuilder);
+
+ for (ConstantValue dependency in constant.getDependencies()) {
+ _computeImpactForCompileTimeConstant(dependency, impactBuilder);
+ }
+ }
+
+ void _computeImpactForCompileTimeConstantInternal(
+ ConstantValue constant, WorldImpactBuilder impactBuilder) {
+ DartType type = constant.getType(_commonElements);
+ _computeImpactForInstantiatedConstantType(type, impactBuilder);
+
+ if (constant.isFunction) {
+ FunctionConstantValue function = constant;
+ impactBuilder
+ .registerStaticUse(new StaticUse.staticTearOff(function.element));
+ } else if (constant.isInterceptor) {
+ // An interceptor constant references the class's prototype chain.
+ InterceptorConstantValue interceptor = constant;
+ ClassElement cls = interceptor.cls;
+ _computeImpactForInstantiatedConstantType(cls.thisType, impactBuilder);
+ } else if (constant.isType) {
+ MethodElement helper = _helpers.createRuntimeType;
+ impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
+ // TODO(johnniwinther): Find the right [CallStructure].
+ helper,
+ null));
+ _backendUsage.registerBackendFunctionUse(helper);
+ impactBuilder
+ .registerTypeUse(new TypeUse.instantiation(_backendClasses.typeType));
+ }
+ }
+
+ void _computeImpactForInstantiatedConstantType(
+ DartType type, WorldImpactBuilder impactBuilder) {
+ if (type is InterfaceType) {
+ impactBuilder.registerTypeUse(new TypeUse.instantiation(type));
+ if (type.element == _backendClasses.typeClass) {
+ // If we use a type literal in a constant, the compile time
+ // constant emitter will generate a call to the createRuntimeType
+ // helper so we register a use of that.
+ impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
+ // TODO(johnniwinther): Find the right [CallStructure].
+ _helpers.createRuntimeType,
+ null));
+ }
+ }
+ }
+
+ @override
+ WorldImpact registerUsedConstant(ConstantValue constant) {
+ WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
+ _computeImpactForCompileTimeConstant(constant, impactBuilder);
+ return impactBuilder;
+ }
+
@override
WorldImpact registerUsedElement(MemberElement member) {
WorldImpactBuilderImpl worldImpact = new WorldImpactBuilderImpl();

Powered by Google App Engine
This is Rietveld 408576698