Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(760)

Unified Diff: runtime/vm/debugger.cc

Issue 1077793003: Remove redundant variable descriptors from optimized code. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/debugger.h ('k') | runtime/vm/flow_graph_compiler.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « runtime/vm/debugger.h ('k') | runtime/vm/flow_graph_compiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698