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) {
37 loop_environment_ = environment()->CopyForLoop(assigned);
38 continue_environment_ = environment()->CopyAsUnreachable();
39 break_environment_ = environment()->CopyAsUnreachable();
43 void LoopBuilder::Continue() {
44 continue_environment_->Merge(environment());
45 environment()->MarkAsUnreachable();
49 void LoopBuilder::Break() {
50 break_environment_->Merge(environment());
51 environment()->MarkAsUnreachable();
55 void LoopBuilder::EndBody() {
56 continue_environment_->Merge(environment());
57 set_environment(continue_environment_);
61 void LoopBuilder::EndLoop() {
62 loop_environment_->Merge(environment());
63 set_environment(break_environment_);
67 void LoopBuilder::BreakUnless(Node* condition) {
68 IfBuilder control_if(builder_);
69 control_if.If(condition);
77 void SwitchBuilder::BeginSwitch() {
78 body_environment_ = environment()->CopyAsUnreachable();
79 label_environment_ = environment()->CopyAsUnreachable();
80 break_environment_ = environment()->CopyAsUnreachable();
81 body_environments_.AddBlock(NULL, case_count(), zone());
85 void SwitchBuilder::BeginLabel(int index, Node* condition) {
86 builder_->NewBranch(condition);
87 label_environment_ = environment()->CopyForConditional();
88 builder_->NewIfTrue();
89 body_environments_[index] = environment();
93 void SwitchBuilder::EndLabel() {
94 set_environment(label_environment_);
95 builder_->NewIfFalse();
99 void SwitchBuilder::DefaultAt(int index) {
100 label_environment_ = environment()->CopyAsUnreachable();
101 body_environments_[index] = environment();
105 void SwitchBuilder::BeginCase(int index) {
106 set_environment(body_environments_[index]);
107 environment()->Merge(body_environment_);
111 void SwitchBuilder::Break() {
112 break_environment_->Merge(environment());
113 environment()->MarkAsUnreachable();
117 void SwitchBuilder::EndCase() { body_environment_ = environment(); }
120 void SwitchBuilder::EndSwitch() {
121 break_environment_->Merge(label_environment_);
122 break_environment_->Merge(environment());
123 set_environment(break_environment_);
127 void BlockBuilder::BeginBlock() {
128 break_environment_ = environment()->CopyAsUnreachable();
132 void BlockBuilder::Break() {
133 break_environment_->Merge(environment());
134 environment()->MarkAsUnreachable();
138 void BlockBuilder::EndBlock() {
139 break_environment_->Merge(environment());
140 set_environment(break_environment_);
144 } // namespace v8::internal::compiler