diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/912-classes/classes.cc | 34 | ||||
| -rw-r--r-- | test/912-classes/expected.txt | 9 | ||||
| -rw-r--r-- | test/912-classes/src/Main.java | 29 |
3 files changed, 70 insertions, 2 deletions
diff --git a/test/912-classes/classes.cc b/test/912-classes/classes.cc index 3383d04319..5674e7b9a3 100644 --- a/test/912-classes/classes.cc +++ b/test/912-classes/classes.cc @@ -121,7 +121,11 @@ extern "C" JNIEXPORT jobjectArray JNICALL Java_Main_getClassFields( fields[i], (modifiers & kStatic) != 0 ? JNI_TRUE : JNI_FALSE); }; - return CreateObjectArray(env, count, "java/lang/Object", callback); + jobjectArray ret = CreateObjectArray(env, count, "java/lang/Object", callback); + if (fields != nullptr) { + jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(fields)); + } + return ret; } extern "C" JNIEXPORT jobjectArray JNICALL Java_Main_getClassMethods( @@ -145,7 +149,33 @@ extern "C" JNIEXPORT jobjectArray JNICALL Java_Main_getClassMethods( methods[i], (modifiers & kStatic) != 0 ? JNI_TRUE : JNI_FALSE); }; - return CreateObjectArray(env, count, "java/lang/Object", callback); + jobjectArray ret = CreateObjectArray(env, count, "java/lang/Object", callback); + if (methods != nullptr) { + jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(methods)); + } + return ret; +} + +extern "C" JNIEXPORT jobjectArray JNICALL Java_Main_getImplementedInterfaces( + JNIEnv* env, jclass Main_klass ATTRIBUTE_UNUSED, jclass klass) { + jint count = 0; + jclass* classes = nullptr; + jvmtiError result = jvmti_env->GetImplementedInterfaces(klass, &count, &classes); + if (result != JVMTI_ERROR_NONE) { + char* err; + jvmti_env->GetErrorName(result, &err); + printf("Failure running GetImplementedInterfaces: %s\n", err); + return nullptr; + } + + auto callback = [&](jint i) { + return classes[i]; + }; + jobjectArray ret = CreateObjectArray(env, count, "java/lang/Class", callback); + if (classes != nullptr) { + jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(classes)); + } + return ret; } extern "C" JNIEXPORT jint JNICALL Java_Main_getClassStatus( diff --git a/test/912-classes/expected.txt b/test/912-classes/expected.txt index de23b7bc4d..9f5254c736 100644 --- a/test/912-classes/expected.txt +++ b/test/912-classes/expected.txt @@ -30,3 +30,12 @@ class [Ljava.lang.String; 10000 class java.lang.Object 111 class Main$TestForNonInit 11 class Main$TestForInitFail 1001 +int [] +class [Ljava.lang.String; [] +class java.lang.Object [] +interface Main$InfA [] +interface Main$InfB [interface Main$InfA] +interface Main$InfC [interface Main$InfB] +class Main$ClassA [interface Main$InfA] +class Main$ClassB [interface Main$InfB] +class Main$ClassC [interface Main$InfA, interface Main$InfC] diff --git a/test/912-classes/src/Main.java b/test/912-classes/src/Main.java index cbcfe71aa6..7a7f4c0e2b 100644 --- a/test/912-classes/src/Main.java +++ b/test/912-classes/src/Main.java @@ -61,6 +61,16 @@ public class Main { } catch (ExceptionInInitializerError e) { } testClassStatus(TestForInitFail.class); + + testInterfaces(int.class); + testInterfaces(String[].class); + testInterfaces(Object.class); + testInterfaces(InfA.class); + testInterfaces(InfB.class); + testInterfaces(InfC.class); + testInterfaces(ClassA.class); + testInterfaces(ClassB.class); + testInterfaces(ClassC.class); } private static Class<?> proxyClass = null; @@ -107,6 +117,10 @@ public class Main { System.out.println(c + " " + Integer.toBinaryString(getClassStatus(c))); } + private static void testInterfaces(Class<?> c) { + System.out.println(c + " " + Arrays.toString(getImplementedInterfaces(c))); + } + private static native String[] getClassSignature(Class<?> c); private static native boolean isInterface(Class<?> c); @@ -116,6 +130,7 @@ public class Main { private static native Object[] getClassFields(Class<?> c); private static native Object[] getClassMethods(Class<?> c); + private static native Class[] getImplementedInterfaces(Class<?> c); private static native int getClassStatus(Class<?> c); @@ -126,4 +141,18 @@ public class Main { private static class TestForInitFail { public static int dummy = ((int)Math.random())/0; // So it throws when initializing. } + + public static interface InfA { + } + public static interface InfB extends InfA { + } + public static interface InfC extends InfB { + } + + public abstract static class ClassA implements InfA { + } + public abstract static class ClassB extends ClassA implements InfB { + } + public abstract static class ClassC implements InfA, InfC { + } } |