Index: sdk/lib/_internal/compiler/implementation/ssa/codegen.dart |
=================================================================== |
--- sdk/lib/_internal/compiler/implementation/ssa/codegen.dart (revision 14732) |
+++ sdk/lib/_internal/compiler/implementation/ssa/codegen.dart (working copy) |
@@ -1520,6 +1520,13 @@ |
arguments); |
} |
+ // TODO(ngeoffray): Once we remove the old interceptors, we can |
ahe
2012/11/12 13:24:11
Perhaps elaborate on what the hack is.
ngeoffray
2012/11/13 11:45:16
Done.
|
+ // start using HInvokeInterceptor to represent interceptor calls on |
+ // an Interceptor class. |
+ bool isInterceptorCall(HInvokeDynamicMethod node) { |
+ return node.inputs.length - 1 != node.selector.argumentCount; |
+ } |
+ |
visitInvokeDynamicMethod(HInvokeDynamicMethod node) { |
use(node.receiver); |
js.Expression object = pop(); |
@@ -1541,7 +1548,14 @@ |
// Register this invocation to collect the types used at all call sites. |
Selector selector = getOptimizedSelectorFor(node, node.selector); |
- backend.registerDynamicInvocation(node, selector, types); |
+ // TODO(ngeoffray): Remove the following restriction. Because |
+ // the second input of this interceptor call is the actual |
+ // receiver (the first is the interceptor), the backend gets |
+ // confused. We should pass a list of types instead of a node to |
+ // [registerDynamicInvocation]. |
+ if (!isInterceptorCall(node)) { |
+ backend.registerDynamicInvocation(node, selector, types); |
+ } |
// If we don't know what we're calling or if we are calling a getter, |
// we need to register that fact that we may be calling a closure |
@@ -1966,7 +1980,11 @@ |
} |
visitThis(HThis node) { |
- push(new js.This()); |
+ if (compiler.isForeignClass(work.element.getEnclosingClass())){ |
ahe
2012/11/12 13:24:11
How about "interceptor class" instead of "foreign
ngeoffray
2012/11/13 11:45:16
Done.
|
+ push(new js.VariableUse(variableNames.getName(node)), node); |
+ } else { |
+ push(new js.This()); |
+ } |
} |
visitThrow(HThrow node) { |