Implement ObjectReference.ReferringObjects.
Bug: 4159882
Change-Id: Iac145715bec80b5900256d3f6bdb18e283eb9a12
diff --git a/src/jdwp/jdwp_handler.cc b/src/jdwp/jdwp_handler.cc
index 86ecffe..23a3130 100644
--- a/src/jdwp/jdwp_handler.cc
+++ b/src/jdwp/jdwp_handler.cc
@@ -95,6 +95,18 @@
return rc;
}
+static JdwpError WriteTaggedObjectList(ExpandBuf* reply, const std::vector<ObjectId>& objects)
+ SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
+ expandBufAdd4BE(reply, objects.size());
+ for (size_t i = 0; i < objects.size(); ++i) {
+ JdwpError rc = WriteTaggedObject(reply, objects[i]);
+ if (rc != ERR_NONE) {
+ return rc;
+ }
+ }
+ return ERR_NONE;
+}
+
/*
* Common code for *_InvokeMethod requests.
*
@@ -663,14 +675,7 @@
return rc;
}
- expandBufAdd4BE(reply, instances.size());
- for (size_t i = 0; i < instances.size(); ++i) {
- rc = WriteTaggedObject(reply, instances[i]);
- if (rc != ERR_NONE) {
- return rc;
- }
- }
- return ERR_NONE;
+ return WriteTaggedObjectList(reply, instances);
}
/*
@@ -949,6 +954,23 @@
return ERR_NONE;
}
+static JdwpError OR_ReferringObjects(JdwpState*, const uint8_t* buf, int, ExpandBuf* reply)
+ SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
+ ObjectId object_id = ReadObjectId(&buf);
+ int32_t max_count = Read4BE(&buf);
+ if (max_count < 0) {
+ return ERR_ILLEGAL_ARGUMENT;
+ }
+
+ std::vector<ObjectId> referring_objects;
+ JdwpError rc = Dbg::GetReferringObjects(object_id, max_count, referring_objects);
+ if (rc != ERR_NONE) {
+ return rc;
+ }
+
+ return WriteTaggedObjectList(reply, referring_objects);
+}
+
/*
* Return the string value in a string object.
*/
@@ -1674,7 +1696,7 @@
{ 9, 7, OR_DisableCollection, "ObjectReference.DisableCollection" },
{ 9, 8, OR_EnableCollection, "ObjectReference.EnableCollection" },
{ 9, 9, OR_IsCollected, "ObjectReference.IsCollected" },
- { 9, 10, NULL, "ObjectReference.ReferringObjects" },
+ { 9, 10, OR_ReferringObjects, "ObjectReference.ReferringObjects" },
/* StringReference command set (10) */
{ 10, 1, SR_Value, "StringReference.Value" },