test/hotspot/jtreg/runtime/clinit/libClassInitBarrier.cpp
changeset 57574 6a159c6c23cc
parent 55105 9ad765641e8f
child 58679 9c3209ff7550
--- 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();
+    }
 }