| 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 2d538659ab78b9e24b48b37491313081300ad749..5d2e74669f712643e2c5ed6f2787563bf228ab1c 100644
|
| --- a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
|
| +++ b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
|
| @@ -582,6 +582,35 @@ class Return extends Statement {
|
| accept1(StatementVisitor1 visitor, arg) => visitor.visitReturn(this, arg);
|
| }
|
|
|
| +/// A throw statement.
|
| +///
|
| +/// In the Tree IR, throw is a statement (like JavaScript and unlike Dart).
|
| +class Throw extends Statement {
|
| + Expression value;
|
| +
|
| + Statement get next => null;
|
| + void set next(Statement s) => throw 'UNREACHABLE';
|
| +
|
| + Throw(this.value);
|
| +
|
| + accept(StatementVisitor visitor) => visitor.visitThrow(this);
|
| + accept1(StatementVisitor1 visitor, arg) => visitor.visitThrow(this, arg);
|
| +}
|
| +
|
| +/// A rethrow exit from the function.
|
| +///
|
| +/// Rethrow can only occur nested inside a catch block. It implicitly throws
|
| +/// the block's caught exception value without changing the caught stack trace.
|
| +class Rethrow extends Statement {
|
| + Statement get next => null;
|
| + void set next(Statement s) => throw 'UNREACHABLE';
|
| +
|
| + Rethrow();
|
| +
|
| + accept(StatementVisitor visitor) => visitor.visitRethrow(this);
|
| + accept1(StatementVisitor1 visitor, arg) => visitor.visitRethrow(this, arg);
|
| +}
|
| +
|
| /**
|
| * A conditional branch based on the true value of an [Expression].
|
| */
|
| @@ -948,6 +977,8 @@ abstract class StatementVisitor<S> {
|
| S visitStatement(Statement node) => node.accept(this);
|
| S visitLabeledStatement(LabeledStatement node);
|
| S visitReturn(Return node);
|
| + S visitThrow(Throw node);
|
| + S visitRethrow(Rethrow node);
|
| S visitBreak(Break node);
|
| S visitContinue(Continue node);
|
| S visitIf(If node);
|
| @@ -963,6 +994,8 @@ abstract class StatementVisitor1<S, A> {
|
| S visitStatement(Statement node, A arg) => node.accept1(this, arg);
|
| S visitLabeledStatement(LabeledStatement node, A arg);
|
| S visitReturn(Return node, A arg);
|
| + S visitThrow(Throw node, A arg);
|
| + S visitRethrow(Rethrow node, A arg);
|
| S visitBreak(Break node, A arg);
|
| S visitContinue(Continue node, A arg);
|
| S visitIf(If node, A arg);
|
| @@ -1094,6 +1127,12 @@ abstract class RecursiveVisitor implements StatementVisitor, ExpressionVisitor {
|
| visitExpression(node.value);
|
| }
|
|
|
| + visitThrow(Throw node) {
|
| + visitExpression(node.value);
|
| + }
|
| +
|
| + visitRethrow(Rethrow node) {}
|
| +
|
| visitBreak(Break node) {}
|
|
|
| visitContinue(Continue node) {}
|
| @@ -1273,6 +1312,13 @@ class RecursiveTransformer extends Transformer {
|
| return node;
|
| }
|
|
|
| + visitThrow(Throw node) {
|
| + node.value = visitExpression(node.value);
|
| + return node;
|
| + }
|
| +
|
| + visitRethrow(Rethrow node) => node;
|
| +
|
| visitBreak(Break node) => node;
|
|
|
| visitContinue(Continue node) => node;
|
|
|