Chromium Code Reviews| Index: pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart |
| diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart |
| index 4c614c977ef00e8f1f3f49bf17a7089f411071f4..310cf86dc169e23c7b45ab97ba350675143e9f5b 100644 |
| --- a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart |
| +++ b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart |
| @@ -9,6 +9,7 @@ import '../dart_types.dart'; |
| import '../elements/elements.dart'; |
| import '../cps_ir/cps_ir_nodes.dart' as cps_ir; |
| import 'tree_ir_nodes.dart'; |
| +import '../js_backend/js_backend.dart'; |
| /** |
| * Builder translates from CPS-based IR to direct-style Tree. |
| @@ -162,7 +163,8 @@ class Builder extends cps_ir.Visitor<Node> { |
| List<Expression> translateArguments(List<cps_ir.Reference> args) { |
| return new List<Expression>.generate(args.length, |
| - (int index) => getVariableReference(args[index])); |
| + (int index) => getVariableReference(args[index]), |
| + growable: false); |
| } |
| List<Variable> translatePhiArguments(List<cps_ir.Reference> args) { |
| @@ -318,6 +320,16 @@ class Builder extends cps_ir.Visitor<Node> { |
| Statement visitInvokeMethod(cps_ir.InvokeMethod node) { |
| Expression receiver = getVariableReference(node.receiver); |
| List<Expression> arguments = translateArguments(node.arguments); |
| + if (node.isIntercepted) { |
| + // When this call is intercepted, the receiver is not actually an object, |
| + // but a prototype that implements the intercepted data types operations. |
| + // The value must be given as the first argument to the interceptor. |
| + cps_ir.Interceptor interceptor = node.receiver.definition; |
| + Expression target = getVariableReference(interceptor.input); |
| + arguments = new List<Expression>.generate(arguments.length + 1, |
| + (int index) => index == 0 ? target : arguments [index - 1], |
| + growable: false); |
| + } |
| Expression invoke = new InvokeMethod(receiver, node.selector, arguments); |
| return continueWithExpression(node.continuation, invoke); |
| } |
| @@ -480,14 +492,16 @@ class Builder extends cps_ir.Visitor<Node> { |
| Expression visitParameter(cps_ir.Parameter node) { |
| // Continuation parameters are not visited (continuations themselves are |
| // not visited yet). |
| - compiler.internalError(compiler.currentElement, 'Unexpected IR node.'); |
| + compiler.internalError(compiler.currentElement, |
| + 'Unexpected IR node: $node'); |
| return null; |
| } |
| Expression visitContinuation(cps_ir.Continuation node) { |
| // Until continuations with multiple uses are supported, they are not |
| // visited. |
| - compiler.internalError(compiler.currentElement, 'Unexpected IR node.'); |
| + compiler.internalError(compiler.currentElement, |
| + 'Unexpected IR node: $node.'); |
| return null; |
| } |
| @@ -506,5 +520,15 @@ class Builder extends cps_ir.Visitor<Node> { |
| <Expression>[getVariableReference(node.left), |
| getVariableReference(node.right)]); |
| } |
| + |
| + Expression visitInterceptor(cps_ir.Interceptor node) { |
| + JavaScriptBackend backend = compiler.backend; |
| + Element getInterceptor = backend.getInterceptorMethod; |
|
sigurdm
2014/12/16 11:44:56
I think we should go via Glue here.
karlklose
2014/12/16 12:04:03
Done.
|
| + backend.registerUseInterceptor(compiler.enqueuer.codegen); |
| + return new InvokeStatic( |
| + getInterceptor, |
| + new dart2js.Selector.fromElement(getInterceptor), |
| + <Expression>[getVariableReference(node.input)]); |
| + } |
| } |