Index: src/compiler/ast-graph-builder.h |
diff --git a/src/compiler/ast-graph-builder.h b/src/compiler/ast-graph-builder.h |
index 07a2a06821bebb3d3b40bc679b90ecf4bf10c375..390ab234a482dbb04d7169c59e1e019e9df60262 100644 |
--- a/src/compiler/ast-graph-builder.h |
+++ b/src/compiler/ast-graph-builder.h |
@@ -63,8 +63,12 @@ class AstGraphBuilder : public AstVisitor { |
class AstEffectContext; |
class AstValueContext; |
class AstTestContext; |
- class BreakableScope; |
class ContextScope; |
+ class ControlScope; |
+ class ControlScopeForBreakable; |
+ class ControlScopeForIteration; |
+ class ControlScopeForCatch; |
+ class ControlScopeForFinally; |
class Environment; |
friend class ControlBuilder; |
@@ -77,8 +81,8 @@ class AstGraphBuilder : public AstVisitor { |
// List of global declarations for functions and variables. |
ZoneVector<Handle<Object>> globals_; |
- // Stack of breakable statements entered by the visitor. |
- BreakableScope* breakable_; |
+ // Stack of control scopes currently entered by the visitor. |
+ ControlScope* execution_control_; |
// Stack of context objects pushed onto the chain by the visitor. |
ContextScope* execution_context_; |
@@ -110,7 +114,7 @@ class AstGraphBuilder : public AstVisitor { |
Zone* local_zone() const { return local_zone_; } |
Environment* environment() { return environment_; } |
AstContext* ast_context() const { return ast_context_; } |
- BreakableScope* breakable() const { return breakable_; } |
+ ControlScope* execution_control() const { return execution_control_; } |
ContextScope* execution_context() const { return execution_context_; } |
CommonOperatorBuilder* common() const { return jsgraph_->common(); } |
CompilationInfo* info() const { return info_; } |
@@ -126,7 +130,7 @@ class AstGraphBuilder : public AstVisitor { |
Node* exit_control() const { return exit_control_; } |
void set_ast_context(AstContext* ctx) { ast_context_ = ctx; } |
- void set_breakable(BreakableScope* brk) { breakable_ = brk; } |
+ void set_execution_control(ControlScope* ctrl) { execution_control_ = ctrl; } |
void set_execution_context(ContextScope* ctx) { execution_context_ = ctx; } |
void set_exit_control(Node* exit) { exit_control_ = exit; } |
void set_current_context(Node* ctx) { current_context_ = ctx; } |
@@ -237,6 +241,10 @@ class AstGraphBuilder : public AstVisitor { |
Node* BuildHoleCheckThrow(Node* value, Variable* var, Node* not_hole, |
BailoutId bailout_id); |
+ // Builders for non-local control flow. |
+ Node* BuildReturn(Node* return_value); |
+ Node* BuildThrow(Node* exception_value); |
+ |
// Builders for binary operations. |
Node* BuildBinaryOp(Node* left, Node* right, Token::Value op); |
@@ -529,42 +537,6 @@ class AstGraphBuilder::AstTestContext FINAL : public AstContext { |
}; |
-// Scoped class tracking breakable statements entered by the visitor. Allows to |
-// properly 'break' and 'continue' iteration statements as well as to 'break' |
-// from blocks within switch statements. |
-class AstGraphBuilder::BreakableScope BASE_EMBEDDED { |
- public: |
- BreakableScope(AstGraphBuilder* owner, BreakableStatement* target, |
- ControlBuilder* control, int drop_extra) |
- : owner_(owner), |
- target_(target), |
- next_(owner->breakable()), |
- control_(control), |
- drop_extra_(drop_extra) { |
- owner_->set_breakable(this); // Push. |
- } |
- |
- ~BreakableScope() { |
- owner_->set_breakable(next_); // Pop. |
- } |
- |
- // Either 'break' or 'continue' the target statement. |
- void BreakTarget(BreakableStatement* target); |
- void ContinueTarget(BreakableStatement* target); |
- |
- private: |
- AstGraphBuilder* owner_; |
- BreakableStatement* target_; |
- BreakableScope* next_; |
- ControlBuilder* control_; |
- int drop_extra_; |
- |
- // Find the correct scope for the target statement. Note that this also drops |
- // extra operands from the environment for each scope skipped along the way. |
- BreakableScope* FindBreakable(BreakableStatement* target); |
-}; |
- |
- |
// Scoped class tracking context objects created by the visitor. Represents |
// mutations of the context chain within the function body and allows to |
// change the current {scope} and {context} during visitation. |