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 |