| 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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 } | 66 } |
| 67 | 67 |
| 68 // Generate bytecode handlers for all bytecodes and scales. | 68 // Generate bytecode handlers for all bytecodes and scales. |
| 69 const OperandScale kOperandScales[] = { | 69 const OperandScale kOperandScales[] = { |
| 70 #define VALUE(Name, _) OperandScale::k##Name, | 70 #define VALUE(Name, _) OperandScale::k##Name, |
| 71 OPERAND_SCALE_LIST(VALUE) | 71 OPERAND_SCALE_LIST(VALUE) |
| 72 #undef VALUE | 72 #undef VALUE |
| 73 }; | 73 }; |
| 74 | 74 |
| 75 for (OperandScale operand_scale : kOperandScales) { | 75 for (OperandScale operand_scale : kOperandScales) { |
| 76 #define GENERATE_CODE(Name, ...) \ | 76 #define GENERATE_CODE(Name, ...) \ |
| 77 { \ | 77 InstallBytecodeHandler(&zone, Bytecode::k##Name, operand_scale, \ |
| 78 if (Bytecodes::BytecodeHasHandler(Bytecode::k##Name, operand_scale)) { \ | 78 &Interpreter::Do##Name); |
| 79 InterpreterDispatchDescriptor descriptor(isolate_); \ | |
| 80 compiler::CodeAssemblerState state( \ | |
| 81 isolate_, &zone, descriptor, \ | |
| 82 Code::ComputeFlags(Code::BYTECODE_HANDLER), \ | |
| 83 Bytecodes::ToString(Bytecode::k##Name), \ | |
| 84 Bytecodes::ReturnCount(Bytecode::k##Name)); \ | |
| 85 InterpreterAssembler assembler(&state, Bytecode::k##Name, \ | |
| 86 operand_scale); \ | |
| 87 Do##Name(&assembler); \ | |
| 88 Handle<Code> code = compiler::CodeAssembler::GenerateCode(&state); \ | |
| 89 size_t index = GetDispatchTableIndex(Bytecode::k##Name, operand_scale); \ | |
| 90 dispatch_table_[index] = code->entry(); \ | |
| 91 TraceCodegen(code); \ | |
| 92 PROFILE( \ | |
| 93 isolate_, \ | |
| 94 CodeCreateEvent( \ | |
| 95 CodeEventListener::BYTECODE_HANDLER_TAG, \ | |
| 96 AbstractCode::cast(*code), \ | |
| 97 Bytecodes::ToString(Bytecode::k##Name, operand_scale).c_str())); \ | |
| 98 } \ | |
| 99 } | |
| 100 BYTECODE_LIST(GENERATE_CODE) | 79 BYTECODE_LIST(GENERATE_CODE) |
| 101 #undef GENERATE_CODE | 80 #undef GENERATE_CODE |
| 102 } | 81 } |
| 103 | 82 |
| 104 // Fill unused entries will the illegal bytecode handler. | 83 // Fill unused entries will the illegal bytecode handler. |
| 105 size_t illegal_index = | 84 size_t illegal_index = |
| 106 GetDispatchTableIndex(Bytecode::kIllegal, OperandScale::kSingle); | 85 GetDispatchTableIndex(Bytecode::kIllegal, OperandScale::kSingle); |
| 107 for (size_t index = 0; index < arraysize(dispatch_table_); ++index) { | 86 for (size_t index = 0; index < arraysize(dispatch_table_); ++index) { |
| 108 if (dispatch_table_[index] == nullptr) { | 87 if (dispatch_table_[index] == nullptr) { |
| 109 dispatch_table_[index] = dispatch_table_[illegal_index]; | 88 dispatch_table_[index] = dispatch_table_[illegal_index]; |
| 110 } | 89 } |
| 111 } | 90 } |
| 112 | 91 |
| 113 // Initialization should have been successful. | 92 // Initialization should have been successful. |
| 114 DCHECK(IsDispatchTableInitialized()); | 93 DCHECK(IsDispatchTableInitialized()); |
| 115 } | 94 } |
| 116 | 95 |
| 96 void Interpreter::InstallBytecodeHandler(Zone* zone, Bytecode bytecode, |
| 97 OperandScale operand_scale, |
| 98 BytecodeGeneratorFunc generator) { |
| 99 if (!Bytecodes::BytecodeHasHandler(bytecode, operand_scale)) return; |
| 100 |
| 101 InterpreterDispatchDescriptor descriptor(isolate_); |
| 102 compiler::CodeAssemblerState state( |
| 103 isolate_, zone, descriptor, Code::ComputeFlags(Code::BYTECODE_HANDLER), |
| 104 Bytecodes::ToString(bytecode), Bytecodes::ReturnCount(bytecode)); |
| 105 InterpreterAssembler assembler(&state, bytecode, operand_scale); |
| 106 (this->*generator)(&assembler); |
| 107 Handle<Code> code = compiler::CodeAssembler::GenerateCode(&state); |
| 108 size_t index = GetDispatchTableIndex(bytecode, operand_scale); |
| 109 dispatch_table_[index] = code->entry(); |
| 110 TraceCodegen(code); |
| 111 PROFILE(isolate_, CodeCreateEvent( |
| 112 CodeEventListener::BYTECODE_HANDLER_TAG, |
| 113 AbstractCode::cast(*code), |
| 114 Bytecodes::ToString(bytecode, operand_scale).c_str())); |
| 115 } |
| 116 |
| 117 Code* Interpreter::GetBytecodeHandler(Bytecode bytecode, | 117 Code* Interpreter::GetBytecodeHandler(Bytecode bytecode, |
| 118 OperandScale operand_scale) { | 118 OperandScale operand_scale) { |
| 119 DCHECK(IsDispatchTableInitialized()); | 119 DCHECK(IsDispatchTableInitialized()); |
| 120 DCHECK(Bytecodes::BytecodeHasHandler(bytecode, operand_scale)); | 120 DCHECK(Bytecodes::BytecodeHasHandler(bytecode, operand_scale)); |
| 121 size_t index = GetDispatchTableIndex(bytecode, operand_scale); | 121 size_t index = GetDispatchTableIndex(bytecode, operand_scale); |
| 122 Address code_entry = dispatch_table_[index]; | 122 Address code_entry = dispatch_table_[index]; |
| 123 return Code::GetCodeFromTargetAddress(code_entry); | 123 return Code::GetCodeFromTargetAddress(code_entry); |
| 124 } | 124 } |
| 125 | 125 |
| 126 // static | 126 // static |
| (...skipping 2739 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2866 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, | 2866 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, |
| 2867 __ SmiTag(new_state)); | 2867 __ SmiTag(new_state)); |
| 2868 __ SetAccumulator(old_state); | 2868 __ SetAccumulator(old_state); |
| 2869 | 2869 |
| 2870 __ Dispatch(); | 2870 __ Dispatch(); |
| 2871 } | 2871 } |
| 2872 | 2872 |
| 2873 } // namespace interpreter | 2873 } // namespace interpreter |
| 2874 } // namespace internal | 2874 } // namespace internal |
| 2875 } // namespace v8 | 2875 } // namespace v8 |
| OLD | NEW |