src/share/vm/prims/jniCheck.cpp
Print this page
rev 6562 : 8043224: -Xcheck:jni improvements to exception checking and excessive local refs
Summary: Warning when not checking exceptions from function that require so, also when local refs expand beyond capacity.
Reviewed-by: zgu, coleenp, hseigel
*** 51,60 ****
--- 51,62 ----
#endif
#ifdef TARGET_ARCH_ppc
# include "jniTypes_ppc.hpp"
#endif
+ // Complain every extra number of unplanned local refs
+ #define CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD 32
// Heap objects are allowed to be directly referenced only in VM code,
// not in native code.
#define ASSERT_OOPS_ALLOWED \
*** 166,181 ****
/*
* SUPPORT FUNCTIONS
*/
static inline void
! functionEnterCritical(JavaThread* thr)
! {
if (thr->has_pending_exception()) {
NativeReportJNIWarning(thr, "JNI call made with exception pending");
}
}
static inline void
functionEnterCriticalExceptionAllowed(JavaThread* thr)
{
--- 168,213 ----
/*
* SUPPORT FUNCTIONS
*/
+ /**
+ * Check whether or not a programmer has actually checked for exceptions. According
+ * to the JNI Specification ("jni/spec/design.html#java_exceptions"):
+ *
+ * There are two cases where the programmer needs to check for exceptions without
+ * being able to first check an error code:
+ *
+ * - The JNI functions that invoke a Java method return the result of the Java method.
+ * The programmer must call ExceptionOccurred() to check for possible exceptions
+ * that occurred during the execution of the Java method.
+ *
+ * - Some of the JNI array access functions do not return an error code, but may
+ * throw an ArrayIndexOutOfBoundsException or ArrayStoreException.
+ *
+ * In all other cases, a non-error return value guarantees that no exceptions have been thrown.
+ */
static inline void
! check_pending_exception(JavaThread* thr) {
if (thr->has_pending_exception()) {
NativeReportJNIWarning(thr, "JNI call made with exception pending");
}
+ if (thr->is_pending_jni_exception_check()) {
+ IN_VM(
+ tty->print_cr("WARNING in native method: JNI call made without checking exceptions when required to from %s",
+ thr->get_pending_jni_exception_check());
+ thr->print_stack();
+ )
+ thr->clear_pending_jni_exception_check(); // Just complain once
+ }
+ }
+
+
+ static inline void
+ functionEnterCritical(JavaThread* thr)
+ {
+ check_pending_exception(thr);
}
static inline void
functionEnterCriticalExceptionAllowed(JavaThread* thr)
{
*** 185,197 ****
functionEnter(JavaThread* thr)
{
if (thr->in_critical()) {
tty->print_cr("%s", warn_other_function_in_critical);
}
! if (thr->has_pending_exception()) {
! NativeReportJNIWarning(thr, "JNI call made with exception pending");
! }
}
static inline void
functionEnterExceptionAllowed(JavaThread* thr)
{
--- 217,227 ----
functionEnter(JavaThread* thr)
{
if (thr->in_critical()) {
tty->print_cr("%s", warn_other_function_in_critical);
}
! check_pending_exception(thr);
}
static inline void
functionEnterExceptionAllowed(JavaThread* thr)
{
*** 199,211 ****
tty->print_cr("%s", warn_other_function_in_critical);
}
}
static inline void
! functionExit(JNIEnv *env)
{
! /* nothing to do at this time */
}
static inline void
checkStaticFieldID(JavaThread* thr, jfieldID fid, jclass cls, int ftype)
{
--- 229,252 ----
tty->print_cr("%s", warn_other_function_in_critical);
}
}
static inline void
! functionExit(JavaThread* thr)
{
! JNIHandleBlock* handles = thr->active_handles();
! size_t planned_capacity = handles->get_planned_capacity();
! size_t live_handles = handles->get_number_of_live_handles();
! if (live_handles > planned_capacity) {
! IN_VM(
! tty->print_cr("WARNING: JNI local refs: %zu, exceeds capacity: %zu",
! live_handles, planned_capacity);
! thr->print_stack();
! )
! // Complain just the once, reset to current + warn threshold
! handles->set_planned_capacity(live_handles + CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD);
! }
}
static inline void
checkStaticFieldID(JavaThread* thr, jfieldID fid, jclass cls, int ftype)
{
*** 506,516 ****
functionEnter(thr);
IN_VM(
jniCheck::validate_object(thr, loader);
)
jclass result = UNCHECKED()->DefineClass(env, name, loader, buf, len);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jclass,
checked_jni_FindClass(JNIEnv *env,
--- 547,557 ----
functionEnter(thr);
IN_VM(
jniCheck::validate_object(thr, loader);
)
jclass result = UNCHECKED()->DefineClass(env, name, loader, buf, len);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jclass,
checked_jni_FindClass(JNIEnv *env,
*** 518,528 ****
functionEnter(thr);
IN_VM(
jniCheck::validate_class_descriptor(thr, name);
)
jclass result = UNCHECKED()->FindClass(env, name);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jmethodID,
checked_jni_FromReflectedMethod(JNIEnv *env,
--- 559,569 ----
functionEnter(thr);
IN_VM(
jniCheck::validate_class_descriptor(thr, name);
)
jclass result = UNCHECKED()->FindClass(env, name);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jmethodID,
checked_jni_FromReflectedMethod(JNIEnv *env,
*** 530,540 ****
functionEnter(thr);
IN_VM(
jniCheck::validate_object(thr, method);
)
jmethodID result = UNCHECKED()->FromReflectedMethod(env, method);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jfieldID,
checked_jni_FromReflectedField(JNIEnv *env,
--- 571,581 ----
functionEnter(thr);
IN_VM(
jniCheck::validate_object(thr, method);
)
jmethodID result = UNCHECKED()->FromReflectedMethod(env, method);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jfieldID,
checked_jni_FromReflectedField(JNIEnv *env,
*** 542,552 ****
functionEnter(thr);
IN_VM(
jniCheck::validate_object(thr, field);
)
jfieldID result = UNCHECKED()->FromReflectedField(env, field);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_ToReflectedMethod(JNIEnv *env,
--- 583,593 ----
functionEnter(thr);
IN_VM(
jniCheck::validate_object(thr, field);
)
jfieldID result = UNCHECKED()->FromReflectedField(env, field);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_ToReflectedMethod(JNIEnv *env,
*** 558,568 ****
jniCheck::validate_class(thr, cls, false);
jniCheck::validate_jmethod_id(thr, methodID);
)
jobject result = UNCHECKED()->ToReflectedMethod(env, cls, methodID,
isStatic);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jclass,
checked_jni_GetSuperclass(JNIEnv *env,
--- 599,609 ----
jniCheck::validate_class(thr, cls, false);
jniCheck::validate_jmethod_id(thr, methodID);
)
jobject result = UNCHECKED()->ToReflectedMethod(env, cls, methodID,
isStatic);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jclass,
checked_jni_GetSuperclass(JNIEnv *env,
*** 570,580 ****
functionEnter(thr);
IN_VM(
jniCheck::validate_class(thr, sub, true);
)
jclass result = UNCHECKED()->GetSuperclass(env, sub);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jboolean,
checked_jni_IsAssignableFrom(JNIEnv *env,
--- 611,621 ----
functionEnter(thr);
IN_VM(
jniCheck::validate_class(thr, sub, true);
)
jclass result = UNCHECKED()->GetSuperclass(env, sub);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jboolean,
checked_jni_IsAssignableFrom(JNIEnv *env,
*** 584,594 ****
IN_VM(
jniCheck::validate_class(thr, sub, true);
jniCheck::validate_class(thr, sup, true);
)
jboolean result = UNCHECKED()->IsAssignableFrom(env, sub, sup);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_ToReflectedField(JNIEnv *env,
--- 625,635 ----
IN_VM(
jniCheck::validate_class(thr, sub, true);
jniCheck::validate_class(thr, sup, true);
)
jboolean result = UNCHECKED()->IsAssignableFrom(env, sub, sup);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_ToReflectedField(JNIEnv *env,
*** 599,609 ****
IN_VM(
jniCheck::validate_class(thr, cls, false);
)
jobject result = UNCHECKED()->ToReflectedField(env, cls, fieldID,
isStatic);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_Throw(JNIEnv *env,
--- 640,650 ----
IN_VM(
jniCheck::validate_class(thr, cls, false);
)
jobject result = UNCHECKED()->ToReflectedField(env, cls, fieldID,
isStatic);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_Throw(JNIEnv *env,
*** 617,627 ****
} else {
jniCheck::validate_throwable_klass(thr, oopObj->klass());
}
)
jint result = UNCHECKED()->Throw(env, obj);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_ThrowNew(JNIEnv *env,
--- 658,668 ----
} else {
jniCheck::validate_throwable_klass(thr, oopObj->klass());
}
)
jint result = UNCHECKED()->Throw(env, obj);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_ThrowNew(JNIEnv *env,
*** 632,692 ****
Klass* k = jniCheck::validate_class(thr, clazz, false);
assert(k != NULL, "validate_class shouldn't return NULL Klass*");
jniCheck::validate_throwable_klass(thr, k);
)
jint result = UNCHECKED()->ThrowNew(env, clazz, msg);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jthrowable,
checked_jni_ExceptionOccurred(JNIEnv *env))
functionEnterExceptionAllowed(thr);
jthrowable result = UNCHECKED()->ExceptionOccurred(env);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_ExceptionDescribe(JNIEnv *env))
functionEnterExceptionAllowed(thr);
UNCHECKED()->ExceptionDescribe(env);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_ExceptionClear(JNIEnv *env))
functionEnterExceptionAllowed(thr);
UNCHECKED()->ExceptionClear(env);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_FatalError(JNIEnv *env,
const char *msg))
functionEnter(thr);
UNCHECKED()->FatalError(env, msg);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_PushLocalFrame(JNIEnv *env,
jint capacity))
functionEnterExceptionAllowed(thr);
if (capacity < 0)
NativeReportJNIFatalError(thr, "negative capacity");
jint result = UNCHECKED()->PushLocalFrame(env, capacity);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_PopLocalFrame(JNIEnv *env,
jobject result))
functionEnterExceptionAllowed(thr);
jobject res = UNCHECKED()->PopLocalFrame(env, result);
! functionExit(env);
return res;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_NewGlobalRef(JNIEnv *env,
--- 673,739 ----
Klass* k = jniCheck::validate_class(thr, clazz, false);
assert(k != NULL, "validate_class shouldn't return NULL Klass*");
jniCheck::validate_throwable_klass(thr, k);
)
jint result = UNCHECKED()->ThrowNew(env, clazz, msg);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jthrowable,
checked_jni_ExceptionOccurred(JNIEnv *env))
+ thr->clear_pending_jni_exception_check();
functionEnterExceptionAllowed(thr);
jthrowable result = UNCHECKED()->ExceptionOccurred(env);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_ExceptionDescribe(JNIEnv *env))
functionEnterExceptionAllowed(thr);
UNCHECKED()->ExceptionDescribe(env);
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_ExceptionClear(JNIEnv *env))
+ thr->clear_pending_jni_exception_check();
functionEnterExceptionAllowed(thr);
UNCHECKED()->ExceptionClear(env);
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_FatalError(JNIEnv *env,
const char *msg))
+ thr->clear_pending_jni_exception_check();
functionEnter(thr);
UNCHECKED()->FatalError(env, msg);
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_PushLocalFrame(JNIEnv *env,
jint capacity))
functionEnterExceptionAllowed(thr);
if (capacity < 0)
NativeReportJNIFatalError(thr, "negative capacity");
jint result = UNCHECKED()->PushLocalFrame(env, capacity);
! if (result == JNI_OK) {
! thr->active_handles()->set_planned_capacity(capacity + CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD);
! }
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_PopLocalFrame(JNIEnv *env,
jobject result))
functionEnterExceptionAllowed(thr);
jobject res = UNCHECKED()->PopLocalFrame(env, result);
! functionExit(thr);
return res;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_NewGlobalRef(JNIEnv *env,
*** 696,706 ****
if (lobj != NULL) {
jniCheck::validate_handle(thr, lobj);
}
)
jobject result = UNCHECKED()->NewGlobalRef(env,lobj);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_DeleteGlobalRef(JNIEnv *env,
--- 743,753 ----
if (lobj != NULL) {
jniCheck::validate_handle(thr, lobj);
}
)
jobject result = UNCHECKED()->NewGlobalRef(env,lobj);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_DeleteGlobalRef(JNIEnv *env,
*** 712,722 ****
ReportJNIFatalError(thr,
"Invalid global JNI handle passed to DeleteGlobalRef");
}
)
UNCHECKED()->DeleteGlobalRef(env,gref);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_DeleteLocalRef(JNIEnv *env,
jobject obj))
--- 759,769 ----
ReportJNIFatalError(thr,
"Invalid global JNI handle passed to DeleteGlobalRef");
}
)
UNCHECKED()->DeleteGlobalRef(env,gref);
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_DeleteLocalRef(JNIEnv *env,
jobject obj))
*** 727,737 ****
JNIHandles::is_frame_handle(thr, obj)))
ReportJNIFatalError(thr,
"Invalid local JNI handle passed to DeleteLocalRef");
)
UNCHECKED()->DeleteLocalRef(env, obj);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(jboolean,
checked_jni_IsSameObject(JNIEnv *env,
jobject obj1,
--- 774,784 ----
JNIHandles::is_frame_handle(thr, obj)))
ReportJNIFatalError(thr,
"Invalid local JNI handle passed to DeleteLocalRef");
)
UNCHECKED()->DeleteLocalRef(env, obj);
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jboolean,
checked_jni_IsSameObject(JNIEnv *env,
jobject obj1,
*** 748,758 ****
if (obj2 != NULL && jniCheck::validate_handle(thr, obj2) != NULL) {
jniCheck::validate_object(thr, obj2);
}
)
jboolean result = UNCHECKED()->IsSameObject(env,obj1,obj2);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_NewLocalRef(JNIEnv *env,
--- 795,805 ----
if (obj2 != NULL && jniCheck::validate_handle(thr, obj2) != NULL) {
jniCheck::validate_object(thr, obj2);
}
)
jboolean result = UNCHECKED()->IsSameObject(env,obj1,obj2);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_NewLocalRef(JNIEnv *env,
*** 762,772 ****
if (ref != NULL) {
jniCheck::validate_handle(thr, ref);
}
)
jobject result = UNCHECKED()->NewLocalRef(env, ref);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_EnsureLocalCapacity(JNIEnv *env,
--- 809,819 ----
if (ref != NULL) {
jniCheck::validate_handle(thr, ref);
}
)
jobject result = UNCHECKED()->NewLocalRef(env, ref);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_EnsureLocalCapacity(JNIEnv *env,
*** 774,784 ****
functionEnter(thr);
if (capacity < 0) {
NativeReportJNIFatalError(thr, "negative capacity");
}
jint result = UNCHECKED()->EnsureLocalCapacity(env, capacity);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_AllocObject(JNIEnv *env,
--- 821,834 ----
functionEnter(thr);
if (capacity < 0) {
NativeReportJNIFatalError(thr, "negative capacity");
}
jint result = UNCHECKED()->EnsureLocalCapacity(env, capacity);
! if (result == JNI_OK) {
! thr->active_handles()->set_planned_capacity(capacity + CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD);
! }
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_AllocObject(JNIEnv *env,
*** 786,796 ****
functionEnter(thr);
IN_VM(
jniCheck::validate_class(thr, clazz, false);
)
jobject result = UNCHECKED()->AllocObject(env,clazz);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_NewObject(JNIEnv *env,
--- 836,846 ----
functionEnter(thr);
IN_VM(
jniCheck::validate_class(thr, clazz, false);
)
jobject result = UNCHECKED()->AllocObject(env,clazz);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_NewObject(JNIEnv *env,
*** 804,814 ****
jniCheck::validate_jmethod_id(thr, methodID);
)
va_start(args, methodID);
jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);
va_end(args);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_NewObjectV(JNIEnv *env,
--- 854,864 ----
jniCheck::validate_jmethod_id(thr, methodID);
)
va_start(args, methodID);
jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);
va_end(args);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_NewObjectV(JNIEnv *env,
*** 819,829 ****
IN_VM(
jniCheck::validate_class(thr, clazz, false);
jniCheck::validate_jmethod_id(thr, methodID);
)
jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_NewObjectA(JNIEnv *env,
--- 869,879 ----
IN_VM(
jniCheck::validate_class(thr, clazz, false);
jniCheck::validate_jmethod_id(thr, methodID);
)
jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_NewObjectA(JNIEnv *env,
*** 834,844 ****
IN_VM(
jniCheck::validate_class(thr, clazz, false);
jniCheck::validate_jmethod_id(thr, methodID);
)
jobject result = UNCHECKED()->NewObjectA(env,clazz,methodID,args);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jclass,
checked_jni_GetObjectClass(JNIEnv *env,
--- 884,894 ----
IN_VM(
jniCheck::validate_class(thr, clazz, false);
jniCheck::validate_jmethod_id(thr, methodID);
)
jobject result = UNCHECKED()->NewObjectA(env,clazz,methodID,args);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jclass,
checked_jni_GetObjectClass(JNIEnv *env,
*** 846,856 ****
functionEnter(thr);
IN_VM(
jniCheck::validate_object(thr, obj);
)
jclass result = UNCHECKED()->GetObjectClass(env,obj);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jboolean,
checked_jni_IsInstanceOf(JNIEnv *env,
--- 896,906 ----
functionEnter(thr);
IN_VM(
jniCheck::validate_object(thr, obj);
)
jclass result = UNCHECKED()->GetObjectClass(env,obj);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jboolean,
checked_jni_IsInstanceOf(JNIEnv *env,
*** 860,870 ****
IN_VM(
jniCheck::validate_object(thr, obj);
jniCheck::validate_class(thr, clazz, true);
)
jboolean result = UNCHECKED()->IsInstanceOf(env,obj,clazz);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jmethodID,
checked_jni_GetMethodID(JNIEnv *env,
--- 910,920 ----
IN_VM(
jniCheck::validate_object(thr, obj);
jniCheck::validate_class(thr, clazz, true);
)
jboolean result = UNCHECKED()->IsInstanceOf(env,obj,clazz);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jmethodID,
checked_jni_GetMethodID(JNIEnv *env,
*** 874,884 ****
functionEnter(thr);
IN_VM(
jniCheck::validate_class(thr, clazz, false);
)
jmethodID result = UNCHECKED()->GetMethodID(env,clazz,name,sig);
! functionExit(env);
return result;
JNI_END
#define WRAPPER_CallMethod(ResultType, Result) \
JNI_ENTRY_CHECKED(ResultType, \
--- 924,934 ----
functionEnter(thr);
IN_VM(
jniCheck::validate_class(thr, clazz, false);
)
jmethodID result = UNCHECKED()->GetMethodID(env,clazz,name,sig);
! functionExit(thr);
return result;
JNI_END
#define WRAPPER_CallMethod(ResultType, Result) \
JNI_ENTRY_CHECKED(ResultType, \
*** 893,903 ****
) \
va_start(args,methodID); \
ResultType result =UNCHECKED()->Call##Result##MethodV(env, obj, methodID, \
args); \
va_end(args); \
! functionExit(env); \
return result; \
JNI_END \
\
JNI_ENTRY_CHECKED(ResultType, \
checked_jni_Call##Result##MethodV(JNIEnv *env, \
--- 943,954 ----
) \
va_start(args,methodID); \
ResultType result =UNCHECKED()->Call##Result##MethodV(env, obj, methodID, \
args); \
va_end(args); \
! thr->set_pending_jni_exception_check("Call"#Result"Method"); \
! functionExit(thr); \
return result; \
JNI_END \
\
JNI_ENTRY_CHECKED(ResultType, \
checked_jni_Call##Result##MethodV(JNIEnv *env, \
*** 908,918 ****
IN_VM(\
jniCheck::validate_call_object(thr, obj, methodID); \
) \
ResultType result = UNCHECKED()->Call##Result##MethodV(env, obj, methodID,\
args); \
! functionExit(env); \
return result; \
JNI_END \
\
JNI_ENTRY_CHECKED(ResultType, \
checked_jni_Call##Result##MethodA(JNIEnv *env, \
--- 959,970 ----
IN_VM(\
jniCheck::validate_call_object(thr, obj, methodID); \
) \
ResultType result = UNCHECKED()->Call##Result##MethodV(env, obj, methodID,\
args); \
! thr->set_pending_jni_exception_check("Call"#Result"MethodV"); \
! functionExit(thr); \
return result; \
JNI_END \
\
JNI_ENTRY_CHECKED(ResultType, \
checked_jni_Call##Result##MethodA(JNIEnv *env, \
*** 923,933 ****
IN_VM( \
jniCheck::validate_call_object(thr, obj, methodID); \
) \
ResultType result = UNCHECKED()->Call##Result##MethodA(env, obj, methodID,\
args); \
! functionExit(env); \
return result; \
JNI_END
WRAPPER_CallMethod(jobject,Object)
WRAPPER_CallMethod(jboolean,Boolean)
--- 975,986 ----
IN_VM( \
jniCheck::validate_call_object(thr, obj, methodID); \
) \
ResultType result = UNCHECKED()->Call##Result##MethodA(env, obj, methodID,\
args); \
! thr->set_pending_jni_exception_check("Call"#Result"MethodA"); \
! functionExit(thr); \
return result; \
JNI_END
WRAPPER_CallMethod(jobject,Object)
WRAPPER_CallMethod(jboolean,Boolean)
*** 950,960 ****
jniCheck::validate_call_object(thr, obj, methodID);
)
va_start(args,methodID);
UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);
va_end(args);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_CallVoidMethodV(JNIEnv *env,
jobject obj,
--- 1003,1014 ----
jniCheck::validate_call_object(thr, obj, methodID);
)
va_start(args,methodID);
UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);
va_end(args);
! thr->set_pending_jni_exception_check("CallVoidMethod");
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_CallVoidMethodV(JNIEnv *env,
jobject obj,
*** 963,973 ****
functionEnter(thr);
IN_VM(
jniCheck::validate_call_object(thr, obj, methodID);
)
UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_CallVoidMethodA(JNIEnv *env,
jobject obj,
--- 1017,1028 ----
functionEnter(thr);
IN_VM(
jniCheck::validate_call_object(thr, obj, methodID);
)
UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);
! thr->set_pending_jni_exception_check("CallVoidMethodV");
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_CallVoidMethodA(JNIEnv *env,
jobject obj,
*** 976,986 ****
functionEnter(thr);
IN_VM(
jniCheck::validate_call_object(thr, obj, methodID);
)
UNCHECKED()->CallVoidMethodA(env,obj,methodID,args);
! functionExit(env);
JNI_END
#define WRAPPER_CallNonvirtualMethod(ResultType, Result) \
JNI_ENTRY_CHECKED(ResultType, \
checked_jni_CallNonvirtual##Result##Method(JNIEnv *env, \
--- 1031,1042 ----
functionEnter(thr);
IN_VM(
jniCheck::validate_call_object(thr, obj, methodID);
)
UNCHECKED()->CallVoidMethodA(env,obj,methodID,args);
! thr->set_pending_jni_exception_check("CallVoidMethodA");
! functionExit(thr);
JNI_END
#define WRAPPER_CallNonvirtualMethod(ResultType, Result) \
JNI_ENTRY_CHECKED(ResultType, \
checked_jni_CallNonvirtual##Result##Method(JNIEnv *env, \
*** 999,1009 ****
obj, \
clazz, \
methodID,\
args); \
va_end(args); \
! functionExit(env); \
return result; \
JNI_END \
\
JNI_ENTRY_CHECKED(ResultType, \
checked_jni_CallNonvirtual##Result##MethodV(JNIEnv *env, \
--- 1055,1066 ----
obj, \
clazz, \
methodID,\
args); \
va_end(args); \
! thr->set_pending_jni_exception_check("CallNonvirtual"#Result"Method"); \
! functionExit(thr); \
return result; \
JNI_END \
\
JNI_ENTRY_CHECKED(ResultType, \
checked_jni_CallNonvirtual##Result##MethodV(JNIEnv *env, \
*** 1019,1029 ****
ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \
obj, \
clazz, \
methodID,\
args); \
! functionExit(env); \
return result; \
JNI_END \
\
JNI_ENTRY_CHECKED(ResultType, \
checked_jni_CallNonvirtual##Result##MethodA(JNIEnv *env, \
--- 1076,1087 ----
ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \
obj, \
clazz, \
methodID,\
args); \
! thr->set_pending_jni_exception_check("CallNonvirtual"#Result"MethodV"); \
! functionExit(thr); \
return result; \
JNI_END \
\
JNI_ENTRY_CHECKED(ResultType, \
checked_jni_CallNonvirtual##Result##MethodA(JNIEnv *env, \
*** 1039,1049 ****
ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodA(env, \
obj, \
clazz, \
methodID,\
args); \
! functionExit(env); \
return result; \
JNI_END
WRAPPER_CallNonvirtualMethod(jobject,Object)
WRAPPER_CallNonvirtualMethod(jboolean,Boolean)
--- 1097,1108 ----
ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodA(env, \
obj, \
clazz, \
methodID,\
args); \
! thr->set_pending_jni_exception_check("CallNonvirtual"#Result"MethodA"); \
! functionExit(thr); \
return result; \
JNI_END
WRAPPER_CallNonvirtualMethod(jobject,Object)
WRAPPER_CallNonvirtualMethod(jboolean,Boolean)
*** 1068,1078 ****
jniCheck::validate_call_class(thr, clazz, methodID);
)
va_start(args,methodID);
UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);
va_end(args);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_CallNonvirtualVoidMethodV(JNIEnv *env,
jobject obj,
--- 1127,1138 ----
jniCheck::validate_call_class(thr, clazz, methodID);
)
va_start(args,methodID);
UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);
va_end(args);
! thr->set_pending_jni_exception_check("CallNonvirtualVoidMethod");
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_CallNonvirtualVoidMethodV(JNIEnv *env,
jobject obj,
*** 1083,1093 ****
IN_VM(
jniCheck::validate_call_object(thr, obj, methodID);
jniCheck::validate_call_class(thr, clazz, methodID);
)
UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_CallNonvirtualVoidMethodA(JNIEnv *env,
jobject obj,
--- 1143,1154 ----
IN_VM(
jniCheck::validate_call_object(thr, obj, methodID);
jniCheck::validate_call_class(thr, clazz, methodID);
)
UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);
! thr->set_pending_jni_exception_check("CallNonvirtualVoidMethodV");
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_CallNonvirtualVoidMethodA(JNIEnv *env,
jobject obj,
*** 1098,1108 ****
IN_VM(
jniCheck::validate_call_object(thr, obj, methodID);
jniCheck::validate_call_class(thr, clazz, methodID);
)
UNCHECKED()->CallNonvirtualVoidMethodA(env,obj,clazz,methodID,args);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(jfieldID,
checked_jni_GetFieldID(JNIEnv *env,
jclass clazz,
--- 1159,1170 ----
IN_VM(
jniCheck::validate_call_object(thr, obj, methodID);
jniCheck::validate_call_class(thr, clazz, methodID);
)
UNCHECKED()->CallNonvirtualVoidMethodA(env,obj,clazz,methodID,args);
! thr->set_pending_jni_exception_check("CallNonvirtualVoidMethodA");
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jfieldID,
checked_jni_GetFieldID(JNIEnv *env,
jclass clazz,
*** 1111,1121 ****
functionEnter(thr);
IN_VM(
jniCheck::validate_class(thr, clazz, false);
)
jfieldID result = UNCHECKED()->GetFieldID(env,clazz,name,sig);
! functionExit(env);
return result;
JNI_END
#define WRAPPER_GetField(ReturnType,Result,FieldType) \
JNI_ENTRY_CHECKED(ReturnType, \
--- 1173,1183 ----
functionEnter(thr);
IN_VM(
jniCheck::validate_class(thr, clazz, false);
)
jfieldID result = UNCHECKED()->GetFieldID(env,clazz,name,sig);
! functionExit(thr);
return result;
JNI_END
#define WRAPPER_GetField(ReturnType,Result,FieldType) \
JNI_ENTRY_CHECKED(ReturnType, \
*** 1125,1135 ****
functionEnter(thr); \
IN_VM( \
checkInstanceFieldID(thr, fieldID, obj, FieldType); \
) \
ReturnType result = UNCHECKED()->Get##Result##Field(env,obj,fieldID); \
! functionExit(env); \
return result; \
JNI_END
WRAPPER_GetField(jobject, Object, T_OBJECT)
WRAPPER_GetField(jboolean, Boolean, T_BOOLEAN)
--- 1187,1197 ----
functionEnter(thr); \
IN_VM( \
checkInstanceFieldID(thr, fieldID, obj, FieldType); \
) \
ReturnType result = UNCHECKED()->Get##Result##Field(env,obj,fieldID); \
! functionExit(thr); \
return result; \
JNI_END
WRAPPER_GetField(jobject, Object, T_OBJECT)
WRAPPER_GetField(jboolean, Boolean, T_BOOLEAN)
*** 1150,1160 ****
functionEnter(thr); \
IN_VM( \
checkInstanceFieldID(thr, fieldID, obj, FieldType); \
) \
UNCHECKED()->Set##Result##Field(env,obj,fieldID,val); \
! functionExit(env); \
JNI_END
WRAPPER_SetField(jobject, Object, T_OBJECT)
WRAPPER_SetField(jboolean, Boolean, T_BOOLEAN)
WRAPPER_SetField(jbyte, Byte, T_BYTE)
--- 1212,1222 ----
functionEnter(thr); \
IN_VM( \
checkInstanceFieldID(thr, fieldID, obj, FieldType); \
) \
UNCHECKED()->Set##Result##Field(env,obj,fieldID,val); \
! functionExit(thr); \
JNI_END
WRAPPER_SetField(jobject, Object, T_OBJECT)
WRAPPER_SetField(jboolean, Boolean, T_BOOLEAN)
WRAPPER_SetField(jbyte, Byte, T_BYTE)
*** 1174,1184 ****
functionEnter(thr);
IN_VM(
jniCheck::validate_class(thr, clazz, false);
)
jmethodID result = UNCHECKED()->GetStaticMethodID(env,clazz,name,sig);
! functionExit(env);
return result;
JNI_END
#define WRAPPER_CallStaticMethod(ReturnType,Result) \
JNI_ENTRY_CHECKED(ReturnType, \
--- 1236,1246 ----
functionEnter(thr);
IN_VM(
jniCheck::validate_class(thr, clazz, false);
)
jmethodID result = UNCHECKED()->GetStaticMethodID(env,clazz,name,sig);
! functionExit(thr);
return result;
JNI_END
#define WRAPPER_CallStaticMethod(ReturnType,Result) \
JNI_ENTRY_CHECKED(ReturnType, \
*** 1196,1206 ****
ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \
clazz, \
methodID, \
args); \
va_end(args); \
! functionExit(env); \
return result; \
JNI_END \
\
JNI_ENTRY_CHECKED(ReturnType, \
checked_jni_CallStatic##Result##MethodV(JNIEnv *env, \
--- 1258,1269 ----
ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \
clazz, \
methodID, \
args); \
va_end(args); \
! thr->set_pending_jni_exception_check("CallStatic"#Result"Method"); \
! functionExit(thr); \
return result; \
JNI_END \
\
JNI_ENTRY_CHECKED(ReturnType, \
checked_jni_CallStatic##Result##MethodV(JNIEnv *env, \
*** 1214,1224 ****
) \
ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \
clazz, \
methodID, \
args); \
! functionExit(env); \
return result; \
JNI_END \
\
JNI_ENTRY_CHECKED(ReturnType, \
checked_jni_CallStatic##Result##MethodA(JNIEnv *env, \
--- 1277,1288 ----
) \
ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \
clazz, \
methodID, \
args); \
! thr->set_pending_jni_exception_check("CallStatic"#Result"MethodV"); \
! functionExit(thr); \
return result; \
JNI_END \
\
JNI_ENTRY_CHECKED(ReturnType, \
checked_jni_CallStatic##Result##MethodA(JNIEnv *env, \
*** 1232,1242 ****
) \
ReturnType result = UNCHECKED()->CallStatic##Result##MethodA(env, \
clazz, \
methodID, \
args); \
! functionExit(env); \
return result; \
JNI_END
WRAPPER_CallStaticMethod(jobject,Object)
WRAPPER_CallStaticMethod(jboolean,Boolean)
--- 1296,1307 ----
) \
ReturnType result = UNCHECKED()->CallStatic##Result##MethodA(env, \
clazz, \
methodID, \
args); \
! thr->set_pending_jni_exception_check("CallStatic"#Result"MethodA"); \
! functionExit(thr); \
return result; \
JNI_END
WRAPPER_CallStaticMethod(jobject,Object)
WRAPPER_CallStaticMethod(jboolean,Boolean)
*** 1260,1270 ****
jniCheck::validate_class(thr, cls, false);
)
va_start(args,methodID);
UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);
va_end(args);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_CallStaticVoidMethodV(JNIEnv *env,
jclass cls,
--- 1325,1336 ----
jniCheck::validate_class(thr, cls, false);
)
va_start(args,methodID);
UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);
va_end(args);
! thr->set_pending_jni_exception_check("CallStaticVoidMethod");
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_CallStaticVoidMethodV(JNIEnv *env,
jclass cls,
*** 1274,1284 ****
IN_VM(
jniCheck::validate_jmethod_id(thr, methodID);
jniCheck::validate_class(thr, cls, false);
)
UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_CallStaticVoidMethodA(JNIEnv *env,
jclass cls,
--- 1340,1351 ----
IN_VM(
jniCheck::validate_jmethod_id(thr, methodID);
jniCheck::validate_class(thr, cls, false);
)
UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);
! thr->set_pending_jni_exception_check("CallStaticVoidMethodV");
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_CallStaticVoidMethodA(JNIEnv *env,
jclass cls,
*** 1288,1298 ****
IN_VM(
jniCheck::validate_jmethod_id(thr, methodID);
jniCheck::validate_class(thr, cls, false);
)
UNCHECKED()->CallStaticVoidMethodA(env,cls,methodID,args);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(jfieldID,
checked_jni_GetStaticFieldID(JNIEnv *env,
jclass clazz,
--- 1355,1366 ----
IN_VM(
jniCheck::validate_jmethod_id(thr, methodID);
jniCheck::validate_class(thr, cls, false);
)
UNCHECKED()->CallStaticVoidMethodA(env,cls,methodID,args);
! thr->set_pending_jni_exception_check("CallStaticVoidMethodA");
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jfieldID,
checked_jni_GetStaticFieldID(JNIEnv *env,
jclass clazz,
*** 1301,1311 ****
functionEnter(thr);
IN_VM(
jniCheck::validate_class(thr, clazz, false);
)
jfieldID result = UNCHECKED()->GetStaticFieldID(env,clazz,name,sig);
! functionExit(env);
return result;
JNI_END
#define WRAPPER_GetStaticField(ReturnType,Result,FieldType) \
JNI_ENTRY_CHECKED(ReturnType, \
--- 1369,1379 ----
functionEnter(thr);
IN_VM(
jniCheck::validate_class(thr, clazz, false);
)
jfieldID result = UNCHECKED()->GetStaticFieldID(env,clazz,name,sig);
! functionExit(thr);
return result;
JNI_END
#define WRAPPER_GetStaticField(ReturnType,Result,FieldType) \
JNI_ENTRY_CHECKED(ReturnType, \
*** 1318,1328 ****
checkStaticFieldID(thr, fieldID, clazz, FieldType); \
) \
ReturnType result = UNCHECKED()->GetStatic##Result##Field(env, \
clazz, \
fieldID); \
! functionExit(env); \
return result; \
JNI_END
WRAPPER_GetStaticField(jobject, Object, T_OBJECT)
WRAPPER_GetStaticField(jboolean, Boolean, T_BOOLEAN)
--- 1386,1396 ----
checkStaticFieldID(thr, fieldID, clazz, FieldType); \
) \
ReturnType result = UNCHECKED()->GetStatic##Result##Field(env, \
clazz, \
fieldID); \
! functionExit(thr); \
return result; \
JNI_END
WRAPPER_GetStaticField(jobject, Object, T_OBJECT)
WRAPPER_GetStaticField(jboolean, Boolean, T_BOOLEAN)
*** 1344,1354 ****
IN_VM( \
jniCheck::validate_class(thr, clazz, false); \
checkStaticFieldID(thr, fieldID, clazz, FieldType); \
) \
UNCHECKED()->SetStatic##Result##Field(env,clazz,fieldID,value); \
! functionExit(env); \
JNI_END
WRAPPER_SetStaticField(jobject, Object, T_OBJECT)
WRAPPER_SetStaticField(jboolean, Boolean, T_BOOLEAN)
WRAPPER_SetStaticField(jbyte, Byte, T_BYTE)
--- 1412,1422 ----
IN_VM( \
jniCheck::validate_class(thr, clazz, false); \
checkStaticFieldID(thr, fieldID, clazz, FieldType); \
) \
UNCHECKED()->SetStatic##Result##Field(env,clazz,fieldID,value); \
! functionExit(thr); \
JNI_END
WRAPPER_SetStaticField(jobject, Object, T_OBJECT)
WRAPPER_SetStaticField(jboolean, Boolean, T_BOOLEAN)
WRAPPER_SetStaticField(jbyte, Byte, T_BYTE)
*** 1364,1374 ****
checked_jni_NewString(JNIEnv *env,
const jchar *unicode,
jsize len))
functionEnter(thr);
jstring result = UNCHECKED()->NewString(env,unicode,len);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jsize,
checked_jni_GetStringLength(JNIEnv *env,
--- 1432,1442 ----
checked_jni_NewString(JNIEnv *env,
const jchar *unicode,
jsize len))
functionEnter(thr);
jstring result = UNCHECKED()->NewString(env,unicode,len);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jsize,
checked_jni_GetStringLength(JNIEnv *env,
*** 1376,1386 ****
functionEnter(thr);
IN_VM(
checkString(thr, str);
)
jsize result = UNCHECKED()->GetStringLength(env,str);
! functionExit(env);
return result;
JNI_END
// Arbitrary (but well-known) tag
const void* STRING_TAG = (void*)0x47114711;
--- 1444,1454 ----
functionEnter(thr);
IN_VM(
checkString(thr, str);
)
jsize result = UNCHECKED()->GetStringLength(env,str);
! functionExit(thr);
return result;
JNI_END
// Arbitrary (but well-known) tag
const void* STRING_TAG = (void*)0x47114711;
*** 1405,1415 ****
}
// Avoiding call to UNCHECKED()->ReleaseStringChars() since that will fire unexpected dtrace probes
// Note that the dtrace arguments for the allocated memory will not match up with this solution.
FreeHeap((char*)result);
}
! functionExit(env);
return new_result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_ReleaseStringChars(JNIEnv *env,
--- 1473,1483 ----
}
// Avoiding call to UNCHECKED()->ReleaseStringChars() since that will fire unexpected dtrace probes
// Note that the dtrace arguments for the allocated memory will not match up with this solution.
FreeHeap((char*)result);
}
! functionExit(thr);
return new_result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_ReleaseStringChars(JNIEnv *env,
*** 1440,1458 ****
"not allocated by GetStringChars");
}
UNCHECKED()->ReleaseStringChars(env, str,
(const jchar*) guarded.release_for_freeing());
}
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(jstring,
checked_jni_NewStringUTF(JNIEnv *env,
const char *utf))
functionEnter(thr);
jstring result = UNCHECKED()->NewStringUTF(env,utf);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jsize,
checked_jni_GetStringUTFLength(JNIEnv *env,
--- 1508,1526 ----
"not allocated by GetStringChars");
}
UNCHECKED()->ReleaseStringChars(env, str,
(const jchar*) guarded.release_for_freeing());
}
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jstring,
checked_jni_NewStringUTF(JNIEnv *env,
const char *utf))
functionEnter(thr);
jstring result = UNCHECKED()->NewStringUTF(env,utf);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jsize,
checked_jni_GetStringUTFLength(JNIEnv *env,
*** 1460,1470 ****
functionEnter(thr);
IN_VM(
checkString(thr, str);
)
jsize result = UNCHECKED()->GetStringUTFLength(env,str);
! functionExit(env);
return result;
JNI_END
// Arbitrary (but well-known) tag - different than GetStringChars
const void* STRING_UTF_TAG = (void*) 0x48124812;
--- 1528,1538 ----
functionEnter(thr);
IN_VM(
checkString(thr, str);
)
jsize result = UNCHECKED()->GetStringUTFLength(env,str);
! functionExit(thr);
return result;
JNI_END
// Arbitrary (but well-known) tag - different than GetStringChars
const void* STRING_UTF_TAG = (void*) 0x48124812;
*** 1488,1498 ****
}
// Avoiding call to UNCHECKED()->ReleaseStringUTFChars() since that will fire unexpected dtrace probes
// Note that the dtrace arguments for the allocated memory will not match up with this solution.
FreeHeap((char*)result, mtInternal);
}
! functionExit(env);
return new_result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_ReleaseStringUTFChars(JNIEnv *env,
--- 1556,1566 ----
}
// Avoiding call to UNCHECKED()->ReleaseStringUTFChars() since that will fire unexpected dtrace probes
// Note that the dtrace arguments for the allocated memory will not match up with this solution.
FreeHeap((char*)result, mtInternal);
}
! functionExit(thr);
return new_result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_ReleaseStringUTFChars(JNIEnv *env,
*** 1523,1555 ****
"called on something not allocated by GetStringUTFChars");
}
UNCHECKED()->ReleaseStringUTFChars(env, str,
(const char*) guarded.release_for_freeing());
}
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(jsize,
checked_jni_GetArrayLength(JNIEnv *env,
jarray array))
functionEnter(thr);
IN_VM(
check_is_array(thr, array);
)
jsize result = UNCHECKED()->GetArrayLength(env,array);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobjectArray,
checked_jni_NewObjectArray(JNIEnv *env,
jsize len,
jclass clazz,
jobject init))
functionEnter(thr);
jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_GetObjectArrayElement(JNIEnv *env,
--- 1591,1623 ----
"called on something not allocated by GetStringUTFChars");
}
UNCHECKED()->ReleaseStringUTFChars(env, str,
(const char*) guarded.release_for_freeing());
}
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jsize,
checked_jni_GetArrayLength(JNIEnv *env,
jarray array))
functionEnter(thr);
IN_VM(
check_is_array(thr, array);
)
jsize result = UNCHECKED()->GetArrayLength(env,array);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobjectArray,
checked_jni_NewObjectArray(JNIEnv *env,
jsize len,
jclass clazz,
jobject init))
functionEnter(thr);
jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_GetObjectArrayElement(JNIEnv *env,
*** 1558,1568 ****
functionEnter(thr);
IN_VM(
check_is_obj_array(thr, array);
)
jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_SetObjectArrayElement(JNIEnv *env,
--- 1626,1637 ----
functionEnter(thr);
IN_VM(
check_is_obj_array(thr, array);
)
jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);
! thr->set_pending_jni_exception_check("GetObjectArrayElement");
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_SetObjectArrayElement(JNIEnv *env,
*** 1572,1591 ****
functionEnter(thr);
IN_VM(
check_is_obj_array(thr, array);
)
UNCHECKED()->SetObjectArrayElement(env,array,index,val);
! functionExit(env);
JNI_END
#define WRAPPER_NewScalarArray(Return, Result) \
JNI_ENTRY_CHECKED(Return, \
checked_jni_New##Result##Array(JNIEnv *env, \
jsize len)) \
functionEnter(thr); \
Return result = UNCHECKED()->New##Result##Array(env,len); \
! functionExit(env); \
return (Return) result; \
JNI_END
WRAPPER_NewScalarArray(jbooleanArray, Boolean)
WRAPPER_NewScalarArray(jbyteArray, Byte)
--- 1641,1661 ----
functionEnter(thr);
IN_VM(
check_is_obj_array(thr, array);
)
UNCHECKED()->SetObjectArrayElement(env,array,index,val);
! thr->set_pending_jni_exception_check("SetObjectArrayElement");
! functionExit(thr);
JNI_END
#define WRAPPER_NewScalarArray(Return, Result) \
JNI_ENTRY_CHECKED(Return, \
checked_jni_New##Result##Array(JNIEnv *env, \
jsize len)) \
functionEnter(thr); \
Return result = UNCHECKED()->New##Result##Array(env,len); \
! functionExit(thr); \
return (Return) result; \
JNI_END
WRAPPER_NewScalarArray(jbooleanArray, Boolean)
WRAPPER_NewScalarArray(jbyteArray, Byte)
*** 1609,1619 ****
array, \
isCopy); \
if (result != NULL) { \
result = (ElementType *) check_jni_wrap_copy_array(thr, array, result); \
} \
! functionExit(env); \
return result; \
JNI_END
WRAPPER_GetScalarArrayElements(T_BOOLEAN, jboolean, Boolean)
WRAPPER_GetScalarArrayElements(T_BYTE, jbyte, Byte)
--- 1679,1689 ----
array, \
isCopy); \
if (result != NULL) { \
result = (ElementType *) check_jni_wrap_copy_array(thr, array, result); \
} \
! functionExit(thr); \
return result; \
JNI_END
WRAPPER_GetScalarArrayElements(T_BOOLEAN, jboolean, Boolean)
WRAPPER_GetScalarArrayElements(T_BYTE, jbyte, Byte)
*** 1637,1647 ****
typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
) \
ElementType* orig_result = (ElementType *) check_wrapped_array_release( \
thr, "checked_jni_Release"#Result"ArrayElements", array, elems, mode); \
UNCHECKED()->Release##Result##ArrayElements(env, array, orig_result, mode); \
! functionExit(env); \
JNI_END
WRAPPER_ReleaseScalarArrayElements(T_BOOLEAN,jboolean, Boolean, bool)
WRAPPER_ReleaseScalarArrayElements(T_BYTE, jbyte, Byte, byte)
WRAPPER_ReleaseScalarArrayElements(T_SHORT, jshort, Short, short)
--- 1707,1717 ----
typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
) \
ElementType* orig_result = (ElementType *) check_wrapped_array_release( \
thr, "checked_jni_Release"#Result"ArrayElements", array, elems, mode); \
UNCHECKED()->Release##Result##ArrayElements(env, array, orig_result, mode); \
! functionExit(thr); \
JNI_END
WRAPPER_ReleaseScalarArrayElements(T_BOOLEAN,jboolean, Boolean, bool)
WRAPPER_ReleaseScalarArrayElements(T_BYTE, jbyte, Byte, byte)
WRAPPER_ReleaseScalarArrayElements(T_SHORT, jshort, Short, short)
*** 1661,1671 ****
functionEnter(thr); \
IN_VM( \
check_primitive_array_type(thr, array, ElementTag); \
) \
UNCHECKED()->Get##Result##ArrayRegion(env,array,start,len,buf); \
! functionExit(env); \
JNI_END
WRAPPER_GetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)
WRAPPER_GetScalarArrayRegion(T_BYTE, jbyte, Byte)
WRAPPER_GetScalarArrayRegion(T_SHORT, jshort, Short)
--- 1731,1742 ----
functionEnter(thr); \
IN_VM( \
check_primitive_array_type(thr, array, ElementTag); \
) \
UNCHECKED()->Get##Result##ArrayRegion(env,array,start,len,buf); \
! thr->set_pending_jni_exception_check("Get"#Result"ArrayRegion"); \
! functionExit(thr); \
JNI_END
WRAPPER_GetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)
WRAPPER_GetScalarArrayRegion(T_BYTE, jbyte, Byte)
WRAPPER_GetScalarArrayRegion(T_SHORT, jshort, Short)
*** 1685,1695 ****
functionEnter(thr); \
IN_VM( \
check_primitive_array_type(thr, array, ElementTag); \
) \
UNCHECKED()->Set##Result##ArrayRegion(env,array,start,len,buf); \
! functionExit(env); \
JNI_END
WRAPPER_SetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)
WRAPPER_SetScalarArrayRegion(T_BYTE, jbyte, Byte)
WRAPPER_SetScalarArrayRegion(T_SHORT, jshort, Short)
--- 1756,1767 ----
functionEnter(thr); \
IN_VM( \
check_primitive_array_type(thr, array, ElementTag); \
) \
UNCHECKED()->Set##Result##ArrayRegion(env,array,start,len,buf); \
! thr->set_pending_jni_exception_check("Set"#Result"ArrayRegion"); \
! functionExit(thr); \
JNI_END
WRAPPER_SetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)
WRAPPER_SetScalarArrayRegion(T_BYTE, jbyte, Byte)
WRAPPER_SetScalarArrayRegion(T_SHORT, jshort, Short)
*** 1704,1723 ****
jclass clazz,
const JNINativeMethod *methods,
jint nMethods))
functionEnter(thr);
jint result = UNCHECKED()->RegisterNatives(env,clazz,methods,nMethods);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_UnregisterNatives(JNIEnv *env,
jclass clazz))
functionEnter(thr);
jint result = UNCHECKED()->UnregisterNatives(env,clazz);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_MonitorEnter(JNIEnv *env,
--- 1776,1795 ----
jclass clazz,
const JNINativeMethod *methods,
jint nMethods))
functionEnter(thr);
jint result = UNCHECKED()->RegisterNatives(env,clazz,methods,nMethods);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_UnregisterNatives(JNIEnv *env,
jclass clazz))
functionEnter(thr);
jint result = UNCHECKED()->UnregisterNatives(env,clazz);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_MonitorEnter(JNIEnv *env,
*** 1725,1735 ****
functionEnter(thr);
IN_VM(
jniCheck::validate_object(thr, obj);
)
jint result = UNCHECKED()->MonitorEnter(env,obj);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_MonitorExit(JNIEnv *env,
--- 1797,1807 ----
functionEnter(thr);
IN_VM(
jniCheck::validate_object(thr, obj);
)
jint result = UNCHECKED()->MonitorEnter(env,obj);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_MonitorExit(JNIEnv *env,
*** 1737,1756 ****
functionEnterExceptionAllowed(thr);
IN_VM(
jniCheck::validate_object(thr, obj);
)
jint result = UNCHECKED()->MonitorExit(env,obj);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_GetJavaVM(JNIEnv *env,
JavaVM **vm))
functionEnter(thr);
jint result = UNCHECKED()->GetJavaVM(env,vm);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_GetStringRegion(JNIEnv *env,
--- 1809,1828 ----
functionEnterExceptionAllowed(thr);
IN_VM(
jniCheck::validate_object(thr, obj);
)
jint result = UNCHECKED()->MonitorExit(env,obj);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_GetJavaVM(JNIEnv *env,
JavaVM **vm))
functionEnter(thr);
jint result = UNCHECKED()->GetJavaVM(env,vm);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_GetStringRegion(JNIEnv *env,
*** 1761,1771 ****
functionEnter(thr);
IN_VM(
checkString(thr, str);
)
UNCHECKED()->GetStringRegion(env, str, start, len, buf);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_GetStringUTFRegion(JNIEnv *env,
jstring str,
--- 1833,1844 ----
functionEnter(thr);
IN_VM(
checkString(thr, str);
)
UNCHECKED()->GetStringRegion(env, str, start, len, buf);
! thr->set_pending_jni_exception_check("GetStringRegion");
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_GetStringUTFRegion(JNIEnv *env,
jstring str,
*** 1775,1785 ****
functionEnter(thr);
IN_VM(
checkString(thr, str);
)
UNCHECKED()->GetStringUTFRegion(env, str, start, len, buf);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(void *,
checked_jni_GetPrimitiveArrayCritical(JNIEnv *env,
jarray array,
--- 1848,1859 ----
functionEnter(thr);
IN_VM(
checkString(thr, str);
)
UNCHECKED()->GetStringUTFRegion(env, str, start, len, buf);
! thr->set_pending_jni_exception_check("GetStringUTFRegion");
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void *,
checked_jni_GetPrimitiveArrayCritical(JNIEnv *env,
jarray array,
*** 1790,1800 ****
)
void *result = UNCHECKED()->GetPrimitiveArrayCritical(env, array, isCopy);
if (result != NULL) {
result = check_jni_wrap_copy_array(thr, array, result);
}
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_ReleasePrimitiveArrayCritical(JNIEnv *env,
--- 1864,1874 ----
)
void *result = UNCHECKED()->GetPrimitiveArrayCritical(env, array, isCopy);
if (result != NULL) {
result = check_jni_wrap_copy_array(thr, array, result);
}
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_ReleasePrimitiveArrayCritical(JNIEnv *env,
*** 1806,1816 ****
check_is_primitive_array(thr, array);
)
// Check the element array...
void* orig_result = check_wrapped_array_release(thr, "ReleasePrimitiveArrayCritical", array, carray, mode);
UNCHECKED()->ReleasePrimitiveArrayCritical(env, array, orig_result, mode);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(const jchar*,
checked_jni_GetStringCritical(JNIEnv *env,
jstring string,
--- 1880,1890 ----
check_is_primitive_array(thr, array);
)
// Check the element array...
void* orig_result = check_wrapped_array_release(thr, "ReleasePrimitiveArrayCritical", array, carray, mode);
UNCHECKED()->ReleasePrimitiveArrayCritical(env, array, orig_result, mode);
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(const jchar*,
checked_jni_GetStringCritical(JNIEnv *env,
jstring string,
*** 1818,1828 ****
functionEnterCritical(thr);
IN_VM(
checkString(thr, string);
)
const jchar *result = UNCHECKED()->GetStringCritical(env, string, isCopy);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_ReleaseStringCritical(JNIEnv *env,
--- 1892,1902 ----
functionEnterCritical(thr);
IN_VM(
checkString(thr, string);
)
const jchar *result = UNCHECKED()->GetStringCritical(env, string, isCopy);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_ReleaseStringCritical(JNIEnv *env,
*** 1834,1844 ****
)
/* The Hotspot JNI code does not use the parameters, so just check the
* string parameter as a minor sanity check
*/
UNCHECKED()->ReleaseStringCritical(env, str, chars);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(jweak,
checked_jni_NewWeakGlobalRef(JNIEnv *env,
jobject obj))
--- 1908,1918 ----
)
/* The Hotspot JNI code does not use the parameters, so just check the
* string parameter as a minor sanity check
*/
UNCHECKED()->ReleaseStringCritical(env, str, chars);
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jweak,
checked_jni_NewWeakGlobalRef(JNIEnv *env,
jobject obj))
*** 1847,1901 ****
if (obj != NULL) {
jniCheck::validate_handle(thr, obj);
}
)
jweak result = UNCHECKED()->NewWeakGlobalRef(env, obj);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_DeleteWeakGlobalRef(JNIEnv *env,
jweak ref))
functionEnterExceptionAllowed(thr);
UNCHECKED()->DeleteWeakGlobalRef(env, ref);
! functionExit(env);
JNI_END
JNI_ENTRY_CHECKED(jboolean,
checked_jni_ExceptionCheck(JNIEnv *env))
functionEnterExceptionAllowed(thr);
jboolean result = UNCHECKED()->ExceptionCheck(env);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_NewDirectByteBuffer(JNIEnv *env,
void *address,
jlong capacity))
functionEnter(thr);
jobject result = UNCHECKED()->NewDirectByteBuffer(env, address, capacity);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(void *,
checked_jni_GetDirectBufferAddress(JNIEnv *env,
jobject buf))
functionEnter(thr);
void* result = UNCHECKED()->GetDirectBufferAddress(env, buf);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jlong,
checked_jni_GetDirectBufferCapacity(JNIEnv *env,
jobject buf))
functionEnter(thr);
jlong result = UNCHECKED()->GetDirectBufferCapacity(env, buf);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobjectRefType,
checked_jni_GetObjectRefType(JNIEnv *env,
--- 1921,1976 ----
if (obj != NULL) {
jniCheck::validate_handle(thr, obj);
}
)
jweak result = UNCHECKED()->NewWeakGlobalRef(env, obj);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_DeleteWeakGlobalRef(JNIEnv *env,
jweak ref))
functionEnterExceptionAllowed(thr);
UNCHECKED()->DeleteWeakGlobalRef(env, ref);
! functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jboolean,
checked_jni_ExceptionCheck(JNIEnv *env))
+ thr->clear_pending_jni_exception_check();
functionEnterExceptionAllowed(thr);
jboolean result = UNCHECKED()->ExceptionCheck(env);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobject,
checked_jni_NewDirectByteBuffer(JNIEnv *env,
void *address,
jlong capacity))
functionEnter(thr);
jobject result = UNCHECKED()->NewDirectByteBuffer(env, address, capacity);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(void *,
checked_jni_GetDirectBufferAddress(JNIEnv *env,
jobject buf))
functionEnter(thr);
void* result = UNCHECKED()->GetDirectBufferAddress(env, buf);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jlong,
checked_jni_GetDirectBufferCapacity(JNIEnv *env,
jobject buf))
functionEnter(thr);
jlong result = UNCHECKED()->GetDirectBufferCapacity(env, buf);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jobjectRefType,
checked_jni_GetObjectRefType(JNIEnv *env,
*** 1904,1923 ****
/* validate the object being passed */
IN_VM(
jniCheck::validate_object(thr, obj);
)
jobjectRefType result = UNCHECKED()->GetObjectRefType(env, obj);
! functionExit(env);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_GetVersion(JNIEnv *env))
functionEnter(thr);
jint result = UNCHECKED()->GetVersion(env);
! functionExit(env);
return result;
JNI_END
--- 1979,1998 ----
/* validate the object being passed */
IN_VM(
jniCheck::validate_object(thr, obj);
)
jobjectRefType result = UNCHECKED()->GetObjectRefType(env, obj);
! functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jint,
checked_jni_GetVersion(JNIEnv *env))
functionEnter(thr);
jint result = UNCHECKED()->GetVersion(env);
! functionExit(thr);
return result;
JNI_END