Index: pkg/compiler/lib/src/js_emitter/class_stub_generator.dart |
diff --git a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart |
index 29db3367e22540136cc6d4b12fab516d0669f19c..e21ba1daf0bd280ce3c6192fe7e634dee5d0c232 100644 |
--- a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart |
+++ b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart |
@@ -48,7 +48,7 @@ class ClassStubGenerator { |
* Invariant: [member] must be a declaration element. |
*/ |
Map<String, jsAst.Expression> generateCallStubsForGetter( |
- Element member, Map<Selector, TypeMaskSet> selectors) { |
+ Element member, Set<Selector> selectors) { |
assert(invariant(member, member.isDeclaration)); |
// If the method is intercepted, the stub gets the |
@@ -80,15 +80,10 @@ class ClassStubGenerator { |
// identical stubs for each we track untyped selectors which already have |
// stubs. |
Set<Selector> generatedSelectors = new Set<Selector>(); |
- for (Selector selector in selectors.keys) { |
- if (generatedSelectors.contains(selector)) continue; |
- if (!selector.appliesUnnamed(member, compiler.world)) continue; |
- for (TypeMask mask in selectors[selector].masks) { |
- if (mask != null && |
- !mask.canHit(member, selector, compiler.world)) { |
- continue; |
- } |
- |
+ for (Selector selector in selectors) { |
+ if (selector.applies(member, compiler.world)) { |
+ selector = selector.asUntyped; |
+ if (generatedSelectors.contains(selector)) continue; |
generatedSelectors.add(selector); |
String invocationName = namer.invocationName(selector); |
@@ -127,28 +122,25 @@ class ClassStubGenerator { |
return jsNames; |
} |
- void addNoSuchMethodHandlers(String ignore, |
- Map<Selector, TypeMaskSet> selectors) { |
+ void addNoSuchMethodHandlers(String ignore, Set<Selector> selectors) { |
TypeMask objectSubclassTypeMask = |
new TypeMask.subclass(compiler.objectClass, compiler.world); |
- for (Selector selector in selectors.keys) { |
- TypeMaskSet maskSet = selectors[selector]; |
- for (TypeMask mask in maskSet.masks) { |
- if (mask == null) mask = objectSubclassTypeMask; |
+ for (Selector selector in selectors) { |
+ TypeMask mask = selector.mask; |
+ if (mask == null) mask = objectSubclassTypeMask; |
- if (mask.needsNoSuchMethodHandling(selector, compiler.world)) { |
- String jsName = namer.invocationMirrorInternalName(selector); |
- jsNames[jsName] = selector; |
- break; |
- } |
+ if (!mask.needsNoSuchMethodHandling(selector, compiler.world)) { |
+ continue; |
} |
+ String jsName = namer.invocationMirrorInternalName(selector); |
+ jsNames[jsName] = selector; |
} |
} |
- compiler.codegenWorld.forEachInvokedName(addNoSuchMethodHandlers); |
- compiler.codegenWorld.forEachInvokedGetter(addNoSuchMethodHandlers); |
- compiler.codegenWorld.forEachInvokedSetter(addNoSuchMethodHandlers); |
+ compiler.codegenWorld.invokedNames.forEach(addNoSuchMethodHandlers); |
+ compiler.codegenWorld.invokedGetters.forEach(addNoSuchMethodHandlers); |
+ compiler.codegenWorld.invokedSetters.forEach(addNoSuchMethodHandlers); |
return jsNames; |
} |