Index: runtime/vm/debugger.cc |
=================================================================== |
--- runtime/vm/debugger.cc (revision 38356) |
+++ runtime/vm/debugger.cc (working copy) |
@@ -363,11 +363,10 @@ |
GetPcDescriptors(); |
PcDescriptors::Iterator iter(pc_desc_, RawPcDescriptors::kAnyKind); |
while (iter.HasNext()) { |
- RawPcDescriptors::PcDescriptorRec rec; |
- iter.NextRec(&rec); |
- if (rec.pc() == pc_) { |
- try_index_ = rec.try_index(); |
- token_pos_ = rec.token_pos(); |
+ const uword pc = iter.NextPc(); |
+ if (pc == pc_) { |
+ try_index_ = iter.current_try_index(); |
+ token_pos_ = iter.current_token_pos(); |
break; |
} |
} |
@@ -931,21 +930,18 @@ |
RawPcDescriptors::kRuntimeCall; |
-static bool HasTokenPos(const RawPcDescriptors::PcDescriptorRec& rec) { |
- return rec.token_pos() != Scanner::kNoSourcePos; |
-} |
- |
- |
CodeBreakpoint::CodeBreakpoint(const Code& code, |
- const RawPcDescriptors::PcDescriptorRec& rec) |
+ intptr_t token_pos, |
+ uword pc, |
+ RawPcDescriptors::Kind kind) |
: code_(code.raw()), |
- token_pos_(rec.token_pos()), |
- pc_(rec.pc()), |
+ token_pos_(token_pos), |
+ pc_(pc), |
line_number_(-1), |
is_enabled_(false), |
src_bpt_(NULL), |
next_(NULL), |
- breakpoint_kind_(rec.kind()), |
+ breakpoint_kind_(kind), |
saved_value_(0) { |
ASSERT(!code.IsNull()); |
ASSERT(token_pos_ > 0); |
@@ -1205,17 +1201,17 @@ |
PcDescriptors& desc = PcDescriptors::Handle(isolate, code.pc_descriptors()); |
PcDescriptors::Iterator iter(desc, kSafepointKind); |
while (iter.HasNext()) { |
- RawPcDescriptors::PcDescriptorRec rec; |
- iter.NextRec(&rec); |
- if (HasTokenPos(rec)) { |
- CodeBreakpoint* bpt = GetCodeBreakpoint(rec.pc()); |
+ const intptr_t token_pos = iter.NextTokenPos(); |
+ if (token_pos != Scanner::kNoSourcePos) { |
+ CodeBreakpoint* bpt = GetCodeBreakpoint(iter.current_pc()); |
if (bpt != NULL) { |
// There is already a breakpoint for this address. Make sure |
// it is enabled. |
bpt->Enable(); |
continue; |
} |
- bpt = new CodeBreakpoint(code, rec); |
+ bpt = new CodeBreakpoint(code, iter.current_token_pos(), |
+ iter.current_pc(), iter.current_kind()); |
RegisterCodeBreakpoint(bpt); |
bpt->Enable(); |
} |
@@ -1553,11 +1549,9 @@ |
intptr_t lowest_pc_token_pos = INT_MAX; |
PcDescriptors::Iterator iter(desc, kSafepointKind); |
while (iter.HasNext()) { |
- RawPcDescriptors::PcDescriptorRec rec; |
- iter.NextRec(&rec); |
- intptr_t desc_token_pos = rec.token_pos(); |
+ const intptr_t desc_token_pos = iter.NextTokenPos(); |
ASSERT(desc_token_pos >= 0); |
- if (HasTokenPos(rec)) { |
+ if (desc_token_pos != Scanner::kNoSourcePos) { |
if ((desc_token_pos < requested_token_pos) || |
(desc_token_pos > last_token_pos)) { |
// This descriptor is outside the desired token range. |
@@ -1568,9 +1562,9 @@ |
// the first acceptable token position. |
best_fit_pos = desc_token_pos; |
} |
- if (rec.pc() < lowest_pc) { |
+ if (iter.current_pc() < lowest_pc) { |
// This descriptor so far has the lowest code address. |
- lowest_pc = rec.pc(); |
+ lowest_pc = iter.current_pc(); |
lowest_pc_token_pos = desc_token_pos; |
} |
} |
@@ -1596,34 +1590,34 @@ |
void Debugger::MakeCodeBreakpointAt(const Function& func, |
SourceBreakpoint* bpt) { |
+ ASSERT(bpt->token_pos_ != Scanner::kNoSourcePos); |
ASSERT((bpt != NULL) && bpt->IsResolved()); |
ASSERT(!func.HasOptimizedCode()); |
Code& code = Code::Handle(func.unoptimized_code()); |
ASSERT(!code.IsNull()); |
PcDescriptors& desc = PcDescriptors::Handle(code.pc_descriptors()); |
uword lowest_pc = kUwordMax; |
+ RawPcDescriptors::Kind lowest_kind = RawPcDescriptors::kAnyKind; |
// 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); |
- RawPcDescriptors::PcDescriptorRec lowest_rec; |
while (iter.HasNext()) { |
- 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; |
+ intptr_t desc_token_pos = iter.NextTokenPos(); |
+ if (desc_token_pos == bpt->token_pos_) { |
+ if (iter.current_pc() < lowest_pc) { |
+ lowest_pc = iter.current_pc(); |
+ lowest_kind = iter.current_kind(); |
} |
} |
} |
if (lowest_pc == kUwordMax) { |
return; |
} |
- CodeBreakpoint* code_bpt = GetCodeBreakpoint(lowest_rec.pc()); |
+ CodeBreakpoint* code_bpt = GetCodeBreakpoint(lowest_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, bpt->token_pos_, |
+ lowest_pc, lowest_kind); |
RegisterCodeBreakpoint(code_bpt); |
} |
code_bpt->set_src_bpt(bpt); |