Include interfaces in IterateOverInstancesOfClass
The JVMTI IterateOverInstancesOfClass would incorrectly not consider
any objects to be instances of interfaces. This is different from
other implementations of JVMTI.
Test: ./test.py --host
Bug: 143893600
Change-Id: Id5e8177f3f31c2fd4a064e3353a236b072dbb55a
diff --git a/openjdkjvmti/ti_heap.cc b/openjdkjvmti/ti_heap.cc
index bbb2ced..702a1c4 100644
--- a/openjdkjvmti/ti_heap.cc
+++ b/openjdkjvmti/ti_heap.cc
@@ -700,11 +700,6 @@
return ERR(INVALID_CLASS);
}
art::Handle<art::mirror::Class> filter_klass(hs.NewHandle(klass_ptr->AsClass()));
- if (filter_klass->IsInterface()) {
- // nothing is an 'instance' of an interface so just return without walking anything.
- return OK;
- }
-
ObjectTagTable* tag_table = ArtJvmTiEnv::AsArtJvmTiEnv(env)->object_tag_table.get();
bool stop_reports = false;
auto visitor = [&](art::mirror::Object* obj) REQUIRES_SHARED(art::Locks::mutator_lock_) {
diff --git a/test/906-iterate-heap/src/art/Test906.java b/test/906-iterate-heap/src/art/Test906.java
index 190f36f..b782c9b 100644
--- a/test/906-iterate-heap/src/art/Test906.java
+++ b/test/906-iterate-heap/src/art/Test906.java
@@ -91,17 +91,26 @@
public static class Baz extends Bar {}
public static class Alpha extends Bar {}
public static class MISSING extends Baz {}
+ public interface Iface {}
+ public static class Beta implements Iface {}
+ public static class Gamma implements Iface {}
+ public static class Delta extends Beta {}
private static void testIterateOverInstances() throws Exception {
Object[] foos = GenTs(Foo.class);
Object[] bars = GenTs(Bar.class);
Object[] bazs = GenTs(Baz.class);
Object[] alphas = GenTs(Alpha.class);
+ Object[] betas = GenTs(Beta.class);
+ Object[] gammas = GenTs(Gamma.class);
+ Object[] deltas = GenTs(Delta.class);
checkEq(0, iterateOverInstancesCount(MISSING.class));
checkEq(alphas.length, iterateOverInstancesCount(Alpha.class));
checkEq(bazs.length, iterateOverInstancesCount(Baz.class));
checkEq(bazs.length + alphas.length + bars.length, iterateOverInstancesCount(Bar.class));
checkEq(bazs.length + alphas.length + bars.length + foos.length,
iterateOverInstancesCount(Foo.class));
+ checkEq(betas.length + gammas.length + deltas.length,
+ iterateOverInstancesCount(Iface.class));
}
public static void doTest() throws Exception {