Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / 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) {
13   builder_->NewBranch(condition);
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() {
36   builder_->NewLoop();
37   loop_environment_ = environment()->CopyForLoop();
38   continue_environment_ = environment()->CopyAsUnreachable();
39   break_environment_ = environment()->CopyAsUnreachable();
40 }
41
42
43 void LoopBuilder::Continue() {
44   continue_environment_->Merge(environment());
45   environment()->MarkAsUnreachable();
46 }
47
48
49 void LoopBuilder::Break() {
50   break_environment_->Merge(environment());
51   environment()->MarkAsUnreachable();
52 }
53
54
55 void LoopBuilder::EndBody() {
56   continue_environment_->Merge(environment());
57   set_environment(continue_environment_);
58 }
59
60
61 void LoopBuilder::EndLoop() {
62   loop_environment_->Merge(environment());
63   set_environment(break_environment_);
64 }
65
66
67 void 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
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());
82 }
83
84
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();
90 }
91
92
93 void SwitchBuilder::EndLabel() {
94   set_environment(label_environment_);
95   builder_->NewIfFalse();
96 }
97
98
99 void SwitchBuilder::DefaultAt(int index) {
100   label_environment_ = environment()->CopyAsUnreachable();
101   body_environments_[index] = environment();
102 }
103
104
105 void SwitchBuilder::BeginCase(int index) {
106   set_environment(body_environments_[index]);
107   environment()->Merge(body_environment_);
108 }
109
110
111 void SwitchBuilder::Break() {
112   break_environment_->Merge(environment());
113   environment()->MarkAsUnreachable();
114 }
115
116
117 void SwitchBuilder::EndCase() { body_environment_ = environment(); }
118
119
120 void SwitchBuilder::EndSwitch() {
121   break_environment_->Merge(label_environment_);
122   break_environment_->Merge(environment());
123   set_environment(break_environment_);
124 }
125
126
127 void BlockBuilder::BeginBlock() {
128   break_environment_ = environment()->CopyAsUnreachable();
129 }
130
131
132 void BlockBuilder::Break() {
133   break_environment_->Merge(environment());
134   environment()->MarkAsUnreachable();
135 }
136
137
138 void BlockBuilder::EndBlock() {
139   break_environment_->Merge(environment());
140   set_environment(break_environment_);
141 }
142 }
143 }
144 }  // namespace v8::internal::compiler