| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index d81b1f6b8c8bcfc1803ad3708c1df0d957c28916..907dc1e126bcdde97f63acbbf199e9a5d0dab208 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -15063,7 +15063,16 @@ void BytecodeArray::Disassemble(std::ostream& os) {
|
| const uint8_t* bytecode_start = &first_bytecode_address[i];
|
| interpreter::Bytecode bytecode =
|
| interpreter::Bytecodes::FromByte(bytecode_start[0]);
|
| - bytecode_size = interpreter::Bytecodes::Size(bytecode);
|
| + int prefix_offset = 0;
|
| + int operand_scale =
|
| + interpreter::Bytecodes::GetPrefixBytecodeScale(bytecode);
|
| + if (operand_scale > 1) {
|
| + // Bytecode is a prefix for wider operands in the next bytecode.
|
| + prefix_offset += 1;
|
| + bytecode = interpreter::Bytecodes::FromByte(bytecode_start[1]);
|
| + }
|
| + bytecode_size =
|
| + prefix_offset + interpreter::Bytecodes::Size(bytecode, operand_scale);
|
|
|
| if (!source_positions.done() && i == source_positions.bytecode_offset()) {
|
| os << std::setw(5) << source_positions.source_position();
|
| @@ -15077,25 +15086,36 @@ void BytecodeArray::Disassemble(std::ostream& os) {
|
| os << buf.start() << " : ";
|
| interpreter::Bytecodes::Decode(os, bytecode_start, parameter_count());
|
|
|
| - if (interpreter::Bytecodes::IsJumpConstantWide(bytecode)) {
|
| - DCHECK_EQ(bytecode_size, 3);
|
| - int index = static_cast<int>(ReadUnalignedUInt16(bytecode_start + 1));
|
| - int offset = Smi::cast(constant_pool()->get(index))->value();
|
| - SNPrintF(buf, " (%p)", bytecode_start + offset);
|
| - os << buf.start();
|
| - } else if (interpreter::Bytecodes::IsJumpConstant(bytecode)) {
|
| - DCHECK_EQ(bytecode_size, 2);
|
| - int index = static_cast<int>(bytecode_start[1]);
|
| - int offset = Smi::cast(constant_pool()->get(index))->value();
|
| - SNPrintF(buf, " (%p)", bytecode_start + offset);
|
| - os << buf.start();
|
| - } else if (interpreter::Bytecodes::IsJump(bytecode)) {
|
| - DCHECK_EQ(bytecode_size, 2);
|
| - int offset = static_cast<int8_t>(bytecode_start[1]);
|
| + if (interpreter::Bytecodes::IsJump(bytecode)) {
|
| + static const int operand_offset = 1;
|
| + int operand;
|
| + switch (operand_scale) {
|
| + case 1:
|
| + operand = static_cast<int8_t>(bytecode_start[operand_offset]);
|
| + break;
|
| + case 2:
|
| + operand = static_cast<int16_t>(ReadUnalignedUInt16(
|
| + bytecode_start + prefix_offset + operand_offset));
|
| + break;
|
| + case 4:
|
| + operand = static_cast<int>(ReadUnalignedUInt32(
|
| + bytecode_start + prefix_offset + operand_offset));
|
| + break;
|
| + default:
|
| + UNREACHABLE();
|
| + }
|
| + int offset;
|
| + if (interpreter::Bytecodes::IsJumpConstant(bytecode)) {
|
| + offset = Smi::cast(constant_pool()->get(operand))->value();
|
| + } else {
|
| + offset = operand;
|
| + }
|
| + offset += prefix_offset;
|
| SNPrintF(buf, " (%p)", bytecode_start + offset);
|
| + DCHECK_GE(i + offset, 0);
|
| + DCHECK_LT(i + offset, length());
|
| os << buf.start();
|
| }
|
| -
|
| os << std::endl;
|
| }
|
|
|
|
|