test/runtime/jni/CallWithJNIWeak/CallWithJNIWeak.c

Fri, 10 May 2019 18:50:40 +0000

author
phh
date
Fri, 10 May 2019 18:50:40 +0000
changeset 9671
e86bc9786d83
permissions
-rw-r--r--

8223664: Add jtreg tests for 8223528, backport to jdk8u of 8176100
Summary: Add hotspot/test/runtime/jni directory with two tests for 8176100
Reviewed-by: kbarrett, coleenp, tschatzl

phh@9671 1 /*
phh@9671 2 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
phh@9671 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
phh@9671 4 *
phh@9671 5 * This code is free software; you can redistribute it and/or modify it
phh@9671 6 * under the terms of the GNU General Public License version 2 only, as
phh@9671 7 * published by the Free Software Foundation.
phh@9671 8 *
phh@9671 9 * This code is distributed in the hope that it will be useful, but WITHOUT
phh@9671 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
phh@9671 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
phh@9671 12 * version 2 for more details (a copy is included in the LICENSE file that
phh@9671 13 * accompanied this code).
phh@9671 14 *
phh@9671 15 * You should have received a copy of the GNU General Public License version
phh@9671 16 * 2 along with this work; if not, write to the Free Software Foundation,
phh@9671 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
phh@9671 18 *
phh@9671 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
phh@9671 20 * or visit www.oracle.com if you need additional information or have any
phh@9671 21 * questions.
phh@9671 22 */
phh@9671 23
phh@9671 24 #include <jni.h>
phh@9671 25
phh@9671 26 /*
phh@9671 27 * Class: CallWithJNIWeak
phh@9671 28 * Method: testJNIFieldAccessors
phh@9671 29 * Signature: (LCallWithJNIWeak;)V
phh@9671 30 */
phh@9671 31 JNIEXPORT void JNICALL
phh@9671 32 Java_CallWithJNIWeak_testJNIFieldAccessors(JNIEnv *env, jclass clazz, jobject this) {
phh@9671 33 // Make sure that we have a weak reference to the receiver
phh@9671 34
phh@9671 35 jweak self = (*env)->NewWeakGlobalRef(env, this);
phh@9671 36
phh@9671 37 jclass this_class = (*env)->GetObjectClass(env, self);
phh@9671 38
phh@9671 39 jclass exception = (*env)->FindClass(env, "java/lang/RuntimeException");
phh@9671 40
phh@9671 41 jfieldID id_i = (*env)->GetFieldID(env, this_class, "i", "I");
phh@9671 42 jfieldID id_j = (*env)->GetFieldID(env, this_class, "j", "J");
phh@9671 43 jfieldID id_z = (*env)->GetFieldID(env, this_class, "z", "Z");
phh@9671 44 jfieldID id_c = (*env)->GetFieldID(env, this_class, "c", "C");
phh@9671 45 jfieldID id_s = (*env)->GetFieldID(env, this_class, "s", "S");
phh@9671 46 jfieldID id_f = (*env)->GetFieldID(env, this_class, "f", "F");
phh@9671 47 jfieldID id_d = (*env)->GetFieldID(env, this_class, "d", "D");
phh@9671 48 jfieldID id_l = (*env)->GetFieldID(env, this_class, "l", "Ljava/lang/Object;");
phh@9671 49 jvalue v;
phh@9671 50
phh@9671 51 #define CHECK(variable, expected) \
phh@9671 52 do { \
phh@9671 53 if ((variable) != (expected)) { \
phh@9671 54 (*env)->ThrowNew(env, exception, #variable" != " #expected); \
phh@9671 55 return; \
phh@9671 56 } \
phh@9671 57 } while(0)
phh@9671 58
phh@9671 59 // The values checked below must be kept in sync with the Java source file.
phh@9671 60
phh@9671 61 v.i = (*env)->GetIntField(env, self, id_i);
phh@9671 62 CHECK(v.i, 1);
phh@9671 63
phh@9671 64 v.j = (*env)->GetLongField(env, self, id_j);
phh@9671 65 CHECK(v.j, 2);
phh@9671 66
phh@9671 67 v.z = (*env)->GetBooleanField(env, self, id_z);
phh@9671 68 CHECK(v.z, JNI_TRUE);
phh@9671 69
phh@9671 70 v.c = (*env)->GetCharField(env, self, id_c);
phh@9671 71 CHECK(v.c, 'a');
phh@9671 72
phh@9671 73 v.s = (*env)->GetShortField(env, self, id_s);
phh@9671 74 CHECK(v.s, 3);
phh@9671 75
phh@9671 76 v.f = (*env)->GetFloatField(env, self, id_f);
phh@9671 77 CHECK(v.f, 1.0f);
phh@9671 78
phh@9671 79 v.d = (*env)->GetDoubleField(env, self, id_d);
phh@9671 80 CHECK(v.d, 2.0);
phh@9671 81
phh@9671 82 #undef CHECK
phh@9671 83
phh@9671 84 v.l = (*env)->GetObjectField(env, self, id_l);
phh@9671 85 if (v.l == NULL) {
phh@9671 86 (*env)->ThrowNew(env, exception, "Object field was null");
phh@9671 87 return;
phh@9671 88 }
phh@9671 89 {
phh@9671 90 jclass clz = (*env)->GetObjectClass(env, v.l);
phh@9671 91 if (!(*env)->IsSameObject(env, clazz, clz)) {
phh@9671 92 (*env)->ThrowNew(env, exception, "Bad object class");
phh@9671 93 }
phh@9671 94 }
phh@9671 95
phh@9671 96 (*env)->DeleteWeakGlobalRef(env, self);
phh@9671 97 }
phh@9671 98
phh@9671 99 /*
phh@9671 100 * Class: CallWithJNIWeak
phh@9671 101 * Method: runTests
phh@9671 102 * Signature: (LCallWithJNIWeak;)V
phh@9671 103 */
phh@9671 104 JNIEXPORT void JNICALL
phh@9671 105 Java_CallWithJNIWeak_runTests(JNIEnv *env, jclass clazz, jobject this) {
phh@9671 106 jweak that = (*env)->NewWeakGlobalRef(env, this);
phh@9671 107 {
phh@9671 108 jmethodID method = (*env)->GetStaticMethodID(env,
phh@9671 109 clazz, "testJNIFieldAccessors", "(LCallWithJNIWeak;)V");
phh@9671 110 (*env)->CallStaticVoidMethod(env, clazz, method, that);
phh@9671 111 if ((*env)->ExceptionCheck(env)) {
phh@9671 112 return;
phh@9671 113 }
phh@9671 114 }
phh@9671 115
phh@9671 116 {
phh@9671 117 jmethodID method = (*env)->GetMethodID(env, clazz, "weakReceiverTest", "()V");
phh@9671 118 (*env)->CallVoidMethod(env, that, method);
phh@9671 119 if ((*env)->ExceptionCheck(env)) {
phh@9671 120 return;
phh@9671 121 }
phh@9671 122 }
phh@9671 123
phh@9671 124 {
phh@9671 125 jmethodID method = (*env)->GetMethodID(env, clazz, "synchonizedWeakReceiverTest", "()V");
phh@9671 126 (*env)->CallVoidMethod(env, that, method);
phh@9671 127 if ((*env)->ExceptionCheck(env)) {
phh@9671 128 return;
phh@9671 129 }
phh@9671 130 }
phh@9671 131 (*env)->DeleteWeakGlobalRef(env, that);
phh@9671 132 }
phh@9671 133
phh@9671 134 /*
phh@9671 135 * Class: CallWithJNIWeak
phh@9671 136 * Method: weakReceiverTest0
phh@9671 137 * Signature: ()V
phh@9671 138 */
phh@9671 139 JNIEXPORT void JNICALL
phh@9671 140 Java_CallWithJNIWeak_weakReceiverTest0(JNIEnv *env, jobject obj) {
phh@9671 141 (*env)->GetObjectClass(env, obj);
phh@9671 142 }

mercurial