Chromium Code Reviews| Index: pkg/compiler/lib/src/world.dart |
| diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart |
| index 9fc0684087d1f22d7da98a04097b110ec6487e79..d9f5e23cc980d63dba8f19bab88744e3af028fa3 100644 |
| --- a/pkg/compiler/lib/src/world.dart |
| +++ b/pkg/compiler/lib/src/world.dart |
| @@ -4,7 +4,7 @@ |
| library dart2js.world; |
| -import 'closure.dart' show ClosureClassElement, SynthesizedCallMethodElementX; |
| +import 'closure.dart' show ClosureClassElement; |
| import 'common.dart'; |
| import 'constants/constant_system.dart'; |
| import 'common_elements.dart' show CommonElements, ElementEnvironment; |
| @@ -14,6 +14,7 @@ import 'elements/elements.dart' |
| ClassElement, |
| Element, |
| MemberElement, |
| + MethodElement, |
| MixinApplicationElement, |
| TypedefElement; |
| import 'elements/resolution_types.dart'; |
| @@ -311,23 +312,24 @@ abstract class ClosedWorld implements World { |
| FieldEntity locateSingleField(Selector selector, TypeMask mask); |
| /// Returns the side effects of executing [element]. |
| - SideEffects getSideEffectsOfElement(Entity element); |
| + SideEffects getSideEffectsOfElement(FunctionEntity 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(Entity element); |
| + bool getCannotThrow(FunctionEntity element); |
| /// Returns `true` if [element] is called in a loop. |
| // TODO(johnniwinther): Is this 'potentially called' or 'known to be called'? |
| - bool isCalledInLoop(Entity element); |
| + // TODO(johnniwinther): Change [MemberEntity] to [FunctionEntity]. |
| + bool isCalledInLoop(MemberEntity element); |
| /// Returns `true` if [element] might be passed to `Function.apply`. |
| // TODO(johnniwinther): Is this 'passed invocation target` or |
| // `passed as argument`? |
| - bool getMightBePassedToApply(Entity element); |
| + bool getMightBePassedToApply(FunctionEntity element); |
| /// Returns a string representation of the closed world. |
| /// |
| @@ -342,29 +344,29 @@ abstract class ClosedWorldRefiner { |
| ClosedWorld get closedWorld; |
| /// Registers the side [effects] of executing [element]. |
| - void registerSideEffects(Entity element, SideEffects effects); |
| + void registerSideEffects(FunctionEntity element, SideEffects effects); |
| /// Registers the executing of [element] as without side effects. |
| - void registerSideEffectsFree(Entity element); |
| + void registerSideEffectsFree(FunctionEntity element); |
| /// Returns the currently known side effects of executing [element]. |
| - SideEffects getCurrentlyKnownSideEffects(Entity element); |
| + SideEffects getCurrentlyKnownSideEffects(FunctionEntity element); |
| /// Registers that [element] might be passed to `Function.apply`. |
| // TODO(johnniwinther): Is this 'passed invocation target` or |
| // `passed as argument`? |
| - void registerMightBePassedToApply(Entity element); |
| + void registerMightBePassedToApply(FunctionEntity element); |
| /// Returns `true` if [element] might be passed to `Function.apply` given the |
| /// currently inferred information. |
| - bool getCurrentlyKnownMightBePassedToApply(Entity element); |
| + bool getCurrentlyKnownMightBePassedToApply(FunctionEntity element); |
| /// Registers that [element] is called in a loop. |
| // TODO(johnniwinther): Is this 'potentially called' or 'known to be called'? |
| - void addFunctionCalledInLoop(Entity element); |
| + void addFunctionCalledInLoop(MemberEntity element); |
| /// Registers that [element] is guaranteed not to throw an exception. |
| - void registerCannotThrow(Entity element); |
| + void registerCannotThrow(FunctionEntity element); |
| /// Adds the closure class [cls] to the inference world. The class is |
| /// considered directly instantiated. |
| @@ -423,14 +425,18 @@ abstract class ClosedWorldBase implements ClosedWorld, ClosedWorldRefiner { |
| final Map<ClassEntity, Map<ClassEntity, bool>> _subtypeCoveredByCache = |
| <ClassEntity, Map<ClassEntity, bool>>{}; |
| - final Set<Entity> _functionsCalledInLoop = new Set<Entity>(); |
| - final Map<Entity, SideEffects> _sideEffects = new Map<Entity, SideEffects>(); |
| + final Set<MemberEntity> _functionsCalledInLoop = new Set<MemberEntity>(); |
| + final Map<FunctionEntity, SideEffects> _sideEffects = |
| + new Map<FunctionEntity, SideEffects>(); |
| - final Set<Entity> _sideEffectsFreeElements = new Set<Entity>(); |
| + final Set<FunctionEntity> _sideEffectsFreeElements = |
| + new Set<FunctionEntity>(); |
| - final Set<Entity> _elementsThatCannotThrow = new Set<Entity>(); |
| + final Set<FunctionEntity> _elementsThatCannotThrow = |
| + new Set<FunctionEntity>(); |
| - final Set<Entity> _functionsThatMightBePassedToApply = new Set<Entity>(); |
| + final Set<FunctionEntity> _functionsThatMightBePassedToApply = |
| + new Set<FunctionEntity>(); |
| CommonMasks _commonMasks; |
| @@ -1081,7 +1087,7 @@ abstract class ClosedWorldBase implements ClosedWorld, ClosedWorldRefiner { |
| return sideEffects; |
| } |
| - SideEffects getSideEffectsOfElement(covariant Entity element) { |
| + SideEffects getSideEffectsOfElement(FunctionEntity element) { |
| assert(checkEntity(element)); |
| return _sideEffects.putIfAbsent(element, _makeSideEffects); |
| } |
| @@ -1089,60 +1095,51 @@ abstract class ClosedWorldBase implements ClosedWorld, ClosedWorldRefiner { |
| static SideEffects _makeSideEffects() => new SideEffects(); |
| @override |
| - SideEffects getCurrentlyKnownSideEffects(Entity element) { |
| + SideEffects getCurrentlyKnownSideEffects(FunctionEntity element) { |
| return getSideEffectsOfElement(element); |
| } |
| - void registerSideEffects(Entity element, SideEffects effects) { |
| + void registerSideEffects(FunctionEntity element, SideEffects effects) { |
| assert(checkEntity(element)); |
| if (_sideEffectsFreeElements.contains(element)) return; |
| _sideEffects[element] = effects; |
| } |
| - void registerSideEffectsFree(Entity element) { |
| + void registerSideEffectsFree(FunctionEntity element) { |
| assert(checkEntity(element)); |
| _sideEffects[element] = new SideEffects.empty(); |
| _sideEffectsFreeElements.add(element); |
| } |
| - void addFunctionCalledInLoop(Entity element) { |
| + void addFunctionCalledInLoop(MemberEntity element) { |
| assert(checkEntity(element)); |
| _functionsCalledInLoop.add(element); |
| } |
| - bool isCalledInLoop(Entity element) { |
| + bool isCalledInLoop(MemberEntity element) { |
| assert(checkEntity(element)); |
| return _functionsCalledInLoop.contains(element); |
| } |
| - void registerCannotThrow(Entity element) { |
| + void registerCannotThrow(FunctionEntity element) { |
| assert(checkEntity(element)); |
| _elementsThatCannotThrow.add(element); |
| } |
| - bool getCannotThrow(Entity element) { |
| + bool getCannotThrow(FunctionEntity element) { |
| return _elementsThatCannotThrow.contains(element); |
| } |
| - void registerMightBePassedToApply(Entity element) { |
| + void registerMightBePassedToApply(FunctionEntity 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); |
|
Siggi Cherem (dart-lang)
2017/06/30 18:13:54
neat to get rid of this, but this is unrelated to
Johnni Winther
2017/06/30 19:02:02
No, this was a fix for the same kind of discrepanc
Siggi Cherem (dart-lang)
2017/06/30 20:34:36
I see - the comment above was misleading, it gave
Johnni Winther
2017/07/03 07:26:07
When the comment was written they _were_ created a
|
| - } |
| + bool getMightBePassedToApply(FunctionEntity element) { |
| return _functionsThatMightBePassedToApply.contains(element); |
| } |
| @override |
| - bool getCurrentlyKnownMightBePassedToApply(Entity element) { |
| + bool getCurrentlyKnownMightBePassedToApply(FunctionEntity element) { |
| return getMightBePassedToApply(element); |
| } |
| @@ -1300,7 +1297,7 @@ class ClosedWorldImpl extends ClosedWorldBase { |
| } |
| } |
| - SideEffects getSideEffectsOfElement(Element element) { |
| + SideEffects getSideEffectsOfElement(covariant MethodElement element) { |
| // The type inferrer (where the side effects are being computed), |
| // does not see generative constructor bodies because they are |
| // created by the backend. Also, it does not make any distinction |