| 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;
|
| }
|
|
|
|
|