Index: src/debug/debug.cc |
diff --git a/src/debug/debug.cc b/src/debug/debug.cc |
index c69b04b0c8327f5dd95a90a8b8ddb945b2ecbe07..d68ca6bbf92b3bc7e3047826b1d1a98fbeaf1b96 100644 |
--- a/src/debug/debug.cc |
+++ b/src/debug/debug.cc |
@@ -66,7 +66,20 @@ BreakLocation::BreakLocation(Handle<DebugInfo> debug_info, DebugBreakType type, |
code_offset_(code_offset), |
type_(type), |
position_(position), |
- statement_position_(statement_position) {} |
+ statement_position_(statement_position) { |
+#ifdef DEBUG |
+ if (type == DEBUG_BREAK_SLOT_AT_RETURN) { |
+ int return_position = 0; |
+ SharedFunctionInfo* shared = debug_info->shared(); |
+ if (shared->HasSourceCode()) { |
+ return_position = |
+ std::max(shared->end_position() - shared->start_position() - 1, 0); |
+ } |
+ CHECK_EQ(return_position, position); |
+ CHECK_EQ(return_position, statement_position); |
+ } |
+#endif // DEBUG |
+} |
BreakLocation::Iterator* BreakLocation::GetIterator( |
Handle<DebugInfo> debug_info, BreakLocatorType type) { |
@@ -83,20 +96,14 @@ BreakLocation::Iterator::Iterator(Handle<DebugInfo> debug_info) |
position_(1), |
statement_position_(1) {} |
-int BreakLocation::Iterator::ReturnPosition() { |
- if (debug_info_->shared()->HasSourceCode()) { |
- return debug_info_->shared()->end_position() - |
- debug_info_->shared()->start_position() - 1; |
- } else { |
- return 0; |
- } |
-} |
- |
BreakLocation::CodeIterator::CodeIterator(Handle<DebugInfo> debug_info, |
BreakLocatorType type) |
: Iterator(debug_info), |
reloc_iterator_(debug_info->abstract_code()->GetCode(), |
- GetModeMask(type)) { |
+ GetModeMask(type)), |
+ source_position_iterator_( |
+ debug_info->abstract_code()->GetCode()->source_position_table()), |
+ start_position_(debug_info_->shared()->start_position()) { |
// There is at least one break location. |
DCHECK(!Done()); |
Next(); |
@@ -104,8 +111,6 @@ BreakLocation::CodeIterator::CodeIterator(Handle<DebugInfo> debug_info, |
int BreakLocation::CodeIterator::GetModeMask(BreakLocatorType type) { |
int mask = 0; |
- mask |= RelocInfo::ModeMask(RelocInfo::POSITION); |
- mask |= RelocInfo::ModeMask(RelocInfo::STATEMENT_POSITION); |
mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_RETURN); |
mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_CALL); |
if (isolate()->is_tail_call_elimination_enabled()) { |
@@ -124,37 +129,23 @@ void BreakLocation::CodeIterator::Next() { |
// Iterate through reloc info stopping at each breakable code target. |
bool first = break_index_ == -1; |
- while (!Done()) { |
- if (!first) reloc_iterator_.next(); |
- first = false; |
- if (Done()) return; |
- // Whenever a statement position or (plain) position is passed update the |
- // current value of these. |
- if (RelocInfo::IsPosition(rmode())) { |
- if (RelocInfo::IsStatementPosition(rmode())) { |
- statement_position_ = static_cast<int>( |
- rinfo()->data() - debug_info_->shared()->start_position()); |
- } |
- // Always update the position as we don't want that to be before the |
- // statement position. |
- position_ = static_cast<int>(rinfo()->data() - |
- debug_info_->shared()->start_position()); |
- DCHECK(position_ >= 0); |
- DCHECK(statement_position_ >= 0); |
- continue; |
- } |
+ if (!first) reloc_iterator_.next(); |
+ first = false; |
+ if (Done()) return; |
- DCHECK(RelocInfo::IsDebugBreakSlot(rmode()) || |
- RelocInfo::IsDebuggerStatement(rmode())); |
- |
- if (RelocInfo::IsDebugBreakSlotAtReturn(rmode())) { |
- // Set the positions to the end of the function. |
- statement_position_ = position_ = ReturnPosition(); |
+ int offset = code_offset(); |
+ while (!source_position_iterator_.done() && |
+ source_position_iterator_.code_offset() <= offset) { |
+ position_ = source_position_iterator_.source_position() - start_position_; |
+ if (source_position_iterator_.is_statement()) { |
+ statement_position_ = position_; |
} |
- |
- break; |
+ source_position_iterator_.Advance(); |
} |
+ |
+ DCHECK(RelocInfo::IsDebugBreakSlot(rmode()) || |
+ RelocInfo::IsDebuggerStatement(rmode())); |
break_index_++; |
} |
@@ -214,11 +205,7 @@ void BreakLocation::BytecodeArrayIterator::Next() { |
DCHECK_EQ(CALLS_AND_RETURNS, break_locator_type_); |
if (type == DEBUG_BREAK_SLOT_AT_CALL) break; |
- if (type == DEBUG_BREAK_SLOT_AT_RETURN) { |
- DCHECK_EQ(ReturnPosition(), position_); |
- DCHECK_EQ(ReturnPosition(), statement_position_); |
- break; |
- } |
+ if (type == DEBUG_BREAK_SLOT_AT_RETURN) break; |
} |
break_index_++; |
} |