| 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-array-builder.h" | 5 #include "src/interpreter/bytecode-array-builder.h" |
| 6 | 6 |
| 7 namespace v8 { | 7 namespace v8 { |
| 8 namespace internal { | 8 namespace internal { |
| 9 namespace interpreter { | 9 namespace interpreter { |
| 10 | 10 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 DISALLOW_COPY_AND_ASSIGN(PreviousBytecodeHelper); | 64 DISALLOW_COPY_AND_ASSIGN(PreviousBytecodeHelper); |
| 65 }; | 65 }; |
| 66 | 66 |
| 67 BytecodeArrayBuilder::BytecodeArrayBuilder(Isolate* isolate, Zone* zone) | 67 BytecodeArrayBuilder::BytecodeArrayBuilder(Isolate* isolate, Zone* zone) |
| 68 : isolate_(isolate), | 68 : isolate_(isolate), |
| 69 zone_(zone), | 69 zone_(zone), |
| 70 bytecodes_(zone), | 70 bytecodes_(zone), |
| 71 bytecode_generated_(false), | 71 bytecode_generated_(false), |
| 72 constant_array_builder_(isolate, zone), | 72 constant_array_builder_(isolate, zone), |
| 73 handler_table_builder_(isolate, zone), | 73 handler_table_builder_(isolate, zone), |
| 74 source_position_table_builder_(isolate, zone), |
| 74 last_block_end_(0), | 75 last_block_end_(0), |
| 75 last_bytecode_start_(~0), | 76 last_bytecode_start_(~0), |
| 76 exit_seen_in_block_(false), | 77 exit_seen_in_block_(false), |
| 77 unbound_jumps_(0), | 78 unbound_jumps_(0), |
| 78 parameter_count_(-1), | 79 parameter_count_(-1), |
| 79 local_register_count_(-1), | 80 local_register_count_(-1), |
| 80 context_register_count_(-1), | 81 context_register_count_(-1), |
| 81 temporary_register_count_(0), | 82 temporary_register_count_(0), |
| 82 free_temporaries_(zone), | 83 free_temporaries_(zone), |
| 83 register_translator_(this) {} | 84 register_translator_(this) {} |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray() { | 147 Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray() { |
| 147 DCHECK_EQ(bytecode_generated_, false); | 148 DCHECK_EQ(bytecode_generated_, false); |
| 148 EnsureReturn(); | 149 EnsureReturn(); |
| 149 | 150 |
| 150 int bytecode_size = static_cast<int>(bytecodes_.size()); | 151 int bytecode_size = static_cast<int>(bytecodes_.size()); |
| 151 int register_count = | 152 int register_count = |
| 152 fixed_and_temporary_register_count() + translation_register_count(); | 153 fixed_and_temporary_register_count() + translation_register_count(); |
| 153 int frame_size = register_count * kPointerSize; | 154 int frame_size = register_count * kPointerSize; |
| 154 Handle<FixedArray> constant_pool = constant_array_builder()->ToFixedArray(); | 155 Handle<FixedArray> constant_pool = constant_array_builder()->ToFixedArray(); |
| 155 Handle<FixedArray> handler_table = handler_table_builder()->ToHandlerTable(); | 156 Handle<FixedArray> handler_table = handler_table_builder()->ToHandlerTable(); |
| 157 Handle<FixedArray> source_position_table = |
| 158 source_position_table_builder()->ToFixedArray(); |
| 156 Handle<BytecodeArray> output = isolate_->factory()->NewBytecodeArray( | 159 Handle<BytecodeArray> output = isolate_->factory()->NewBytecodeArray( |
| 157 bytecode_size, &bytecodes_.front(), frame_size, parameter_count(), | 160 bytecode_size, &bytecodes_.front(), frame_size, parameter_count(), |
| 158 constant_pool); | 161 constant_pool); |
| 159 output->set_handler_table(*handler_table); | 162 output->set_handler_table(*handler_table); |
| 163 output->set_source_position_table(*source_position_table); |
| 160 bytecode_generated_ = true; | 164 bytecode_generated_ = true; |
| 161 return output; | 165 return output; |
| 162 } | 166 } |
| 163 | 167 |
| 164 | 168 |
| 165 template <size_t N> | 169 template <size_t N> |
| 166 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t(&operands)[N]) { | 170 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t(&operands)[N]) { |
| 167 // Don't output dead code. | 171 // Don't output dead code. |
| 168 if (exit_seen_in_block_) return; | 172 if (exit_seen_in_block_) return; |
| 169 | 173 |
| (...skipping 1031 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1201 BytecodeArrayBuilder& BytecodeArrayBuilder::DeleteLookupSlot() { | 1205 BytecodeArrayBuilder& BytecodeArrayBuilder::DeleteLookupSlot() { |
| 1202 Output(Bytecode::kDeleteLookupSlot); | 1206 Output(Bytecode::kDeleteLookupSlot); |
| 1203 return *this; | 1207 return *this; |
| 1204 } | 1208 } |
| 1205 | 1209 |
| 1206 | 1210 |
| 1207 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { | 1211 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { |
| 1208 return constant_array_builder()->Insert(object); | 1212 return constant_array_builder()->Insert(object); |
| 1209 } | 1213 } |
| 1210 | 1214 |
| 1215 void BytecodeArrayBuilder::SetStatementPosition(Statement* stmt) { |
| 1216 if (stmt->position() == RelocInfo::kNoPosition) return; |
| 1217 source_position_table_builder_.AddStatementPosition(bytecodes_.size(), |
| 1218 stmt->position()); |
| 1219 } |
| 1220 |
| 1221 void BytecodeArrayBuilder::SetExpressionPosition(Expression* expr) { |
| 1222 if (expr->position() == RelocInfo::kNoPosition) return; |
| 1223 source_position_table_builder_.AddExpressionPosition(bytecodes_.size(), |
| 1224 expr->position()); |
| 1225 } |
| 1226 |
| 1211 void BytecodeArrayBuilder::ForgeTemporaryRegister() { | 1227 void BytecodeArrayBuilder::ForgeTemporaryRegister() { |
| 1212 temporary_register_count_++; | 1228 temporary_register_count_++; |
| 1213 } | 1229 } |
| 1214 | 1230 |
| 1215 int BytecodeArrayBuilder::BorrowTemporaryRegister() { | 1231 int BytecodeArrayBuilder::BorrowTemporaryRegister() { |
| 1216 if (free_temporaries_.empty()) { | 1232 if (free_temporaries_.empty()) { |
| 1217 ForgeTemporaryRegister(); | 1233 ForgeTemporaryRegister(); |
| 1218 return last_temporary_register().index(); | 1234 return last_temporary_register().index(); |
| 1219 } else { | 1235 } else { |
| 1220 auto pos = free_temporaries_.begin(); | 1236 auto pos = free_temporaries_.begin(); |
| (...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1813 } | 1829 } |
| 1814 | 1830 |
| 1815 // static | 1831 // static |
| 1816 bool BytecodeArrayBuilder::FitsInReg16OperandUntranslated(Register value) { | 1832 bool BytecodeArrayBuilder::FitsInReg16OperandUntranslated(Register value) { |
| 1817 return value.is_short_operand(); | 1833 return value.is_short_operand(); |
| 1818 } | 1834 } |
| 1819 | 1835 |
| 1820 } // namespace interpreter | 1836 } // namespace interpreter |
| 1821 } // namespace internal | 1837 } // namespace internal |
| 1822 } // namespace v8 | 1838 } // namespace v8 |
| OLD | NEW |