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 99b449334a0f99394ed7e745734701baca2aa017..f0dea2b63733279017aa51bc39677131e29e55ca 100644 |
| --- a/pkg/compiler/lib/src/world.dart |
| +++ b/pkg/compiler/lib/src/world.dart |
| @@ -111,8 +111,8 @@ class World implements ClassWorld { |
| ClassElement get doubleClass => compiler.doubleClass; |
| ClassElement get stringClass => compiler.stringClass; |
| - Map<Selector, Map<ti.TypeMask, TypedSelector>> canonicalizedValues = |
| - new Map<Selector, Map<ti.TypeMask, TypedSelector>>(); |
| + List<Map<ClassElement, ti.TypeMask>> canonicalizedTypeMasks = |
| + new List<Map<ClassElement, ti.TypeMask>>.filled(8, null); |
|
herhut
2015/06/24 15:19:29
I don't like the magic 8 here but I also have no s
Johnni Winther
2015/06/25 07:25:28
Added a comment explaining the relation.
|
| bool checkInvariants(ClassElement cls, {bool mustBeInstantiated: true}) { |
| return |
| @@ -405,8 +405,8 @@ class World implements ClassWorld { |
| users.add(mixinApplication); |
| } |
| - bool hasAnyUserDefinedGetter(Selector selector) { |
| - return allFunctions.filter(selector).any((each) => each.isGetter); |
| + bool hasAnyUserDefinedGetter(Selector selector, ti.TypeMask mask) { |
| + return allFunctions.filter(selector, mask).any((each) => each.isGetter); |
| } |
| void registerUsedElement(Element element) { |
| @@ -415,16 +415,26 @@ class World implements ClassWorld { |
| } |
| } |
| - VariableElement locateSingleField(Selector selector) { |
| - Element result = locateSingleElement(selector); |
| + VariableElement locateSingleField(Selector selector, ti.TypeMask mask) { |
| + Element result = locateSingleElement(selector, mask); |
| return (result != null && result.isField) ? result : null; |
| } |
| - Element locateSingleElement(Selector selector) { |
| - ti.TypeMask mask = selector.mask == null |
| + Element locateSingleElement(Selector selector, ti.TypeMask mask) { |
| + mask = mask == null |
| ? compiler.typesTask.dynamicType |
| - : selector.mask; |
| - return mask.locateSingleElement(selector, compiler); |
| + : mask; |
| + return mask.locateSingleElement(selector, mask, compiler); |
| + } |
| + |
| + ti.TypeMask extendMaskIfReachesAll(Selector selector, ti.TypeMask mask) { |
| + bool canReachAll = true; |
| + if (mask != null) { |
| + canReachAll = |
| + compiler.enabledInvokeOn && |
| + mask.needsNoSuchMethodHandling(selector, this); |
| + } |
| + return canReachAll ? compiler.typesTask.dynamicType : mask; |
| } |
| void addFunctionCalledInLoop(Element element) { |
| @@ -475,11 +485,11 @@ class World implements ClassWorld { |
| sideEffectsFreeElements.add(element); |
| } |
| - SideEffects getSideEffectsOfSelector(Selector selector) { |
| + SideEffects getSideEffectsOfSelector(Selector selector, ti.TypeMask mask) { |
| // We're not tracking side effects of closures. |
| if (selector.isClosureCall) return new SideEffects(); |
| SideEffects sideEffects = new SideEffects.empty(); |
| - for (Element e in allFunctions.filter(selector)) { |
| + for (Element e in allFunctions.filter(selector, mask)) { |
| if (e.isField) { |
| if (selector.isGetter) { |
| if (!fieldNeverChanges(e)) { |