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/values.dart' as values; | 7 import '../constants/values.dart' as values; |
8 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType; | 8 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType; |
9 import '../elements/elements.dart'; | 9 import '../elements/elements.dart'; |
10 import '../io/source_information.dart' show SourceInformation; | 10 import '../io/source_information.dart' show SourceInformation; |
(...skipping 939 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
950 | 950 |
951 accept(StatementVisitor visitor) { | 951 accept(StatementVisitor visitor) { |
952 return visitor.visitYield(this); | 952 return visitor.visitYield(this); |
953 } | 953 } |
954 | 954 |
955 accept1(StatementVisitor1 visitor, arg) { | 955 accept1(StatementVisitor1 visitor, arg) { |
956 return visitor.visitYield(this, arg); | 956 return visitor.visitYield(this, arg); |
957 } | 957 } |
958 } | 958 } |
959 | 959 |
| 960 class NullCheck extends Statement { |
| 961 Expression condition; |
| 962 Expression value; |
| 963 Selector selector; |
| 964 Statement next; |
| 965 SourceInformation sourceInformation; |
| 966 |
| 967 NullCheck({this.condition, this.value, this.selector, this.next, |
| 968 this.sourceInformation}); |
| 969 |
| 970 accept(StatementVisitor visitor) { |
| 971 return visitor.visitNullCheck(this); |
| 972 } |
| 973 |
| 974 accept1(StatementVisitor1 visitor, arg) { |
| 975 return visitor.visitNullCheck(this, arg); |
| 976 } |
| 977 } |
| 978 |
960 abstract class ExpressionVisitor<E> { | 979 abstract class ExpressionVisitor<E> { |
961 E visitExpression(Expression node) => node.accept(this); | 980 E visitExpression(Expression node) => node.accept(this); |
962 E visitVariableUse(VariableUse node); | 981 E visitVariableUse(VariableUse node); |
963 E visitAssign(Assign node); | 982 E visitAssign(Assign node); |
964 E visitInvokeStatic(InvokeStatic node); | 983 E visitInvokeStatic(InvokeStatic node); |
965 E visitInvokeMethod(InvokeMethod node); | 984 E visitInvokeMethod(InvokeMethod node); |
966 E visitInvokeMethodDirectly(InvokeMethodDirectly node); | 985 E visitInvokeMethodDirectly(InvokeMethodDirectly node); |
967 E visitInvokeConstructor(InvokeConstructor node); | 986 E visitInvokeConstructor(InvokeConstructor node); |
968 E visitConstant(Constant node); | 987 E visitConstant(Constant node); |
969 E visitThis(This node); | 988 E visitThis(This node); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1040 S visitBreak(Break node); | 1059 S visitBreak(Break node); |
1041 S visitContinue(Continue node); | 1060 S visitContinue(Continue node); |
1042 S visitIf(If node); | 1061 S visitIf(If node); |
1043 S visitWhileTrue(WhileTrue node); | 1062 S visitWhileTrue(WhileTrue node); |
1044 S visitFor(For node); | 1063 S visitFor(For node); |
1045 S visitExpressionStatement(ExpressionStatement node); | 1064 S visitExpressionStatement(ExpressionStatement node); |
1046 S visitTry(Try node); | 1065 S visitTry(Try node); |
1047 S visitUnreachable(Unreachable node); | 1066 S visitUnreachable(Unreachable node); |
1048 S visitForeignStatement(ForeignStatement node); | 1067 S visitForeignStatement(ForeignStatement node); |
1049 S visitYield(Yield node); | 1068 S visitYield(Yield node); |
| 1069 S visitNullCheck(NullCheck node); |
1050 } | 1070 } |
1051 | 1071 |
1052 abstract class StatementVisitor1<S, A> { | 1072 abstract class StatementVisitor1<S, A> { |
1053 S visitStatement(Statement node, A arg) => node.accept1(this, arg); | 1073 S visitStatement(Statement node, A arg) => node.accept1(this, arg); |
1054 S visitLabeledStatement(LabeledStatement node, A arg); | 1074 S visitLabeledStatement(LabeledStatement node, A arg); |
1055 S visitReturn(Return node, A arg); | 1075 S visitReturn(Return node, A arg); |
1056 S visitThrow(Throw node, A arg); | 1076 S visitThrow(Throw node, A arg); |
1057 S visitRethrow(Rethrow node, A arg); | 1077 S visitRethrow(Rethrow node, A arg); |
1058 S visitBreak(Break node, A arg); | 1078 S visitBreak(Break node, A arg); |
1059 S visitContinue(Continue node, A arg); | 1079 S visitContinue(Continue node, A arg); |
1060 S visitIf(If node, A arg); | 1080 S visitIf(If node, A arg); |
1061 S visitWhileTrue(WhileTrue node, A arg); | 1081 S visitWhileTrue(WhileTrue node, A arg); |
1062 S visitFor(For node, A arg); | 1082 S visitFor(For node, A arg); |
1063 S visitExpressionStatement(ExpressionStatement node, A arg); | 1083 S visitExpressionStatement(ExpressionStatement node, A arg); |
1064 S visitTry(Try node, A arg); | 1084 S visitTry(Try node, A arg); |
1065 S visitUnreachable(Unreachable node, A arg); | 1085 S visitUnreachable(Unreachable node, A arg); |
1066 S visitForeignStatement(ForeignStatement node, A arg); | 1086 S visitForeignStatement(ForeignStatement node, A arg); |
1067 S visitYield(Yield node, A arg); | 1087 S visitYield(Yield node, A arg); |
| 1088 S visitNullCheck(NullCheck node, A arg); |
1068 } | 1089 } |
1069 | 1090 |
1070 abstract class RecursiveVisitor implements StatementVisitor, ExpressionVisitor { | 1091 abstract class RecursiveVisitor implements StatementVisitor, ExpressionVisitor { |
1071 visitExpression(Expression e) => e.accept(this); | 1092 visitExpression(Expression e) => e.accept(this); |
1072 visitStatement(Statement s) => s.accept(this); | 1093 visitStatement(Statement s) => s.accept(this); |
1073 | 1094 |
1074 visitVariable(Variable variable) {} | 1095 visitVariable(Variable variable) {} |
1075 | 1096 |
1076 visitVariableUse(VariableUse node) { | 1097 visitVariableUse(VariableUse node) { |
1077 visitVariable(node.variable); | 1098 visitVariable(node.variable); |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1270 } | 1291 } |
1271 | 1292 |
1272 visitAwait(Await node) { | 1293 visitAwait(Await node) { |
1273 visitExpression(node.input); | 1294 visitExpression(node.input); |
1274 } | 1295 } |
1275 | 1296 |
1276 visitYield(Yield node) { | 1297 visitYield(Yield node) { |
1277 visitExpression(node.input); | 1298 visitExpression(node.input); |
1278 visitStatement(node.next); | 1299 visitStatement(node.next); |
1279 } | 1300 } |
| 1301 |
| 1302 visitNullCheck(NullCheck node) { |
| 1303 if (node.condition != null) visitExpression(node.condition); |
| 1304 visitExpression(node.value); |
| 1305 visitStatement(node.next); |
| 1306 } |
1280 } | 1307 } |
1281 | 1308 |
1282 abstract class Transformer implements ExpressionVisitor<Expression>, | 1309 abstract class Transformer implements ExpressionVisitor<Expression>, |
1283 StatementVisitor<Statement> { | 1310 StatementVisitor<Statement> { |
1284 Expression visitExpression(Expression e) => e.accept(this); | 1311 Expression visitExpression(Expression e) => e.accept(this); |
1285 Statement visitStatement(Statement s) => s.accept(this); | 1312 Statement visitStatement(Statement s) => s.accept(this); |
1286 } | 1313 } |
1287 | 1314 |
1288 class RecursiveTransformer extends Transformer { | 1315 class RecursiveTransformer extends Transformer { |
1289 void _replaceExpressions(List<Expression> list) { | 1316 void _replaceExpressions(List<Expression> list) { |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1527 visitAwait(Await node) { | 1554 visitAwait(Await node) { |
1528 node.input = visitExpression(node.input); | 1555 node.input = visitExpression(node.input); |
1529 return node; | 1556 return node; |
1530 } | 1557 } |
1531 | 1558 |
1532 visitYield(Yield node) { | 1559 visitYield(Yield node) { |
1533 node.input = visitExpression(node.input); | 1560 node.input = visitExpression(node.input); |
1534 node.next = visitStatement(node.next); | 1561 node.next = visitStatement(node.next); |
1535 return node; | 1562 return node; |
1536 } | 1563 } |
| 1564 |
| 1565 visitNullCheck(NullCheck node) { |
| 1566 if (node.condition != null) { |
| 1567 node.condition = visitExpression(node.condition); |
| 1568 } |
| 1569 node.value = visitExpression(node.value); |
| 1570 node.next = visitStatement(node.next); |
| 1571 return node; |
| 1572 } |
1537 } | 1573 } |
1538 | 1574 |
1539 class FallthroughTarget { | 1575 class FallthroughTarget { |
1540 final Statement target; | 1576 final Statement target; |
1541 int useCount = 0; | 1577 int useCount = 0; |
1542 | 1578 |
1543 FallthroughTarget(this.target); | 1579 FallthroughTarget(this.target); |
1544 } | 1580 } |
1545 | 1581 |
1546 /// A stack machine for tracking fallthrough while traversing the Tree IR. | 1582 /// A stack machine for tracking fallthrough while traversing the Tree IR. |
(...skipping 17 matching lines...) Expand all Loading... |
1564 | 1600 |
1565 /// Number of uses of the current fallthrough target. | 1601 /// Number of uses of the current fallthrough target. |
1566 int get useCount => _stack.last.useCount; | 1602 int get useCount => _stack.last.useCount; |
1567 | 1603 |
1568 /// Indicate that a statement will fall through to the current fallthrough | 1604 /// Indicate that a statement will fall through to the current fallthrough |
1569 /// target. | 1605 /// target. |
1570 void use() { | 1606 void use() { |
1571 ++_stack.last.useCount; | 1607 ++_stack.last.useCount; |
1572 } | 1608 } |
1573 } | 1609 } |
OLD | NEW |