Index: runtime/vm/debugger.cc |
=================================================================== |
--- runtime/vm/debugger.cc (revision 28666) |
+++ runtime/vm/debugger.cc (working copy) |
@@ -126,8 +126,13 @@ |
visitor->VisitPointer(reinterpret_cast<RawObject**>(&function_)); |
} |
- |
-ActivationFrame::ActivationFrame(uword pc, uword fp, uword sp, const Code& code) |
+ActivationFrame::ActivationFrame( |
+ uword pc, |
+ uword fp, |
+ uword sp, |
+ const Code& code, |
+ const Array& deopt_frame, |
+ intptr_t deopt_frame_offset) |
: pc_(pc), fp_(fp), sp_(sp), |
ctx_(Context::ZoneHandle()), |
code_(Code::ZoneHandle(code.raw())), |
@@ -136,8 +141,8 @@ |
pc_desc_index_(-1), |
line_number_(-1), |
context_level_(-1), |
- deopt_frame_(Array::ZoneHandle()), |
- deopt_frame_offset_(0), |
+ deopt_frame_(Array::ZoneHandle(deopt_frame.raw())), |
+ deopt_frame_offset_(deopt_frame_offset), |
vars_initialized_(false), |
var_descriptors_(LocalVarDescriptors::ZoneHandle()), |
desc_indices_(8), |
@@ -580,6 +585,9 @@ |
// The context level at the PC/token index of this activation frame. |
intptr_t frame_ctx_level = ContextLevel(); |
if (ctx_.IsNull()) { |
+ if (FLAG_use_new_stacktrace) { |
+ UNREACHABLE(); // ctx_ should never be null. |
+ } |
*value = Symbols::New("<unknown>"); |
return; |
} |
@@ -593,6 +601,9 @@ |
if ((ctx_slot < ctx_.num_variables()) && (ctx_slot >= 0)) { |
*value = ctx_.At(ctx_slot); |
} else { |
+ if (FLAG_use_new_stacktrace) { |
+ UNREACHABLE(); // ctx_ should be correct. |
+ } |
*value = Symbols::New("<unknown>"); |
} |
} else { |
@@ -608,6 +619,9 @@ |
((ctx_slot < var_ctx.num_variables()) && (ctx_slot >= 0))) { |
*value = var_ctx.At(ctx_slot); |
} else { |
+ if (FLAG_use_new_stacktrace) { |
+ UNREACHABLE(); // var_ctx should be correct. |
+ } |
*value = Symbols::New("<unknown>"); |
} |
} |
@@ -1023,20 +1037,19 @@ |
uword pc, |
StackFrame* frame, |
const Code& code, |
- bool optimized, |
+ const Array& deopt_frame, |
+ intptr_t deopt_frame_offset, |
ActivationFrame* callee_activation, |
const Context& entry_ctx) { |
- // We never provide both a callee activation and an entry context. |
- ASSERT((callee_activation == NULL) || entry_ctx.IsNull()); |
+ // We provide either a callee activation or an entry context. Not both. |
+ ASSERT(((callee_activation != NULL) && entry_ctx.IsNull()) || |
+ ((callee_activation == NULL) && !entry_ctx.IsNull())); |
ActivationFrame* activation = |
- new ActivationFrame(pc, frame->fp(), frame->sp(), code); |
+ new ActivationFrame(pc, frame->fp(), frame->sp(), code, |
+ deopt_frame, deopt_frame_offset); |
// Recover the context for this frame. |
- if (optimized) { |
- // Bail out for optimized frames for now. |
- activation->SetContext(Context::Handle(isolate)); |
- |
- } else if (callee_activation == NULL) { |
+ if (callee_activation == NULL) { |
// No callee. Use incoming entry context. Could be from |
// isolate's top context or from an entry frame. |
activation->SetContext(entry_ctx); |
@@ -1050,10 +1063,14 @@ |
// Sometimes there is no saved context. This is a bug. |
// https://code.google.com/p/dart/issues/detail?id=12767 |
- if (FLAG_verbose_debug && closure_call_ctx.IsNull()) { |
+ if ((FLAG_verbose_debug || FLAG_use_new_stacktrace) && |
+ closure_call_ctx.IsNull()) { |
PrintStackTraceError( |
"Expected to find saved context for call to closure function", |
activation, callee_activation); |
+ if (FLAG_use_new_stacktrace) { |
+ UNREACHABLE(); // This bug should be fixed with new stack collection. |
+ } |
} |
} else { |
@@ -1122,10 +1139,10 @@ |
it.pc(), |
frame, |
inlined_code, |
- true, |
+ deopt_frame, |
+ deopt_frame_offset, |
current_activation, |
entry_ctx); |
- current_activation->SetDeoptFrame(deopt_frame, deopt_frame_offset); |
stack_trace->AddActivation(current_activation); |
entry_ctx = Context::null(); // Only use entry context once. |
} |
@@ -1134,7 +1151,8 @@ |
frame->pc(), |
frame, |
code, |
- false, |
+ Object::null_array(), |
+ 0, |
current_activation, |
entry_ctx); |
stack_trace->AddActivation(current_activation); |
@@ -1167,7 +1185,8 @@ |
if (frame->IsDartFrame()) { |
code = frame->LookupDartCode(); |
ActivationFrame* activation = |
- new ActivationFrame(frame->pc(), frame->fp(), frame->sp(), code); |
+ new ActivationFrame(frame->pc(), frame->fp(), frame->sp(), code, |
+ Object::null_array(), 0); |
// If this activation frame called a closure, the function has |
// saved its context before the call. |
if ((callee_activation != NULL) && |
@@ -1217,7 +1236,8 @@ |
} |
Code& code = Code::Handle(isolate_, frame->LookupDartCode()); |
ActivationFrame* activation = |
- new ActivationFrame(frame->pc(), frame->fp(), frame->sp(), code); |
+ new ActivationFrame(frame->pc(), frame->fp(), frame->sp(), code, |
+ Object::null_array(), 0); |
return activation; |
} |