1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "control-builders.h"
12 void IfBuilder::If(Node* condition, BranchHint hint) {
13 builder_->NewBranch(condition, hint);
14 else_environment_ = environment()->CopyForConditional();
18 void IfBuilder::Then() { builder_->NewIfTrue(); }
21 void IfBuilder::Else() {
23 then_environment_ = environment();
24 set_environment(else_environment_);
25 builder_->NewIfFalse();
29 void IfBuilder::End() {
30 then_environment_->Merge(environment());
31 set_environment(then_environment_);
35 void LoopBuilder::BeginLoop(BitVector* assigned, bool is_osr) {
36 loop_environment_ = environment()->CopyForLoop(assigned, is_osr);
37 continue_environment_ = environment()->CopyAsUnreachable();
38 break_environment_ = environment()->CopyAsUnreachable();
42 void LoopBuilder::Continue() {
43 continue_environment_->Merge(environment());
44 environment()->MarkAsUnreachable();
48 void LoopBuilder::Break() {
49 break_environment_->Merge(environment());
50 environment()->MarkAsUnreachable();
54 void LoopBuilder::EndBody() {
55 continue_environment_->Merge(environment());
56 set_environment(continue_environment_);
60 void LoopBuilder::EndLoop() {
61 loop_environment_->Merge(environment());
62 set_environment(break_environment_);
66 void LoopBuilder::BreakUnless(Node* condition) {
67 IfBuilder control_if(builder_);
68 control_if.If(condition);
76 void LoopBuilder::BreakWhen(Node* condition) {
77 IfBuilder control_if(builder_);
78 control_if.If(condition);
86 void SwitchBuilder::BeginSwitch() {
87 body_environment_ = environment()->CopyAsUnreachable();
88 label_environment_ = environment()->CopyAsUnreachable();
89 break_environment_ = environment()->CopyAsUnreachable();
93 void SwitchBuilder::BeginLabel(int index, Node* condition) {
94 builder_->NewBranch(condition);
95 label_environment_ = environment()->CopyForConditional();
96 builder_->NewIfTrue();
97 body_environments_[index] = environment();
101 void SwitchBuilder::EndLabel() {
102 set_environment(label_environment_);
103 builder_->NewIfFalse();
107 void SwitchBuilder::DefaultAt(int index) {
108 label_environment_ = environment()->CopyAsUnreachable();
109 body_environments_[index] = environment();
113 void SwitchBuilder::BeginCase(int index) {
114 set_environment(body_environments_[index]);
115 environment()->Merge(body_environment_);
119 void SwitchBuilder::Break() {
120 break_environment_->Merge(environment());
121 environment()->MarkAsUnreachable();
125 void SwitchBuilder::EndCase() { body_environment_ = environment(); }
128 void SwitchBuilder::EndSwitch() {
129 break_environment_->Merge(label_environment_);
130 break_environment_->Merge(environment());
131 set_environment(break_environment_);
135 void BlockBuilder::BeginBlock() {
136 break_environment_ = environment()->CopyAsUnreachable();
140 void BlockBuilder::Break() {
141 break_environment_->Merge(environment());
142 environment()->MarkAsUnreachable();
146 void BlockBuilder::EndBlock() {
147 break_environment_->Merge(environment());
148 set_environment(break_environment_);
152 void TryCatchBuilder::BeginTry() {
153 catch_environment_ = environment()->CopyAsUnreachable();
154 catch_environment_->Push(the_hole());
158 void TryCatchBuilder::Throw(Node* exception) {
159 environment()->Push(exception);
160 catch_environment_->Merge(environment());
161 environment()->Pop();
162 environment()->MarkAsUnreachable();
166 void TryCatchBuilder::EndTry() {
167 exit_environment_ = environment();
168 exception_node_ = catch_environment_->Pop();
169 set_environment(catch_environment_);
173 void TryCatchBuilder::EndCatch() {
174 exit_environment_->Merge(environment());
175 set_environment(exit_environment_);
179 void TryFinallyBuilder::BeginTry() {
180 finally_environment_ = environment()->CopyAsUnreachable();
181 finally_environment_->Push(the_hole());
182 finally_environment_->Push(the_hole());
186 void TryFinallyBuilder::LeaveTry(Node* token, Node* value) {
187 environment()->Push(value);
188 environment()->Push(token);
189 finally_environment_->Merge(environment());
190 environment()->Drop(2);
194 void TryFinallyBuilder::EndTry(Node* fallthrough_token, Node* value) {
195 environment()->Push(value);
196 environment()->Push(fallthrough_token);
197 finally_environment_->Merge(environment());
198 environment()->Drop(2);
199 token_node_ = finally_environment_->Pop();
200 value_node_ = finally_environment_->Pop();
201 set_environment(finally_environment_);
205 void TryFinallyBuilder::EndFinally() {
206 // Nothing to be done here.
209 } // namespace compiler
210 } // namespace internal