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