| 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 164663372e22cb8250b1c25be82a45353fa5b459..33ddf42ae34e5a423820f10242101cb3cd582983 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
|
| @@ -10,6 +10,9 @@ import '../elements/elements.dart';
|
| import '../io/source_information.dart' show SourceInformation;
|
| import '../universe/universe.dart' show Selector, SelectorKind;
|
|
|
| +import 'builtin_operator.dart';
|
| +export 'builtin_operator.dart';
|
| +
|
| abstract class Node {
|
| /// A pointer to the parent node. Is null until set by optimization passes.
|
| Node parent;
|
| @@ -119,7 +122,7 @@ class Reference<T extends Definition<T>> {
|
| /// During one-pass construction a LetPrim with an empty body is used to
|
| /// represent the one-hole context `let val x = V in []`.
|
| class LetPrim extends Expression implements InteriorNode {
|
| - final Primitive primitive;
|
| + Primitive primitive;
|
| Expression body;
|
|
|
| LetPrim(this.primitive, [this.body = null]);
|
| @@ -437,6 +440,19 @@ class ConcatenateStrings extends Expression {
|
| accept(Visitor visitor) => visitor.visitConcatenateStrings(this);
|
| }
|
|
|
| +/// Apply a built-in operator.
|
| +///
|
| +/// It must be known that the arguments have the proper types.
|
| +class ApplyBuiltinOperator extends Primitive {
|
| + BuiltinOperator operator;
|
| + List<Reference<Primitive>> arguments;
|
| +
|
| + ApplyBuiltinOperator(this.operator, List<Primitive> arguments)
|
| + : this.arguments = _referenceList(arguments);
|
| +
|
| + accept(Visitor visitor) => visitor.visitApplyBuiltinOperator(this);
|
| +}
|
| +
|
| /// Throw a value.
|
| ///
|
| /// Throw is an expression, i.e., it always occurs in tail position with
|
| @@ -536,14 +552,6 @@ class InvokeContinuation extends Expression {
|
| if (isRecursive) cont.isRecursive = true;
|
| }
|
|
|
| - /// Build a one-argument InvokeContinuation using existing reference objects.
|
| - ///
|
| - /// This is useful for converting call continuations to local continuations.
|
| - InvokeContinuation.fromCall(this.continuation,
|
| - Reference<Primitive> argument)
|
| - : arguments = <Reference<Primitive>>[argument],
|
| - isRecursive = false;
|
| -
|
| /// A continuation invocation whose target and arguments will be filled
|
| /// in later.
|
| ///
|
| @@ -952,6 +960,7 @@ abstract class Visitor<T> {
|
| T visitTypeExpression(TypeExpression node);
|
| T visitCreateInvocationMirror(CreateInvocationMirror node);
|
| T visitTypeTest(TypeTest node);
|
| + T visitApplyBuiltinOperator(ApplyBuiltinOperator node);
|
|
|
| // Conditions.
|
| T visitIsTrue(IsTrue node);
|
| @@ -1234,6 +1243,12 @@ class RecursiveVisitor implements Visitor {
|
| node.arguments.forEach(processReference);
|
| }
|
|
|
| + processApplyBuiltinOperator(ApplyBuiltinOperator node) {}
|
| + visitApplyBuiltinOperator(ApplyBuiltinOperator node) {
|
| + processApplyBuiltinOperator(node);
|
| + node.arguments.forEach(processReference);
|
| + }
|
| +
|
| processUnreachable(Unreachable node) {}
|
| visitUnreachable(Unreachable node) {
|
| processUnreachable(node);
|
|
|