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 3034 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3045 VisitForAccumulatorValue(right); | 3045 VisitForAccumulatorValue(right); |
3046 builder()->Bind(&end_label); | 3046 builder()->Bind(&end_label); |
3047 } | 3047 } |
3048 execution_result()->SetResultInAccumulator(); | 3048 execution_result()->SetResultInAccumulator(); |
3049 } | 3049 } |
3050 | 3050 |
3051 void BytecodeGenerator::VisitRewritableExpression(RewritableExpression* expr) { | 3051 void BytecodeGenerator::VisitRewritableExpression(RewritableExpression* expr) { |
3052 Visit(expr->expression()); | 3052 Visit(expr->expression()); |
3053 } | 3053 } |
3054 | 3054 |
3055 namespace { | |
3056 | |
3057 Handle<ScopeInfo> GetScopeInfo(Scope* scope, Isolate* isolate) { | |
3058 // TODO(5203): Remove this temporary exception. | |
3059 AllowHeapAllocation allow_allocation; | |
3060 AllowHandleAllocation allow_handles; | |
3061 AllowHandleDereference allow_deref; | |
3062 return scope->GetScopeInfo(isolate); | |
3063 } | |
3064 | |
3065 } // namespace | |
3066 | |
3067 void BytecodeGenerator::VisitNewLocalFunctionContext() { | 3055 void BytecodeGenerator::VisitNewLocalFunctionContext() { |
3068 AccumulatorResultScope accumulator_execution_result(this); | 3056 AccumulatorResultScope accumulator_execution_result(this); |
3069 Scope* scope = this->scope(); | 3057 Scope* scope = this->scope(); |
3070 | 3058 |
3071 // Allocate a new local context. | 3059 // Allocate a new local context. |
3072 if (scope->is_script_scope()) { | 3060 if (scope->is_script_scope()) { |
3073 RegisterAllocationScope register_scope(this); | 3061 RegisterAllocationScope register_scope(this); |
3074 Register closure = register_allocator()->NewRegister(); | 3062 Register closure = register_allocator()->NewRegister(); |
3075 Register scope_info = register_allocator()->NewRegister(); | 3063 Register scope_info = register_allocator()->NewRegister(); |
3076 DCHECK(Register::AreContiguous(closure, scope_info)); | 3064 DCHECK(Register::AreContiguous(closure, scope_info)); |
3077 builder() | 3065 builder() |
3078 ->LoadAccumulatorWithRegister(Register::function_closure()) | 3066 ->LoadAccumulatorWithRegister(Register::function_closure()) |
3079 .StoreAccumulatorInRegister(closure) | 3067 .StoreAccumulatorInRegister(closure) |
3080 .LoadLiteral(GetScopeInfo(scope, isolate())) | 3068 .LoadLiteral(scope->GetScopeInfo(isolate())) |
3081 .StoreAccumulatorInRegister(scope_info) | 3069 .StoreAccumulatorInRegister(scope_info) |
3082 .CallRuntime(Runtime::kNewScriptContext, closure, 2); | 3070 .CallRuntime(Runtime::kNewScriptContext, closure, 2); |
3083 } else { | 3071 } else { |
3084 int slot_count = scope->num_heap_slots() - Context::MIN_CONTEXT_SLOTS; | 3072 int slot_count = scope->num_heap_slots() - Context::MIN_CONTEXT_SLOTS; |
3085 builder()->CreateFunctionContext(slot_count); | 3073 builder()->CreateFunctionContext(slot_count); |
3086 } | 3074 } |
3087 execution_result()->SetResultInAccumulator(); | 3075 execution_result()->SetResultInAccumulator(); |
3088 } | 3076 } |
3089 | 3077 |
3090 void BytecodeGenerator::VisitBuildLocalActivationContext() { | 3078 void BytecodeGenerator::VisitBuildLocalActivationContext() { |
(...skipping 27 matching lines...) Expand all Loading... |
3118 void BytecodeGenerator::VisitNewLocalBlockContext(Scope* scope) { | 3106 void BytecodeGenerator::VisitNewLocalBlockContext(Scope* scope) { |
3119 AccumulatorResultScope accumulator_execution_result(this); | 3107 AccumulatorResultScope accumulator_execution_result(this); |
3120 DCHECK(scope->is_block_scope()); | 3108 DCHECK(scope->is_block_scope()); |
3121 | 3109 |
3122 // Allocate a new local block context. | 3110 // Allocate a new local block context. |
3123 register_allocator()->PrepareForConsecutiveAllocations(2); | 3111 register_allocator()->PrepareForConsecutiveAllocations(2); |
3124 Register scope_info = register_allocator()->NextConsecutiveRegister(); | 3112 Register scope_info = register_allocator()->NextConsecutiveRegister(); |
3125 Register closure = register_allocator()->NextConsecutiveRegister(); | 3113 Register closure = register_allocator()->NextConsecutiveRegister(); |
3126 | 3114 |
3127 builder() | 3115 builder() |
3128 ->LoadLiteral(GetScopeInfo(scope, isolate())) | 3116 ->LoadLiteral(scope->GetScopeInfo(isolate())) |
3129 .StoreAccumulatorInRegister(scope_info); | 3117 .StoreAccumulatorInRegister(scope_info); |
3130 VisitFunctionClosureForContext(); | 3118 VisitFunctionClosureForContext(); |
3131 builder() | 3119 builder() |
3132 ->StoreAccumulatorInRegister(closure) | 3120 ->StoreAccumulatorInRegister(closure) |
3133 .CallRuntime(Runtime::kPushBlockContext, scope_info, 2); | 3121 .CallRuntime(Runtime::kPushBlockContext, scope_info, 2); |
3134 execution_result()->SetResultInAccumulator(); | 3122 execution_result()->SetResultInAccumulator(); |
3135 } | 3123 } |
3136 | 3124 |
3137 void BytecodeGenerator::VisitNewLocalWithContext() { | 3125 void BytecodeGenerator::VisitNewLocalWithContext() { |
3138 AccumulatorResultScope accumulator_execution_result(this); | 3126 AccumulatorResultScope accumulator_execution_result(this); |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3309 return execution_context()->scope()->language_mode(); | 3297 return execution_context()->scope()->language_mode(); |
3310 } | 3298 } |
3311 | 3299 |
3312 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { | 3300 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
3313 return TypeFeedbackVector::GetIndex(slot); | 3301 return TypeFeedbackVector::GetIndex(slot); |
3314 } | 3302 } |
3315 | 3303 |
3316 } // namespace interpreter | 3304 } // namespace interpreter |
3317 } // namespace internal | 3305 } // namespace internal |
3318 } // namespace v8 | 3306 } // namespace v8 |
OLD | NEW |