Index: src/interpreter/bytecode-generator.cc |
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
index 4ce5afe86a4a1bc0a82d18eec5b6a9316e026a38..3c3c2843e45b39205bd6f33b982832c116451d50 100644 |
--- a/src/interpreter/bytecode-generator.cc |
+++ b/src/interpreter/bytecode-generator.cc |
@@ -72,6 +72,7 @@ class BytecodeGenerator::ContextScope BASE_EMBEDDED { |
Scope* scope() const { return scope_; } |
Register reg() const { return register_; } |
+ bool ShouldPopContext() { return should_pop_context_; } |
private: |
const BytecodeArrayBuilder* builder() const { return generator_->builder(); } |
@@ -212,9 +213,9 @@ class BytecodeGenerator::ControlScopeForTopLevel final |
protected: |
bool Execute(Command command, Statement* statement) override { |
switch (command) { |
- case CMD_BREAK: |
+ case CMD_BREAK: // We should never see break/continue in top-level. |
case CMD_CONTINUE: |
- break; |
+ UNREACHABLE(); |
case CMD_RETURN: |
generator()->builder()->Return(); |
return true; |
@@ -363,21 +364,20 @@ void BytecodeGenerator::ControlScope::PerformCommand(Command command, |
Statement* statement) { |
ControlScope* current = this; |
ContextScope* context = generator()->execution_context(); |
+ // Pop context to the expected depth but do not pop the outermost context. |
+ if (context != current->context() && context->ShouldPopContext()) { |
+ generator()->builder()->PopContext(current->context()->reg()); |
+ } |
do { |
- if (current->context() != context) { |
- // Pop context to the expected depth for break and continue. For return |
- // and throw it is not required to pop. Debugger expects that the |
- // context is not popped on return. So do not pop on return. |
- // TODO(rmcilroy): Only emit a single context pop. |
- if (command == CMD_BREAK || command == CMD_CONTINUE) { |
- generator()->builder()->PopContext(current->context()->reg()); |
- } |
- context = current->context(); |
- } |
if (current->Execute(command, statement)) { |
return; |
} |
current = current->outer(); |
+ if (current->context() != context) { |
+ // Pop context to the expected depth. |
+ // TODO(rmcilroy): Only emit a single context pop. |
+ generator()->builder()->PopContext(current->context()->reg()); |
+ } |
} while (current != nullptr); |
UNREACHABLE(); |
} |