Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(634)

Unified Diff: pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart

Issue 806103003: cps-ir: Add support for intercepted calls. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Disable debug print. Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)]);
+ }
}

Powered by Google App Engine
This is Rietveld 408576698