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