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

Unified Diff: pkg/compiler/lib/src/js_emitter/class_stub_generator.dart

Issue 1182913003: Split TypedSelector into Selector and TypeMask. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 6 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/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 e21ba1daf0bd280ce3c6192fe7e634dee5d0c232..29db3367e22540136cc6d4b12fab516d0669f19c 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, Set<Selector> selectors) {
+ Element member, Map<Selector, TypeMaskSet> selectors) {
assert(invariant(member, member.isDeclaration));
// If the method is intercepted, the stub gets the
@@ -80,10 +80,15 @@ 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) {
- if (selector.applies(member, compiler.world)) {
- selector = selector.asUntyped;
- if (generatedSelectors.contains(selector)) continue;
+ 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;
+ }
+
generatedSelectors.add(selector);
String invocationName = namer.invocationName(selector);
@@ -122,25 +127,28 @@ class ClassStubGenerator {
return jsNames;
}
- void addNoSuchMethodHandlers(String ignore, Set<Selector> selectors) {
+ void addNoSuchMethodHandlers(String ignore,
+ Map<Selector, TypeMaskSet> selectors) {
TypeMask objectSubclassTypeMask =
new TypeMask.subclass(compiler.objectClass, compiler.world);
- for (Selector selector in selectors) {
- TypeMask mask = selector.mask;
- if (mask == null) mask = objectSubclassTypeMask;
+ for (Selector selector in selectors.keys) {
+ TypeMaskSet maskSet = selectors[selector];
+ for (TypeMask mask in maskSet.masks) {
+ if (mask == null) mask = objectSubclassTypeMask;
- if (!mask.needsNoSuchMethodHandling(selector, compiler.world)) {
- continue;
+ if (mask.needsNoSuchMethodHandling(selector, compiler.world)) {
+ String jsName = namer.invocationMirrorInternalName(selector);
+ jsNames[jsName] = selector;
+ break;
+ }
}
- String jsName = namer.invocationMirrorInternalName(selector);
- jsNames[jsName] = selector;
}
}
- compiler.codegenWorld.invokedNames.forEach(addNoSuchMethodHandlers);
- compiler.codegenWorld.invokedGetters.forEach(addNoSuchMethodHandlers);
- compiler.codegenWorld.invokedSetters.forEach(addNoSuchMethodHandlers);
+ compiler.codegenWorld.forEachInvokedName(addNoSuchMethodHandlers);
+ compiler.codegenWorld.forEachInvokedGetter(addNoSuchMethodHandlers);
+ compiler.codegenWorld.forEachInvokedSetter(addNoSuchMethodHandlers);
return jsNames;
}
« no previous file with comments | « pkg/compiler/lib/src/js_backend/codegen/codegen.dart ('k') | pkg/compiler/lib/src/js_emitter/js_emitter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698