| 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/compiler.h" | 7 #include "src/compiler.h" |
| 8 #include "src/interpreter/control-flow-builders.h" | 8 #include "src/interpreter/control-flow-builders.h" |
| 9 #include "src/objects.h" | 9 #include "src/objects.h" |
| 10 #include "src/parser.h" | 10 #include "src/parser.h" |
| (...skipping 919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 930 execution_result()->SetResultInRegister(source); | 930 execution_result()->SetResultInRegister(source); |
| 931 break; | 931 break; |
| 932 } | 932 } |
| 933 case VariableLocation::PARAMETER: { | 933 case VariableLocation::PARAMETER: { |
| 934 // The parameter indices are shifted by 1 (receiver is variable | 934 // The parameter indices are shifted by 1 (receiver is variable |
| 935 // index -1 but is parameter index 0 in BytecodeArrayBuilder). | 935 // index -1 but is parameter index 0 in BytecodeArrayBuilder). |
| 936 Register source = builder()->Parameter(variable->index() + 1); | 936 Register source = builder()->Parameter(variable->index() + 1); |
| 937 execution_result()->SetResultInRegister(source); | 937 execution_result()->SetResultInRegister(source); |
| 938 break; | 938 break; |
| 939 } | 939 } |
| 940 case VariableLocation::GLOBAL: { | 940 case VariableLocation::GLOBAL: |
| 941 // Global var, const, or let variable. | |
| 942 // TODO(rmcilroy): If context chain depth is short enough, do this using | |
| 943 // a generic version of LoadGlobalViaContextStub rather than calling the | |
| 944 // runtime. | |
| 945 DCHECK(variable->IsStaticGlobalObjectProperty()); | |
| 946 builder()->LoadGlobal(variable->index()); | |
| 947 execution_result()->SetResultInAccumulator(); | |
| 948 break; | |
| 949 } | |
| 950 case VariableLocation::UNALLOCATED: { | 941 case VariableLocation::UNALLOCATED: { |
| 951 TemporaryRegisterScope temporary_register_scope(builder()); | 942 TemporaryRegisterScope temporary_register_scope(builder()); |
| 952 Register obj = temporary_register_scope.NewRegister(); | 943 Register obj = temporary_register_scope.NewRegister(); |
| 953 builder()->LoadContextSlot(execution_context()->reg(), | 944 builder()->LoadContextSlot(execution_context()->reg(), |
| 954 Context::GLOBAL_OBJECT_INDEX); | 945 Context::GLOBAL_OBJECT_INDEX); |
| 955 builder()->StoreAccumulatorInRegister(obj); | 946 builder()->StoreAccumulatorInRegister(obj); |
| 956 builder()->LoadLiteral(variable->name()); | 947 builder()->LoadLiteral(variable->name()); |
| 957 builder()->LoadNamedProperty(obj, feedback_index(slot), language_mode()); | 948 builder()->LoadNamedProperty(obj, feedback_index(slot), language_mode()); |
| 958 execution_result()->SetResultInAccumulator(); | 949 execution_result()->SetResultInAccumulator(); |
| 959 break; | 950 break; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 987 break; | 978 break; |
| 988 } | 979 } |
| 989 case VariableLocation::PARAMETER: { | 980 case VariableLocation::PARAMETER: { |
| 990 // The parameter indices are shifted by 1 (receiver is variable | 981 // The parameter indices are shifted by 1 (receiver is variable |
| 991 // index -1 but is parameter index 0 in BytecodeArrayBuilder). | 982 // index -1 but is parameter index 0 in BytecodeArrayBuilder). |
| 992 Register destination(builder()->Parameter(variable->index() + 1)); | 983 Register destination(builder()->Parameter(variable->index() + 1)); |
| 993 builder()->StoreAccumulatorInRegister(destination); | 984 builder()->StoreAccumulatorInRegister(destination); |
| 994 RecordStoreToRegister(destination); | 985 RecordStoreToRegister(destination); |
| 995 break; | 986 break; |
| 996 } | 987 } |
| 997 case VariableLocation::GLOBAL: { | 988 case VariableLocation::GLOBAL: |
| 998 // Global var, const, or let variable. | |
| 999 // TODO(rmcilroy): If context chain depth is short enough, do this using | |
| 1000 // a generic version of LoadGlobalViaContextStub rather than calling the | |
| 1001 // runtime. | |
| 1002 DCHECK(variable->IsStaticGlobalObjectProperty()); | |
| 1003 builder()->StoreGlobal(variable->index(), language_mode()); | |
| 1004 break; | |
| 1005 } | |
| 1006 case VariableLocation::UNALLOCATED: { | 989 case VariableLocation::UNALLOCATED: { |
| 1007 Register value = execution_result()->NewRegister(); | 990 Register value = execution_result()->NewRegister(); |
| 1008 Register obj = execution_result()->NewRegister(); | 991 Register obj = execution_result()->NewRegister(); |
| 1009 Register name = execution_result()->NewRegister(); | 992 Register name = execution_result()->NewRegister(); |
| 1010 | 993 |
| 1011 // TODO(rmcilroy): Investigate whether we can avoid having to stash the | 994 // TODO(rmcilroy): Investigate whether we can avoid having to stash the |
| 1012 // value in a register. | 995 // value in a register. |
| 1013 builder()->StoreAccumulatorInRegister(value); | 996 builder()->StoreAccumulatorInRegister(value); |
| 1014 builder()->LoadContextSlot(execution_context()->reg(), | 997 builder()->LoadContextSlot(execution_context()->reg(), |
| 1015 Context::GLOBAL_OBJECT_INDEX); | 998 Context::GLOBAL_OBJECT_INDEX); |
| (...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1651 } | 1634 } |
| 1652 | 1635 |
| 1653 | 1636 |
| 1654 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { | 1637 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
| 1655 return info()->feedback_vector()->GetIndex(slot); | 1638 return info()->feedback_vector()->GetIndex(slot); |
| 1656 } | 1639 } |
| 1657 | 1640 |
| 1658 } // namespace interpreter | 1641 } // namespace interpreter |
| 1659 } // namespace internal | 1642 } // namespace internal |
| 1660 } // namespace v8 | 1643 } // namespace v8 |
| OLD | NEW |