Index: src/compiler/control-builders.cc |
diff --git a/src/compiler/control-builders.cc b/src/compiler/control-builders.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3b7d05ba5551137859c0a7d463854c70b1713eaf |
--- /dev/null |
+++ b/src/compiler/control-builders.cc |
@@ -0,0 +1,144 @@ |
+// Copyright 2013 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "control-builders.h" |
+ |
+namespace v8 { |
+namespace internal { |
+namespace compiler { |
+ |
+ |
+void IfBuilder::If(Node* condition) { |
+ builder_->NewBranch(condition); |
+ else_environment_ = environment()->CopyForConditional(); |
+} |
+ |
+ |
+void IfBuilder::Then() { builder_->NewIfTrue(); } |
+ |
+ |
+void IfBuilder::Else() { |
+ builder_->NewMerge(); |
+ then_environment_ = environment(); |
+ set_environment(else_environment_); |
+ builder_->NewIfFalse(); |
+} |
+ |
+ |
+void IfBuilder::End() { |
+ then_environment_->Merge(environment()); |
+ set_environment(then_environment_); |
+} |
+ |
+ |
+void LoopBuilder::BeginLoop() { |
+ builder_->NewLoop(); |
+ loop_environment_ = environment()->CopyForLoop(); |
+ continue_environment_ = environment()->CopyAsUnreachable(); |
+ break_environment_ = environment()->CopyAsUnreachable(); |
+} |
+ |
+ |
+void LoopBuilder::Continue() { |
+ continue_environment_->Merge(environment()); |
+ environment()->MarkAsUnreachable(); |
+} |
+ |
+ |
+void LoopBuilder::Break() { |
+ break_environment_->Merge(environment()); |
+ environment()->MarkAsUnreachable(); |
+} |
+ |
+ |
+void LoopBuilder::EndBody() { |
+ continue_environment_->Merge(environment()); |
+ set_environment(continue_environment_); |
+} |
+ |
+ |
+void LoopBuilder::EndLoop() { |
+ loop_environment_->Merge(environment()); |
+ set_environment(break_environment_); |
+} |
+ |
+ |
+void LoopBuilder::BreakUnless(Node* condition) { |
+ IfBuilder control_if(builder_); |
+ control_if.If(condition); |
+ control_if.Then(); |
+ control_if.Else(); |
+ Break(); |
+ control_if.End(); |
+} |
+ |
+ |
+void SwitchBuilder::BeginSwitch() { |
+ body_environment_ = environment()->CopyAsUnreachable(); |
+ label_environment_ = environment()->CopyAsUnreachable(); |
+ break_environment_ = environment()->CopyAsUnreachable(); |
+ body_environments_.AddBlock(NULL, case_count(), zone()); |
+} |
+ |
+ |
+void SwitchBuilder::BeginLabel(int index, Node* condition) { |
+ builder_->NewBranch(condition); |
+ label_environment_ = environment()->CopyForConditional(); |
+ builder_->NewIfTrue(); |
+ body_environments_[index] = environment(); |
+} |
+ |
+ |
+void SwitchBuilder::EndLabel() { |
+ set_environment(label_environment_); |
+ builder_->NewIfFalse(); |
+} |
+ |
+ |
+void SwitchBuilder::DefaultAt(int index) { |
+ label_environment_ = environment()->CopyAsUnreachable(); |
+ body_environments_[index] = environment(); |
+} |
+ |
+ |
+void SwitchBuilder::BeginCase(int index) { |
+ set_environment(body_environments_[index]); |
+ environment()->Merge(body_environment_); |
+} |
+ |
+ |
+void SwitchBuilder::Break() { |
+ break_environment_->Merge(environment()); |
+ environment()->MarkAsUnreachable(); |
+} |
+ |
+ |
+void SwitchBuilder::EndCase() { body_environment_ = environment(); } |
+ |
+ |
+void SwitchBuilder::EndSwitch() { |
+ break_environment_->Merge(label_environment_); |
+ break_environment_->Merge(environment()); |
+ set_environment(break_environment_); |
+} |
+ |
+ |
+void BlockBuilder::BeginBlock() { |
+ break_environment_ = environment()->CopyAsUnreachable(); |
+} |
+ |
+ |
+void BlockBuilder::Break() { |
+ break_environment_->Merge(environment()); |
+ environment()->MarkAsUnreachable(); |
+} |
+ |
+ |
+void BlockBuilder::EndBlock() { |
+ break_environment_->Merge(environment()); |
+ set_environment(break_environment_); |
+} |
+} |
+} |
+} // namespace v8::internal::compiler |