blob: 8725244ebda11ef4cdf2e6b5e658844efffe364c [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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.
4
5#include "control-builders.h"
6
7namespace v8 {
8namespace internal {
9namespace compiler {
10
11
Emily Bernierd0a1eb72015-03-24 16:35:39 -040012void IfBuilder::If(Node* condition, BranchHint hint) {
13 builder_->NewBranch(condition, hint);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000014 else_environment_ = environment()->CopyForConditional();
15}
16
17
18void IfBuilder::Then() { builder_->NewIfTrue(); }
19
20
21void IfBuilder::Else() {
22 builder_->NewMerge();
23 then_environment_ = environment();
24 set_environment(else_environment_);
25 builder_->NewIfFalse();
26}
27
28
29void IfBuilder::End() {
30 then_environment_->Merge(environment());
31 set_environment(then_environment_);
32}
33
34
Emily Bernierd0a1eb72015-03-24 16:35:39 -040035void LoopBuilder::BeginLoop(BitVector* assigned) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000036 builder_->NewLoop();
Emily Bernierd0a1eb72015-03-24 16:35:39 -040037 loop_environment_ = environment()->CopyForLoop(assigned);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000038 continue_environment_ = environment()->CopyAsUnreachable();
39 break_environment_ = environment()->CopyAsUnreachable();
40}
41
42
43void LoopBuilder::Continue() {
44 continue_environment_->Merge(environment());
45 environment()->MarkAsUnreachable();
46}
47
48
49void LoopBuilder::Break() {
50 break_environment_->Merge(environment());
51 environment()->MarkAsUnreachable();
52}
53
54
55void LoopBuilder::EndBody() {
56 continue_environment_->Merge(environment());
57 set_environment(continue_environment_);
58}
59
60
61void LoopBuilder::EndLoop() {
62 loop_environment_->Merge(environment());
63 set_environment(break_environment_);
64}
65
66
67void LoopBuilder::BreakUnless(Node* condition) {
68 IfBuilder control_if(builder_);
69 control_if.If(condition);
70 control_if.Then();
71 control_if.Else();
72 Break();
73 control_if.End();
74}
75
76
77void SwitchBuilder::BeginSwitch() {
78 body_environment_ = environment()->CopyAsUnreachable();
79 label_environment_ = environment()->CopyAsUnreachable();
80 break_environment_ = environment()->CopyAsUnreachable();
Ben Murdochb8a8cc12014-11-26 15:28:44 +000081}
82
83
84void SwitchBuilder::BeginLabel(int index, Node* condition) {
85 builder_->NewBranch(condition);
86 label_environment_ = environment()->CopyForConditional();
87 builder_->NewIfTrue();
88 body_environments_[index] = environment();
89}
90
91
92void SwitchBuilder::EndLabel() {
93 set_environment(label_environment_);
94 builder_->NewIfFalse();
95}
96
97
98void SwitchBuilder::DefaultAt(int index) {
99 label_environment_ = environment()->CopyAsUnreachable();
100 body_environments_[index] = environment();
101}
102
103
104void SwitchBuilder::BeginCase(int index) {
105 set_environment(body_environments_[index]);
106 environment()->Merge(body_environment_);
107}
108
109
110void SwitchBuilder::Break() {
111 break_environment_->Merge(environment());
112 environment()->MarkAsUnreachable();
113}
114
115
116void SwitchBuilder::EndCase() { body_environment_ = environment(); }
117
118
119void SwitchBuilder::EndSwitch() {
120 break_environment_->Merge(label_environment_);
121 break_environment_->Merge(environment());
122 set_environment(break_environment_);
123}
124
125
126void BlockBuilder::BeginBlock() {
127 break_environment_ = environment()->CopyAsUnreachable();
128}
129
130
131void BlockBuilder::Break() {
132 break_environment_->Merge(environment());
133 environment()->MarkAsUnreachable();
134}
135
136
137void BlockBuilder::EndBlock() {
138 break_environment_->Merge(environment());
139 set_environment(break_environment_);
140}
141}
142}
143} // namespace v8::internal::compiler