| 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 1850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1861 } | 1861 } |
| 1862 | 1862 |
| 1863 void BytecodeGenerator::VisitVariableLoad(Variable* variable, | 1863 void BytecodeGenerator::VisitVariableLoad(Variable* variable, |
| 1864 FeedbackVectorSlot slot, | 1864 FeedbackVectorSlot slot, |
| 1865 TypeofMode typeof_mode) { | 1865 TypeofMode typeof_mode) { |
| 1866 switch (variable->location()) { | 1866 switch (variable->location()) { |
| 1867 case VariableLocation::LOCAL: { | 1867 case VariableLocation::LOCAL: { |
| 1868 Register source(Register(variable->index())); | 1868 Register source(Register(variable->index())); |
| 1869 builder()->LoadAccumulatorWithRegister(source); | 1869 builder()->LoadAccumulatorWithRegister(source); |
| 1870 BuildHoleCheckForVariableLoad(variable); | 1870 BuildHoleCheckForVariableLoad(variable); |
| 1871 execution_result()->SetResultInAccumulator(); | |
| 1872 break; | 1871 break; |
| 1873 } | 1872 } |
| 1874 case VariableLocation::PARAMETER: { | 1873 case VariableLocation::PARAMETER: { |
| 1875 // The parameter indices are shifted by 1 (receiver is variable | 1874 // The parameter indices are shifted by 1 (receiver is variable |
| 1876 // index -1 but is parameter index 0 in BytecodeArrayBuilder). | 1875 // index -1 but is parameter index 0 in BytecodeArrayBuilder). |
| 1877 Register source = builder()->Parameter(variable->index() + 1); | 1876 Register source = builder()->Parameter(variable->index() + 1); |
| 1878 builder()->LoadAccumulatorWithRegister(source); | 1877 builder()->LoadAccumulatorWithRegister(source); |
| 1879 BuildHoleCheckForVariableLoad(variable); | 1878 BuildHoleCheckForVariableLoad(variable); |
| 1880 execution_result()->SetResultInAccumulator(); | |
| 1881 break; | 1879 break; |
| 1882 } | 1880 } |
| 1883 case VariableLocation::GLOBAL: | 1881 case VariableLocation::GLOBAL: |
| 1884 case VariableLocation::UNALLOCATED: { | 1882 case VariableLocation::UNALLOCATED: { |
| 1885 builder()->LoadGlobal(feedback_index(slot), typeof_mode); | 1883 builder()->LoadGlobal(feedback_index(slot), typeof_mode); |
| 1886 execution_result()->SetResultInAccumulator(); | |
| 1887 break; | 1884 break; |
| 1888 } | 1885 } |
| 1889 case VariableLocation::CONTEXT: { | 1886 case VariableLocation::CONTEXT: { |
| 1890 int depth = execution_context()->ContextChainDepth(variable->scope()); | 1887 int depth = execution_context()->ContextChainDepth(variable->scope()); |
| 1891 ContextScope* context = execution_context()->Previous(depth); | 1888 ContextScope* context = execution_context()->Previous(depth); |
| 1892 Register context_reg; | 1889 Register context_reg; |
| 1893 if (context) { | 1890 if (context) { |
| 1894 context_reg = context->reg(); | 1891 context_reg = context->reg(); |
| 1895 } else { | 1892 } else { |
| 1896 context_reg = register_allocator()->NewRegister(); | 1893 context_reg = register_allocator()->NewRegister(); |
| 1897 // Walk the context chain to find the context at the given depth. | 1894 // Walk the context chain to find the context at the given depth. |
| 1898 // TODO(rmcilroy): Perform this work in a bytecode handler once we have | 1895 // TODO(rmcilroy): Perform this work in a bytecode handler once we have |
| 1899 // a generic mechanism for performing jumps in interpreter.cc. | 1896 // a generic mechanism for performing jumps in interpreter.cc. |
| 1900 // TODO(mythria): Also update bytecode graph builder with correct depth | 1897 // TODO(mythria): Also update bytecode graph builder with correct depth |
| 1901 // when this changes. | 1898 // when this changes. |
| 1902 builder() | 1899 builder() |
| 1903 ->LoadAccumulatorWithRegister(execution_context()->reg()) | 1900 ->LoadAccumulatorWithRegister(execution_context()->reg()) |
| 1904 .StoreAccumulatorInRegister(context_reg); | 1901 .StoreAccumulatorInRegister(context_reg); |
| 1905 for (int i = 0; i < depth; ++i) { | 1902 for (int i = 0; i < depth; ++i) { |
| 1906 builder() | 1903 builder() |
| 1907 ->LoadContextSlot(context_reg, Context::PREVIOUS_INDEX) | 1904 ->LoadContextSlot(context_reg, Context::PREVIOUS_INDEX) |
| 1908 .StoreAccumulatorInRegister(context_reg); | 1905 .StoreAccumulatorInRegister(context_reg); |
| 1909 } | 1906 } |
| 1910 } | 1907 } |
| 1911 | 1908 |
| 1912 builder()->LoadContextSlot(context_reg, variable->index()); | 1909 builder()->LoadContextSlot(context_reg, variable->index()); |
| 1913 BuildHoleCheckForVariableLoad(variable); | 1910 BuildHoleCheckForVariableLoad(variable); |
| 1914 execution_result()->SetResultInAccumulator(); | |
| 1915 break; | 1911 break; |
| 1916 } | 1912 } |
| 1917 case VariableLocation::LOOKUP: { | 1913 case VariableLocation::LOOKUP: { |
| 1918 builder()->LoadLookupSlot(variable->name(), typeof_mode); | 1914 builder()->LoadLookupSlot(variable->name(), typeof_mode); |
| 1919 execution_result()->SetResultInAccumulator(); | |
| 1920 break; | 1915 break; |
| 1921 } | 1916 } |
| 1922 case VariableLocation::MODULE: | 1917 case VariableLocation::MODULE: |
| 1923 UNREACHABLE(); | 1918 UNREACHABLE(); |
| 1924 } | 1919 } |
| 1920 execution_result()->SetResultInAccumulator(); |
| 1925 } | 1921 } |
| 1926 | 1922 |
| 1927 void BytecodeGenerator::VisitVariableLoadForAccumulatorValue( | 1923 void BytecodeGenerator::VisitVariableLoadForAccumulatorValue( |
| 1928 Variable* variable, FeedbackVectorSlot slot, TypeofMode typeof_mode) { | 1924 Variable* variable, FeedbackVectorSlot slot, TypeofMode typeof_mode) { |
| 1929 AccumulatorResultScope accumulator_result(this); | 1925 AccumulatorResultScope accumulator_result(this); |
| 1930 VisitVariableLoad(variable, slot, typeof_mode); | 1926 VisitVariableLoad(variable, slot, typeof_mode); |
| 1931 } | 1927 } |
| 1932 | 1928 |
| 1933 Register BytecodeGenerator::VisitVariableLoadForRegisterValue( | 1929 Register BytecodeGenerator::VisitVariableLoadForRegisterValue( |
| 1934 Variable* variable, FeedbackVectorSlot slot, TypeofMode typeof_mode) { | 1930 Variable* variable, FeedbackVectorSlot slot, TypeofMode typeof_mode) { |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2028 } | 2024 } |
| 2029 | 2025 |
| 2030 void BytecodeGenerator::VisitVariableAssignment(Variable* variable, | 2026 void BytecodeGenerator::VisitVariableAssignment(Variable* variable, |
| 2031 Token::Value op, | 2027 Token::Value op, |
| 2032 FeedbackVectorSlot slot) { | 2028 FeedbackVectorSlot slot) { |
| 2033 VariableMode mode = variable->mode(); | 2029 VariableMode mode = variable->mode(); |
| 2034 RegisterAllocationScope assignment_register_scope(this); | 2030 RegisterAllocationScope assignment_register_scope(this); |
| 2035 BytecodeLabel end_label; | 2031 BytecodeLabel end_label; |
| 2036 bool hole_check_required = | 2032 bool hole_check_required = |
| 2037 variable->binding_needs_init() && | 2033 variable->binding_needs_init() && |
| 2038 ((IsLexicalVariableMode(mode) && op != Token::INIT) || | 2034 (op != Token::INIT || (mode == CONST && variable->is_this())); |
| 2039 (mode == CONST && op == Token::INIT && variable->is_this())); | |
| 2040 switch (variable->location()) { | 2035 switch (variable->location()) { |
| 2041 case VariableLocation::PARAMETER: | 2036 case VariableLocation::PARAMETER: |
| 2042 case VariableLocation::LOCAL: { | 2037 case VariableLocation::LOCAL: { |
| 2043 Register destination; | 2038 Register destination; |
| 2044 if (VariableLocation::PARAMETER == variable->location()) { | 2039 if (VariableLocation::PARAMETER == variable->location()) { |
| 2045 destination = Register(builder()->Parameter(variable->index() + 1)); | 2040 destination = Register(builder()->Parameter(variable->index() + 1)); |
| 2046 } else { | 2041 } else { |
| 2047 destination = Register(variable->index()); | 2042 destination = Register(variable->index()); |
| 2048 } | 2043 } |
| 2049 | 2044 |
| (...skipping 1235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3285 return execution_context()->scope()->language_mode(); | 3280 return execution_context()->scope()->language_mode(); |
| 3286 } | 3281 } |
| 3287 | 3282 |
| 3288 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { | 3283 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
| 3289 return TypeFeedbackVector::GetIndex(slot); | 3284 return TypeFeedbackVector::GetIndex(slot); |
| 3290 } | 3285 } |
| 3291 | 3286 |
| 3292 } // namespace interpreter | 3287 } // namespace interpreter |
| 3293 } // namespace internal | 3288 } // namespace internal |
| 3294 } // namespace v8 | 3289 } // namespace v8 |
| OLD | NEW |