Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart |
| index e4a4ad825268f78016408b3c07a567ed5a23077c..a7df4f5fd232f171eb69400a0a1531ed3949ed56 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart |
| @@ -215,7 +215,29 @@ class SsaSimplifyInterceptors extends HBaseVisitor |
| HInstruction receiver = node.receiver; |
| if (canUseSelfForInterceptor(receiver, interceptedClasses)) { |
| + var users = node.usedBy.toList(); |
|
floitsch
2013/12/18 19:20:12
We use types.
sra1
2013/12/19 03:28:15
Done.
|
| node.block.rewrite(node, receiver); |
| + |
| + // Replace occurences of the receiver in invocations with a dummy receiver |
| + // if the selector matches only methods that ignore the receiver. |
| + JavaScriptBackend backend = compiler.backend; |
| + for (var user in users) { |
|
floitsch
2013/12/18 19:20:12
ditto.
sra1
2013/12/19 03:28:15
Done.
|
| + if (user is HInvokeDynamic) { |
| + HInvokeDynamic invoke = user; |
| + if (invoke.getDartReceiver(compiler) == receiver |
| + && !backend.isInterceptedMixinSelector(invoke.selector)) { |
| + // [receiver] might not be the direct input since `node.receiver` |
| + // looks through type conversion nodes like [TypeKnown]. |
| + HInstruction immediateReceiver = invoke.inputs[1]; |
| + Constant constant = new DummyReceiverConstant( |
| + immediateReceiver.instructionType); |
| + var dummy = graph.addConstant(constant, compiler); |
|
floitsch
2013/12/18 19:20:12
ditto.
sra1
2013/12/19 03:28:15
Done.
|
| + immediateReceiver.usedBy.remove(invoke); |
| + invoke.inputs[1] = dummy; |
| + dummy.usedBy.add(invoke); |
| + } |
| + } |
| + } |
| return false; |
| } |