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

Unified Diff: pkg/compiler/lib/src/world.dart

Issue 2814973003: Extract ClosedWorldRefiner implementation from ClosedWorldImpl to ClosedWorldBase (Closed)
Patch Set: Created 3 years, 8 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/world.dart
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index 907ef5743dda447a5bff1dde3db694729b0e1454..6a05a00e3807fd40be0678cc07cc33d8bc9c72e9 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -14,7 +14,6 @@ import 'elements/elements.dart'
show
ClassElement,
Element,
- FunctionElement,
MemberElement,
MixinApplicationElement,
TypedefElement;
@@ -299,23 +298,23 @@ abstract class ClosedWorld implements World {
FieldEntity locateSingleField(Selector selector, TypeMask mask);
/// Returns the side effects of executing [element].
- SideEffects getSideEffectsOfElement(Element element);
+ SideEffects getSideEffectsOfElement(Entity element);
/// Returns the side effects of calling [selector] on a receiver of type
/// [mask].
SideEffects getSideEffectsOfSelector(Selector selector, TypeMask mask);
/// Returns `true` if [element] is guaranteed not to throw an exception.
- bool getCannotThrow(Element element);
+ bool getCannotThrow(Entity element);
/// Returns `true` if [element] is called in a loop.
// TODO(johnniwinther): Is this 'potentially called' or 'known to be called'?
- bool isCalledInLoop(Element element);
+ bool isCalledInLoop(Entity element);
/// Returns `true` if [element] might be passed to `Function.apply`.
// TODO(johnniwinther): Is this 'passed invocation target` or
// `passed as argument`?
- bool getMightBePassedToApply(Element element);
+ bool getMightBePassedToApply(Entity element);
/// Returns a string representation of the closed world.
///
@@ -330,29 +329,29 @@ abstract class ClosedWorldRefiner {
ClosedWorld get closedWorld;
/// Registers the side [effects] of executing [element].
- void registerSideEffects(Element element, SideEffects effects);
+ void registerSideEffects(Entity element, SideEffects effects);
/// Registers the executing of [element] as without side effects.
- void registerSideEffectsFree(Element element);
+ void registerSideEffectsFree(Entity element);
/// Returns the currently known side effects of executing [element].
- SideEffects getCurrentlyKnownSideEffects(Element element);
+ SideEffects getCurrentlyKnownSideEffects(Entity element);
/// Registers that [element] might be passed to `Function.apply`.
// TODO(johnniwinther): Is this 'passed invocation target` or
// `passed as argument`?
- void registerMightBePassedToApply(Element element);
+ void registerMightBePassedToApply(Entity element);
/// Returns `true` if [element] might be passed to `Function.apply` given the
/// currently inferred information.
- bool getCurrentlyKnownMightBePassedToApply(Element element);
+ bool getCurrentlyKnownMightBePassedToApply(Entity element);
/// Registers that [element] is called in a loop.
// TODO(johnniwinther): Is this 'potentially called' or 'known to be called'?
- void addFunctionCalledInLoop(Element element);
+ void addFunctionCalledInLoop(Entity element);
/// Registers that [element] is guaranteed not to throw an exception.
- void registerCannotThrow(Element element);
+ void registerCannotThrow(Entity element);
/// Adds the closure class [cls] to the inference world. The class is
/// considered directly instantiated.
@@ -409,15 +408,14 @@ abstract class ClosedWorldBase implements ClosedWorld, ClosedWorldRefiner {
final Map<ClassEntity, Map<ClassEntity, bool>> _subtypeCoveredByCache =
<ClassEntity, Map<ClassEntity, bool>>{};
- final Set<Element> functionsCalledInLoop = new Set<Element>();
- final Map<Element, SideEffects> sideEffects = new Map<Element, SideEffects>();
+ final Set<Entity> _functionsCalledInLoop = new Set<Entity>();
+ final Map<Entity, SideEffects> _sideEffects = new Map<Entity, SideEffects>();
- final Set<Element> sideEffectsFreeElements = new Set<Element>();
+ final Set<Entity> _sideEffectsFreeElements = new Set<Entity>();
- final Set<Element> elementsThatCannotThrow = new Set<Element>();
+ final Set<Entity> _elementsThatCannotThrow = new Set<Entity>();
- final Set<Element> functionsThatMightBePassedToApply =
- new Set<FunctionElement>();
+ final Set<Entity> _functionsThatMightBePassedToApply = new Set<Entity>();
CommonMasks _commonMasks;
@@ -470,6 +468,8 @@ abstract class ClosedWorldBase implements ClosedWorld, ClosedWorldRefiner {
return cachedMasks.putIfAbsent(base, createMask);
}
+ bool _checkEntity(Entity element);
+
bool _checkClass(ClassEntity cls);
bool _checkInvariants(ClassEntity cls, {bool mustBeInstantiated: true});
@@ -902,6 +902,71 @@ abstract class ClosedWorldBase implements ClosedWorld, ClosedWorldRefiner {
}
return sideEffects;
}
+
+ SideEffects getSideEffectsOfElement(Entity element) {
Emily Fortuna 2017/04/12 18:07:18 getSideEffectsOfEntity?
Johnni Winther 2017/04/18 07:36:08 I'll stick with the name for now. I think needs to
+ assert(_checkEntity(element));
+ return _sideEffects.putIfAbsent(element, () {
+ return new SideEffects();
+ });
+ }
+
+ @override
+ SideEffects getCurrentlyKnownSideEffects(Entity element) {
+ return getSideEffectsOfElement(element);
+ }
+
+ void registerSideEffects(Entity element, SideEffects effects) {
+ assert(_checkEntity(element));
+ if (_sideEffectsFreeElements.contains(element)) return;
+ _sideEffects[element] = effects;
+ }
+
+ void registerSideEffectsFree(Entity element) {
+ assert(_checkEntity(element));
+ _sideEffects[element] = new SideEffects.empty();
+ _sideEffectsFreeElements.add(element);
+ }
+
+ void addFunctionCalledInLoop(Entity element) {
+ assert(_checkEntity(element));
+ _functionsCalledInLoop.add(element);
+ }
+
+ bool isCalledInLoop(Entity element) {
+ assert(_checkEntity(element));
+ return _functionsCalledInLoop.contains(element);
+ }
+
+ void registerCannotThrow(Entity element) {
+ assert(_checkEntity(element));
+ _elementsThatCannotThrow.add(element);
+ }
+
+ bool getCannotThrow(Entity element) {
+ return _elementsThatCannotThrow.contains(element);
+ }
+
+ void registerMightBePassedToApply(Entity element) {
+ _functionsThatMightBePassedToApply.add(element);
+ }
+
+ bool getMightBePassedToApply(Entity element) {
+ // We have to check whether the element we look at was created after
+ // type inference ran. This is currently only the case for the call
+ // method of function classes that were generated for function
+ // expressions. In such a case, we have to look at the original
+ // function expressions's element.
+ // TODO(herhut): Generate classes for function expressions earlier.
+ if (element is SynthesizedCallMethodElementX) {
+ return getMightBePassedToApply(element.expression);
+ }
+ return _functionsThatMightBePassedToApply.contains(element);
+ }
+
+ @override
+ bool getCurrentlyKnownMightBePassedToApply(Entity element) {
+ return getMightBePassedToApply(element);
+ }
}
class ClosedWorldImpl extends ClosedWorldBase {
@@ -927,6 +992,7 @@ class ClosedWorldImpl extends ClosedWorldBase {
classSets: classSets);
bool _checkClass(ClassElement cls) => cls.isDeclaration;
+ bool _checkEntity(Element element) => element.isDeclaration;
bool _checkInvariants(ClassElement cls, {bool mustBeInstantiated: true}) {
return invariant(cls, cls.isDeclaration,
@@ -1152,61 +1218,6 @@ class ClosedWorldImpl extends ClosedWorldBase {
// contain the side effects of the initializers.
assert(!element.isGenerativeConstructorBody);
assert(!element.isField);
- return sideEffects.putIfAbsent(element.declaration, () {
- return new SideEffects();
- });
- }
-
- @override
- SideEffects getCurrentlyKnownSideEffects(Element element) {
- return getSideEffectsOfElement(element);
- }
-
- void registerSideEffects(Element element, SideEffects effects) {
- if (sideEffectsFreeElements.contains(element)) return;
- sideEffects[element.declaration] = effects;
- }
-
- void registerSideEffectsFree(Element element) {
- sideEffects[element.declaration] = new SideEffects.empty();
- sideEffectsFreeElements.add(element);
- }
-
- void addFunctionCalledInLoop(Element element) {
- functionsCalledInLoop.add(element.declaration);
- }
-
- bool isCalledInLoop(Element element) {
- return functionsCalledInLoop.contains(element.declaration);
- }
-
- void registerCannotThrow(Element element) {
- elementsThatCannotThrow.add(element);
- }
-
- bool getCannotThrow(Element element) {
- return elementsThatCannotThrow.contains(element);
- }
-
- void registerMightBePassedToApply(Element element) {
- functionsThatMightBePassedToApply.add(element);
- }
-
- bool getMightBePassedToApply(Element element) {
- // We have to check whether the element we look at was created after
- // type inference ran. This is currently only the case for the call
- // method of function classes that were generated for function
- // expressions. In such a case, we have to look at the original
- // function expressions's element.
- // TODO(herhut): Generate classes for function expressions earlier.
- if (element is SynthesizedCallMethodElementX) {
- return getMightBePassedToApply(element.expression);
- }
- return functionsThatMightBePassedToApply.contains(element);
- }
-
- @override
- bool getCurrentlyKnownMightBePassedToApply(Element element) {
- return getMightBePassedToApply(element);
+ return super.getSideEffectsOfElement(element);
}
}
« no previous file with comments | « pkg/compiler/lib/src/ssa/builder.dart ('k') | tests/compiler/dart2js/embedded_category_api_boundary_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698