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)) { |