Index: src/interpreter/bytecode-generator.cc |
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
index af7b9158e2e3d77e013c47f1db75366229e37acb..b0bfb7ee05abc79d356c510d8e2ed42a392e1cac 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(); |
Jarin
2016/04/28 16:31:18
I am mildly surprised this works is not first_yiel
neis
2016/04/29 07:52:24
signed to unsigned is always "fine" as far as I kn
|
+ 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->id())) |
.SuspendGenerator(generator) |
.LoadAccumulatorWithRegister(value) |
.Return(); // Hard return (ignore any finally blocks). |
- builder()->Bind(&(generator_resume_points_[id])); |
+ builder()->Bind(&(generator_resume_points_[expr->id()])); |
// Upon resume, we continue here. |
{ |