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

Unified Diff: pkg/compiler/lib/src/universe/codegen_world_builder.dart

Issue 2894893002: Add ElementCodegenWorldBuilder (Closed)
Patch Set: Updated cf. comments. Created 3 years, 7 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/ssa/ssa.dart ('k') | tests/compiler/dart2js/compiler_helper.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/universe/codegen_world_builder.dart
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index 05bcca7e314b7879357f48941c20e3572a5fe596..c135e726d8d9370123c8e60255f980831f032c15 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -28,9 +28,9 @@ abstract class CodegenWorldBuilder implements WorldBuilder {
f(String name, Map<Selector, SelectorConstraints> selectors));
/// Returns `true` if [member] is invoked as a setter.
- bool hasInvokedSetter(Element member, ClosedWorld world);
+ bool hasInvokedSetter(MemberEntity member, ClosedWorld world);
- bool hasInvokedGetter(Element member, ClosedWorld world);
+ bool hasInvokedGetter(MemberEntity member, ClosedWorld world);
Map<Selector, SelectorConstraints> invocationsByName(String name);
@@ -50,10 +50,10 @@ abstract class CodegenWorldBuilder implements WorldBuilder {
Iterable<FunctionEntity> get closurizedMembers;
}
-class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
- final NativeBasicData _nativeData;
+abstract class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
+ final ElementEnvironment _elementEnvironment;
+ final NativeBasicData _nativeBasicData;
final ClosedWorld _world;
- final JavaScriptConstantCompiler _constants;
/// The set of all directly instantiated classes, that is, classes with a
/// generative constructor that has been called directly and not only through
@@ -62,8 +62,7 @@ class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
/// Invariant: Elements are declaration elements.
// TODO(johnniwinther): [_directlyInstantiatedClasses] and
// [_instantiatedTypes] sets should be merged.
- final Set<ClassElement> _directlyInstantiatedClasses =
- new Set<ClassElement>();
+ final Set<ClassEntity> _directlyInstantiatedClasses = new Set<ClassEntity>();
/// The set of all directly instantiated types, that is, the types of the
/// directly instantiated classes.
@@ -72,12 +71,12 @@ class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
final Set<InterfaceType> _instantiatedTypes = new Set<InterfaceType>();
/// Classes implemented by directly instantiated classes.
- final Set<ClassElement> _implementedClasses = new Set<ClassElement>();
+ final Set<ClassEntity> _implementedClasses = new Set<ClassEntity>();
/// The set of all referenced static fields.
///
/// Invariant: Elements are declaration elements.
- final Set<FieldElement> allReferencedStaticFields = new Set<FieldElement>();
+ final Set<FieldEntity> allReferencedStaticFields = new Set<FieldEntity>();
/**
* Documentation wanted -- johnniwinther
@@ -95,8 +94,8 @@ class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
final Map<String, Map<Selector, SelectorConstraints>> _invokedSetters =
<String, Map<Selector, SelectorConstraints>>{};
- final Map<ClassElement, _ClassUsage> _processedClasses =
- <ClassElement, _ClassUsage>{};
+ final Map<ClassEntity, _ClassUsage> _processedClasses =
+ <ClassEntity, _ClassUsage>{};
/// Map of registered usage of static members of live classes.
final Map<Entity, _StaticMemberUsage> _staticMemberUsage =
@@ -116,7 +115,7 @@ class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
final Map<String, Set<_MemberUsage>> _instanceFunctionsByName =
<String, Set<_MemberUsage>>{};
- final Set<ResolutionDartType> isChecks = new Set<ResolutionDartType>();
+ final Set<DartType> isChecks = new Set<DartType>();
final SelectorConstraintsStrategy selectorConstraintsStrategy;
@@ -125,34 +124,17 @@ class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
/// Set of methods in instantiated classes that are potentially closurized.
final Set<FunctionEntity> closurizedMembers = new Set<FunctionEntity>();
- CodegenWorldBuilderImpl(this._nativeData, this._world, this._constants,
- this.selectorConstraintsStrategy);
-
- /// Calls [f] with every instance field, together with its declarer, in an
- /// instance of [cls].
- void forEachInstanceField(
- ClassElement cls, void f(ClassEntity declarer, FieldEntity field)) {
- cls.implementation
- .forEachInstanceField(f, includeSuperAndInjectedMembers: true);
- }
+ CodegenWorldBuilderImpl(this._elementEnvironment, this._nativeBasicData,
+ this._world, this.selectorConstraintsStrategy);
- @override
- void forEachParameter(
- MethodElement function, void f(DartType type, String name)) {
- FunctionSignature parameters = function.functionSignature;
- parameters.forEachParameter((ParameterElement parameter) {
- f(parameter.type, parameter.name);
- });
- }
-
- Iterable<ClassElement> get processedClasses => _processedClasses.keys
+ Iterable<ClassEntity> get processedClasses => _processedClasses.keys
.where((cls) => _processedClasses[cls].isInstantiated);
/// All directly instantiated classes, that is, classes with a generative
/// constructor that has been called directly and not only through a
/// super-call.
// TODO(johnniwinther): Improve semantic precision.
- Iterable<ClassElement> get directlyInstantiatedClasses {
+ Iterable<ClassEntity> get directlyInstantiatedClasses {
return _directlyInstantiatedClasses;
}
@@ -170,10 +152,10 @@ class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
// subclass and through subtype instantiated types/classes.
// TODO(johnniwinther): Support unknown type arguments for generic types.
void registerTypeInstantiation(
- ResolutionInterfaceType type, ClassUsedCallback classUsed,
+ InterfaceType type, ClassUsedCallback classUsed,
{bool byMirrors: false}) {
- ClassElement cls = type.element;
- bool isNative = _nativeData.isNativeClass(cls);
+ ClassEntity cls = type.element;
+ bool isNative = _nativeBasicData.isNativeClass(cls);
_instantiatedTypes.add(type);
if (!cls.isAbstract
// We can't use the closed-world assumption with native abstract
@@ -195,7 +177,7 @@ class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
// include the type arguments.
if (_implementedClasses.add(cls)) {
classUsed(cls, _getClassUsage(cls).implement());
- cls.allSupertypes.forEach((ResolutionInterfaceType supertype) {
+ _elementEnvironment.forEachSupertype(cls, (InterfaceType supertype) {
if (_implementedClasses.add(supertype.element)) {
classUsed(
supertype.element, _getClassUsage(supertype.element).implement());
@@ -205,7 +187,7 @@ class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
}
bool _hasMatchingSelector(Map<Selector, SelectorConstraints> selectors,
- MemberElement member, ClosedWorld world) {
+ MemberEntity member, ClosedWorld world) {
if (selectors == null) return false;
for (Selector selector in selectors.keys) {
if (selector.appliesUnnamed(member)) {
@@ -218,16 +200,16 @@ class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
return false;
}
- bool hasInvocation(Element member, ClosedWorld world) {
+ bool hasInvocation(MemberEntity member, ClosedWorld world) {
return _hasMatchingSelector(_invokedNames[member.name], member, world);
}
- bool hasInvokedGetter(Element member, ClosedWorld world) {
+ bool hasInvokedGetter(MemberEntity member, ClosedWorld world) {
return _hasMatchingSelector(_invokedGetters[member.name], member, world) ||
member.isFunction && methodsNeedingSuperGetter.contains(member);
}
- bool hasInvokedSetter(Element member, ClosedWorld world) {
+ bool hasInvokedSetter(MemberEntity member, ClosedWorld world) {
return _hasMatchingSelector(_invokedSetters[member.name], member, world);
}
@@ -318,28 +300,23 @@ class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
_invokedSetters.forEach(f);
}
- void registerIsCheck(ResolutionDartType type) {
- type = type.unaliased;
- // Even in checked mode, type annotations for return type and argument
- // types do not imply type checks, so there should never be a check
- // against the type variable of a typedef.
- assert(!type.isTypeVariable || !type.element.enclosingElement.isTypedef);
- isChecks.add(type);
+ void registerIsCheck(DartType type) {
+ isChecks.add(type.unaliased);
}
void _registerStaticUse(StaticUse staticUse) {
- Element element = staticUse.element;
- if (Elements.isStaticOrTopLevel(element) && element.isField) {
- allReferencedStaticFields.add(element);
+ if (staticUse.element is FieldEntity) {
+ FieldEntity field = staticUse.element;
+ if (field.isTopLevel || field.isStatic) {
+ allReferencedStaticFields.add(field);
+ }
}
switch (staticUse.kind) {
case StaticUseKind.STATIC_TEAR_OFF:
- MethodElement method = element;
- staticFunctionsNeedingGetter.add(method);
+ staticFunctionsNeedingGetter.add(staticUse.element);
break;
case StaticUseKind.SUPER_TEAR_OFF:
- MethodElement method = element;
- methodsNeedingSuperGetter.add(method);
+ methodsNeedingSuperGetter.add(staticUse.element);
break;
case StaticUseKind.SUPER_FIELD_SET:
case StaticUseKind.FIELD_SET:
@@ -357,12 +334,12 @@ class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
}
void registerStaticUse(StaticUse staticUse, MemberUsedCallback memberUsed) {
- Element element = staticUse.element;
- assert(invariant(element, element.isDeclaration,
- message: "Element ${element} is not the declaration."));
+ Entity element = staticUse.element;
_registerStaticUse(staticUse);
_StaticMemberUsage usage = _staticMemberUsage.putIfAbsent(element, () {
- if ((element.isStatic || element.isTopLevel) && element.isFunction) {
+ if (element is MemberEntity &&
+ (element.isStatic || element.isTopLevel) &&
+ element.isFunction) {
return new _StaticFunctionUsage(element);
} else {
return new _GeneralStaticMemberUsage(element);
@@ -413,22 +390,25 @@ class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
closurizedMembers.add(element);
}
- void processClassMembers(ClassElement cls, MemberUsedCallback memberUsed) {
- cls.implementation.forEachMember((_, MemberElement member) {
- assert(invariant(member, member.isDeclaration));
- if (!member.isInstanceMember) return;
- if (member.isMalformed) return;
- _getMemberUsage(member, memberUsed);
+ void processClassMembers(ClassEntity cls, MemberUsedCallback memberUsed) {
+ _elementEnvironment.forEachClassMember(cls,
+ (ClassEntity cls, MemberEntity member) {
+ _processInstantiatedClassMember(cls, member, memberUsed);
});
}
+ void _processInstantiatedClassMember(
+ ClassEntity cls, MemberEntity member, MemberUsedCallback memberUsed) {
+ if (!member.isInstanceMember) return;
+ _getMemberUsage(member, memberUsed);
+ }
+
_MemberUsage _getMemberUsage(
- MemberElement member, MemberUsedCallback memberUsed) {
- assert(invariant(member, member.isDeclaration));
+ MemberEntity member, MemberUsedCallback memberUsed) {
return _instanceMemberUsage.putIfAbsent(member, () {
String memberName = member.name;
- ClassElement cls = member.enclosingClass;
- bool isNative = _nativeData.isNativeClass(cls);
+ ClassEntity cls = member.enclosingClass;
+ bool isNative = _nativeBasicData.isNativeClass(cls);
_MemberUsage usage = new _MemberUsage(member, isNative: isNative);
EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
useSet.addAll(usage.appliedUse);
@@ -477,16 +457,15 @@ class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
}
/// Return the canonical [_ClassUsage] for [cls].
- _ClassUsage _getClassUsage(ClassElement cls) {
+ _ClassUsage _getClassUsage(ClassEntity cls) {
return _processedClasses.putIfAbsent(cls, () => new _ClassUsage(cls));
}
- void _processInstantiatedClass(
- ClassElement cls, ClassUsedCallback classUsed) {
+ void _processInstantiatedClass(ClassEntity cls, ClassUsedCallback classUsed) {
// Registers [superclass] as instantiated. Returns `true` if it wasn't
// already instantiated and we therefore have to process its superclass as
// well.
- bool processClass(ClassElement superclass) {
+ bool processClass(ClassEntity superclass) {
_ClassUsage usage = _getClassUsage(superclass);
if (!usage.isInstantiated) {
classUsed(usage.cls, usage.instantiate());
@@ -496,16 +475,108 @@ class CodegenWorldBuilderImpl implements CodegenWorldBuilder {
}
while (cls != null && processClass(cls)) {
- cls = cls.superclass;
+ cls = _elementEnvironment.getSuperClass(cls);
}
}
+ bool registerConstantUse(ConstantUse use);
+}
+
+class ElementCodegenWorldBuilderImpl extends CodegenWorldBuilderImpl {
+ final JavaScriptConstantCompiler _constants;
+
+ ElementCodegenWorldBuilderImpl(
+ ElementEnvironment elementEnvironment,
+ NativeBasicData nativeBasicData,
+ ClosedWorld world,
+ this._constants,
+ SelectorConstraintsStrategy selectorConstraintsStrategy)
+ : super(elementEnvironment, nativeBasicData, world,
+ selectorConstraintsStrategy);
+
+ /// Calls [f] with every instance field, together with its declarer, in an
+ /// instance of [cls].
+ void forEachInstanceField(
+ ClassElement cls, void f(ClassEntity declarer, FieldEntity field)) {
+ cls.implementation
+ .forEachInstanceField(f, includeSuperAndInjectedMembers: true);
+ }
+
+ @override
+ void forEachParameter(
+ MethodElement function, void f(DartType type, String name)) {
+ FunctionSignature parameters = function.functionSignature;
+ parameters.forEachParameter((ParameterElement parameter) {
+ f(parameter.type, parameter.name);
+ });
+ }
+
+ @override
+ void _processInstantiatedClassMember(
+ ClassEntity cls, MemberElement member, MemberUsedCallback memberUsed) {
+ assert(invariant(member, member.isDeclaration));
+ if (member.isMalformed) return;
+ super._processInstantiatedClassMember(cls, member, memberUsed);
+ }
+
+ @override
+ _MemberUsage _getMemberUsage(
+ MemberElement member, MemberUsedCallback memberUsed) {
+ assert(invariant(member, member.isDeclaration));
+ return super._getMemberUsage(member, memberUsed);
+ }
+
+ void registerStaticUse(StaticUse staticUse, MemberUsedCallback memberUsed) {
+ Element element = staticUse.element;
+ assert(invariant(element, element.isDeclaration,
+ message: "Element ${element} is not the declaration."));
+ super.registerStaticUse(staticUse, memberUsed);
+ }
+
/// Register the constant [use] with this world builder. Returns `true` if
/// the constant use was new to the world.
+ @override
bool registerConstantUse(ConstantUse use) {
if (use.kind == ConstantUseKind.DIRECT) {
_constants.addCompileTimeConstantForEmission(use.value);
}
return _constantValues.add(use.value);
}
+
+ void registerIsCheck(ResolutionDartType type) {
+ // Even in checked mode, type annotations for return type and argument
+ // types do not imply type checks, so there should never be a check
+ // against the type variable of a typedef.
+ assert(!type.isTypeVariable || !type.element.enclosingElement.isTypedef);
+ super.registerIsCheck(type);
+ }
+}
+
+class KernelCodegenWorldBuilder extends CodegenWorldBuilderImpl {
+ KernelCodegenWorldBuilder(
+ ElementEnvironment elementEnvironment,
+ NativeBasicData nativeBasicData,
+ ClosedWorld world,
+ SelectorConstraintsStrategy selectorConstraintsStrategy)
+ : super(elementEnvironment, nativeBasicData, world,
+ selectorConstraintsStrategy);
+
+ @override
+ bool registerConstantUse(ConstantUse use) {
+ throw new UnimplementedError(
+ 'KernelCodegenWorldBuilder.registerConstantUse');
+ }
+
+ @override
+ void forEachParameter(
+ FunctionEntity function, void f(DartType type, String name)) {
+ throw new UnimplementedError('KernelCodegenWorldBuilder.forEachParameter');
+ }
+
+ @override
+ void forEachInstanceField(
+ ClassEntity cls, void f(ClassEntity declarer, FieldEntity field)) {
+ throw new UnimplementedError(
+ 'KernelCodegenWorldBuilder.forEachInstanceField');
+ }
}
« no previous file with comments | « pkg/compiler/lib/src/ssa/ssa.dart ('k') | tests/compiler/dart2js/compiler_helper.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698