blob: 3b7d05ba5551137859c0a7d463854c70b1713eaf [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
12void IfBuilder::If(Node* condition) {
13 builder_->NewBranch(condition);
14 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
35void LoopBuilder::BeginLoop() {
36 builder_->NewLoop();
37 loop_environment_ = environment()->CopyForLoop();
38 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();
81 body_environments_.AddBlock(NULL, case_count(), zone());
82}
83
84
85void 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
93void SwitchBuilder::EndLabel() {
94 set_environment(label_environment_);
95 builder_->NewIfFalse();
96}
97
98
99void SwitchBuilder::DefaultAt(int index) {
100 label_environment_ = environment()->CopyAsUnreachable();
101 body_environments_[index] = environment();
102}
103
104
105void SwitchBuilder::BeginCase(int index) {
106 set_environment(body_environments_[index]);
107 environment()->Merge(body_environment_);
108}
109
110
111void SwitchBuilder::Break() {
112 break_environment_->Merge(environment());
113 environment()->MarkAsUnreachable();
114}
115
116
117void SwitchBuilder::EndCase() { body_environment_ = environment(); }
118
119
120void SwitchBuilder::EndSwitch() {
121 break_environment_->Merge(label_environment_);
122 break_environment_->Merge(environment());
123 set_environment(break_environment_);
124}
125
126
127void BlockBuilder::BeginBlock() {
128 break_environment_ = environment()->CopyAsUnreachable();
129}
130
131
132void BlockBuilder::Break() {
133 break_environment_->Merge(environment());
134 environment()->MarkAsUnreachable();
135}
136
137
138void BlockBuilder::EndBlock() {
139 break_environment_->Merge(environment());
140 set_environment(break_environment_);
141}
142}
143}
144} // namespace v8::internal::compiler