| 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..413f0e1201a938405e47876168ca53ed228ade35 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
|
| @@ -208,6 +208,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 +457,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 +700,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 +890,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 +1080,8 @@ class RegisterAllocator extends Visitor {
|
| visitReference(node.left);
|
| visitReference(node.right);
|
| }
|
| -}
|
|
|
| + void visitInterceptor(Interceptor node) {
|
| + visitReference(node.input);
|
| + }
|
| +}
|
|
|