Chromium Code Reviews| Index: src/debug/debug.cc |
| diff --git a/src/debug/debug.cc b/src/debug/debug.cc |
| index a7bce4083b90c8ed2915d926be4401851258f72d..44342376e57e436b3767331ecc77df1b201091d2 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) { |
|
rmcilroy
2016/03/10 16:45:37
Could you pull out the logic for getting the curre
oth
2016/03/11 16:26:12
Done.
|
| + 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)) { |