// 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