ART: Add IsInterface and IsArrayClass support
Add support for these two required calls. Add a test.
Bug: 31684578
Test: m test-art-host-run-test-912-classes
Change-Id: I2f9e5c62dd4c3d7f29aaf3dd08f1297aa3b2fd8b
diff --git a/runtime/openjdkjvmti/ti_class.cc b/runtime/openjdkjvmti/ti_class.cc
index de2076a..fec8447 100644
--- a/runtime/openjdkjvmti/ti_class.cc
+++ b/runtime/openjdkjvmti/ti_class.cc
@@ -70,4 +70,38 @@
return ERR(NONE);
}
+template <typename T>
+static jvmtiError ClassIsT(jclass jklass, T test, jboolean* is_t_ptr) {
+ art::ScopedObjectAccess soa(art::Thread::Current());
+ art::ObjPtr<art::mirror::Class> klass = soa.Decode<art::mirror::Class>(jklass);
+ if (klass == nullptr) {
+ return ERR(INVALID_CLASS);
+ }
+
+ if (is_t_ptr == nullptr) {
+ return ERR(NULL_POINTER);
+ }
+
+ *is_t_ptr = test(klass) ? JNI_TRUE : JNI_FALSE;
+ return ERR(NONE);
+}
+
+jvmtiError ClassUtil::IsInterface(jvmtiEnv* env ATTRIBUTE_UNUSED,
+ jclass jklass,
+ jboolean* is_interface_ptr) {
+ auto test = [](art::ObjPtr<art::mirror::Class> klass) REQUIRES_SHARED(art::Locks::mutator_lock_) {
+ return klass->IsInterface();
+ };
+ return ClassIsT(jklass, test, is_interface_ptr);
+}
+
+jvmtiError ClassUtil::IsArrayClass(jvmtiEnv* env ATTRIBUTE_UNUSED,
+ jclass jklass,
+ jboolean* is_array_class_ptr) {
+ auto test = [](art::ObjPtr<art::mirror::Class> klass) REQUIRES_SHARED(art::Locks::mutator_lock_) {
+ return klass->IsArrayClass();
+ };
+ return ClassIsT(jklass, test, is_array_class_ptr);
+}
+
} // namespace openjdkjvmti