Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "src/interpreter/bytecode-array-writer.h" | |
| 6 | |
| 7 #include <iomanip> | |
| 8 #include "src/interpreter/source-position-table.h" | |
| 9 | |
| 10 namespace v8 { | |
| 11 namespace internal { | |
| 12 namespace interpreter { | |
| 13 | |
| 14 BytecodeArrayWriter::BytecodeArrayWriter( | |
| 15 Zone* zone, SourcePositionTableBuilder* source_position_table_builder) | |
| 16 : bytecodes_(zone), | |
| 17 frame_register_count_(0), | |
| 18 source_position_table_builder_(source_position_table_builder) { | |
| 19 bytecodes_.reserve(256); | |
| 20 } | |
| 21 | |
| 22 // override | |
| 23 BytecodeArrayWriter::~BytecodeArrayWriter() {} | |
| 24 | |
| 25 // override | |
| 26 size_t BytecodeArrayWriter::FlushForOffset() { return bytecodes()->size(); } | |
| 27 | |
| 28 // override | |
| 29 void BytecodeArrayWriter::Write(BytecodeNode* node) { | |
| 30 UpdateSourcePositionTable(node); | |
| 31 EmitBytecode(node); | |
| 32 node->Release(); | |
| 33 } | |
| 34 | |
| 35 void BytecodeArrayWriter::UpdateSourcePositionTable( | |
| 36 const BytecodeNode* const node) { | |
| 37 int bytecode_offset = static_cast<int>(bytecodes()->size()); | |
| 38 const BytecodeSourceInfo& source_info = node->source_info(); | |
| 39 if (source_info.is_valid()) { | |
| 40 if (source_info.is_statement()) { | |
| 41 source_position_table_builder_->AddStatementPosition( | |
|
rmcilroy
2016/05/10 11:14:09
nit - maybe just update SourcePositionTableBuilder
oth
2016/05/11 13:17:30
Done.
| |
| 42 bytecode_offset, source_info.source_position()); | |
| 43 } else { | |
| 44 source_position_table_builder_->AddExpressionPosition( | |
| 45 bytecode_offset, source_info.source_position()); | |
| 46 } | |
| 47 } | |
| 48 } | |
| 49 | |
| 50 void BytecodeArrayWriter::EmitBytecode(const BytecodeNode* const node) { | |
| 51 OperandScale operand_scale = node->operand_scale(); | |
| 52 if (operand_scale != OperandScale::kSingle) { | |
| 53 Bytecode prefix = Bytecodes::OperandScaleToPrefixBytecode(operand_scale); | |
| 54 bytecodes()->push_back(Bytecodes::ToByte(prefix)); | |
| 55 } | |
| 56 | |
| 57 Bytecode bytecode = node->bytecode(); | |
| 58 bytecodes()->push_back(Bytecodes::ToByte(bytecode)); | |
| 59 | |
| 60 int register_operand_bitmap = Bytecodes::GetRegisterOperandBitmap(bytecode); | |
| 61 const uint32_t* const operands = node->operands(); | |
| 62 const OperandType* operand_types = Bytecodes::GetOperandTypes(bytecode); | |
| 63 for (int i = 0; operand_types[i] != OperandType::kNone; ++i) { | |
| 64 OperandType operand_type = operand_types[i]; | |
| 65 switch (Bytecodes::SizeOfOperand(operand_type, operand_scale)) { | |
| 66 case OperandSize::kNone: | |
| 67 UNREACHABLE(); | |
| 68 break; | |
| 69 case OperandSize::kByte: | |
| 70 bytecodes()->push_back(static_cast<uint8_t>(operands[i])); | |
| 71 break; | |
| 72 case OperandSize::kShort: { | |
| 73 uint8_t operand_bytes[2]; | |
| 74 WriteUnalignedUInt16(operand_bytes, operands[i]); | |
| 75 bytecodes()->insert(bytecodes()->end(), operand_bytes, | |
| 76 operand_bytes + 2); | |
| 77 break; | |
| 78 } | |
| 79 case OperandSize::kQuad: { | |
| 80 uint8_t operand_bytes[4]; | |
| 81 WriteUnalignedUInt32(operand_bytes, operands[i]); | |
| 82 bytecodes()->insert(bytecodes()->end(), operand_bytes, | |
| 83 operand_bytes + 4); | |
| 84 break; | |
| 85 } | |
| 86 } | |
| 87 | |
| 88 if ((register_operand_bitmap >> i) & 1) { | |
| 89 int count; | |
| 90 if (operand_types[i + 1] == OperandType::kRegCount) { | |
| 91 count = static_cast<int>(operands[i + 1]); | |
| 92 } else { | |
| 93 count = Bytecodes::GetNumberOfRegistersRepresentedBy(operand_type); | |
| 94 } | |
| 95 Register reg = Register::FromOperand(static_cast<int32_t>(operands[i])); | |
| 96 frame_register_count_ = | |
|
rmcilroy
2016/05/10 11:14:09
Nit - max_register_count_ ?
oth
2016/05/11 13:17:30
Done.
| |
| 97 std::max(frame_register_count_, reg.index() + count); | |
| 98 } | |
| 99 } | |
| 100 } | |
| 101 | |
| 102 // override | |
| 103 void BytecodeArrayWriter::LeaveBasicBlock() {} | |
| 104 | |
| 105 int BytecodeArrayWriter::GetMeasuredFrameSize() { | |
|
rmcilroy
2016/05/10 11:14:09
nit - GetMaxRegisterCount() ?
oth
2016/05/11 13:17:30
The emphasis is on measured. Returning the size ra
rmcilroy
2016/05/12 12:15:13
How about GetMaximumFrameSizeUsed()?
rmcilroy
2016/05/12 15:19:47
Did you miss this comment, or prefer GetMeasuredFr
oth
2016/05/12 15:44:31
Done.
| |
| 106 return frame_register_count_ * kPointerSize; | |
| 107 } | |
| 108 | |
| 109 } // namespace interpreter | |
| 110 } // namespace internal | |
| 111 } // namespace v8 | |
| OLD | NEW |