2ace441e61eac82a83439ed2155a599128a290fb
[platform/upstream/nodejs.git] / deps / v8 / src / compiler / control-builders.cc
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.
4
5 #include "control-builders.h"
6
7 namespace v8 {
8 namespace internal {
9 namespace compiler {
10
11
12 void IfBuilder::If(Node* condition, BranchHint hint) {
13   builder_->NewBranch(condition, hint);
14   else_environment_ = environment()->CopyForConditional();
15 }
16
17
18 void IfBuilder::Then() { builder_->NewIfTrue(); }
19
20
21 void IfBuilder::Else() {
22   builder_->NewMerge();
23   then_environment_ = environment();
24   set_environment(else_environment_);
25   builder_->NewIfFalse();
26 }
27
28
29 void IfBuilder::End() {
30   then_environment_->Merge(environment());
31   set_environment(then_environment_);
32 }
33
34
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();
39 }
40
41
42 void LoopBuilder::Continue() {
43   continue_environment_->Merge(environment());
44   environment()->MarkAsUnreachable();
45 }
46
47
48 void LoopBuilder::Break() {
49   break_environment_->Merge(environment());
50   environment()->MarkAsUnreachable();
51 }
52
53
54 void LoopBuilder::EndBody() {
55   continue_environment_->Merge(environment());
56   set_environment(continue_environment_);
57 }
58
59
60 void LoopBuilder::EndLoop() {
61   loop_environment_->Merge(environment());
62   set_environment(break_environment_);
63 }
64
65
66 void LoopBuilder::BreakUnless(Node* condition) {
67   IfBuilder control_if(builder_);
68   control_if.If(condition);
69   control_if.Then();
70   control_if.Else();
71   Break();
72   control_if.End();
73 }
74
75
76 void LoopBuilder::BreakWhen(Node* condition) {
77   IfBuilder control_if(builder_);
78   control_if.If(condition);
79   control_if.Then();
80   Break();
81   control_if.Else();
82   control_if.End();
83 }
84
85
86 void SwitchBuilder::BeginSwitch() {
87   body_environment_ = environment()->CopyAsUnreachable();
88   label_environment_ = environment()->CopyAsUnreachable();
89   break_environment_ = environment()->CopyAsUnreachable();
90 }
91
92
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();
98 }
99
100
101 void SwitchBuilder::EndLabel() {
102   set_environment(label_environment_);
103   builder_->NewIfFalse();
104 }
105
106
107 void SwitchBuilder::DefaultAt(int index) {
108   label_environment_ = environment()->CopyAsUnreachable();
109   body_environments_[index] = environment();
110 }
111
112
113 void SwitchBuilder::BeginCase(int index) {
114   set_environment(body_environments_[index]);
115   environment()->Merge(body_environment_);
116 }
117
118
119 void SwitchBuilder::Break() {
120   break_environment_->Merge(environment());
121   environment()->MarkAsUnreachable();
122 }
123
124
125 void SwitchBuilder::EndCase() { body_environment_ = environment(); }
126
127
128 void SwitchBuilder::EndSwitch() {
129   break_environment_->Merge(label_environment_);
130   break_environment_->Merge(environment());
131   set_environment(break_environment_);
132 }
133
134
135 void BlockBuilder::BeginBlock() {
136   break_environment_ = environment()->CopyAsUnreachable();
137 }
138
139
140 void BlockBuilder::Break() {
141   break_environment_->Merge(environment());
142   environment()->MarkAsUnreachable();
143 }
144
145
146 void BlockBuilder::EndBlock() {
147   break_environment_->Merge(environment());
148   set_environment(break_environment_);
149 }
150
151
152 void TryCatchBuilder::BeginTry() {
153   catch_environment_ = environment()->CopyAsUnreachable();
154   catch_environment_->Push(the_hole());
155 }
156
157
158 void TryCatchBuilder::Throw(Node* exception) {
159   environment()->Push(exception);
160   catch_environment_->Merge(environment());
161   environment()->Pop();
162   environment()->MarkAsUnreachable();
163 }
164
165
166 void TryCatchBuilder::EndTry() {
167   exit_environment_ = environment();
168   exception_node_ = catch_environment_->Pop();
169   set_environment(catch_environment_);
170 }
171
172
173 void TryCatchBuilder::EndCatch() {
174   exit_environment_->Merge(environment());
175   set_environment(exit_environment_);
176 }
177
178
179 void TryFinallyBuilder::BeginTry() {
180   finally_environment_ = environment()->CopyAsUnreachable();
181   finally_environment_->Push(the_hole());
182 }
183
184
185 void TryFinallyBuilder::LeaveTry(Node* token) {
186   environment()->Push(token);
187   finally_environment_->Merge(environment());
188   environment()->Pop();
189 }
190
191
192 void TryFinallyBuilder::EndTry(Node* fallthrough_token) {
193   environment()->Push(fallthrough_token);
194   finally_environment_->Merge(environment());
195   environment()->Pop();
196   token_node_ = finally_environment_->Pop();
197   set_environment(finally_environment_);
198 }
199
200
201 void TryFinallyBuilder::EndFinally() {
202   // Nothing to be done here.
203 }
204
205 }  // namespace compiler
206 }  // namespace internal
207 }  // namespace v8