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 |