Path: blob/master/test/hotspot/jtreg/compiler/calls/common/libCallsNative.c
41153 views
/*1* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223#include <stdio.h>2425#include "jni.h"2627#ifdef __cplusplus28extern "C" {29#endif3031#define METHOD_SIGNATURE "(IJFDLjava/lang/String;)Z"32#define STATIC_CALLEE_SIGNATURE "(Lcompiler/calls/common/InvokeStatic;IJFDLjava/lang/String;)Z"33#define BASE_CLASS "compiler/calls/common/CallsBase"3435#define CHECK_EXCEPTIONS if ((*env)->ExceptionCheck(env)) return36#define CHECK_EXCEPTIONS_FALSE if ((*env)->ExceptionCheck(env)) return JNI_FALSE3738#define IS_STATIC 139#define NOT_STATIC 04041jboolean doCalleeWork(JNIEnv *env, jobject self, jint param1, jlong param2,42jfloat param3, jdouble param4, jstring param5) {43jclass cls = (*env)->GetObjectClass(env, self);44jfieldID calleeVisitedID = (*env)->GetFieldID(env, cls, "calleeVisited", "Z");45jclass CheckCallsBaseClass;46jmethodID checkValuesID;47CHECK_EXCEPTIONS_FALSE;48(*env)->SetBooleanField(env, self, calleeVisitedID, JNI_TRUE);49CHECK_EXCEPTIONS_FALSE;50CheckCallsBaseClass = (*env)->FindClass(env, BASE_CLASS);51CHECK_EXCEPTIONS_FALSE;52checkValuesID = (*env)->GetStaticMethodID(env, CheckCallsBaseClass,53"checkValues", "(IJFDLjava/lang/String;)V");54CHECK_EXCEPTIONS_FALSE;55(*env)->CallStaticVoidMethod(env, CheckCallsBaseClass, checkValuesID,56param1, param2, param3, param4, param5);57return JNI_TRUE;58}5960JNIEXPORT jboolean JNICALL Java_compiler_calls_common_InvokeDynamic_calleeNative(JNIEnv *env, jobject obj,61jint param1, jlong param2, jfloat param3, jdouble param4, jstring param5) {62return doCalleeWork(env, obj, param1, param2, param3, param4, param5);63}6465JNIEXPORT jboolean JNICALL Java_compiler_calls_common_InvokeInterface_calleeNative(JNIEnv *env, jobject obj,66jint param1, jlong param2, jfloat param3, jdouble param4, jstring param5) {67return doCalleeWork(env, obj, param1, param2, param3, param4, param5);68}6970JNIEXPORT jboolean JNICALL Java_compiler_calls_common_InvokeSpecial_calleeNative(JNIEnv *env, jobject obj,71jint param1, jlong param2, jfloat param3, jdouble param4, jstring param5) {72return doCalleeWork(env, obj, param1, param2, param3, param4, param5);73}7475JNIEXPORT jboolean JNICALL Java_compiler_calls_common_InvokeVirtual_calleeNative(JNIEnv *env, jobject obj,76jint param1, jlong param2, jfloat param3, jdouble param4, jstring param5) {77return doCalleeWork(env, obj, param1, param2, param3, param4, param5);78}7980JNIEXPORT jboolean JNICALL Java_compiler_calls_common_InvokeStatic_calleeNative(JNIEnv *env, jclass obj,81jobject self, jint param1, jlong param2, jfloat param3, jdouble param4, jstring param5) {82return doCalleeWork(env, self, param1, param2, param3, param4, param5);83}8485void doCallerWork(JNIEnv *env, jobject obj, int isStatic) {86jclass cls = (*env)->GetObjectClass(env, obj);87jmethodID calleeMethodID = 0;88jfieldID errorMessageID;89jfieldID nativeCalleeID;90jobject errorMessage;91jmethodID assertTrue;92jboolean callNative;93jclass assertsClass;94jclass baseClass;95jboolean result;96char* methodName;97CHECK_EXCEPTIONS;98nativeCalleeID = (*env)->GetFieldID(env, cls, "nativeCallee", "Z");99CHECK_EXCEPTIONS;100callNative = (*env)->GetBooleanField(env, obj, nativeCalleeID);101CHECK_EXCEPTIONS;102methodName = (callNative == JNI_TRUE) ? "calleeNative" : "callee";103if (isStatic) {104calleeMethodID = (*env)->GetStaticMethodID(env, cls, methodName,105STATIC_CALLEE_SIGNATURE);106} else {107calleeMethodID = (*env)->GetMethodID(env, cls, methodName, METHOD_SIGNATURE);108}109CHECK_EXCEPTIONS;110if (isStatic) {111result = (*env)->CallStaticBooleanMethod(env, cls, calleeMethodID, obj,112(jint) 1, (jlong) 2L, (jfloat) 3.0f, (jdouble) 4.0, (*env)->NewStringUTF(env, "5"));113} else {114result = (*env)->CallBooleanMethod(env, obj, calleeMethodID,115(jint) 1, (jlong) 2L, (jfloat) 3.0f, (jdouble) 4.0, (*env)->NewStringUTF(env, "5"));116}117CHECK_EXCEPTIONS;118baseClass = (*env)->FindClass(env, BASE_CLASS);119CHECK_EXCEPTIONS;120errorMessageID = (*env)->GetStaticFieldID(env, baseClass,121"CALL_ERR_MSG", "Ljava/lang/String;");122CHECK_EXCEPTIONS;123errorMessage = (*env)->GetStaticObjectField(env, baseClass, errorMessageID);124CHECK_EXCEPTIONS;125assertsClass = (*env)->FindClass(env, "jdk/test/lib/Asserts");126CHECK_EXCEPTIONS;127assertTrue = (*env)->GetStaticMethodID(env, assertsClass,128"assertTrue", "(ZLjava/lang/String;)V");129(*env)->CallStaticVoidMethod(env, assertsClass, assertTrue, result,130errorMessage);131}132133JNIEXPORT void JNICALL Java_compiler_calls_common_InvokeSpecial_callerNative(JNIEnv *env, jobject obj) {134doCallerWork(env, obj, NOT_STATIC);135}136137JNIEXPORT void JNICALL Java_compiler_calls_common_InvokeVirtual_callerNative(JNIEnv *env, jobject obj) {138doCallerWork(env, obj, NOT_STATIC);139}140141JNIEXPORT void JNICALL Java_compiler_calls_common_InvokeStatic_callerNative(JNIEnv *env, jobject obj) {142doCallerWork(env, obj, IS_STATIC);143}144145#ifdef __cplusplus146}147#endif148149150