Index: src/debug/debug.cc |
diff --git a/src/debug/debug.cc b/src/debug/debug.cc |
index 67ca2410da43fd5c342974bcf3f3137ed24d9e07..9c862700f22ce8e35091a12676ce377e6a5922c8 100644 |
--- a/src/debug/debug.cc |
+++ b/src/debug/debug.cc |
@@ -217,11 +217,40 @@ void BreakLocation::BytecodeArrayIterator::Next() { |
} |
} |
+namespace { |
+class BytecodePrefixHelper final { |
rmcilroy
2016/03/16 11:55:54
As discussed offline, I think we could get rid of
oth
2016/03/17 13:48:38
Done.
|
+ public: |
+ BytecodePrefixHelper(BytecodeArray* bytecode_array, int offset) { |
+ bytecode_ = interpreter::Bytecodes::FromByte(bytecode_array->get(offset)); |
+ operand_scale_ = interpreter::Bytecodes::GetPrefixBytecodeScale(bytecode_); |
+ if (operand_scale_ > 1) { |
+ prefix_offset_ = 1; |
+ bytecode_ = |
+ interpreter::Bytecodes::FromByte(bytecode_array->get(offset + 1)); |
+ } else { |
+ prefix_offset_ = 0; |
+ } |
+ DCHECK(!interpreter::Bytecodes::IsPrefixScalingBytecode(bytecode_)); |
+ } |
+ |
+ interpreter::Bytecode bytecode() const { return bytecode_; } |
+ int operand_scale() const { return operand_scale_; } |
+ int prefix_offset() const { return prefix_offset_; } |
+ |
+ private: |
+ interpreter::Bytecode bytecode_; |
+ int operand_scale_; |
+ int prefix_offset_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BytecodePrefixHelper); |
+}; |
+} // namespace |
+ |
BreakLocation::DebugBreakType |
BreakLocation::BytecodeArrayIterator::GetDebugBreakType() { |
BytecodeArray* bytecode_array = debug_info_->original_bytecode_array(); |
- interpreter::Bytecode bytecode = |
- interpreter::Bytecodes::FromByte(bytecode_array->get(code_offset())); |
+ BytecodePrefixHelper bytecode_prefix_helper(bytecode_array, code_offset()); |
+ interpreter::Bytecode bytecode = bytecode_prefix_helper.bytecode(); |
if (bytecode == interpreter::Bytecode::kDebugger) { |
return DEBUGGER_STATEMENT; |
@@ -404,11 +433,11 @@ void BreakLocation::SetDebugBreak() { |
DebugCodegen::PatchDebugBreakSlot(isolate(), pc, target); |
} else { |
BytecodeArray* bytecode_array = abstract_code()->GetBytecodeArray(); |
- interpreter::Bytecode bytecode = |
- interpreter::Bytecodes::FromByte(bytecode_array->get(code_offset())); |
- interpreter::Bytecode debugbreak = |
- interpreter::Bytecodes::GetDebugBreak(bytecode); |
- bytecode_array->set(code_offset(), |
+ BytecodePrefixHelper bytecode_prefix_helper(bytecode_array, code_offset()); |
+ interpreter::Bytecode debugbreak = interpreter::Bytecodes::GetDebugBreak( |
+ bytecode_prefix_helper.bytecode(), |
+ bytecode_prefix_helper.operand_scale()); |
+ bytecode_array->set(code_offset() + bytecode_prefix_helper.prefix_offset(), |
interpreter::Bytecodes::ToByte(debugbreak)); |
} |
DCHECK(IsDebugBreak()); |
@@ -428,7 +457,9 @@ 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())); |
+ BytecodePrefixHelper bytecode_prefix_helper(original, code_offset()); |
+ int offset = code_offset() + bytecode_prefix_helper.prefix_offset(); |
+ bytecode_array->set(offset, original->get(offset)); |
} |
DCHECK(!IsDebugBreak()); |
} |
@@ -444,9 +475,8 @@ bool BreakLocation::IsDebugBreak() const { |
return DebugCodegen::DebugBreakSlotIsPatched(pc); |
} else { |
BytecodeArray* bytecode_array = abstract_code()->GetBytecodeArray(); |
- interpreter::Bytecode bytecode = |
- interpreter::Bytecodes::FromByte(bytecode_array->get(code_offset())); |
- return interpreter::Bytecodes::IsDebugBreak(bytecode); |
+ BytecodePrefixHelper prefix_helper(bytecode_array, code_offset()); |
+ return interpreter::Bytecodes::IsDebugBreak(prefix_helper.bytecode()); |
} |
} |
@@ -1577,9 +1607,9 @@ Object* Debug::SetAfterBreakTarget(JavaScriptFrame* frame) { |
SharedFunctionInfo* shared = interpreted_frame->function()->shared(); |
BytecodeArray* bytecode_array = shared->bytecode_array(); |
int bytecode_offset = interpreted_frame->GetBytecodeOffset(); |
- interpreter::Bytecode bytecode = |
- interpreter::Bytecodes::FromByte(bytecode_array->get(bytecode_offset)); |
- return isolate_->interpreter()->GetBytecodeHandler(bytecode); |
+ BytecodePrefixHelper prefix_helper(bytecode_array, bytecode_offset); |
+ return isolate_->interpreter()->GetBytecodeHandler( |
+ prefix_helper.bytecode(), prefix_helper.operand_scale()); |
rmcilroy
2016/03/16 11:55:54
As discussed offline, I don't think this would wor
oth
2016/03/17 13:48:38
Done.
|
} else { |
after_break_target_ = NULL; |
if (!LiveEdit::SetAfterBreakTarget(this)) { |