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" },