diff options
Diffstat (limited to 'runtime/debugger.cc')
-rw-r--r-- | runtime/debugger.cc | 58 |
1 files changed, 26 insertions, 32 deletions
diff --git a/runtime/debugger.cc b/runtime/debugger.cc index e5d648bd19..6e11cf88c4 100644 --- a/runtime/debugger.cc +++ b/runtime/debugger.cc @@ -726,11 +726,11 @@ JDWP::JdwpError Dbg::GetSuperclass(JDWP::RefTypeId id, JDWP::RefTypeId* supercla JDWP::JdwpError Dbg::GetClassLoader(JDWP::RefTypeId id, JDWP::ExpandBuf* pReply) { JDWP::JdwpError error; - mirror::Object* o = gRegistry->Get<mirror::Object*>(id, &error); - if (o == nullptr) { - return JDWP::ERR_INVALID_OBJECT; + mirror::Class* c = DecodeClass(id, &error); + if (c == nullptr) { + return error; } - expandBufAddObjectId(pReply, gRegistry->Add(o->GetClass()->GetClassLoader())); + expandBufAddObjectId(pReply, gRegistry->Add(c->GetClassLoader())); return JDWP::ERR_NONE; } @@ -1491,25 +1491,20 @@ JDWP::JdwpError Dbg::OutputDeclaredMethods(JDWP::RefTypeId class_id, bool with_g return error; } - size_t direct_method_count = c->NumDirectMethods(); - size_t virtual_method_count = c->NumVirtualMethods(); - - expandBufAdd4BE(pReply, direct_method_count + virtual_method_count); + expandBufAdd4BE(pReply, c->NumMethods()); auto* cl = Runtime::Current()->GetClassLinker(); auto ptr_size = cl->GetImagePointerSize(); - for (size_t i = 0; i < direct_method_count + virtual_method_count; ++i) { - ArtMethod* m = i < direct_method_count ? - c->GetDirectMethod(i, ptr_size) : c->GetVirtualMethod(i - direct_method_count, ptr_size); - expandBufAddMethodId(pReply, ToMethodId(m)); - expandBufAddUtf8String(pReply, m->GetInterfaceMethodIfProxy(sizeof(void*))->GetName()); + for (ArtMethod& m : c->GetMethods(ptr_size)) { + expandBufAddMethodId(pReply, ToMethodId(&m)); + expandBufAddUtf8String(pReply, m.GetInterfaceMethodIfProxy(sizeof(void*))->GetName()); expandBufAddUtf8String(pReply, - m->GetInterfaceMethodIfProxy(sizeof(void*))->GetSignature().ToString()); + m.GetInterfaceMethodIfProxy(sizeof(void*))->GetSignature().ToString()); if (with_generic) { const char* generic_signature = ""; expandBufAddUtf8String(pReply, generic_signature); } - expandBufAdd4BE(pReply, MangleAccessFlags(m->GetAccessFlags())); + expandBufAdd4BE(pReply, MangleAccessFlags(m.GetAccessFlags())); } return JDWP::ERR_NONE; } @@ -2038,29 +2033,28 @@ static void GetChildThreadGroups(ScopedObjectAccessUnchecked& soa, mirror::Objec SHARED_REQUIRES(Locks::mutator_lock_) { CHECK(thread_group != nullptr); - // Get the ArrayList<ThreadGroup> "groups" out of this thread group... - ArtField* groups_field = soa.DecodeField(WellKnownClasses::java_lang_ThreadGroup_groups); - mirror::Object* groups_array_list = groups_field->GetObject(thread_group); - { - // The "groups" field is declared as a java.util.List: check it really is - // an instance of java.util.ArrayList. - CHECK(groups_array_list != nullptr); - mirror::Class* java_util_ArrayList_class = - soa.Decode<mirror::Class*>(WellKnownClasses::java_util_ArrayList); - CHECK(groups_array_list->InstanceOf(java_util_ArrayList_class)); + // Get the int "ngroups" count of this thread group... + ArtField* ngroups_field = soa.DecodeField(WellKnownClasses::java_lang_ThreadGroup_ngroups); + CHECK(ngroups_field != nullptr); + const int32_t size = ngroups_field->GetInt(thread_group); + if (size == 0) { + return; } - // Get the array and size out of the ArrayList<ThreadGroup>... - ArtField* array_field = soa.DecodeField(WellKnownClasses::java_util_ArrayList_array); - ArtField* size_field = soa.DecodeField(WellKnownClasses::java_util_ArrayList_size); - mirror::ObjectArray<mirror::Object>* groups_array = - array_field->GetObject(groups_array_list)->AsObjectArray<mirror::Object>(); - const int32_t size = size_field->GetInt(groups_array_list); + // Get the ThreadGroup[] "groups" out of this thread group... + ArtField* groups_field = soa.DecodeField(WellKnownClasses::java_lang_ThreadGroup_groups); + mirror::Object* groups_array = groups_field->GetObject(thread_group); + + CHECK(groups_array != nullptr); + CHECK(groups_array->IsObjectArray()); + + mirror::ObjectArray<mirror::Object>* groups_array_as_array = + groups_array->AsObjectArray<mirror::Object>(); // Copy the first 'size' elements out of the array into the result. ObjectRegistry* registry = Dbg::GetObjectRegistry(); for (int32_t i = 0; i < size; ++i) { - child_thread_group_ids->push_back(registry->Add(groups_array->Get(i))); + child_thread_group_ids->push_back(registry->Add(groups_array_as_array->Get(i))); } } |