| Index: runtime/vm/debugger.cc
|
| ===================================================================
|
| --- runtime/vm/debugger.cc (revision 45130)
|
| +++ runtime/vm/debugger.cc (working copy)
|
| @@ -460,7 +460,11 @@
|
|
|
| void ActivationFrame::GetVarDescriptors() {
|
| if (var_descriptors_.IsNull()) {
|
| - var_descriptors_ = code().var_descriptors();
|
| + if (code().is_optimized()) {
|
| + Compiler::EnsureUnoptimizedCode(Thread::Current(), function());
|
| + }
|
| + var_descriptors_ =
|
| + Code::Handle(function().unoptimized_code()).var_descriptors();
|
| ASSERT(!var_descriptors_.IsNull());
|
| }
|
| }
|
| @@ -473,7 +477,8 @@
|
|
|
| // Calculate the context level at the current token index of the frame.
|
| intptr_t ActivationFrame::ContextLevel() {
|
| - if (context_level_ < 0 && !ctx_.IsNull()) {
|
| + const Context& ctx = GetSavedCurrentContext();
|
| + if (context_level_ < 0 && !ctx.IsNull()) {
|
| ASSERT(!code_.is_optimized());
|
| context_level_ = 0;
|
| // TODO(hausner): What to do if there is no descriptor entry
|
| @@ -513,7 +518,8 @@
|
|
|
|
|
| // Get the saved current context of this activation.
|
| -RawContext* ActivationFrame::GetSavedCurrentContext() {
|
| +const Context& ActivationFrame::GetSavedCurrentContext() {
|
| + if (!ctx_.IsNull()) return ctx_;
|
| GetVarDescriptors();
|
| intptr_t var_desc_len = var_descriptors_.Length();
|
| for (intptr_t i = 0; i < var_desc_len; i++) {
|
| @@ -525,12 +531,12 @@
|
| OS::PrintErr("\tFound saved current ctx at index %d\n",
|
| var_info.index());
|
| }
|
| - ASSERT(Object::Handle(GetLocalVar(var_info.index())).IsContext());
|
| - return Context::RawCast(GetLocalVar(var_info.index()));
|
| + ctx_ ^= GetLocalVar(var_info.index());
|
| + return ctx_;
|
| }
|
| }
|
| UNREACHABLE();
|
| - return Context::null();
|
| + return Context::ZoneHandle(Context::null());
|
| }
|
|
|
|
|
| @@ -654,7 +660,7 @@
|
| return desc_indices_.length();
|
| }
|
|
|
| -// TODO(hausner): Handle captured variables.
|
| +
|
| RawObject* ActivationFrame::GetLocalVar(intptr_t slot_index) {
|
| if (deopt_frame_.IsNull()) {
|
| uword var_address = fp() + slot_index * kWordSize;
|
| @@ -695,7 +701,8 @@
|
|
|
| OS::PrintErr("-------------------------\n"
|
| "Context contents:\n");
|
| - ctx_.Dump(8);
|
| + const Context& ctx = GetSavedCurrentContext();
|
| + ctx.Dump(8);
|
|
|
| OS::PrintErr("-------------------------\n"
|
| "Debugger stack trace...\n\n");
|
| @@ -744,7 +751,8 @@
|
| *value = GetLocalInstanceVar(var_info.index());
|
| } else {
|
| ASSERT(kind == RawLocalVarDescriptors::kContextVar);
|
| - ASSERT(!ctx_.IsNull());
|
| + const Context& ctx = GetSavedCurrentContext();
|
| + ASSERT(!ctx.IsNull());
|
|
|
| // The context level at the PC/token index of this activation frame.
|
| intptr_t frame_ctx_level = ContextLevel();
|
| @@ -755,15 +763,15 @@
|
| intptr_t ctx_slot = var_info.index();
|
| if (level_diff == 0) {
|
| if ((ctx_slot < 0) ||
|
| - (ctx_slot >= ctx_.num_variables())) {
|
| + (ctx_slot >= ctx.num_variables())) {
|
| PrintContextMismatchError(*name, ctx_slot,
|
| frame_ctx_level, var_ctx_level);
|
| }
|
| - ASSERT((ctx_slot >= 0) && (ctx_slot < ctx_.num_variables()));
|
| - *value = ctx_.At(ctx_slot);
|
| + ASSERT((ctx_slot >= 0) && (ctx_slot < ctx.num_variables()));
|
| + *value = ctx.At(ctx_slot);
|
| } else {
|
| ASSERT(level_diff > 0);
|
| - Context& var_ctx = Context::Handle(ctx_.raw());
|
| + Context& var_ctx = Context::Handle(ctx.raw());
|
| while (level_diff > 0 && !var_ctx.IsNull()) {
|
| level_diff--;
|
| var_ctx = var_ctx.parent();
|
| @@ -1185,13 +1193,8 @@
|
| ActivationFrame* activation =
|
| new ActivationFrame(pc, frame->fp(), frame->sp(), code,
|
| deopt_frame, deopt_frame_offset);
|
| -
|
| - // Recover the context for this frame.
|
| - const Context& ctx =
|
| - Context::Handle(isolate, activation->GetSavedCurrentContext());
|
| - ASSERT(!ctx.IsNull());
|
| - activation->SetContext(ctx);
|
| if (FLAG_trace_debugger_stacktrace) {
|
| + const Context& ctx = activation->GetSavedCurrentContext();
|
| OS::PrintErr("\tUsing saved context: %s\n", ctx.ToCString());
|
| }
|
| if (FLAG_trace_debugger_stacktrace) {
|
|
|