Chromium Code Reviews| 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/interpreter.h" | 5 #include "src/interpreter/interpreter.h" |
| 6 | 6 |
| 7 #include <fstream> | 7 #include <fstream> |
| 8 #include <memory> | 8 #include <memory> |
| 9 | 9 |
| 10 #include "src/ast/prettyprinter.h" | 10 #include "src/ast/prettyprinter.h" |
| (...skipping 910 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 921 | 921 |
| 922 // StaKeyedPropertyStrict <object> <key> <slot> | 922 // StaKeyedPropertyStrict <object> <key> <slot> |
| 923 // | 923 // |
| 924 // Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object> | 924 // Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object> |
| 925 // and the key <key> with the value in the accumulator. | 925 // and the key <key> with the value in the accumulator. |
| 926 void Interpreter::DoStaKeyedPropertyStrict(InterpreterAssembler* assembler) { | 926 void Interpreter::DoStaKeyedPropertyStrict(InterpreterAssembler* assembler) { |
| 927 Callable ic = CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT); | 927 Callable ic = CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT); |
| 928 DoKeyedStoreIC(ic, assembler); | 928 DoKeyedStoreIC(ic, assembler); |
| 929 } | 929 } |
| 930 | 930 |
| 931 // LdaModuleVariable <imm> | |
| 932 // | |
| 933 // Load the contents of a module variable into the accumulator. The variable is | |
| 934 // identified by its index <imm>. | |
| 935 void Interpreter::DoLdaModuleVariable(InterpreterAssembler* assembler) { | |
|
Benedikt Meurer
2016/11/04 16:45:59
Cool! I like this!
| |
| 936 Node* raw_index = __ BytecodeOperandImm(0); | |
| 937 | |
| 938 Node* module_context = __ LoadModuleContext(__ GetContext()); | |
| 939 Node* module = __ LoadContextSlot(module_context, Context::EXTENSION_INDEX); | |
| 940 | |
| 941 Label if_export(assembler), if_import(assembler), end(assembler); | |
| 942 __ Branch(__ IntPtrGreaterThan(raw_index, __ IntPtrConstant(0)), &if_export, | |
| 943 &if_import); | |
| 944 | |
| 945 __ Bind(&if_export); | |
| 946 { | |
| 947 Node* regular_exports = | |
| 948 __ LoadObjectField(module, Module::kRegularExportsOffset); | |
| 949 // The actual array index is (raw_index - 1). | |
| 950 Node* export_index = __ IntPtrSub(raw_index, __ IntPtrConstant(1)); | |
| 951 Node* cell = __ LoadFixedArrayElement(regular_exports, export_index); | |
| 952 __ SetAccumulator(__ LoadObjectField(cell, Cell::kValueOffset)); | |
| 953 __ Goto(&end); | |
| 954 } | |
| 955 | |
| 956 __ Bind(&if_import); | |
| 957 { | |
| 958 Node* regular_imports = | |
| 959 __ LoadObjectField(module, Module::kRegularImportsOffset); | |
| 960 // The actual array index is (-raw_index - 1). | |
| 961 Node* import_index = __ IntPtrSub( | |
| 962 __ IntPtrMul(raw_index, __ IntPtrConstant(-1)), __ IntPtrConstant(1)); | |
| 963 Node* cell = __ LoadFixedArrayElement(regular_imports, import_index); | |
| 964 __ SetAccumulator(__ LoadObjectField(cell, Cell::kValueOffset)); | |
| 965 __ Goto(&end); | |
| 966 } | |
| 967 | |
| 968 __ Bind(&end); | |
| 969 __ Dispatch(); | |
| 970 } | |
| 971 | |
| 972 // StaModuleVariable <imm> | |
| 973 // | |
| 974 // Store accumulator to the module variable identified by its index <imm>. | |
| 975 void Interpreter::DoStaModuleVariable(InterpreterAssembler* assembler) { | |
| 976 Node* value = __ GetAccumulator(); | |
| 977 Node* raw_index = __ BytecodeOperandImm(0); | |
| 978 | |
| 979 Node* module_context = __ LoadModuleContext(__ GetContext()); | |
| 980 Node* module = __ LoadContextSlot(module_context, Context::EXTENSION_INDEX); | |
| 981 | |
| 982 Label if_export(assembler), if_import(assembler), end(assembler); | |
| 983 __ Branch(__ IntPtrGreaterThan(raw_index, __ IntPtrConstant(0)), &if_export, | |
| 984 &if_import); | |
| 985 | |
| 986 __ Bind(&if_export); | |
| 987 { | |
| 988 Node* regular_exports = | |
| 989 __ LoadObjectField(module, Module::kRegularExportsOffset); | |
| 990 Node* export_index = __ IntPtrSub(raw_index, __ IntPtrConstant(1)); | |
| 991 Node* cell = __ LoadFixedArrayElement(regular_exports, export_index); | |
| 992 __ StoreObjectField(cell, Cell::kValueOffset, value); | |
| 993 __ Goto(&end); | |
| 994 } | |
| 995 | |
| 996 __ Bind(&if_import); | |
| 997 { | |
| 998 // Not supported (probably never). | |
| 999 __ Abort(kUnsupportedModuleOperation); | |
| 1000 __ Goto(&end); | |
| 1001 } | |
| 1002 | |
| 1003 __ Bind(&end); | |
| 1004 __ Dispatch(); | |
| 1005 } | |
| 1006 | |
| 931 // PushContext <context> | 1007 // PushContext <context> |
| 932 // | 1008 // |
| 933 // Saves the current context in <context>, and pushes the accumulator as the | 1009 // Saves the current context in <context>, and pushes the accumulator as the |
| 934 // new current context. | 1010 // new current context. |
| 935 void Interpreter::DoPushContext(InterpreterAssembler* assembler) { | 1011 void Interpreter::DoPushContext(InterpreterAssembler* assembler) { |
| 936 Node* reg_index = __ BytecodeOperandReg(0); | 1012 Node* reg_index = __ BytecodeOperandReg(0); |
| 937 Node* new_context = __ GetAccumulator(); | 1013 Node* new_context = __ GetAccumulator(); |
| 938 Node* old_context = __ GetContext(); | 1014 Node* old_context = __ GetContext(); |
| 939 __ StoreRegister(old_context, reg_index); | 1015 __ StoreRegister(old_context, reg_index); |
| 940 __ SetContext(new_context); | 1016 __ SetContext(new_context); |
| (...skipping 1754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2695 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, | 2771 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, |
| 2696 __ SmiTag(new_state)); | 2772 __ SmiTag(new_state)); |
| 2697 __ SetAccumulator(old_state); | 2773 __ SetAccumulator(old_state); |
| 2698 | 2774 |
| 2699 __ Dispatch(); | 2775 __ Dispatch(); |
| 2700 } | 2776 } |
| 2701 | 2777 |
| 2702 } // namespace interpreter | 2778 } // namespace interpreter |
| 2703 } // namespace internal | 2779 } // namespace internal |
| 2704 } // namespace v8 | 2780 } // namespace v8 |
| OLD | NEW |