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 |
11 BytecodeArrayBuilder::BytecodeArrayBuilder(Isolate* isolate, Zone* zone) | 11 BytecodeArrayBuilder::BytecodeArrayBuilder(Isolate* isolate, Zone* zone) |
12 : isolate_(isolate), | 12 : isolate_(isolate), |
13 zone_(zone), | |
13 bytecodes_(zone), | 14 bytecodes_(zone), |
14 bytecode_generated_(false), | 15 bytecode_generated_(false), |
15 last_block_end_(0), | 16 last_block_end_(0), |
16 last_bytecode_start_(~0), | 17 last_bytecode_start_(~0), |
17 return_seen_in_block_(false), | 18 return_seen_in_block_(false), |
18 constants_map_(isolate->heap(), zone), | 19 constants_map_(isolate->heap(), zone), |
19 constants_(zone), | 20 constants_(zone), |
20 parameter_count_(-1), | 21 parameter_count_(-1), |
21 local_register_count_(-1), | 22 local_register_count_(-1), |
22 temporary_register_count_(0), | 23 temporary_register_count_(0), |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
307 if (label->is_forward_target()) { | 308 if (label->is_forward_target()) { |
308 // An earlier jump instruction refers to this label. Update it's location. | 309 // An earlier jump instruction refers to this label. Update it's location. |
309 PatchJump(bytecodes()->end(), bytecodes()->begin() + label->offset()); | 310 PatchJump(bytecodes()->end(), bytecodes()->begin() + label->offset()); |
310 // Now treat as if the label will only be back referred to. | 311 // Now treat as if the label will only be back referred to. |
311 } | 312 } |
312 label->bind_to(bytecodes()->size()); | 313 label->bind_to(bytecodes()->size()); |
313 return *this; | 314 return *this; |
314 } | 315 } |
315 | 316 |
316 | 317 |
318 BytecodeArrayBuilder& BytecodeArrayBuilder::Bind( | |
319 BytecodeLabel* unbound, const BytecodeLabel* const bound) { | |
320 DCHECK_EQ(unbound->is_bound(), false); | |
321 DCHECK_EQ(bound->is_bound(), true); | |
322 PatchJump(bytecodes()->begin() + bound->offset(), | |
323 bytecodes()->begin() + unbound->offset()); | |
324 unbound->bind_to(bound->offset()); | |
325 return *this; | |
326 } | |
327 | |
328 | |
317 // static | 329 // static |
318 bool BytecodeArrayBuilder::IsJumpWithImm8Operand(Bytecode jump_bytecode) { | 330 bool BytecodeArrayBuilder::IsJumpWithImm8Operand(Bytecode jump_bytecode) { |
rmcilroy
2015/10/01 12:12:07
replace this with your newly added Bytecodes::IsJu
oth
2015/10/01 13:13:56
Done.
| |
319 return jump_bytecode == Bytecode::kJump || | 331 return jump_bytecode == Bytecode::kJump || |
320 jump_bytecode == Bytecode::kJumpIfTrue || | 332 jump_bytecode == Bytecode::kJumpIfTrue || |
321 jump_bytecode == Bytecode::kJumpIfFalse; | 333 jump_bytecode == Bytecode::kJumpIfFalse; |
322 } | 334 } |
323 | 335 |
324 | 336 |
325 // static | 337 // static |
326 Bytecode BytecodeArrayBuilder::GetJumpWithConstantOperand( | 338 Bytecode BytecodeArrayBuilder::GetJumpWithConstantOperand( |
327 Bytecode jump_bytecode) { | 339 Bytecode jump_bytecode) { |
328 switch (jump_bytecode) { | 340 switch (jump_bytecode) { |
(...skipping 11 matching lines...) Expand all Loading... | |
340 | 352 |
341 | 353 |
342 void BytecodeArrayBuilder::PatchJump( | 354 void BytecodeArrayBuilder::PatchJump( |
343 const ZoneVector<uint8_t>::iterator& jump_target, | 355 const ZoneVector<uint8_t>::iterator& jump_target, |
344 ZoneVector<uint8_t>::iterator jump_location) { | 356 ZoneVector<uint8_t>::iterator jump_location) { |
345 Bytecode jump_bytecode = Bytecodes::FromByte(*jump_location); | 357 Bytecode jump_bytecode = Bytecodes::FromByte(*jump_location); |
346 int delta = static_cast<int>(jump_target - jump_location); | 358 int delta = static_cast<int>(jump_target - jump_location); |
347 | 359 |
348 DCHECK(IsJumpWithImm8Operand(jump_bytecode)); | 360 DCHECK(IsJumpWithImm8Operand(jump_bytecode)); |
349 DCHECK_EQ(Bytecodes::Size(jump_bytecode), 2); | 361 DCHECK_EQ(Bytecodes::Size(jump_bytecode), 2); |
350 DCHECK_GE(delta, 0); | |
rmcilroy
2015/10/01 12:12:07
Maybe make this DCHECK_NE(delta, 0) instead of rem
oth
2015/10/01 13:13:56
Done.
| |
351 | 362 |
352 if (FitsInImm8Operand(delta)) { | 363 if (FitsInImm8Operand(delta)) { |
353 // Just update the operand | 364 // Just update the operand |
354 jump_location++; | 365 jump_location++; |
355 *jump_location = static_cast<uint8_t>(delta); | 366 *jump_location = static_cast<uint8_t>(delta); |
356 } else { | 367 } else { |
357 // Update the jump type and operand | 368 // Update the jump type and operand |
358 size_t entry = GetConstantPoolEntry(handle(Smi::FromInt(delta), isolate())); | 369 size_t entry = GetConstantPoolEntry(handle(Smi::FromInt(delta), isolate())); |
359 if (FitsInIdxOperand(entry)) { | 370 if (FitsInIdxOperand(entry)) { |
360 *jump_location++ = | 371 *jump_location++ = |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
605 | 616 |
606 Register TemporaryRegisterScope::NewRegister() { | 617 Register TemporaryRegisterScope::NewRegister() { |
607 count_++; | 618 count_++; |
608 last_register_index_ = builder_->BorrowTemporaryRegister(); | 619 last_register_index_ = builder_->BorrowTemporaryRegister(); |
609 return Register(last_register_index_); | 620 return Register(last_register_index_); |
610 } | 621 } |
611 | 622 |
612 } // namespace interpreter | 623 } // namespace interpreter |
613 } // namespace internal | 624 } // namespace internal |
614 } // namespace v8 | 625 } // namespace v8 |
OLD | NEW |