Chromium Code Reviews| Index: runtime/vm/debugger.cc |
| =================================================================== |
| --- runtime/vm/debugger.cc (revision 3572) |
| +++ runtime/vm/debugger.cc (working copy) |
| @@ -7,6 +7,7 @@ |
| #include "vm/code_index_table.h" |
| #include "vm/code_patcher.h" |
| #include "vm/compiler.h" |
| +#include "vm/dart_entry.h" |
| #include "vm/flags.h" |
| #include "vm/globals.h" |
| #include "vm/object.h" |
| @@ -407,6 +408,83 @@ |
| } |
| +static RawArray* MakeNameValueList(const GrowableArray<Object*>& pairs) { |
| + int pairs_len = pairs.length(); |
| + ASSERT(pairs_len % 2 == 0); |
| + const Array& list = Array::Handle(Array::New(pairs_len)); |
| + for (int i = 0; i < pairs_len; i++) { |
| + list.SetAt(i, *pairs[i]); |
| + } |
| + return list.raw(); |
| +} |
| + |
| + |
| +RawInstance* Debugger::GetInstanceField(const Class& cls, |
| + const String& field_name, |
| + const Instance& object) { |
| + const Function& getter_func = |
| + Function::Handle(cls.LookupGetterFunction(field_name)); |
| + ASSERT(!getter_func.IsNull()); |
| + GrowableArray<const Object*> noArguments; |
| + const Array& noArgumentNames = Array::Handle(); |
| + return DartEntry::InvokeDynamic(object, getter_func, |
| + noArguments, noArgumentNames); |
|
siva
2012/01/26 21:34:08
Until Todd implements his change of capturing all
hausner
2012/01/27 17:19:30
Good point. The compilation part is taken care of
|
| +} |
| + |
| + |
| +RawInstance* Debugger::GetStaticField(const Class& cls, |
| + const String& field_name) { |
| + const Function& getter_func = |
| + Function::Handle(cls.LookupGetterFunction(field_name)); |
| + ASSERT(!getter_func.IsNull()); |
| + GrowableArray<const Object*> noArguments; |
| + const Array& noArgumentNames = Array::Handle(); |
| + return DartEntry::InvokeStatic(getter_func, noArguments, noArgumentNames); |
|
siva
2012/01/26 21:34:08
Ditto comment about setjmp/longjmp.
hausner
2012/01/27 17:19:30
Done.
|
| +} |
| + |
| + |
| +RawArray* Debugger::GetInstanceFields(const Instance& obj) { |
| + Class& cls = Class::Handle(obj.clazz()); |
| + Array& fields = Array::Handle(); |
| + Field& field = Field::Handle(); |
| + GrowableArray<Object*> field_list(8); |
| + // Iterate over fields in class hierarchy to count all instance fields. |
| + int num_fields = 0; |
| + while (!cls.IsNull()) { |
| + fields = cls.fields(); |
| + for (int i = 0; i < fields.Length(); i++) { |
| + field ^= fields.At(i); |
| + if (!field.is_static()) { |
| + String& field_name = String::Handle(field.name()); |
| + field_list.Add(&field_name); |
| + Instance& field_value = Instance::Handle(); |
| + field_value = GetInstanceField(cls, field_name, obj); |
| + field_list.Add(&field_value); |
| + } |
| + } |
| + cls = cls.SuperClass(); |
| + } |
| + return MakeNameValueList(field_list); |
| +} |
| + |
| + |
| +RawArray* Debugger::GetStaticFields(const Class& cls) { |
| + GrowableArray<Object*> field_list(8); |
| + Array& fields = Array::Handle(cls.fields()); |
| + Field& field = Field::Handle(); |
| + for (int i = 0; i < fields.Length(); i++) { |
| + field ^= fields.At(i); |
| + if (field.is_static()) { |
| + String& field_name = String::Handle(field.name()); |
| + Instance& field_value = Instance::Handle(GetStaticField(cls, field_name)); |
| + field_list.Add(&field_name); |
| + field_list.Add(&field_value); |
| + } |
| + } |
| + return MakeNameValueList(field_list); |
| +} |
| + |
| + |
| void Debugger::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
| ASSERT(visitor != NULL); |
| Breakpoint* bpt = this->breakpoints_; |