Chromium Code Reviews| 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) { |