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