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

Unified Diff: runtime/vm/debugger.cc

Issue 9019029: Retrieve value of local variables in stack frames. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 9 years 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/debugger_arm.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 2724)
+++ runtime/vm/debugger.cc (working copy)
@@ -68,28 +68,29 @@
}
-ActivationFrame::ActivationFrame(uword pc)
- : pc_(pc),
- function_(NULL),
+ActivationFrame::ActivationFrame(uword pc, uword fp)
+ : pc_(pc), fp_(fp),
+ function_(Function::ZoneHandle()),
token_index_(-1),
line_number_(-1),
- locals_(NULL) {
+ var_descriptors_(NULL),
+ desc_indices_(8) {
}
-Function* ActivationFrame::DartFunction() {
- if (function_ == NULL) {
+const Function& ActivationFrame::DartFunction() {
+ if (function_.IsNull()) {
ASSERT(Isolate::Current() != NULL);
CodeIndexTable* code_index_table = Isolate::Current()->code_index_table();
ASSERT(code_index_table != NULL);
- function_ = &Function::ZoneHandle(code_index_table->LookupFunction(pc_));
+ function_ = code_index_table->LookupFunction(pc_);
}
return function_;
}
const char* Debugger::QualifiedFunctionName(const Function& func) {
- String& func_name = String::Handle(func.name());
+ const String& func_name = String::Handle(func.name());
Class& func_class = Class::Handle(func.owner());
String& class_name = String::Handle(func_class.Name());
@@ -110,7 +111,7 @@
RawString* ActivationFrame::QualifiedFunctionName() {
- Function& func = *DartFunction();
+ const Function& func = DartFunction();
return String::New(Debugger::QualifiedFunctionName(func));
}
@@ -122,7 +123,7 @@
RawScript* ActivationFrame::SourceScript() {
- const Function& func = *DartFunction();
+ const Function& func = DartFunction();
const Class& cls = Class::Handle(func.owner());
return cls.script();
}
@@ -130,7 +131,7 @@
intptr_t ActivationFrame::TokenIndex() {
if (token_index_ < 0) {
- const Function& func = *DartFunction();
+ const Function& func = DartFunction();
Code& code = Code::Handle(func.code());
ASSERT(!code.IsNull());
PcDescriptors& desc = PcDescriptors::Handle(code.pc_descriptors());
@@ -157,15 +158,47 @@
}
-ActiveVariables* ActivationFrame::LocalVariables() {
- if (locals_ == NULL) {
- const Function& func = *DartFunction();
- locals_ = new ActiveVariables(func, TokenIndex());
+void ActivationFrame::GetLocalVariables() {
+ if (var_descriptors_ == NULL) {
+ const Code& code = Code::Handle(DartFunction().code());
+ var_descriptors_ =
+ &LocalVarDescriptors::ZoneHandle(code.var_descriptors());
+ intptr_t activation_token_pos = TokenIndex();
+ intptr_t desc_len = var_descriptors_->Length();
+ for (int i = 0; i < desc_len; i++) {
+ intptr_t begin_pos, end_pos;
+ var_descriptors_->GetRange(i, &begin_pos, &end_pos);
+ if ((begin_pos <= activation_token_pos) &&
+ (activation_token_pos <= end_pos)) {
+ desc_indices_.Add(i);
+ }
+ }
}
- return locals_;
}
+intptr_t ActivationFrame::NumLocalVariables() {
+ GetLocalVariables();
+ return desc_indices_.length();
+}
+
+
+void ActivationFrame::VariableAt(intptr_t i,
+ String* name,
+ intptr_t* token_pos,
+ intptr_t* end_pos,
+ Instance* value) {
+ GetLocalVariables();
+ ASSERT(i < desc_indices_.length());
+ ASSERT(name != NULL);
+ intptr_t desc_index = desc_indices_[i];
+ *name ^= var_descriptors_->GetName(desc_index);
+ var_descriptors_->GetRange(i, token_pos, end_pos);
+ ASSERT(value != NULL);
+ *value = GetLocalVarValue(var_descriptors_->GetSlotIndex(i));
+}
+
+
RawInstance* ActivationFrame::Value(const String& variable_name) {
UNIMPLEMENTED();
return NULL;
@@ -175,8 +208,8 @@
const char* ActivationFrame::ToCString() {
const char* kFormat = "Function: '%s' url: '%s' line: %d";
- Function& func = *DartFunction();
- String& url = String::Handle(SourceUrl());
+ const Function& func = DartFunction();
+ const String& url = String::Handle(SourceUrl());
intptr_t line = LineNumber();
const char* func_name = Debugger::QualifiedFunctionName(func);
@@ -195,39 +228,6 @@
}
-ActiveVariables::ActiveVariables(const Function& function, intptr_t token_pos)
- : descriptors_(NULL),
- desc_indices_(8) {
- const Code& code = Code::Handle(function.code());
- LocalVarDescriptors& var_descs =
- LocalVarDescriptors::ZoneHandle(code.var_descriptors());
- descriptors_ = &var_descs;
- intptr_t desc_len = var_descs.Length();
- for (int i = 0; i < desc_len; i++) {
- intptr_t begin_pos, end_pos;
- var_descs.GetRange(i, &begin_pos, &end_pos);
- if ((begin_pos <= token_pos) && (token_pos <= end_pos)) {
- desc_indices_.Add(i);
- }
- }
-}
-
-
-void ActiveVariables::VariableAt(intptr_t i,
- String* name,
- intptr_t* token_pos,
- intptr_t* end_pos,
- Instance* value) const {
- ASSERT(i < Length());
- ASSERT(name != NULL);
- intptr_t desc_index = desc_indices_[i];
- *name ^= descriptors_->GetName(desc_index);
- descriptors_->GetRange(i, token_pos, end_pos);
- ASSERT(value != NULL);
- *value = Instance::null(); // TODO(hausner): get actual variable value.
-}
-
-
Debugger::Debugger()
: initialized_(false),
bp_handler_(NULL),
@@ -333,11 +333,10 @@
ActivationFrame* frame = stack->ActivationFrameAt(i);
OS::Print(" %d. %s\n",
i + 1, frame->ToCString());
- ActiveVariables* locals = frame->LocalVariables();
- intptr_t num_locals = locals->Length();
+ intptr_t num_locals = frame->NumLocalVariables();
for (intptr_t i = 0; i < num_locals; i++) {
intptr_t token_pos, end_pos;
- locals->VariableAt(i, &var_name, &token_pos, &end_pos, &value);
+ frame->VariableAt(i, &var_name, &token_pos, &end_pos, &value);
OS::Print(" var %s (pos %d) = %s\n",
var_name.ToCString(), token_pos, value.ToCString());
}
@@ -370,7 +369,8 @@
while (frame != NULL) {
ASSERT(frame->IsValid());
ASSERT(frame->IsDartFrame());
- ActivationFrame* activation = new ActivationFrame(frame->pc());
+ ActivationFrame* activation =
+ new ActivationFrame(frame->pc(), frame->fp());
stack_trace->AddActivation(activation);
frame = iterator.NextFrame();
}
« no previous file with comments | « runtime/vm/debugger.h ('k') | runtime/vm/debugger_arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698