Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(981)

Unified Diff: src/interpreter/bytecode-generator.cc

Issue 1901713003: [generators] Perform state dispatch in loop header. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(&regular_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.
{

Powered by Google App Engine
This is Rietveld 408576698