Chromium Code Reviews| Index: runtime/vm/debugger.cc |
| =================================================================== |
| --- runtime/vm/debugger.cc (revision 2724) |
| +++ runtime/vm/debugger.cc (working copy) |
| @@ -68,21 +68,22 @@ |
| } |
| -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) { |
| + /*locals_(NULL)*/ var_descriptors_(NULL), |
|
siva
2011/12/22 00:04:28
Why is the commented out locals_ stuff needed?
hausner
2011/12/22 00:15:32
Oops, leftover code. Removed.
|
| + desc_indices_(8) { |
| } |
| -Function* ActivationFrame::DartFunction() { |
| - if (function_ == NULL) { |
| +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_; |
| } |
| @@ -110,7 +111,7 @@ |
| RawString* ActivationFrame::QualifiedFunctionName() { |
| - Function& func = *DartFunction(); |
| + Function& func = DartFunction(); |
|
siva
2011/12/22 00:04:28
const Function& func = ...
hausner
2011/12/22 00:15:32
Done.
|
| 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,7 +208,7 @@ |
| const char* ActivationFrame::ToCString() { |
| const char* kFormat = "Function: '%s' url: '%s' line: %d"; |
| - Function& func = *DartFunction(); |
| + Function& func = DartFunction(); |
|
siva
2011/12/22 00:04:28
const Function& func = ...?
hausner
2011/12/22 00:15:32
Done.
|
| 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(); |
| } |