Parameterize instance counting to include subclasses.
diff --git a/vm/alloc/Alloc.c b/vm/alloc/Alloc.c
index 4dcd91c..7b56a35 100644
--- a/vm/alloc/Alloc.c
+++ b/vm/alloc/Alloc.c
@@ -305,11 +305,11 @@
typedef struct {
const ClassObject *clazz;
size_t count;
-} CountInstancesOfClassContext;
+} CountContext;
static void countInstancesOfClassCallback(void *ptr, void *arg)
{
- CountInstancesOfClassContext *ctx = arg;
+ CountContext *ctx = arg;
const Object *obj = ptr;
assert(ctx != NULL);
@@ -320,10 +320,31 @@
size_t dvmCountInstancesOfClass(const ClassObject *clazz)
{
- CountInstancesOfClassContext ctx = { clazz, 0 };
+ CountContext ctx = { clazz, 0 };
HeapBitmap *bitmap = dvmHeapSourceGetLiveBits();
dvmLockHeap();
dvmHeapBitmapWalk(bitmap, countInstancesOfClassCallback, &ctx);
dvmUnlockHeap();
return ctx.count;
}
+
+static void countAssignableInstancesOfClassCallback(void *ptr, void *arg)
+{
+ CountContext *ctx = arg;
+ const Object *obj = ptr;
+
+ assert(ctx != NULL);
+ if (dvmInstanceof(obj->clazz, ctx->clazz)) {
+ ctx->count += 1;
+ }
+}
+
+size_t dvmCountAssignableInstancesOfClass(const ClassObject *clazz)
+{
+ CountContext ctx = { clazz, 0 };
+ HeapBitmap *bitmap = dvmHeapSourceGetLiveBits();
+ dvmLockHeap();
+ dvmHeapBitmapWalk(bitmap, countAssignableInstancesOfClassCallback, &ctx);
+ dvmUnlockHeap();
+ return ctx.count;
+}
diff --git a/vm/alloc/Alloc.h b/vm/alloc/Alloc.h
index aeed9c3..fd9c633 100644
--- a/vm/alloc/Alloc.h
+++ b/vm/alloc/Alloc.h
@@ -180,8 +180,13 @@
size_t dvmGetExternalBytesAllocated(void);
/*
- * Returns a count of the extant instances of a class.
+ * Returns a count of the direct instances of a class.
*/
size_t dvmCountInstancesOfClass(const ClassObject *clazz);
+/*
+ * Returns a count of the instances of a class and its subclasses.
+ */
+size_t dvmCountAssignableInstancesOfClass(const ClassObject *clazz);
+
#endif /*_DALVIK_ALLOC_ALLOC*/
diff --git a/vm/native/dalvik_system_VMDebug.c b/vm/native/dalvik_system_VMDebug.c
index b9f3610..192a8f2 100644
--- a/vm/native/dalvik_system_VMDebug.c
+++ b/vm/native/dalvik_system_VMDebug.c
@@ -889,8 +889,13 @@
JValue* pResult)
{
ClassObject* clazz = (ClassObject*)args[0];
+ bool countAssignable = args[1];
if (clazz == NULL) {
RETURN_LONG(0);
+ }
+ if (countAssignable) {
+ size_t count = dvmCountAssignableInstancesOfClass(clazz);
+ RETURN_LONG((long long)count);
} else {
size_t count = dvmCountInstancesOfClass(clazz);
RETURN_LONG((long long)count);
@@ -954,7 +959,7 @@
Dalvik_dalvik_system_VMDebug_crash },
{ "infopoint", "(I)V",
Dalvik_dalvik_system_VMDebug_infopoint },
- { "countInstancesOfClass", "(Ljava/lang/Class;)J",
+ { "countInstancesOfClass", "(Ljava/lang/Class;Z)J",
Dalvik_dalvik_system_VMDebug_countInstancesOfClass },
{ NULL, NULL, NULL },
};