Chromium Code Reviews| Index: src/interpreter/bytecode-generator.cc |
| diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
| index 9148b2d294cc475f96b31372cb7725405d705125..0d85f89daeae349b5d972b2810c027808563ae97 100644 |
| --- a/src/interpreter/bytecode-generator.cc |
| +++ b/src/interpreter/bytecode-generator.cc |
| @@ -565,10 +565,8 @@ BytecodeGenerator::BytecodeGenerator(Isolate* isolate, Zone* zone) |
| execution_context_(nullptr), |
| execution_result_(nullptr), |
| register_allocator_(nullptr), |
| - generator_resume_points_(0, zone), |
| try_catch_nesting_level_(0), |
| - try_finally_nesting_level_(0), |
| - generator_yields_seen_(0) { |
| + try_finally_nesting_level_(0) { |
| InitializeAstVisitor(isolate); |
| } |
| @@ -641,8 +639,9 @@ void BytecodeGenerator::MakeBytecodeBody() { |
| } |
| void BytecodeGenerator::VisitGeneratorPrologue() { |
| - generator_resume_points_.clear(); |
| - generator_resume_points_.resize(info()->literal()->yield_count()); |
| + auto& resume_points = builder()->generator_resume_points; |
| + resume_points.clear(); |
| + resume_points.resize(info()->literal()->yield_count()); |
| BytecodeLabel regular_call; |
| builder() |
| @@ -651,23 +650,12 @@ void BytecodeGenerator::VisitGeneratorPrologue() { |
| // This is a resume call. Restore registers and perform state dispatch. |
| // (The current context has already been restored by the trampoline.) |
| - { |
| - RegisterAllocationScope register_scope(this); |
| - Register state = register_allocator()->NewRegister(); |
| - builder() |
| - ->CallRuntime(Runtime::kResumeIgnitionGenerator, Register::new_target(), |
| - 1) |
| - .StoreAccumulatorInRegister(state); |
| - |
| - // TODO(neis): Optimize this by using a proper jump table. |
| - for (size_t i = 0; i < generator_resume_points_.size(); ++i) { |
| - builder() |
| - ->LoadLiteral(Smi::FromInt(static_cast<int>(i))) |
| - .CompareOperation(Token::Value::EQ_STRICT, state) |
| - .JumpIfTrue(&(generator_resume_points_[i])); |
| - } |
| - builder()->Illegal(); // Should never get here. |
| - } |
| + Register state = Register::new_target(); // HACK |
|
rmcilroy
2016/04/19 09:30:03
Could you allocate an additional local for this pu
neis
2016/04/19 11:02:15
I think I prefer having a dedicated register rathe
|
| + builder() |
| + ->CallRuntime(Runtime::kResumeIgnitionGenerator, Register::new_target(), |
| + 1) |
| + .StoreAccumulatorInRegister(state) |
| + .IndexedJump(state, 0, resume_points.size(), resume_points); |
| builder()->Bind(®ular_call); |
| // This is a regular call. Fall through to the ordinary function prologue, |
| @@ -1000,7 +988,7 @@ void BytecodeGenerator::VisitIterationBody(IterationStatement* stmt, |
| } |
| void BytecodeGenerator::VisitDoWhileStatement(DoWhileStatement* stmt) { |
| - LoopBuilder loop_builder(builder()); |
| + LoopBuilder loop_builder(builder(), stmt->yield_count()); |
| loop_builder.LoopHeader(); |
| if (stmt->cond()->ToBooleanIsFalse()) { |
| VisitIterationBody(stmt, &loop_builder); |
| @@ -1025,7 +1013,7 @@ void BytecodeGenerator::VisitWhileStatement(WhileStatement* stmt) { |
| return; |
| } |
| - LoopBuilder loop_builder(builder()); |
| + LoopBuilder loop_builder(builder(), stmt->yield_count()); |
| loop_builder.LoopHeader(); |
| loop_builder.Condition(); |
| if (!stmt->cond()->ToBooleanIsTrue()) { |
| @@ -1049,7 +1037,7 @@ void BytecodeGenerator::VisitForStatement(ForStatement* stmt) { |
| return; |
| } |
| - LoopBuilder loop_builder(builder()); |
| + LoopBuilder loop_builder(builder(), stmt->yield_count()); |
| loop_builder.LoopHeader(); |
| loop_builder.Condition(); |
| if (stmt->cond() && !stmt->cond()->ToBooleanIsTrue()) { |
| @@ -1149,7 +1137,7 @@ void BytecodeGenerator::VisitForInStatement(ForInStatement* stmt) { |
| return; |
| } |
| - LoopBuilder loop_builder(builder()); |
| + LoopBuilder loop_builder(builder(), stmt->yield_count()); |
| BytecodeLabel subject_null_label, subject_undefined_label; |
| // Prepare the state for executing ForIn. |
| @@ -1197,7 +1185,7 @@ void BytecodeGenerator::VisitForInStatement(ForInStatement* stmt) { |
| void BytecodeGenerator::VisitForOfStatement(ForOfStatement* stmt) { |
| - LoopBuilder loop_builder(builder()); |
| + LoopBuilder loop_builder(builder(), stmt->yield_count()); |
| ControlScopeForIteration control_scope(this, stmt, &loop_builder); |
| VisitForEffect(stmt->assign_iterator()); |
| @@ -2270,7 +2258,7 @@ void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
| } |
| void BytecodeGenerator::VisitYield(Yield* expr) { |
| - int id = generator_yields_seen_++; |
| + int id = builder()->incr_generator_yields_seen(); |
| builder()->SetExpressionPosition(expr); |
| Register value = VisitForRegisterValue(expr->expression()); |
| @@ -2288,7 +2276,7 @@ void BytecodeGenerator::VisitYield(Yield* expr) { |
| .LoadAccumulatorWithRegister(value) |
| .Return(); // Hard return (ignore any finally blocks). |
| - builder()->Bind(&(generator_resume_points_[id])); |
| + builder()->Bind(&(builder()->generator_resume_points[id])); |
| // Upon resume, we continue here. |
| { |