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 a7aac4e4f3d0fdc47aae1f65a53c44fb6a65292f..b93928279c174bfd35086e5bf8abe7d28d81a4bd 100644 |
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart |
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart |
@@ -519,6 +519,31 @@ class ApplyBuiltinOperator extends Primitive { |
bool get isSafeForReordering => true; |
} |
+/// Apply a built-in method. |
+/// |
+/// It must be known that the arguments have the proper types. |
+class ApplyBuiltinMethod extends Primitive { |
+ BuiltinMethod method; |
+ Reference<Primitive> receiver; |
+ List<Reference<Primitive>> arguments; |
+ final SourceInformation sourceInformation; |
+ |
+ bool receiverIsNotNull; |
+ |
+ ApplyBuiltinMethod(this.method, |
+ Primitive receiver, |
+ List<Primitive> arguments, |
+ this.sourceInformation, |
+ {this.receiverIsNotNull: false}) |
+ : this.receiver = new Reference<Primitive>(receiver), |
+ this.arguments = _referenceList(arguments); |
+ |
+ accept(Visitor visitor) => visitor.visitApplyBuiltinMethod(this); |
+ |
+ bool get isSafeForElimination => false; |
+ bool get isSafeForReordering => false; |
+} |
+ |
/// Throw a value. |
/// |
/// Throw is an expression, i.e., it always occurs in tail position with |
@@ -1156,6 +1181,7 @@ abstract class Visitor<T> { |
T visitCreateInvocationMirror(CreateInvocationMirror node); |
T visitTypeTest(TypeTest node); |
T visitApplyBuiltinOperator(ApplyBuiltinOperator node); |
+ T visitApplyBuiltinMethod(ApplyBuiltinMethod node); |
T visitGetLength(GetLength node); |
T visitGetIndex(GetIndex node); |
T visitSetIndex(SetIndex node); |
@@ -1426,6 +1452,13 @@ class LeafVisitor implements Visitor { |
node.arguments.forEach(processReference); |
} |
+ processApplyBuiltinMethod(ApplyBuiltinMethod node) {} |
+ visitApplyBuiltinMethod(ApplyBuiltinMethod node) { |
+ processApplyBuiltinMethod(node); |
+ processReference(node.receiver); |
+ node.arguments.forEach(processReference); |
+ } |
+ |
processForeignCode(ForeignCode node) {} |
visitForeignCode(ForeignCode node) { |
processForeignCode(node); |