Index: sdk/lib/_internal/compiler/implementation/ssa/codegen.dart |
=================================================================== |
--- sdk/lib/_internal/compiler/implementation/ssa/codegen.dart (revision 14840) |
+++ sdk/lib/_internal/compiler/implementation/ssa/codegen.dart (working copy) |
@@ -1520,6 +1520,16 @@ |
arguments); |
} |
+ // TODO(ngeoffray): Once we remove the old interceptors, we can |
+ // start using HInvokeInterceptor to represent interceptor calls on |
+ // an Interceptor class. Currently we recognize if a call is a call |
+ // on an interceptor by checking if the arguments in the inputs list |
+ // is one more than the arguments in the selector. The extra |
+ // argument in an interceptor call is the actual receiver. |
+ bool isInterceptorCall(HInvokeDynamicMethod node) { |
+ return node.inputs.length - 1 != node.selector.argumentCount; |
+ } |
+ |
visitInvokeDynamicMethod(HInvokeDynamicMethod node) { |
use(node.receiver); |
js.Expression object = pop(); |
@@ -1541,7 +1551,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 +1983,11 @@ |
} |
visitThis(HThis node) { |
- push(new js.This()); |
+ if (backend.isInterceptorClass(work.element.getEnclosingClass())){ |
+ push(new js.VariableUse(variableNames.getName(node)), node); |
+ } else { |
+ push(new js.This()); |
+ } |
} |
visitThrow(HThrow node) { |