| Index: src/debug/debug.cc
|
| diff --git a/src/debug/debug.cc b/src/debug/debug.cc
|
| index a7bce4083b90c8ed2915d926be4401851258f72d..19f9ab92071b666ddcac0c01422018e9abe7a220 100644
|
| --- a/src/debug/debug.cc
|
| +++ b/src/debug/debug.cc
|
| @@ -222,6 +222,10 @@ BreakLocation::BytecodeArrayIterator::GetDebugBreakType() {
|
| BytecodeArray* bytecode_array = debug_info_->original_bytecode_array();
|
| interpreter::Bytecode bytecode =
|
| interpreter::Bytecodes::FromByte(bytecode_array->get(code_offset()));
|
| + if (interpreter::Bytecodes::GetPrefixBytecodeScale(bytecode) > 1) {
|
| + bytecode = interpreter::Bytecodes::FromByte(
|
| + bytecode_array->get(code_offset() + 1));
|
| + }
|
|
|
| if (bytecode == interpreter::Bytecode::kDebugger) {
|
| return DEBUGGER_STATEMENT;
|
| @@ -421,9 +425,17 @@ void BreakLocation::SetDebugBreak() {
|
| BytecodeArray* bytecode_array = abstract_code()->GetBytecodeArray();
|
| interpreter::Bytecode bytecode =
|
| interpreter::Bytecodes::FromByte(bytecode_array->get(code_offset()));
|
| + int prefix_offset = 0;
|
| + int operand_scale =
|
| + interpreter::Bytecodes::GetPrefixBytecodeScale(bytecode);
|
| + if (operand_scale > 1) {
|
| + prefix_offset = 1;
|
| + bytecode = interpreter::Bytecodes::FromByte(
|
| + bytecode_array->get(code_offset() + prefix_offset));
|
| + }
|
| interpreter::Bytecode debugbreak =
|
| - interpreter::Bytecodes::GetDebugBreak(bytecode);
|
| - bytecode_array->set(code_offset(),
|
| + interpreter::Bytecodes::GetDebugBreak(bytecode, operand_scale);
|
| + bytecode_array->set(code_offset() + prefix_offset,
|
| interpreter::Bytecodes::ToByte(debugbreak));
|
| }
|
| DCHECK(IsDebugBreak());
|
| @@ -443,7 +455,11 @@ void BreakLocation::ClearDebugBreak() {
|
| } else {
|
| BytecodeArray* bytecode_array = abstract_code()->GetBytecodeArray();
|
| BytecodeArray* original = debug_info_->original_bytecode_array();
|
| - bytecode_array->set(code_offset(), original->get(code_offset()));
|
| + int operand_scale = interpreter::Bytecodes::GetPrefixBytecodeScale(
|
| + interpreter::Bytecodes::FromByte(original->get(code_offset())));
|
| + int prefix_offset = operand_scale > 1 ? 1 : 0;
|
| + bytecode_array->set(code_offset() + prefix_offset,
|
| + original->get(code_offset() + prefix_offset));
|
| }
|
| DCHECK(!IsDebugBreak());
|
| }
|
| @@ -461,6 +477,10 @@ bool BreakLocation::IsDebugBreak() const {
|
| BytecodeArray* bytecode_array = abstract_code()->GetBytecodeArray();
|
| interpreter::Bytecode bytecode =
|
| interpreter::Bytecodes::FromByte(bytecode_array->get(code_offset()));
|
| + if (interpreter::Bytecodes::GetPrefixBytecodeScale(bytecode) > 1) {
|
| + bytecode = interpreter::Bytecodes::FromByte(
|
| + bytecode_array->get(code_offset() + 1));
|
| + }
|
| return interpreter::Bytecodes::IsDebugBreak(bytecode);
|
| }
|
| }
|
| @@ -1593,7 +1613,13 @@ Object* Debug::SetAfterBreakTarget(JavaScriptFrame* frame) {
|
| int bytecode_offset = interpreted_frame->GetBytecodeOffset();
|
| interpreter::Bytecode bytecode =
|
| interpreter::Bytecodes::FromByte(bytecode_array->get(bytecode_offset));
|
| - return isolate_->interpreter()->GetBytecodeHandler(bytecode);
|
| + int operand_scale =
|
| + interpreter::Bytecodes::GetPrefixBytecodeScale(bytecode);
|
| + if (operand_scale > 1) {
|
| + interpreter::Bytecodes::FromByte(
|
| + bytecode_array->get(bytecode_offset + 1));
|
| + }
|
| + return isolate_->interpreter()->GetBytecodeHandler(bytecode, operand_scale);
|
| } else {
|
| after_break_target_ = NULL;
|
| if (!LiveEdit::SetAfterBreakTarget(this)) {
|
|
|