| 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 854 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 DCHECK(!variable->binding_needs_init()); | 865 DCHECK(!variable->binding_needs_init()); |
| 866 | 866 |
| 867 Register name = register_allocator()->NewRegister(); | 867 Register name = register_allocator()->NewRegister(); |
| 868 | 868 |
| 869 builder() | 869 builder() |
| 870 ->LoadLiteral(variable->name()) | 870 ->LoadLiteral(variable->name()) |
| 871 .StoreAccumulatorInRegister(name) | 871 .StoreAccumulatorInRegister(name) |
| 872 .CallRuntime(Runtime::kDeclareEvalVar, name, 1); | 872 .CallRuntime(Runtime::kDeclareEvalVar, name, 1); |
| 873 break; | 873 break; |
| 874 } | 874 } |
| 875 case VariableLocation::MODULE: |
| 876 UNREACHABLE(); |
| 875 } | 877 } |
| 876 } | 878 } |
| 877 | 879 |
| 878 void BytecodeGenerator::VisitFunctionDeclaration(FunctionDeclaration* decl) { | 880 void BytecodeGenerator::VisitFunctionDeclaration(FunctionDeclaration* decl) { |
| 879 Variable* variable = decl->proxy()->var(); | 881 Variable* variable = decl->proxy()->var(); |
| 880 switch (variable->location()) { | 882 switch (variable->location()) { |
| 881 case VariableLocation::GLOBAL: | 883 case VariableLocation::GLOBAL: |
| 882 case VariableLocation::UNALLOCATED: { | 884 case VariableLocation::UNALLOCATED: { |
| 883 FeedbackVectorSlot slot = decl->proxy()->VariableFeedbackSlot(); | 885 FeedbackVectorSlot slot = decl->proxy()->VariableFeedbackSlot(); |
| 884 globals_builder()->AddFunctionDeclaration(slot, decl->fun()); | 886 globals_builder()->AddFunctionDeclaration(slot, decl->fun()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 902 } | 904 } |
| 903 case VariableLocation::LOOKUP: { | 905 case VariableLocation::LOOKUP: { |
| 904 register_allocator()->PrepareForConsecutiveAllocations(2); | 906 register_allocator()->PrepareForConsecutiveAllocations(2); |
| 905 Register name = register_allocator()->NextConsecutiveRegister(); | 907 Register name = register_allocator()->NextConsecutiveRegister(); |
| 906 Register literal = register_allocator()->NextConsecutiveRegister(); | 908 Register literal = register_allocator()->NextConsecutiveRegister(); |
| 907 builder()->LoadLiteral(variable->name()).StoreAccumulatorInRegister(name); | 909 builder()->LoadLiteral(variable->name()).StoreAccumulatorInRegister(name); |
| 908 | 910 |
| 909 VisitForAccumulatorValue(decl->fun()); | 911 VisitForAccumulatorValue(decl->fun()); |
| 910 builder()->StoreAccumulatorInRegister(literal).CallRuntime( | 912 builder()->StoreAccumulatorInRegister(literal).CallRuntime( |
| 911 Runtime::kDeclareEvalFunction, name, 2); | 913 Runtime::kDeclareEvalFunction, name, 2); |
| 914 break; |
| 912 } | 915 } |
| 916 case VariableLocation::MODULE: |
| 917 UNREACHABLE(); |
| 913 } | 918 } |
| 914 } | 919 } |
| 915 | 920 |
| 916 void BytecodeGenerator::VisitDeclarations( | 921 void BytecodeGenerator::VisitDeclarations( |
| 917 ZoneList<Declaration*>* declarations) { | 922 ZoneList<Declaration*>* declarations) { |
| 918 RegisterAllocationScope register_scope(this); | 923 RegisterAllocationScope register_scope(this); |
| 919 DCHECK(globals_builder()->empty()); | 924 DCHECK(globals_builder()->empty()); |
| 920 for (int i = 0; i < declarations->length(); i++) { | 925 for (int i = 0; i < declarations->length(); i++) { |
| 921 RegisterAllocationScope register_scope(this); | 926 RegisterAllocationScope register_scope(this); |
| 922 Visit(declarations->at(i)); | 927 Visit(declarations->at(i)); |
| (...skipping 974 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1897 builder()->LoadContextSlot(context_reg, variable->index()); | 1902 builder()->LoadContextSlot(context_reg, variable->index()); |
| 1898 BuildHoleCheckForVariableLoad(variable); | 1903 BuildHoleCheckForVariableLoad(variable); |
| 1899 execution_result()->SetResultInAccumulator(); | 1904 execution_result()->SetResultInAccumulator(); |
| 1900 break; | 1905 break; |
| 1901 } | 1906 } |
| 1902 case VariableLocation::LOOKUP: { | 1907 case VariableLocation::LOOKUP: { |
| 1903 builder()->LoadLookupSlot(variable->name(), typeof_mode); | 1908 builder()->LoadLookupSlot(variable->name(), typeof_mode); |
| 1904 execution_result()->SetResultInAccumulator(); | 1909 execution_result()->SetResultInAccumulator(); |
| 1905 break; | 1910 break; |
| 1906 } | 1911 } |
| 1912 case VariableLocation::MODULE: |
| 1913 UNREACHABLE(); |
| 1907 } | 1914 } |
| 1908 } | 1915 } |
| 1909 | 1916 |
| 1910 void BytecodeGenerator::VisitVariableLoadForAccumulatorValue( | 1917 void BytecodeGenerator::VisitVariableLoadForAccumulatorValue( |
| 1911 Variable* variable, FeedbackVectorSlot slot, TypeofMode typeof_mode) { | 1918 Variable* variable, FeedbackVectorSlot slot, TypeofMode typeof_mode) { |
| 1912 AccumulatorResultScope accumulator_result(this); | 1919 AccumulatorResultScope accumulator_result(this); |
| 1913 VisitVariableLoad(variable, slot, typeof_mode); | 1920 VisitVariableLoad(variable, slot, typeof_mode); |
| 1914 } | 1921 } |
| 1915 | 1922 |
| 1916 Register BytecodeGenerator::VisitVariableLoadForRegisterValue( | 1923 Register BytecodeGenerator::VisitVariableLoadForRegisterValue( |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2122 } | 2129 } |
| 2123 | 2130 |
| 2124 builder()->StoreContextSlot(context_reg, variable->index()); | 2131 builder()->StoreContextSlot(context_reg, variable->index()); |
| 2125 break; | 2132 break; |
| 2126 } | 2133 } |
| 2127 case VariableLocation::LOOKUP: { | 2134 case VariableLocation::LOOKUP: { |
| 2128 DCHECK_NE(CONST_LEGACY, variable->mode()); | 2135 DCHECK_NE(CONST_LEGACY, variable->mode()); |
| 2129 builder()->StoreLookupSlot(variable->name(), language_mode()); | 2136 builder()->StoreLookupSlot(variable->name(), language_mode()); |
| 2130 break; | 2137 break; |
| 2131 } | 2138 } |
| 2139 case VariableLocation::MODULE: |
| 2140 UNREACHABLE(); |
| 2132 } | 2141 } |
| 2133 } | 2142 } |
| 2134 | 2143 |
| 2135 void BytecodeGenerator::VisitAssignment(Assignment* expr) { | 2144 void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
| 2136 DCHECK(expr->target()->IsValidReferenceExpressionOrThis()); | 2145 DCHECK(expr->target()->IsValidReferenceExpressionOrThis()); |
| 2137 Register object, key, home_object, value; | 2146 Register object, key, home_object, value; |
| 2138 Handle<String> name; | 2147 Handle<String> name; |
| 2139 | 2148 |
| 2140 // Left-hand side can only be a property, a global or a variable slot. | 2149 // Left-hand side can only be a property, a global or a variable slot. |
| 2141 Property* property = expr->target()->AsProperty(); | 2150 Property* property = expr->target()->AsProperty(); |
| (...skipping 1129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3271 return execution_context()->scope()->language_mode(); | 3280 return execution_context()->scope()->language_mode(); |
| 3272 } | 3281 } |
| 3273 | 3282 |
| 3274 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { | 3283 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
| 3275 return TypeFeedbackVector::GetIndex(slot); | 3284 return TypeFeedbackVector::GetIndex(slot); |
| 3276 } | 3285 } |
| 3277 | 3286 |
| 3278 } // namespace interpreter | 3287 } // namespace interpreter |
| 3279 } // namespace internal | 3288 } // namespace internal |
| 3280 } // namespace v8 | 3289 } // namespace v8 |
| OLD | NEW |