| Index: pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
|
| diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
|
| index b4f111a98f3607b3778de5dc8cc8020083b9d610..f6ca56bfc34076969630ddc08aaab9893b253706 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
|
| @@ -193,12 +193,18 @@ class InvokeMethod extends Expression implements Invoke {
|
| final List<Reference<Primitive>> arguments;
|
|
|
| InvokeMethod(Primitive receiver,
|
| - this.selector,
|
| + Selector selector,
|
| Continuation cont,
|
| List<Primitive> args)
|
| - : receiver = new Reference<Primitive>(receiver),
|
| - continuation = new Reference<Continuation>(cont),
|
| - arguments = _referenceList(args) {
|
| + : this.internal(new Reference<Primitive>(receiver),
|
| + selector,
|
| + new Reference<Continuation>(cont),
|
| + _referenceList(args));
|
| +
|
| + InvokeMethod.internal(this.receiver,
|
| + this.selector,
|
| + this.continuation,
|
| + this.arguments) {
|
| assert(selector != null);
|
| assert(selector.kind == SelectorKind.CALL ||
|
| selector.kind == SelectorKind.OPERATOR ||
|
| @@ -208,6 +214,8 @@ class InvokeMethod extends Expression implements Invoke {
|
| (selector.kind == SelectorKind.INDEX && arguments.length == 2));
|
| }
|
|
|
| + bool get isIntercepted => receiver.definition is Interceptor;
|
| +
|
| accept(Visitor visitor) => visitor.visitInvokeMethod(this);
|
| }
|
|
|
| @@ -455,6 +463,14 @@ class Identical extends Primitive {
|
| accept(Visitor visitor) => visitor.visitIdentical(this);
|
| }
|
|
|
| +class Interceptor extends Primitive {
|
| + final Reference<Primitive> input;
|
| + final Set<ClassElement> interceptedClasses;
|
| + Interceptor(Primitive input, this.interceptedClasses)
|
| + : this.input = new Reference<Primitive>(input);
|
| + accept(Visitor visitor) => visitor.visitInterceptor(this);
|
| +}
|
| +
|
| class Constant extends Primitive {
|
| final ConstantExpression expression;
|
|
|
| @@ -690,6 +706,7 @@ abstract class Visitor<T> {
|
|
|
| // JavaScript specific nodes.
|
| T visitIdentical(Identical node) => visitPrimitive(node);
|
| + T visitInterceptor(Interceptor node) => visitPrimitive(node);
|
| }
|
|
|
| /// Recursively visits the entire CPS term, and calls abstract `process*`
|
| @@ -879,6 +896,12 @@ abstract class RecursiveVisitor extends Visitor {
|
| processReference(node.left);
|
| processReference(node.right);
|
| }
|
| +
|
| + processInterceptor(Interceptor node) {}
|
| + visitInterceptor(Interceptor node) {
|
| + processInterceptor(node);
|
| + processReference(node.input);
|
| + }
|
| }
|
|
|
| /// Keeps track of currently unused register indices.
|
| @@ -1063,5 +1086,8 @@ class RegisterAllocator extends Visitor {
|
| visitReference(node.left);
|
| visitReference(node.right);
|
| }
|
| -}
|
|
|
| + void visitInterceptor(Interceptor node) {
|
| + visitReference(node.input);
|
| + }
|
| +}
|
|
|