Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index fd4b397d2bf074090a0a4359cbf37b0778b2234f..3b1c24f0dd3283102e837c9692edb3e8f6858c62 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -13505,31 +13505,14 @@ void Code::CopyFrom(const CodeDesc& desc) { |
// The position returned is relative to the beginning of the script where the |
// source for this function is found. |
int Code::SourcePosition(int code_offset) { |
- Address pc = instruction_start() + code_offset; |
- int distance = kMaxInt; |
+ // Subtract one because the current PC is one instruction after the call site. |
+ Address pc = instruction_start() + code_offset - 1; |
int position = RelocInfo::kNoPosition; // Initially no position found. |
- // Run through all the relocation info to find the best matching source |
- // position. All the code needs to be considered as the sequence of the |
- // instructions in the code does not necessarily follow the same order as the |
- // source. |
- RelocIterator it(this, RelocInfo::kPositionMask); |
- while (!it.done()) { |
- // Only look at positions after the current pc. |
- if (it.rinfo()->pc() < pc) { |
- // Get position and distance. |
- |
- int dist = static_cast<int>(pc - it.rinfo()->pc()); |
- int pos = static_cast<int>(it.rinfo()->data()); |
- // If this position is closer than the current candidate or if it has the |
- // same distance as the current candidate and the position is higher then |
- // this position is the new candidate. |
- if ((dist < distance) || |
- (dist == distance && pos > position)) { |
- position = pos; |
- distance = dist; |
- } |
- } |
- it.next(); |
+ // Find the closest position attached to a pc lower or equal to the current. |
+ // Note that the pc of reloc infos grow monotonically. |
+ for (RelocIterator it(this, RelocInfo::kPositionMask); |
+ !it.done() && it.rinfo()->pc() <= pc; it.next()) { |
+ position = static_cast<int>(it.rinfo()->data()); |
} |
DCHECK(kind() == FUNCTION || (is_optimized_code() && is_turbofanned()) || |
is_wasm_code() || position == RelocInfo::kNoPosition); |
@@ -13540,20 +13523,18 @@ int Code::SourcePosition(int code_offset) { |
// Same as Code::SourcePosition above except it only looks for statement |
// positions. |
int Code::SourceStatementPosition(int code_offset) { |
- // First find the position as close as possible using all position |
- // information. |
+ // First find the closest position. |
int position = SourcePosition(code_offset); |
// Now find the closest statement position before the position. |
int statement_position = 0; |
- RelocIterator it(this, RelocInfo::kPositionMask); |
- while (!it.done()) { |
+ for (RelocIterator it(this, RelocInfo::kPositionMask); !it.done(); |
+ it.next()) { |
if (RelocInfo::IsStatementPosition(it.rinfo()->rmode())) { |
int p = static_cast<int>(it.rinfo()->data()); |
if (statement_position < p && p <= position) { |
statement_position = p; |
} |
} |
- it.next(); |
} |
return statement_position; |
} |
@@ -14362,20 +14343,18 @@ int BytecodeArray::SourcePosition(int offset) { |
} |
int BytecodeArray::SourceStatementPosition(int offset) { |
- // First find the position as close as possible using all position |
- // information. |
+ // First find the closest position. |
int position = SourcePosition(offset); |
// Now find the closest statement position before the position. |
int statement_position = 0; |
- interpreter::SourcePositionTableIterator iterator(source_position_table()); |
- while (!iterator.done()) { |
- if (iterator.is_statement()) { |
- int p = iterator.source_position(); |
+ for (interpreter::SourcePositionTableIterator it(source_position_table()); |
+ !it.done(); it.Advance()) { |
+ if (it.is_statement()) { |
+ int p = it.source_position(); |
if (statement_position < p && p <= position) { |
statement_position = p; |
} |
} |
- iterator.Advance(); |
} |
return statement_position; |
} |