Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(540)

Unified Diff: pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart

Issue 1092023002: CPS implementation of throw and rethrow. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698