| 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/code-stubs.h" | 8 #include "src/code-stubs.h" |
| 9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
| 10 #include "src/interpreter/bytecode-flags.h" | 10 #include "src/interpreter/bytecode-flags.h" |
| (...skipping 3033 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3044 .StoreAccumulatorInRegister(scope_info) | 3044 .StoreAccumulatorInRegister(scope_info) |
| 3045 .CallRuntime(Runtime::kNewScriptContext, closure, 2); | 3045 .CallRuntime(Runtime::kNewScriptContext, closure, 2); |
| 3046 } else { | 3046 } else { |
| 3047 int slot_count = scope->num_heap_slots() - Context::MIN_CONTEXT_SLOTS; | 3047 int slot_count = scope->num_heap_slots() - Context::MIN_CONTEXT_SLOTS; |
| 3048 builder()->CreateFunctionContext(slot_count); | 3048 builder()->CreateFunctionContext(slot_count); |
| 3049 } | 3049 } |
| 3050 execution_result()->SetResultInAccumulator(); | 3050 execution_result()->SetResultInAccumulator(); |
| 3051 } | 3051 } |
| 3052 | 3052 |
| 3053 void BytecodeGenerator::VisitBuildLocalActivationContext() { | 3053 void BytecodeGenerator::VisitBuildLocalActivationContext() { |
| 3054 DeclarationScope* scope = this->scope(); | 3054 Scope* scope = this->scope(); |
| 3055 | 3055 |
| 3056 if (scope->has_this_declaration() && scope->receiver()->IsContextSlot()) { | 3056 if (scope->has_this_declaration() && scope->receiver()->IsContextSlot()) { |
| 3057 Variable* variable = scope->receiver(); | 3057 Variable* variable = scope->receiver(); |
| 3058 Register receiver(builder()->Parameter(0)); | 3058 Register receiver(builder()->Parameter(0)); |
| 3059 // Context variable (at bottom of the context chain). | 3059 // Context variable (at bottom of the context chain). |
| 3060 DCHECK_EQ(0, scope->ContextChainLength(variable->scope())); | 3060 DCHECK_EQ(0, scope->ContextChainLength(variable->scope())); |
| 3061 builder()->LoadAccumulatorWithRegister(receiver).StoreContextSlot( | 3061 builder()->LoadAccumulatorWithRegister(receiver).StoreContextSlot( |
| 3062 execution_context()->reg(), variable->index()); | 3062 execution_context()->reg(), variable->index()); |
| 3063 } | 3063 } |
| 3064 | 3064 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3193 void BytecodeGenerator::VisitNewTargetVariable(Variable* variable) { | 3193 void BytecodeGenerator::VisitNewTargetVariable(Variable* variable) { |
| 3194 if (variable == nullptr) return; | 3194 if (variable == nullptr) return; |
| 3195 | 3195 |
| 3196 // Store the new target we were called with in the given variable. | 3196 // Store the new target we were called with in the given variable. |
| 3197 builder()->LoadAccumulatorWithRegister(Register::new_target()); | 3197 builder()->LoadAccumulatorWithRegister(Register::new_target()); |
| 3198 VisitVariableAssignment(variable, Token::INIT, FeedbackVectorSlot::Invalid()); | 3198 VisitVariableAssignment(variable, Token::INIT, FeedbackVectorSlot::Invalid()); |
| 3199 } | 3199 } |
| 3200 | 3200 |
| 3201 void BytecodeGenerator::VisitFunctionClosureForContext() { | 3201 void BytecodeGenerator::VisitFunctionClosureForContext() { |
| 3202 AccumulatorResultScope accumulator_execution_result(this); | 3202 AccumulatorResultScope accumulator_execution_result(this); |
| 3203 DeclarationScope* closure_scope = | 3203 Scope* closure_scope = execution_context()->scope()->ClosureScope(); |
| 3204 execution_context()->scope()->GetClosureScope(); | |
| 3205 if (closure_scope->is_script_scope() || | 3204 if (closure_scope->is_script_scope() || |
| 3206 closure_scope->is_module_scope()) { | 3205 closure_scope->is_module_scope()) { |
| 3207 // Contexts nested in the native context have a canonical empty function as | 3206 // Contexts nested in the native context have a canonical empty function as |
| 3208 // their closure, not the anonymous closure containing the global code. | 3207 // their closure, not the anonymous closure containing the global code. |
| 3209 Register native_context = register_allocator()->NewRegister(); | 3208 Register native_context = register_allocator()->NewRegister(); |
| 3210 builder() | 3209 builder() |
| 3211 ->LoadContextSlot(execution_context()->reg(), | 3210 ->LoadContextSlot(execution_context()->reg(), |
| 3212 Context::NATIVE_CONTEXT_INDEX) | 3211 Context::NATIVE_CONTEXT_INDEX) |
| 3213 .StoreAccumulatorInRegister(native_context) | 3212 .StoreAccumulatorInRegister(native_context) |
| 3214 .LoadContextSlot(native_context, Context::CLOSURE_INDEX); | 3213 .LoadContextSlot(native_context, Context::CLOSURE_INDEX); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3272 return execution_context()->scope()->language_mode(); | 3271 return execution_context()->scope()->language_mode(); |
| 3273 } | 3272 } |
| 3274 | 3273 |
| 3275 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { | 3274 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
| 3276 return TypeFeedbackVector::GetIndex(slot); | 3275 return TypeFeedbackVector::GetIndex(slot); |
| 3277 } | 3276 } |
| 3278 | 3277 |
| 3279 } // namespace interpreter | 3278 } // namespace interpreter |
| 3280 } // namespace internal | 3279 } // namespace internal |
| 3281 } // namespace v8 | 3280 } // namespace v8 |
| OLD | NEW |