| Index: test/cctest/interpreter/bytecode-expectations-printer.cc
|
| diff --git a/test/cctest/interpreter/bytecode-expectations-printer.cc b/test/cctest/interpreter/bytecode-expectations-printer.cc
|
| index bf43b954025a9f1043281cd17cccdaea87695aaf..b0f623611eccd96e3d8019b01f2378e2866fe1df 100644
|
| --- a/test/cctest/interpreter/bytecode-expectations-printer.cc
|
| +++ b/test/cctest/interpreter/bytecode-expectations-printer.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "test/cctest/interpreter/bytecode-expectations-printer.h"
|
|
|
| +#include <iomanip>
|
| #include <iostream>
|
| #include <vector>
|
|
|
| @@ -19,6 +20,7 @@
|
| #include "src/interpreter/bytecode-generator.h"
|
| #include "src/interpreter/bytecodes.h"
|
| #include "src/interpreter/interpreter.h"
|
| +#include "src/interpreter/source-position-table.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -27,6 +29,7 @@ namespace interpreter {
|
| // static
|
| const char* const BytecodeExpectationsPrinter::kDefaultTopFunctionName =
|
| "__genbckexp_wrapper__";
|
| +const char* const BytecodeExpectationsPrinter::kIndent = " ";
|
|
|
| v8::Local<v8::String> BytecodeExpectationsPrinter::V8StringFromUTF8(
|
| const char* data) const {
|
| @@ -102,11 +105,11 @@ i::Runtime::FunctionId IndexToFunctionId(uint32_t index) {
|
| } // namespace
|
|
|
| void BytecodeExpectationsPrinter::PrintBytecodeOperand(
|
| - std::ostream& stream, const BytecodeArrayIterator& bytecode_iter,
|
| + std::ostream& stream, const BytecodeArrayIterator& bytecode_iterator,
|
| const Bytecode& bytecode, int op_index, int parameter_count) const {
|
| OperandType op_type = Bytecodes::GetOperandType(bytecode, op_index);
|
| OperandSize op_size = Bytecodes::GetOperandSize(
|
| - bytecode, op_index, bytecode_iter.current_operand_scale());
|
| + bytecode, op_index, bytecode_iterator.current_operand_scale());
|
|
|
| const char* size_tag;
|
| switch (op_size) {
|
| @@ -125,7 +128,7 @@ void BytecodeExpectationsPrinter::PrintBytecodeOperand(
|
| }
|
|
|
| if (Bytecodes::IsRegisterOperandType(op_type)) {
|
| - Register register_value = bytecode_iter.GetRegisterOperand(op_index);
|
| + Register register_value = bytecode_iterator.GetRegisterOperand(op_index);
|
| stream << 'R';
|
| if (op_size != OperandSize::kByte) stream << size_tag;
|
| if (register_value.is_new_target()) {
|
| @@ -149,19 +152,19 @@ void BytecodeExpectationsPrinter::PrintBytecodeOperand(
|
|
|
| switch (op_type) {
|
| case OperandType::kFlag8:
|
| - stream << bytecode_iter.GetFlagOperand(op_index);
|
| + stream << bytecode_iterator.GetFlagOperand(op_index);
|
| break;
|
| case OperandType::kIdx:
|
| - stream << bytecode_iter.GetIndexOperand(op_index);
|
| + stream << bytecode_iterator.GetIndexOperand(op_index);
|
| break;
|
| case OperandType::kImm:
|
| - stream << bytecode_iter.GetImmediateOperand(op_index);
|
| + stream << bytecode_iterator.GetImmediateOperand(op_index);
|
| break;
|
| case OperandType::kRegCount:
|
| - stream << bytecode_iter.GetRegisterCountOperand(op_index);
|
| + stream << bytecode_iterator.GetRegisterCountOperand(op_index);
|
| break;
|
| case OperandType::kRuntimeId: {
|
| - uint32_t operand = bytecode_iter.GetRuntimeIdOperand(op_index);
|
| + uint32_t operand = bytecode_iterator.GetRuntimeIdOperand(op_index);
|
| stream << "Runtime::k"
|
| << i::Runtime::FunctionForId(IndexToFunctionId(operand))->name;
|
| break;
|
| @@ -175,10 +178,10 @@ void BytecodeExpectationsPrinter::PrintBytecodeOperand(
|
| }
|
|
|
| void BytecodeExpectationsPrinter::PrintBytecode(
|
| - std::ostream& stream, const BytecodeArrayIterator& bytecode_iter,
|
| + std::ostream& stream, const BytecodeArrayIterator& bytecode_iterator,
|
| int parameter_count) const {
|
| - Bytecode bytecode = bytecode_iter.current_bytecode();
|
| - OperandScale operand_scale = bytecode_iter.current_operand_scale();
|
| + Bytecode bytecode = bytecode_iterator.current_bytecode();
|
| + OperandScale operand_scale = bytecode_iterator.current_operand_scale();
|
| if (Bytecodes::OperandScaleRequiresPrefixBytecode(operand_scale)) {
|
| Bytecode prefix = Bytecodes::OperandScaleToPrefixBytecode(operand_scale);
|
| stream << "B(" << Bytecodes::ToString(prefix) << "), ";
|
| @@ -187,11 +190,30 @@ void BytecodeExpectationsPrinter::PrintBytecode(
|
| int operands_count = Bytecodes::NumberOfOperands(bytecode);
|
| for (int op_index = 0; op_index < operands_count; ++op_index) {
|
| stream << ", ";
|
| - PrintBytecodeOperand(stream, bytecode_iter, bytecode, op_index,
|
| + PrintBytecodeOperand(stream, bytecode_iterator, bytecode, op_index,
|
| parameter_count);
|
| }
|
| }
|
|
|
| +void BytecodeExpectationsPrinter::PrintSourcePosition(
|
| + std::ostream& stream, SourcePositionTableIterator& source_iterator,
|
| + int bytecode_offset) const {
|
| + static const size_t kPositionWidth = 4;
|
| + if (!source_iterator.done() &&
|
| + source_iterator.bytecode_offset() == bytecode_offset) {
|
| + stream << "/* " << std::setw(kPositionWidth)
|
| + << source_iterator.source_position();
|
| + if (source_iterator.is_statement()) {
|
| + stream << " S> */ ";
|
| + } else {
|
| + stream << " E> */ ";
|
| + }
|
| + source_iterator.Advance();
|
| + } else {
|
| + stream << " " << std::setw(kPositionWidth) << ' ' << " ";
|
| + }
|
| +}
|
| +
|
| void BytecodeExpectationsPrinter::PrintV8String(std::ostream& stream,
|
| i::String* string) const {
|
| stream << '"';
|
| @@ -246,10 +268,15 @@ void BytecodeExpectationsPrinter::PrintBytecodeSequence(
|
| std::ostream& stream, i::Handle<i::BytecodeArray> bytecode_array) const {
|
| stream << "bytecode array length: " << bytecode_array->length()
|
| << "\nbytecodes: [\n";
|
| - BytecodeArrayIterator bytecode_iter(bytecode_array);
|
| - for (; !bytecode_iter.done(); bytecode_iter.Advance()) {
|
| - stream << " ";
|
| - PrintBytecode(stream, bytecode_iter, bytecode_array->parameter_count());
|
| +
|
| + SourcePositionTableIterator source_iterator(
|
| + bytecode_array->source_position_table());
|
| + BytecodeArrayIterator bytecode_iterator(bytecode_array);
|
| + for (; !bytecode_iterator.done(); bytecode_iterator.Advance()) {
|
| + stream << kIndent;
|
| + PrintSourcePosition(stream, source_iterator,
|
| + bytecode_iterator.current_offset());
|
| + PrintBytecode(stream, bytecode_iterator, bytecode_array->parameter_count());
|
| stream << ",\n";
|
| }
|
| stream << "]\n";
|
| @@ -261,7 +288,7 @@ void BytecodeExpectationsPrinter::PrintConstantPool(
|
| int num_constants = constant_pool->length();
|
| if (num_constants > 0) {
|
| for (int i = 0; i < num_constants; ++i) {
|
| - stream << " ";
|
| + stream << kIndent;
|
| PrintConstant(stream, i::FixedArray::get(constant_pool, i, i_isolate()));
|
| stream << ",\n";
|
| }
|
| @@ -275,7 +302,7 @@ void BytecodeExpectationsPrinter::PrintCodeSnippet(
|
| std::stringstream body_stream(body);
|
| std::string body_line;
|
| while (std::getline(body_stream, body_line)) {
|
| - stream << " ";
|
| + stream << kIndent;
|
| PrintEscapedString(stream, body_line);
|
| stream << '\n';
|
| }
|
|
|