| Index: test/unittests/interpreter/bytecode-array-writer-unittest.cc
|
| diff --git a/test/unittests/interpreter/bytecode-array-writer-unittest.cc b/test/unittests/interpreter/bytecode-array-writer-unittest.cc
|
| index 0bb0f9757a74fc7afc37c9d0856e516106191355..e3eb7a9a099c8a80ce4c013eae03aaae1a6fd909 100644
|
| --- a/test/unittests/interpreter/bytecode-array-writer-unittest.cc
|
| +++ b/test/unittests/interpreter/bytecode-array-writer-unittest.cc
|
| @@ -28,78 +28,93 @@
|
| SourcePositionTableBuilder::RECORD_SOURCE_POSITIONS) {}
|
| ~BytecodeArrayWriterUnittest() override {}
|
|
|
| - void Write(Bytecode bytecode, BytecodeSourceInfo info = BytecodeSourceInfo());
|
| + void Write(BytecodeNode* node, const BytecodeSourceInfo& info);
|
| + void Write(Bytecode bytecode,
|
| + const BytecodeSourceInfo& info = BytecodeSourceInfo());
|
| void Write(Bytecode bytecode, uint32_t operand0,
|
| - BytecodeSourceInfo info = BytecodeSourceInfo());
|
| + const BytecodeSourceInfo& info = BytecodeSourceInfo());
|
| void Write(Bytecode bytecode, uint32_t operand0, uint32_t operand1,
|
| - BytecodeSourceInfo info = BytecodeSourceInfo());
|
| +
|
| + const BytecodeSourceInfo& info = BytecodeSourceInfo());
|
| void Write(Bytecode bytecode, uint32_t operand0, uint32_t operand1,
|
| - uint32_t operand2, BytecodeSourceInfo info = BytecodeSourceInfo());
|
| + uint32_t operand2,
|
| + const BytecodeSourceInfo& info = BytecodeSourceInfo());
|
| void Write(Bytecode bytecode, uint32_t operand0, uint32_t operand1,
|
| uint32_t operand2, uint32_t operand3,
|
| - BytecodeSourceInfo info = BytecodeSourceInfo());
|
| + const BytecodeSourceInfo& info = BytecodeSourceInfo());
|
|
|
| void WriteJump(Bytecode bytecode, BytecodeLabel* label,
|
| - BytecodeSourceInfo info = BytecodeSourceInfo());
|
| - void WriteJumpLoop(Bytecode bytecode, BytecodeLabel* label, int depth,
|
| - BytecodeSourceInfo info = BytecodeSourceInfo());
|
| + const BytecodeSourceInfo& info = BytecodeSourceInfo());
|
| + void WriteJumpLoop(Bytecode bytecode, BytecodeLabel* label, int depth);
|
|
|
| BytecodeArrayWriter* writer() { return &bytecode_array_writer_; }
|
| ZoneVector<unsigned char>* bytecodes() { return writer()->bytecodes(); }
|
| SourcePositionTableBuilder* source_position_table_builder() {
|
| return writer()->source_position_table_builder();
|
| }
|
| + int max_register_count() { return writer()->max_register_count(); }
|
|
|
| private:
|
| ConstantArrayBuilder constant_array_builder_;
|
| BytecodeArrayWriter bytecode_array_writer_;
|
| };
|
|
|
| +void BytecodeArrayWriterUnittest::Write(BytecodeNode* node,
|
| + const BytecodeSourceInfo& info) {
|
| + if (info.is_valid()) {
|
| + node->source_info().Clone(info);
|
| + }
|
| + writer()->Write(node);
|
| +}
|
| +
|
| void BytecodeArrayWriterUnittest::Write(Bytecode bytecode,
|
| - BytecodeSourceInfo info) {
|
| - BytecodeNode node(bytecode, &info);
|
| - writer()->Write(&node);
|
| -}
|
| -
|
| -void BytecodeArrayWriterUnittest::Write(Bytecode bytecode, uint32_t operand0,
|
| - BytecodeSourceInfo info) {
|
| - BytecodeNode node(bytecode, operand0, &info);
|
| - writer()->Write(&node);
|
| + const BytecodeSourceInfo& info) {
|
| + BytecodeNode node(bytecode);
|
| + Write(&node, info);
|
| +}
|
| +
|
| +void BytecodeArrayWriterUnittest::Write(Bytecode bytecode, uint32_t operand0,
|
| + const BytecodeSourceInfo& info) {
|
| + BytecodeNode node(bytecode, operand0);
|
| + Write(&node, info);
|
| }
|
|
|
| void BytecodeArrayWriterUnittest::Write(Bytecode bytecode, uint32_t operand0,
|
| uint32_t operand1,
|
| - BytecodeSourceInfo info) {
|
| - BytecodeNode node(bytecode, operand0, operand1, &info);
|
| - writer()->Write(&node);
|
| + const BytecodeSourceInfo& info) {
|
| + BytecodeNode node(bytecode, operand0, operand1);
|
| + Write(&node, info);
|
| }
|
|
|
| void BytecodeArrayWriterUnittest::Write(Bytecode bytecode, uint32_t operand0,
|
| uint32_t operand1, uint32_t operand2,
|
| - BytecodeSourceInfo info) {
|
| - BytecodeNode node(bytecode, operand0, operand1, operand2, &info);
|
| - writer()->Write(&node);
|
| + const BytecodeSourceInfo& info) {
|
| + BytecodeNode node(bytecode, operand0, operand1, operand2);
|
| + Write(&node, info);
|
| }
|
|
|
| void BytecodeArrayWriterUnittest::Write(Bytecode bytecode, uint32_t operand0,
|
| uint32_t operand1, uint32_t operand2,
|
| uint32_t operand3,
|
| - BytecodeSourceInfo info) {
|
| - BytecodeNode node(bytecode, operand0, operand1, operand2, operand3, &info);
|
| - writer()->Write(&node);
|
| + const BytecodeSourceInfo& info) {
|
| + BytecodeNode node(bytecode, operand0, operand1, operand2, operand3);
|
| + Write(&node, info);
|
| }
|
|
|
| void BytecodeArrayWriterUnittest::WriteJump(Bytecode bytecode,
|
| BytecodeLabel* label,
|
| - BytecodeSourceInfo info) {
|
| - BytecodeNode node(bytecode, 0, &info);
|
| + const BytecodeSourceInfo& info) {
|
| + BytecodeNode node(bytecode, 0);
|
| + if (info.is_valid()) {
|
| + node.source_info().Clone(info);
|
| + }
|
| writer()->WriteJump(&node, label);
|
| }
|
|
|
| void BytecodeArrayWriterUnittest::WriteJumpLoop(Bytecode bytecode,
|
| - BytecodeLabel* label, int depth,
|
| - BytecodeSourceInfo info) {
|
| - BytecodeNode node(bytecode, 0, depth, &info);
|
| + BytecodeLabel* label,
|
| + int depth) {
|
| + BytecodeNode node(bytecode, 0, depth);
|
| writer()->WriteJump(&node, label);
|
| }
|
|
|
| @@ -108,15 +123,19 @@
|
|
|
| Write(Bytecode::kStackCheck, {10, false});
|
| CHECK_EQ(bytecodes()->size(), 1);
|
| + CHECK_EQ(max_register_count(), 0);
|
|
|
| Write(Bytecode::kLdaSmi, 127, {55, true});
|
| CHECK_EQ(bytecodes()->size(), 3);
|
| + CHECK_EQ(max_register_count(), 0);
|
|
|
| Write(Bytecode::kLdar, Register(200).ToOperand());
|
| CHECK_EQ(bytecodes()->size(), 7);
|
| + CHECK_EQ(max_register_count(), 201);
|
|
|
| Write(Bytecode::kReturn, {70, true});
|
| CHECK_EQ(bytecodes()->size(), 8);
|
| + CHECK_EQ(max_register_count(), 201);
|
|
|
| static const uint8_t bytes[] = {B(StackCheck), B(LdaSmi), U8(127), B(Wide),
|
| B(Ldar), R16(200), B(Return)};
|
| @@ -148,7 +167,7 @@
|
| // clang-format off
|
| /* 0 30 E> */ B(StackCheck),
|
| /* 1 42 S> */ B(LdaConstant), U8(0),
|
| - /* 3 42 E> */ B(Add), R8(1), U8(1),
|
| + /* 3 42 E> */ B(Star), R8(1),
|
| /* 5 68 S> */ B(JumpIfUndefined), U8(39),
|
| /* 7 */ B(JumpIfNull), U8(37),
|
| /* 9 */ B(ToObject), R8(3),
|
| @@ -173,23 +192,30 @@
|
| };
|
|
|
| static const PositionTableEntry expected_positions[] = {
|
| - {0, 30, false}, {1, 42, true}, {3, 42, false}, {6, 68, true},
|
| - {18, 63, true}, {32, 54, false}, {37, 85, true}, {46, 85, true}};
|
| + {0, 30, false}, {1, 42, true}, {3, 42, false}, {5, 68, true},
|
| + {17, 63, true}, {31, 54, false}, {36, 85, true}, {45, 85, true}};
|
|
|
| BytecodeLabel back_jump, jump_for_in, jump_end_1, jump_end_2, jump_end_3;
|
|
|
| #define R(i) static_cast<uint32_t>(Register(i).ToOperand())
|
| Write(Bytecode::kStackCheck, {30, false});
|
| Write(Bytecode::kLdaConstant, U8(0), {42, true});
|
| - Write(Bytecode::kAdd, R(1), U8(1), {42, false});
|
| + CHECK_EQ(max_register_count(), 0);
|
| + Write(Bytecode::kStar, R(1), {42, false});
|
| + CHECK_EQ(max_register_count(), 2);
|
| WriteJump(Bytecode::kJumpIfUndefined, &jump_end_1, {68, true});
|
| WriteJump(Bytecode::kJumpIfNull, &jump_end_2);
|
| Write(Bytecode::kToObject, R(3));
|
| + CHECK_EQ(max_register_count(), 4);
|
| Write(Bytecode::kForInPrepare, R(3), R(4));
|
| + CHECK_EQ(max_register_count(), 7);
|
| Write(Bytecode::kLdaZero);
|
| + CHECK_EQ(max_register_count(), 7);
|
| Write(Bytecode::kStar, R(7));
|
| + CHECK_EQ(max_register_count(), 8);
|
| writer()->BindLabel(&back_jump);
|
| Write(Bytecode::kForInContinue, R(7), R(6), {63, true});
|
| + CHECK_EQ(max_register_count(), 8);
|
| WriteJump(Bytecode::kJumpIfFalse, &jump_end_3);
|
| Write(Bytecode::kForInNext, R(3), R(7), R(4), U8(1));
|
| WriteJump(Bytecode::kJumpIfUndefined, &jump_for_in);
|
| @@ -207,6 +233,7 @@
|
| writer()->BindLabel(&jump_end_3);
|
| Write(Bytecode::kLdaUndefined);
|
| Write(Bytecode::kReturn, {85, true});
|
| + CHECK_EQ(max_register_count(), 8);
|
| #undef R
|
|
|
| CHECK_EQ(bytecodes()->size(), arraysize(expected_bytes));
|
|
|