Index: src/interpreter/bytecode-generator.cc |
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
index d3b1f2722379851370c198a56846e57b4ea81ee6..37cd938a15dacfe65548c79fa4713a83298fc46e 100644 |
--- a/src/interpreter/bytecode-generator.cc |
+++ b/src/interpreter/bytecode-generator.cc |
@@ -27,19 +27,26 @@ class BytecodeGenerator::ContextScope BASE_EMBEDDED { |
: generator_(generator), |
scope_(scope), |
outer_(generator_->execution_context()), |
- register_(generator_->NextContextRegister()), |
+ register_(Register::current_context()), |
depth_(0), |
should_pop_context_(should_pop_context) { |
if (outer_) { |
depth_ = outer_->depth_ + 1; |
- generator_->builder()->PushContext(register_); |
+ |
+ // Push the outer context into a new context register. |
+ Register outer_context_reg(builder()->first_context_register().index() + |
+ outer_->depth_); |
+ outer_->set_register(outer_context_reg); |
+ generator_->builder()->PushContext(outer_context_reg); |
} |
generator_->set_execution_context(this); |
} |
~ContextScope() { |
if (outer_ && should_pop_context_) { |
+ DCHECK_EQ(register_.index(), Register::current_context().index()); |
generator_->builder()->PopContext(outer_->reg()); |
+ outer_->set_register(register_); |
} |
generator_->set_execution_context(outer_); |
} |
@@ -67,6 +74,10 @@ class BytecodeGenerator::ContextScope BASE_EMBEDDED { |
Register reg() const { return register_; } |
private: |
+ const BytecodeArrayBuilder* builder() const { return generator_->builder(); } |
+ |
+ void set_register(Register reg) { register_ = reg; } |
+ |
BytecodeGenerator* generator_; |
Scope* scope_; |
ContextScope* outer_; |
@@ -1866,7 +1877,7 @@ void BytecodeGenerator::VisitCall(Call* expr) { |
DCHECK(Register::AreContiguous(callee, receiver)); |
Variable* variable = callee_expr->AsVariableProxy()->var(); |
builder() |
- ->MoveRegister(execution_context()->reg(), context) |
+ ->MoveRegister(Register::current_context(), context) |
.LoadLiteral(variable->name()) |
.StoreAccumulatorInRegister(name) |
.CallRuntimeForPair(Runtime::kLoadLookupSlot, context, 2, callee); |
@@ -2480,24 +2491,6 @@ void BytecodeGenerator::VisitInScope(Statement* stmt, Scope* scope) { |
} |
-Register BytecodeGenerator::NextContextRegister() const { |
- if (execution_context() == nullptr) { |
- // Return the incoming function context for the outermost execution context. |
- return Register::function_context(); |
- } |
- Register previous = execution_context()->reg(); |
- if (previous == Register::function_context()) { |
- // If the previous context was the incoming function context, then the next |
- // context register is the first local context register. |
- return builder_.first_context_register(); |
- } else { |
- // Otherwise use the next local context register. |
- DCHECK_LT(previous.index(), builder_.last_context_register().index()); |
- return Register(previous.index() + 1); |
- } |
-} |
- |
- |
LanguageMode BytecodeGenerator::language_mode() const { |
return info()->language_mode(); |
} |