--- a/test/hotspot/jtreg/runtime/clinit/libClassInitBarrier.cpp Wed Jul 24 10:09:30 2019 +0800
+++ b/test/hotspot/jtreg/runtime/clinit/libClassInitBarrier.cpp Wed Jul 24 10:50:40 2019 +0300
@@ -25,6 +25,17 @@
static jmethodID methodId;
+static jclass test_class_A;
+static jclass test_class_B;
+
+static jmethodID test_staticM_id;
+static jmethodID test_staticS_id;
+static jmethodID test_staticN_id;
+static jmethodID test_A_m_id;
+
+static jfieldID test_staticF_id;
+static jfieldID test_A_f_id;
+
extern "C" {
JNIEXPORT jboolean JNICALL Java_ClassInitBarrier_init(JNIEnv* env, jclass cls) {
jclass runnable = env->FindClass("java/lang/Runnable");
@@ -36,7 +47,103 @@
return JNI_TRUE;
}
+ JNIEXPORT jboolean JNICALL Java_ClassInitBarrier_00024Test_00024A_init(JNIEnv* env, jclass cls, jclass arg1) {
+ test_class_A = (jclass)env->NewGlobalRef(cls);
+ if (test_class_A == NULL) return JNI_FALSE;
+
+ test_class_B = (jclass)env->NewGlobalRef(arg1);
+ if (test_class_B == NULL) return JNI_FALSE;
+
+ test_staticM_id = env->GetStaticMethodID(test_class_A, "staticM", "(Ljava/lang/Runnable;)V");
+ if (test_staticM_id == NULL) return JNI_FALSE;
+
+ test_staticS_id = env->GetStaticMethodID(test_class_A, "staticS", "(Ljava/lang/Runnable;)V");
+ if (test_staticS_id == NULL) return JNI_FALSE;
+
+ test_staticN_id = env->GetStaticMethodID(test_class_A, "staticN", "(Ljava/lang/Runnable;)V");
+ if (test_staticN_id == NULL) return JNI_FALSE;
+
+ test_A_m_id = env->GetMethodID(test_class_A, "m", "()V");
+ if (test_A_m_id == NULL) return JNI_FALSE;
+
+ test_staticF_id = env->GetStaticFieldID(test_class_A, "staticF", "I");
+ if (test_staticF_id == NULL) return JNI_FALSE;
+
+ test_A_f_id = env->GetFieldID(test_class_A, "f", "I");
+ if (test_A_f_id == NULL) return JNI_FALSE;
+
+ return JNI_TRUE;
+ }
+
JNIEXPORT void JNICALL Java_ClassInitBarrier_00024Test_00024A_staticN(JNIEnv* env, jclass cls, jobject action) {
env->CallVoidMethod(action, methodId);
}
+
+ JNIEXPORT void JNICALL Java_ClassInitBarrier_00024Test_testInvokeStaticJNI(JNIEnv* env, jclass cls, jobject action) {
+ env->CallStaticVoidMethod(test_class_A, test_staticM_id, action);
+ }
+
+ JNIEXPORT void JNICALL Java_ClassInitBarrier_00024Test_testInvokeStaticSyncJNI(JNIEnv* env, jclass cls, jobject action) {
+ env->CallStaticVoidMethod(test_class_A, test_staticS_id, action);
+ }
+
+ JNIEXPORT void JNICALL Java_ClassInitBarrier_00024Test_testInvokeStaticNativeJNI(JNIEnv* env, jclass cls, jobject action) {
+ env->CallStaticVoidMethod(test_class_A, test_staticN_id, action);
+ }
+
+ JNIEXPORT jint JNICALL Java_ClassInitBarrier_00024Test_testGetStaticJNI(JNIEnv* env, jclass cls, jobject action) {
+ jint v = env->GetStaticIntField(test_class_A, test_staticF_id); // int v = A.staticF;
+ env->CallVoidMethod(action, methodId); // action.run();
+ return v;
+ }
+
+ JNIEXPORT void JNICALL Java_ClassInitBarrier_00024Test_testPutStaticJNI(JNIEnv* env, jclass cls, jobject action) {
+ env->SetStaticIntField(test_class_A, test_staticF_id, 1); // A.staticF = 1;
+ env->CallVoidMethod(action, methodId); // action.run();
+ }
+
+ JNIEXPORT jobject JNICALL Java_ClassInitBarrier_00024Test_testNewInstanceAJNI(JNIEnv* env, jclass cls, jobject action) {
+ jobject obj = env->AllocObject(test_class_A); // A obj = new A();
+ if (env->ExceptionOccurred()) {
+ return NULL;
+ } else if (obj == NULL) {
+ jclass errorClass = env->FindClass("java/lang/AssertionError");
+ int ret = env->ThrowNew(errorClass, "JNI: AllocObject: allocation failed, but no exception thrown");
+ return NULL;
+ }
+ env->CallVoidMethod(action, methodId); // action.run();
+ return obj;
+ }
+
+ JNIEXPORT jobject JNICALL Java_ClassInitBarrier_00024Test_testNewInstanceBJNI(JNIEnv* env, jclass cls, jobject action) {
+ jobject obj = env->AllocObject(test_class_B); // B obj = new B();
+ if (env->ExceptionOccurred()) {
+ return NULL;
+ } else if (obj == NULL) {
+ jclass errorClass = env->FindClass("java/lang/AssertionError");
+ int ret = env->ThrowNew(errorClass, "JNI: AllocObject: allocation failed, but no exception thrown");
+ return NULL;
+ }
+ env->CallVoidMethod(action, methodId); // action.run();
+ return obj;
+ }
+
+ JNIEXPORT jint JNICALL Java_ClassInitBarrier_00024Test_testGetFieldJNI(JNIEnv* env, jclass cls, jobject recv, jobject action) {
+ jint v = env->GetIntField(recv, test_A_f_id); // int v = recv.f;
+ env->CallVoidMethod(action, methodId); // action.run();
+ return v;
+ }
+
+ JNIEXPORT void JNICALL Java_ClassInitBarrier_00024Test_testPutFieldJNI(JNIEnv* env, jclass cls, jobject recv, jobject action) {
+ env->SetIntField(recv, test_A_f_id, 1); // A.staticF = 1;
+ env->CallVoidMethod(action, methodId); // action.run();
+ }
+
+ JNIEXPORT void JNICALL Java_ClassInitBarrier_00024Test_testInvokeVirtualJNI(JNIEnv* env, jclass cls, jobject recv, jobject action) {
+ env->CallVoidMethod(recv, test_A_m_id); // recv.m();
+ if (env->ExceptionOccurred()) {
+ return;
+ }
+ env->CallVoidMethod(action, methodId); // action.run();
+ }
}