ART: Add klass filter support
Add support for klass filter to FollowReferences. Update test.
Bug: 31385354
Test: m test-art-host-run-test-913-heaps
Change-Id: If8f0fb67a931fb358d99b49e774a197388796b6e
diff --git a/runtime/openjdkjvmti/ti_heap.cc b/runtime/openjdkjvmti/ti_heap.cc
index 2fbc12b..eb2cbbd 100644
--- a/runtime/openjdkjvmti/ti_heap.cc
+++ b/runtime/openjdkjvmti/ti_heap.cc
@@ -314,11 +314,13 @@
jvmtiEnv* jvmti_env,
art::ObjPtr<art::mirror::Object> initial_object,
const jvmtiHeapCallbacks* callbacks,
+ art::ObjPtr<art::mirror::Class> class_filter,
const void* user_data)
: env(jvmti_env),
tag_table_(h->GetTags()),
initial_object_(initial_object),
callbacks_(callbacks),
+ class_filter_(class_filter),
user_data_(user_data),
start_(0),
stop_reports_(false) {
@@ -760,6 +762,10 @@
return 0;
}
+ if (UNLIKELY(class_filter_ != nullptr) && class_filter_ != referree->GetClass()) {
+ return JVMTI_VISIT_OBJECTS;
+ }
+
const jlong class_tag = tag_table_->GetTagOrZero(referree->GetClass());
const jlong referrer_class_tag =
referrer == nullptr ? 0 : tag_table_->GetTagOrZero(referrer->GetClass());
@@ -779,6 +785,7 @@
referrer_tag_ptr = &referrer_tag;
}
}
+
jint length = -1;
if (referree->IsArrayInstance()) {
length = referree->AsArray()->GetLength();
@@ -808,6 +815,7 @@
ObjectTagTable* tag_table_;
art::ObjPtr<art::mirror::Object> initial_object_;
const jvmtiHeapCallbacks* callbacks_;
+ art::ObjPtr<art::mirror::Class> class_filter_;
const void* user_data_;
std::vector<art::mirror::Object*> worklist_;
@@ -823,7 +831,7 @@
jvmtiError HeapUtil::FollowReferences(jvmtiEnv* env,
jint heap_filter ATTRIBUTE_UNUSED,
- jclass klass ATTRIBUTE_UNUSED,
+ jclass klass,
jobject initial_object,
const jvmtiHeapCallbacks* callbacks,
const void* user_data) {
@@ -844,10 +852,14 @@
art::ScopedThreadSuspension sts(self, art::kWaitingForVisitObjects);
art::ScopedSuspendAll ssa("FollowReferences");
+ art::ObjPtr<art::mirror::Class> class_filter = klass == nullptr
+ ? nullptr
+ : art::ObjPtr<art::mirror::Class>::DownCast(self->DecodeJObject(klass));
FollowReferencesHelper frh(this,
env,
self->DecodeJObject(initial_object),
callbacks,
+ class_filter,
user_data);
frh.Init();
frh.Work();