Index: runtime/vm/debugger.cc |
=================================================================== |
--- runtime/vm/debugger.cc (revision 38336) |
+++ runtime/vm/debugger.cc (working copy) |
@@ -179,8 +179,9 @@ |
ctx_(Context::ZoneHandle()), |
code_(Code::ZoneHandle(code.raw())), |
function_(Function::ZoneHandle(code.function())), |
+ token_pos_initialized_(false), |
token_pos_(-1), |
- desc_rec_(NULL), |
+ try_index_(-1), |
line_number_(-1), |
column_number_(-1), |
context_level_(-1), |
@@ -354,16 +355,18 @@ |
} |
-// Compute token_pos_ and pc_desc_index_. |
+// Compute token_pos_ and try_index_ and token_pos_initialized_. |
intptr_t ActivationFrame::TokenPos() { |
- if (token_pos_ < 0) { |
+ if (!token_pos_initialized_) { |
+ token_pos_initialized_ = true; |
token_pos_ = Scanner::kNoSourcePos; |
GetPcDescriptors(); |
PcDescriptors::Iterator iter(pc_desc_, RawPcDescriptors::kAnyKind); |
while (iter.HasNext()) { |
- const RawPcDescriptors::PcDescriptorRec& rec = iter.Next(); |
+ RawPcDescriptors::PcDescriptorRec rec; |
+ iter.NextRec(&rec); |
if (rec.pc() == pc_) { |
- desc_rec_ = &rec; |
+ try_index_ = rec.try_index(); |
token_pos_ = rec.token_pos(); |
break; |
} |
@@ -374,14 +377,10 @@ |
intptr_t ActivationFrame::TryIndex() { |
- if (desc_rec_ == NULL) { |
- TokenPos(); // Side effect: compute desc_rec_ lazily. |
+ if (!token_pos_initialized_) { |
+ TokenPos(); // Side effect: computes token_pos_initialized_, try_index_. |
} |
- if (desc_rec_ == NULL) { |
- return -1; |
- } else { |
- return desc_rec_->try_index(); |
- } |
+ return try_index_; |
} |
@@ -430,7 +429,9 @@ |
// TODO(hausner): What to do if there is no descriptor entry |
// for the code position of the frame? For now say we are at context |
// level 0. |
- if (desc_rec_ == NULL) { |
+ TokenPos(); |
+ if (token_pos_ == -1) { |
+ // No PcDescriptor. |
return context_level_; |
} |
ASSERT(!pc_desc_.IsNull()); |
@@ -1204,7 +1205,8 @@ |
PcDescriptors& desc = PcDescriptors::Handle(isolate, code.pc_descriptors()); |
PcDescriptors::Iterator iter(desc, kSafepointKind); |
while (iter.HasNext()) { |
- const RawPcDescriptors::PcDescriptorRec& rec = iter.Next(); |
+ RawPcDescriptors::PcDescriptorRec rec; |
+ iter.NextRec(&rec); |
if (HasTokenPos(rec)) { |
CodeBreakpoint* bpt = GetCodeBreakpoint(rec.pc()); |
if (bpt != NULL) { |
@@ -1255,8 +1257,8 @@ |
PcDescriptors::Handle(isolate, code.pc_descriptors()); |
PcDescriptors::Iterator iter(pc_desc, RawPcDescriptors::kClosureCall); |
while (iter.HasNext()) { |
- const RawPcDescriptors::PcDescriptorRec& rec = iter.Next(); |
- if (rec.pc() == pc) { |
+ const uword rec_pc = iter.NextPc(); |
+ if (rec_pc == pc) { |
is_closure_call = true; |
break; |
} |
@@ -1547,17 +1549,15 @@ |
ASSERT(!code.IsNull()); |
PcDescriptors& desc = PcDescriptors::Handle(code.pc_descriptors()); |
intptr_t best_fit_pos = INT_MAX; |
- const RawPcDescriptors::PcDescriptorRec* best_fit_rec = NULL; |
uword lowest_pc = kUwordMax; |
- const RawPcDescriptors::PcDescriptorRec* lowest_pc_rec = NULL; |
- |
- const RawPcDescriptors::PcDescriptorRec* rec = NULL; |
+ intptr_t lowest_pc_token_pos = INT_MAX; |
PcDescriptors::Iterator iter(desc, kSafepointKind); |
while (iter.HasNext()) { |
- rec = &iter.Next(); |
- intptr_t desc_token_pos = rec->token_pos(); |
+ RawPcDescriptors::PcDescriptorRec rec; |
+ iter.NextRec(&rec); |
+ intptr_t desc_token_pos = rec.token_pos(); |
ASSERT(desc_token_pos >= 0); |
- if (HasTokenPos(*rec)) { |
+ if (HasTokenPos(rec)) { |
if ((desc_token_pos < requested_token_pos) || |
(desc_token_pos > last_token_pos)) { |
// This descriptor is outside the desired token range. |
@@ -1567,24 +1567,23 @@ |
// So far, this descriptor has the lowest token position after |
// the first acceptable token position. |
best_fit_pos = desc_token_pos; |
- best_fit_rec = rec; |
} |
- if (rec->pc() < lowest_pc) { |
+ if (rec.pc() < lowest_pc) { |
// This descriptor so far has the lowest code address. |
- lowest_pc = rec->pc(); |
- lowest_pc_rec = rec; |
+ lowest_pc = rec.pc(); |
+ lowest_pc_token_pos = desc_token_pos; |
} |
} |
} |
- if (lowest_pc_rec != NULL) { |
+ if (lowest_pc_token_pos != INT_MAX) { |
// We found the pc descriptor that has the lowest execution address. |
// This is the first possible breakpoint after the requested token |
// position. We use this instead of the nearest PC descriptor |
// measured in token index distance. |
- best_fit_rec = lowest_pc_rec; |
+ return lowest_pc_token_pos; |
} |
- if (best_fit_rec != NULL) { |
- return best_fit_rec->token_pos(); |
+ if (best_fit_pos != INT_MAX) { |
+ return best_fit_pos; |
} |
// We didn't find a safe point in the given token range. Try and find |
// a safe point in the remaining source code of the function. |
@@ -1606,24 +1605,25 @@ |
// Find the safe point with the lowest compiled code address |
// that maps to the token position of the source breakpoint. |
PcDescriptors::Iterator iter(desc, kSafepointKind); |
- const RawPcDescriptors::PcDescriptorRec* lowest_rec = NULL; |
+ RawPcDescriptors::PcDescriptorRec lowest_rec; |
while (iter.HasNext()) { |
- const RawPcDescriptors::PcDescriptorRec& rec = iter.Next(); |
+ RawPcDescriptors::PcDescriptorRec rec; |
+ iter.NextRec(&rec); |
intptr_t desc_token_pos = rec.token_pos(); |
if ((desc_token_pos == bpt->token_pos_) && HasTokenPos(rec)) { |
if (rec.pc() < lowest_pc) { |
lowest_pc = rec.pc(); |
- lowest_rec = &rec; |
+ lowest_rec = rec; |
} |
} |
} |
- if (lowest_rec == NULL) { |
+ if (lowest_pc == kUwordMax) { |
return; |
} |
- CodeBreakpoint* code_bpt = GetCodeBreakpoint(lowest_rec->pc()); |
+ CodeBreakpoint* code_bpt = GetCodeBreakpoint(lowest_rec.pc()); |
if (code_bpt == NULL) { |
// No code breakpoint for this code exists; create one. |
- code_bpt = new CodeBreakpoint(code, *lowest_rec); |
+ code_bpt = new CodeBreakpoint(code, lowest_rec); |
RegisterCodeBreakpoint(code_bpt); |
} |
code_bpt->set_src_bpt(bpt); |