Index: src/compiler/control-builders.h |
diff --git a/src/compiler/control-builders.h b/src/compiler/control-builders.h |
index 7ab12d892cdd6dc727a676fd18e1adb078fff0ce..d190f61f5dc2b480b2910fbebc1bb97c6e261577 100644 |
--- a/src/compiler/control-builders.h |
+++ b/src/compiler/control-builders.h |
@@ -15,16 +15,15 @@ namespace internal { |
namespace compiler { |
// Base class for all control builders. Also provides a common interface for |
-// control builders to handle 'break' and 'continue' statements when they are |
-// used to model breakable statements. |
+// control builders to handle 'break' statements when they are used to model |
+// breakable statements. |
class ControlBuilder { |
public: |
explicit ControlBuilder(AstGraphBuilder* builder) : builder_(builder) {} |
virtual ~ControlBuilder() {} |
- // Interface for break and continue. |
+ // Interface for break. |
virtual void Break() { UNREACHABLE(); } |
- virtual void Continue() { UNREACHABLE(); } |
protected: |
typedef AstGraphBuilder Builder; |
@@ -69,11 +68,11 @@ class LoopBuilder FINAL : public ControlBuilder { |
// Primitive control commands. |
void BeginLoop(BitVector* assigned, bool is_osr = false); |
+ void Continue(); |
void EndBody(); |
void EndLoop(); |
- // Primitive support for break and continue. |
- void Continue() FINAL; |
+ // Primitive support for break. |
void Break() FINAL; |
// Compound control commands for conditional break. |
@@ -137,6 +136,54 @@ class BlockBuilder FINAL : public ControlBuilder { |
Environment* break_environment_; // Environment after the block exits. |
}; |
+ |
+// Tracks control flow for a try-catch statement. |
+class TryCatchBuilder FINAL : public ControlBuilder { |
+ public: |
+ explicit TryCatchBuilder(AstGraphBuilder* builder) |
+ : ControlBuilder(builder), |
+ catch_environment_(NULL), |
+ exit_environment_(NULL), |
+ exception_node_(NULL) {} |
+ |
+ // Primitive control commands. |
+ void BeginTry(); |
+ void Throw(Node* exception); |
+ void EndTry(); |
+ void EndCatch(); |
+ |
+ // Returns the exception value inside the 'catch' body. |
+ Node* GetExceptionNode() const { return exception_node_; } |
+ |
+ private: |
+ Environment* catch_environment_; // Environment for the 'catch' body. |
+ Environment* exit_environment_; // Environment after the statement. |
+ Node* exception_node_; // Node for exception in 'catch' body. |
+}; |
+ |
+ |
+// Tracks control flow for a try-finally statement. |
+class TryFinallyBuilder FINAL : public ControlBuilder { |
+ public: |
+ explicit TryFinallyBuilder(AstGraphBuilder* builder) |
+ : ControlBuilder(builder), |
+ finally_environment_(NULL), |
+ token_node_(NULL) {} |
+ |
+ // Primitive control commands. |
+ void BeginTry(); |
+ void LeaveTry(Node* token); |
+ void EndTry(Node* token); |
+ void EndFinally(); |
+ |
+ // Returns the dispatch token value inside the 'finally' body. |
+ Node* GetDispatchTokenNode() const { return token_node_; } |
+ |
+ private: |
+ Environment* finally_environment_; // Environment for the 'finally' body. |
+ Node* token_node_; // Node for token in 'finally' body. |
+}; |
+ |
} // namespace compiler |
} // namespace internal |
} // namespace v8 |