Index: pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart |
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart |
index d200e405e5cf36eef3aa733695a69536760dfbdf..2231d47d09705721d0006e6e73d88358f50d1c25 100644 |
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart |
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart |
@@ -192,14 +192,17 @@ class InvokeStatic extends Expression implements Invoke { |
/** |
* A call to a method, operator, getter, setter or index getter/setter. |
* |
- * In contrast to the CPS-based IR, the receiver and arguments can be |
- * arbitrary expressions. |
+ * If [receiver] is `null`, an error is thrown before the arguments are |
+ * evaluated. This corresponds to the JS evaluation order. |
*/ |
class InvokeMethod extends Expression implements Invoke { |
Expression receiver; |
final Selector selector; |
final List<Expression> arguments; |
+ /// If true, it is known that the receiver cannot be `null`. |
+ bool receiverIsNotNull = false; |
+ |
InvokeMethod(this.receiver, this.selector, this.arguments) { |
assert(receiver != null); |
} |
@@ -211,6 +214,9 @@ class InvokeMethod extends Expression implements Invoke { |
} |
/// Invoke [target] on [receiver], bypassing ordinary dispatch semantics. |
+/// |
+/// Since the [receiver] is not used for method lookup, it may be `null` |
+/// without an error being thrown. |
class InvokeMethodDirectly extends Expression implements Invoke { |
Expression receiver; |
final Element target; |