Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/interpreter/bytecode-generator.h" | 5 #include "src/interpreter/bytecode-generator.h" |
| 6 | 6 |
| 7 #include "src/ast/scopes.h" | 7 #include "src/ast/scopes.h" |
| 8 #include "src/compiler.h" | 8 #include "src/compiler.h" |
| 9 #include "src/interpreter/bytecode-register-allocator.h" | 9 #include "src/interpreter/bytecode-register-allocator.h" |
| 10 #include "src/interpreter/control-flow-builders.h" | 10 #include "src/interpreter/control-flow-builders.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 65 | 65 |
| 66 ContextScope* previous = this; | 66 ContextScope* previous = this; |
| 67 for (int i = depth; i > 0; --i) { | 67 for (int i = depth; i > 0; --i) { |
| 68 previous = previous->outer_; | 68 previous = previous->outer_; |
| 69 } | 69 } |
| 70 return previous; | 70 return previous; |
| 71 } | 71 } |
| 72 | 72 |
| 73 Scope* scope() const { return scope_; } | 73 Scope* scope() const { return scope_; } |
| 74 Register reg() const { return register_; } | 74 Register reg() const { return register_; } |
| 75 bool ShouldPopContext() { return should_pop_context_; } | |
| 75 | 76 |
| 76 private: | 77 private: |
| 77 const BytecodeArrayBuilder* builder() const { return generator_->builder(); } | 78 const BytecodeArrayBuilder* builder() const { return generator_->builder(); } |
| 78 | 79 |
| 79 void set_register(Register reg) { register_ = reg; } | 80 void set_register(Register reg) { register_ = reg; } |
| 80 | 81 |
| 81 BytecodeGenerator* generator_; | 82 BytecodeGenerator* generator_; |
| 82 Scope* scope_; | 83 Scope* scope_; |
| 83 ContextScope* outer_; | 84 ContextScope* outer_; |
| 84 Register register_; | 85 Register register_; |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 356 private: | 357 private: |
| 357 TryFinallyBuilder* try_finally_builder_; | 358 TryFinallyBuilder* try_finally_builder_; |
| 358 DeferredCommands* commands_; | 359 DeferredCommands* commands_; |
| 359 }; | 360 }; |
| 360 | 361 |
| 361 | 362 |
| 362 void BytecodeGenerator::ControlScope::PerformCommand(Command command, | 363 void BytecodeGenerator::ControlScope::PerformCommand(Command command, |
| 363 Statement* statement) { | 364 Statement* statement) { |
| 364 ControlScope* current = this; | 365 ControlScope* current = this; |
| 365 ContextScope* context = generator()->execution_context(); | 366 ContextScope* context = generator()->execution_context(); |
| 367 // Do not pop if it is the outermost context. | |
| 368 if (context != current->context() && context->ShouldPopContext()) { | |
|
mythria
2016/03/15 09:49:11
I am still not very sure about the check for conte
| |
| 369 generator()->builder()->PopContext(current->context()->reg()); | |
| 370 } | |
| 366 do { | 371 do { |
| 367 if (current->context() != context) { | |
| 368 // Pop context to the expected depth for break and continue. For return | |
| 369 // and throw it is not required to pop. Debugger expects that the | |
| 370 // context is not popped on return. So do not pop on return. | |
| 371 // TODO(rmcilroy): Only emit a single context pop. | |
| 372 if (command == CMD_BREAK || command == CMD_CONTINUE) { | |
| 373 generator()->builder()->PopContext(current->context()->reg()); | |
| 374 } | |
| 375 context = current->context(); | |
| 376 } | |
| 377 if (current->Execute(command, statement)) { | 372 if (current->Execute(command, statement)) { |
| 378 return; | 373 return; |
| 379 } | 374 } |
| 380 current = current->outer(); | 375 current = current->outer(); |
| 376 if (current->context() != context) { | |
| 377 // Pop context to the expected depth. | |
| 378 // TODO(rmcilroy): Only emit a single context pop. | |
| 379 generator()->builder()->PopContext(current->context()->reg()); | |
| 380 } | |
| 381 } while (current != nullptr); | 381 } while (current != nullptr); |
| 382 UNREACHABLE(); | 382 UNREACHABLE(); |
| 383 } | 383 } |
| 384 | 384 |
| 385 | 385 |
| 386 class BytecodeGenerator::RegisterAllocationScope { | 386 class BytecodeGenerator::RegisterAllocationScope { |
| 387 public: | 387 public: |
| 388 explicit RegisterAllocationScope(BytecodeGenerator* generator) | 388 explicit RegisterAllocationScope(BytecodeGenerator* generator) |
| 389 : generator_(generator), | 389 : generator_(generator), |
| 390 outer_(generator->register_allocator()), | 390 outer_(generator->register_allocator()), |
| (...skipping 2766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3157 } | 3157 } |
| 3158 | 3158 |
| 3159 | 3159 |
| 3160 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { | 3160 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
| 3161 return info()->feedback_vector()->GetIndex(slot); | 3161 return info()->feedback_vector()->GetIndex(slot); |
| 3162 } | 3162 } |
| 3163 | 3163 |
| 3164 } // namespace interpreter | 3164 } // namespace interpreter |
| 3165 } // namespace internal | 3165 } // namespace internal |
| 3166 } // namespace v8 | 3166 } // namespace v8 |
| OLD | NEW |