Index: src/interpreter/bytecode-generator.cc |
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
index af7b9158e2e3d77e013c47f1db75366229e37acb..e6321159de552377e727104a70ab2430cf10ef30 100644 |
--- a/src/interpreter/bytecode-generator.cc |
+++ b/src/interpreter/bytecode-generator.cc |
@@ -570,7 +570,6 @@ BytecodeGenerator::BytecodeGenerator(CompilationInfo* info) |
register_allocator_(nullptr), |
generator_resume_points_(info->literal()->yield_count(), info->zone()), |
generator_state_(), |
- generator_yields_seen_(0), |
try_catch_nesting_level_(0), |
try_finally_nesting_level_(0) { |
InitializeAstVisitor(isolate()); |
@@ -667,8 +666,8 @@ void BytecodeGenerator::VisitIterationHeader(IterationStatement* stmt, |
// that they can be bound to the loop header below. Also create fresh labels |
// for these resume points, to be used inside the loop. |
ZoneVector<BytecodeLabel> resume_points_in_loop(zone()); |
- for (size_t id = generator_yields_seen_; |
- id < generator_yields_seen_ + stmt->yield_count(); id++) { |
+ size_t first = stmt->first_yield_id(); |
Michael Starzinger
2016/05/02 14:31:16
nit: s/first/first_yield/
|
+ for (size_t id = first; id < first + stmt->yield_count(); id++) { |
DCHECK(0 <= id && id < generator_resume_points_.size()); |
auto& label = generator_resume_points_[id]; |
resume_points_in_loop.push_back(label); |
@@ -685,8 +684,8 @@ void BytecodeGenerator::VisitIterationHeader(IterationStatement* stmt, |
->LoadLiteral(Smi::FromInt(JSGeneratorObject::kGeneratorExecuting)) |
.CompareOperation(Token::Value::EQ, generator_state_) |
.JumpIfTrue(¬_resuming); |
- BuildIndexedJump(generator_state_, generator_yields_seen_, |
- stmt->yield_count(), generator_resume_points_); |
+ BuildIndexedJump( |
+ generator_state_, first, stmt->yield_count(), generator_resume_points_); |
builder()->Bind(¬_resuming); |
} |
} |
@@ -2266,8 +2265,6 @@ void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
} |
void BytecodeGenerator::VisitYield(Yield* expr) { |
- size_t id = generator_yields_seen_++; |
- |
builder()->SetExpressionPosition(expr); |
Register value = VisitForRegisterValue(expr->expression()); |
@@ -2275,12 +2272,12 @@ void BytecodeGenerator::VisitYield(Yield* expr) { |
// Save context, registers, and state. Then return. |
builder() |
- ->LoadLiteral(Smi::FromInt(static_cast<int>(id))) |
+ ->LoadLiteral(Smi::FromInt(expr->yield_id())) |
.SuspendGenerator(generator) |
.LoadAccumulatorWithRegister(value) |
.Return(); // Hard return (ignore any finally blocks). |
- builder()->Bind(&(generator_resume_points_[id])); |
+ builder()->Bind(&(generator_resume_points_[expr->yield_id()])); |
// Upon resume, we continue here. |
{ |