Fri, 10 May 2019 18:50:40 +0000
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 | } |