Chromium Code Reviews| Index: src/interpreter/control-flow-builders.cc |
| diff --git a/src/interpreter/control-flow-builders.cc b/src/interpreter/control-flow-builders.cc |
| index 1624712425392f6addf140473ede669b059f6760..b9ae6d6614f2f0116531d358b7fc0f6f57da1fd1 100644 |
| --- a/src/interpreter/control-flow-builders.cc |
| +++ b/src/interpreter/control-flow-builders.cc |
| @@ -10,95 +10,52 @@ namespace interpreter { |
| BreakableControlFlowBuilder::~BreakableControlFlowBuilder() { |
| - DCHECK(break_sites_.empty()); |
| + DCHECK(break_labels_.empty() || break_labels_.is_bound()); |
| } |
| - |
| -void BreakableControlFlowBuilder::SetBreakTarget(const BytecodeLabel& target) { |
| - BindLabels(target, &break_sites_); |
| -} |
| - |
| - |
| -void BreakableControlFlowBuilder::EmitJump(ZoneVector<BytecodeLabel>* sites) { |
| - sites->push_back(BytecodeLabel()); |
| - builder()->Jump(&sites->back()); |
| -} |
| - |
| - |
| -void BreakableControlFlowBuilder::EmitJumpIfTrue( |
| - ZoneVector<BytecodeLabel>* sites) { |
| - sites->push_back(BytecodeLabel()); |
| - builder()->JumpIfTrue(&sites->back()); |
| +void BreakableControlFlowBuilder::BindBreakTarget() { |
| + break_labels_.Bind(builder()); |
| } |
| - |
| -void BreakableControlFlowBuilder::EmitJumpIfFalse( |
| - ZoneVector<BytecodeLabel>* sites) { |
| - sites->push_back(BytecodeLabel()); |
| - builder()->JumpIfFalse(&sites->back()); |
| -} |
| - |
| - |
| -void BreakableControlFlowBuilder::EmitJumpIfUndefined( |
| - ZoneVector<BytecodeLabel>* sites) { |
| - sites->push_back(BytecodeLabel()); |
| - builder()->JumpIfUndefined(&sites->back()); |
| -} |
| - |
| - |
| -void BreakableControlFlowBuilder::EmitJumpIfNull( |
| - ZoneVector<BytecodeLabel>* sites) { |
| - sites->push_back(BytecodeLabel()); |
| - builder()->JumpIfNull(&sites->back()); |
| +void BreakableControlFlowBuilder::EmitJump(BytecodeLabels* sites) { |
| + builder()->Jump(sites->New()); |
| } |
| - |
| -void BreakableControlFlowBuilder::EmitJump(ZoneVector<BytecodeLabel>* sites, |
| - int index) { |
| - builder()->Jump(&sites->at(index)); |
| +void BreakableControlFlowBuilder::EmitJumpIfTrue(BytecodeLabels* sites) { |
| + builder()->JumpIfTrue(sites->New()); |
| } |
| - |
| -void BreakableControlFlowBuilder::EmitJumpIfTrue( |
| - ZoneVector<BytecodeLabel>* sites, int index) { |
| - builder()->JumpIfTrue(&sites->at(index)); |
| +void BreakableControlFlowBuilder::EmitJumpIfFalse(BytecodeLabels* sites) { |
| + builder()->JumpIfFalse(sites->New()); |
| } |
| - |
| -void BreakableControlFlowBuilder::EmitJumpIfFalse( |
| - ZoneVector<BytecodeLabel>* sites, int index) { |
| - builder()->JumpIfFalse(&sites->at(index)); |
| +void BreakableControlFlowBuilder::EmitJumpIfUndefined(BytecodeLabels* sites) { |
| + builder()->JumpIfUndefined(sites->New()); |
| } |
| - |
| -void BreakableControlFlowBuilder::BindLabels(const BytecodeLabel& target, |
| - ZoneVector<BytecodeLabel>* sites) { |
| - for (size_t i = 0; i < sites->size(); i++) { |
| - BytecodeLabel& site = sites->at(i); |
| - builder()->Bind(target, &site); |
| - } |
| - sites->clear(); |
| +void BreakableControlFlowBuilder::EmitJumpIfNull(BytecodeLabels* sites) { |
| + builder()->JumpIfNull(sites->New()); |
| } |
| void BlockBuilder::EndBlock() { |
| builder()->Bind(&block_end_); |
| - SetBreakTarget(block_end_); |
| + BindBreakTarget(); |
| } |
| - |
| -LoopBuilder::~LoopBuilder() { DCHECK(continue_sites_.empty()); } |
| - |
| +LoopBuilder::~LoopBuilder() { |
| + DCHECK(continue_labels_.empty() || continue_labels_.is_bound()); |
|
rmcilroy
2016/08/17 16:20:43
Also DCHECK header labels
klaasb
2016/08/18 11:40:00
Done.
|
| +} |
| void LoopBuilder::LoopHeader(ZoneVector<BytecodeLabel>* additional_labels) { |
| // Jumps from before the loop header into the loop violate ordering |
| // requirements of bytecode basic blocks. The only entry into a loop |
| // must be the loop header. Surely breaks is okay? Not if nested |
| // and misplaced between the headers. |
| - DCHECK(break_sites_.empty() && continue_sites_.empty()); |
| + DCHECK(break_labels_.empty() && continue_labels_.empty()); |
| builder()->Bind(&loop_header_); |
| for (auto& label : *additional_labels) { |
| - builder()->Bind(loop_header_, &label); |
| + builder()->Bind(&label); |
| } |
| } |
| @@ -117,16 +74,11 @@ void LoopBuilder::JumpToHeaderIfTrue() { |
| } |
| void LoopBuilder::EndLoop() { |
| - builder()->Bind(&loop_end_); |
| - SetBreakTarget(loop_end_); |
| -} |
| - |
| -void LoopBuilder::SetContinueTarget() { |
| - BytecodeLabel target; |
| - builder()->Bind(&target); |
| - BindLabels(target, &continue_sites_); |
| + BindBreakTarget(); |
| + header_labels_.BindToLabel(builder(), loop_header_); |
| } |
| +void LoopBuilder::BindContinueTarget() { continue_labels_.Bind(builder()); } |
| SwitchBuilder::~SwitchBuilder() { |
| #ifdef DEBUG |
| @@ -165,8 +117,7 @@ void TryFinallyBuilder::BeginTry(Register context) { |
| void TryFinallyBuilder::LeaveTry() { |
| - finalization_sites_.push_back(BytecodeLabel()); |
| - builder()->Jump(&finalization_sites_.back()); |
| + builder()->Jump(finalization_sites_.New()); |
| } |
| @@ -180,14 +131,7 @@ void TryFinallyBuilder::BeginHandler() { |
| builder()->MarkHandler(handler_id_, catch_prediction_); |
| } |
| - |
| -void TryFinallyBuilder::BeginFinally() { |
| - for (size_t i = 0; i < finalization_sites_.size(); i++) { |
| - BytecodeLabel& site = finalization_sites_.at(i); |
| - builder()->Bind(&site); |
| - } |
| -} |
| - |
| +void TryFinallyBuilder::BeginFinally() { finalization_sites_.Bind(builder()); } |
| void TryFinallyBuilder::EndFinally() { |
| // Nothing to be done here. |