ART: Add GetClassModifiers

Add support for GetClassModifiers. Add a test.

Bug: 31684578
Test: m test-art-host-run-test-912-classes
Change-Id: Ia14276d3139503ce35f7684bd846b371e9eafa25
diff --git a/test/912-classes/classes.cc b/test/912-classes/classes.cc
index 6771d71..3383d04 100644
--- a/test/912-classes/classes.cc
+++ b/test/912-classes/classes.cc
@@ -87,6 +87,19 @@
   return is_array_class;
 }
 
+extern "C" JNIEXPORT jint JNICALL Java_Main_getClassModifiers(
+    JNIEnv* env ATTRIBUTE_UNUSED, jclass Main_klass ATTRIBUTE_UNUSED, jclass klass) {
+  jint mod;
+  jvmtiError result = jvmti_env->GetClassModifiers(klass, &mod);
+  if (result != JVMTI_ERROR_NONE) {
+    char* err;
+    jvmti_env->GetErrorName(result, &err);
+    printf("Failure running GetClassModifiers: %s\n", err);
+    return JNI_FALSE;
+  }
+  return mod;
+}
+
 extern "C" JNIEXPORT jobjectArray JNICALL Java_Main_getClassFields(
     JNIEnv* env, jclass Main_klass ATTRIBUTE_UNUSED, jclass klass) {
   jint count = 0;
diff --git a/test/912-classes/expected.txt b/test/912-classes/expected.txt
index 9999903..de23b7b 100644
--- a/test/912-classes/expected.txt
+++ b/test/912-classes/expected.txt
@@ -1,10 +1,17 @@
 [Ljava/lang/Object;, null]
+1
 [Ljava/lang/String;, null]
+11
 [Ljava/lang/Math;, null]
+11
 [Ljava/util/List;, null]
+601
 [L$Proxy0;, null]
+11
 [I, null]
+411
 [[D, null]
+411
 int interface=false array=false
 $Proxy0 interface=false array=false
 java.lang.Runnable interface=true array=false
diff --git a/test/912-classes/src/Main.java b/test/912-classes/src/Main.java
index fd9e31a..cbcfe71 100644
--- a/test/912-classes/src/Main.java
+++ b/test/912-classes/src/Main.java
@@ -82,6 +82,11 @@
   private static void testClass(Class<?> base) throws Exception {
     String[] result = getClassSignature(base);
     System.out.println(Arrays.toString(result));
+    int mod = getClassModifiers(base);
+    if (mod != base.getModifiers()) {
+      throw new RuntimeException("Unexpected modifiers: " + base.getModifiers() + " vs " + mod);
+    }
+    System.out.println(Integer.toHexString(mod));
   }
 
   private static void testClassType(Class<?> c) throws Exception {
@@ -107,6 +112,8 @@
   private static native boolean isInterface(Class<?> c);
   private static native boolean isArrayClass(Class<?> c);
 
+  private static native int getClassModifiers(Class<?> c);
+
   private static native Object[] getClassFields(Class<?> c);
   private static native Object[] getClassMethods(Class<?> c);