| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library tree_ir_nodes; | 5 library tree_ir_nodes; |
| 6 | 6 |
| 7 import '../constants/expressions.dart'; | 7 import '../constants/expressions.dart'; |
| 8 import '../constants/values.dart' as values; | 8 import '../constants/values.dart' as values; |
| 9 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType; | 9 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType; |
| 10 import '../elements/elements.dart'; | 10 import '../elements/elements.dart'; |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 | 185 |
| 186 accept(ExpressionVisitor visitor) => visitor.visitInvokeStatic(this); | 186 accept(ExpressionVisitor visitor) => visitor.visitInvokeStatic(this); |
| 187 accept1(ExpressionVisitor1 visitor, arg) { | 187 accept1(ExpressionVisitor1 visitor, arg) { |
| 188 return visitor.visitInvokeStatic(this, arg); | 188 return visitor.visitInvokeStatic(this, arg); |
| 189 } | 189 } |
| 190 } | 190 } |
| 191 | 191 |
| 192 /** | 192 /** |
| 193 * A call to a method, operator, getter, setter or index getter/setter. | 193 * A call to a method, operator, getter, setter or index getter/setter. |
| 194 * | 194 * |
| 195 * In contrast to the CPS-based IR, the receiver and arguments can be | 195 * If [receiver] is `null`, an error is thrown before the arguments are |
| 196 * arbitrary expressions. | 196 * evaluated. This corresponds to the JS evaluation order. |
| 197 */ | 197 */ |
| 198 class InvokeMethod extends Expression implements Invoke { | 198 class InvokeMethod extends Expression implements Invoke { |
| 199 Expression receiver; | 199 Expression receiver; |
| 200 final Selector selector; | 200 final Selector selector; |
| 201 final List<Expression> arguments; | 201 final List<Expression> arguments; |
| 202 | 202 |
| 203 /// If true, it is known that the receiver cannot be `null`. |
| 204 bool receiverIsNotNull = false; |
| 205 |
| 203 InvokeMethod(this.receiver, this.selector, this.arguments) { | 206 InvokeMethod(this.receiver, this.selector, this.arguments) { |
| 204 assert(receiver != null); | 207 assert(receiver != null); |
| 205 } | 208 } |
| 206 | 209 |
| 207 accept(ExpressionVisitor visitor) => visitor.visitInvokeMethod(this); | 210 accept(ExpressionVisitor visitor) => visitor.visitInvokeMethod(this); |
| 208 accept1(ExpressionVisitor1 visitor, arg) { | 211 accept1(ExpressionVisitor1 visitor, arg) { |
| 209 return visitor.visitInvokeMethod(this, arg); | 212 return visitor.visitInvokeMethod(this, arg); |
| 210 } | 213 } |
| 211 } | 214 } |
| 212 | 215 |
| 213 /// Invoke [target] on [receiver], bypassing ordinary dispatch semantics. | 216 /// Invoke [target] on [receiver], bypassing ordinary dispatch semantics. |
| 217 /// |
| 218 /// Since the [receiver] is not used for method lookup, it may be `null` |
| 219 /// without an error being thrown. |
| 214 class InvokeMethodDirectly extends Expression implements Invoke { | 220 class InvokeMethodDirectly extends Expression implements Invoke { |
| 215 Expression receiver; | 221 Expression receiver; |
| 216 final Element target; | 222 final Element target; |
| 217 final Selector selector; | 223 final Selector selector; |
| 218 final List<Expression> arguments; | 224 final List<Expression> arguments; |
| 219 | 225 |
| 220 InvokeMethodDirectly(this.receiver, this.target, this.selector, | 226 InvokeMethodDirectly(this.receiver, this.target, this.selector, |
| 221 this.arguments); | 227 this.arguments); |
| 222 | 228 |
| 223 accept(ExpressionVisitor visitor) => visitor.visitInvokeMethodDirectly(this); | 229 accept(ExpressionVisitor visitor) => visitor.visitInvokeMethodDirectly(this); |
| (...skipping 967 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1191 visitTypeExpression(TypeExpression node) { | 1197 visitTypeExpression(TypeExpression node) { |
| 1192 _replaceExpressions(node.arguments); | 1198 _replaceExpressions(node.arguments); |
| 1193 return node; | 1199 return node; |
| 1194 } | 1200 } |
| 1195 | 1201 |
| 1196 visitCreateInvocationMirror(CreateInvocationMirror node) { | 1202 visitCreateInvocationMirror(CreateInvocationMirror node) { |
| 1197 _replaceExpressions(node.arguments); | 1203 _replaceExpressions(node.arguments); |
| 1198 return node; | 1204 return node; |
| 1199 } | 1205 } |
| 1200 } | 1206 } |
| OLD | NEW |