238 fieldDescriptor fd;
239
240 /* make sure it is a static field */
241 if (!jfieldIDWorkaround::is_static_jfieldID(fid))
242 ReportJNIFatalError(thr, fatal_should_be_static);
243
244 /* validate the class being passed */
245 ASSERT_OOPS_ALLOWED;
246 Klass* k_oop = jniCheck::validate_class(thr, cls, false);
247
248 /* check for proper subclass hierarchy */
249 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fid);
250 Klass* f_oop = id->holder();
251 if (!k_oop->is_subtype_of(f_oop))
252 ReportJNIFatalError(thr, fatal_wrong_static_field);
253
254 /* check for proper field type */
255 if (!id->find_local_field(&fd))
256 ReportJNIFatalError(thr, fatal_static_field_not_found);
257 if ((fd.field_type() != ftype) &&
258 !(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {
259 ReportJNIFatalError(thr, fatal_static_field_mismatch);
260 }
261
262 /* check if setting a final field */
263 if (setter && fd.is_final() && !fd.is_mutable_static_final()) {
264 ResourceMark rm(thr);
265 stringStream ss;
266 ss.print("SetStatic<Type>Field called to mutate final static field %s.%s", k_oop->external_name(), fd.name()->as_C_string());
267 ReportJNIWarning(thr, ss.as_string());
268 }
269 }
270
271 static inline void
272 checkInstanceFieldID(JavaThread* thr, jfieldID fid, jobject obj, int ftype, bool setter)
273 {
274 fieldDescriptor fd;
275
276 /* make sure it is an instance field */
277 if (jfieldIDWorkaround::is_static_jfieldID(fid))
278 ReportJNIFatalError(thr, fatal_should_be_nonstatic);
341 if (!aOop->is_typeArray()) {
342 ReportJNIFatalError(thr, fatal_prim_type_array_expected);
343 }
344 return aOop;
345 }
346
347 static inline void
348 check_primitive_array_type(JavaThread* thr, jarray jArray, BasicType elementType)
349 {
350 BasicType array_type;
351 arrayOop aOop;
352
353 aOop = check_is_primitive_array(thr, jArray);
354 array_type = TypeArrayKlass::cast(aOop->klass())->element_type();
355 if (array_type != elementType) {
356 ReportJNIFatalError(thr, fatal_element_type_mismatch);
357 }
358 }
359
360 static inline void
361 check_is_obj_array(JavaThread* thr, jarray jArray) {
362 arrayOop aOop = check_is_array(thr, jArray);
363 if (!aOop->is_objArray()) {
364 ReportJNIFatalError(thr, fatal_object_array_expected);
365 }
366 }
367
368 // Arbitrary (but well-known) tag for GetStringChars
369 const void* STRING_TAG = (void*)0x47114711;
370
371 // Arbitrary (but well-known) tag for GetStringUTFChars
372 const void* STRING_UTF_TAG = (void*) 0x48124812;
373
374 // Arbitrary (but well-known) tag for GetPrimitiveArrayCritical
375 const void* CRITICAL_TAG = (void*)0x49134913;
376
377 /*
378 * Copy and wrap array elements for bounds checking.
379 * Remember the original elements (GuardedMemory::get_tag())
380 */
381 static void* check_jni_wrap_copy_array(JavaThread* thr, jarray array,
382 void* orig_elements, jboolean is_critical = JNI_FALSE) {
383 void* result;
1650 return result;
1651 JNI_END
1652
1653 JNI_ENTRY_CHECKED(jobjectArray,
1654 checked_jni_NewObjectArray(JNIEnv *env,
1655 jsize len,
1656 jclass clazz,
1657 jobject init))
1658 functionEnter(thr);
1659 jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);
1660 functionExit(thr);
1661 return result;
1662 JNI_END
1663
1664 JNI_ENTRY_CHECKED(jobject,
1665 checked_jni_GetObjectArrayElement(JNIEnv *env,
1666 jobjectArray array,
1667 jsize index))
1668 functionEnter(thr);
1669 IN_VM(
1670 check_is_obj_array(thr, array);
1671 )
1672 jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);
1673 functionExit(thr);
1674 return result;
1675 JNI_END
1676
1677 JNI_ENTRY_CHECKED(void,
1678 checked_jni_SetObjectArrayElement(JNIEnv *env,
1679 jobjectArray array,
1680 jsize index,
1681 jobject val))
1682 functionEnter(thr);
1683 IN_VM(
1684 check_is_obj_array(thr, array);
1685 )
1686 UNCHECKED()->SetObjectArrayElement(env,array,index,val);
1687 functionExit(thr);
1688 JNI_END
1689
1690 #define WRAPPER_NewScalarArray(Return, Result) \
1691 JNI_ENTRY_CHECKED(Return, \
1692 checked_jni_New##Result##Array(JNIEnv *env, \
1693 jsize len)) \
1694 functionEnter(thr); \
1695 Return result = UNCHECKED()->New##Result##Array(env,len); \
1696 functionExit(thr); \
1697 return (Return) result; \
1698 JNI_END
1699
1700 WRAPPER_NewScalarArray(jbooleanArray, Boolean)
1701 WRAPPER_NewScalarArray(jbyteArray, Byte)
1702 WRAPPER_NewScalarArray(jshortArray, Short)
1703 WRAPPER_NewScalarArray(jcharArray, Char)
1704 WRAPPER_NewScalarArray(jintArray, Int)
|
238 fieldDescriptor fd;
239
240 /* make sure it is a static field */
241 if (!jfieldIDWorkaround::is_static_jfieldID(fid))
242 ReportJNIFatalError(thr, fatal_should_be_static);
243
244 /* validate the class being passed */
245 ASSERT_OOPS_ALLOWED;
246 Klass* k_oop = jniCheck::validate_class(thr, cls, false);
247
248 /* check for proper subclass hierarchy */
249 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fid);
250 Klass* f_oop = id->holder();
251 if (!k_oop->is_subtype_of(f_oop))
252 ReportJNIFatalError(thr, fatal_wrong_static_field);
253
254 /* check for proper field type */
255 if (!id->find_local_field(&fd))
256 ReportJNIFatalError(thr, fatal_static_field_not_found);
257 if ((fd.field_type() != ftype) &&
258 !(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {
259 ReportJNIFatalError(thr, fatal_static_field_mismatch);
260 }
261
262 /* check if setting a final field */
263 if (setter && fd.is_final() && !fd.is_mutable_static_final()) {
264 ResourceMark rm(thr);
265 stringStream ss;
266 ss.print("SetStatic<Type>Field called to mutate final static field %s.%s", k_oop->external_name(), fd.name()->as_C_string());
267 ReportJNIWarning(thr, ss.as_string());
268 }
269 }
270
271 static inline void
272 checkInstanceFieldID(JavaThread* thr, jfieldID fid, jobject obj, int ftype, bool setter)
273 {
274 fieldDescriptor fd;
275
276 /* make sure it is an instance field */
277 if (jfieldIDWorkaround::is_static_jfieldID(fid))
278 ReportJNIFatalError(thr, fatal_should_be_nonstatic);
341 if (!aOop->is_typeArray()) {
342 ReportJNIFatalError(thr, fatal_prim_type_array_expected);
343 }
344 return aOop;
345 }
346
347 static inline void
348 check_primitive_array_type(JavaThread* thr, jarray jArray, BasicType elementType)
349 {
350 BasicType array_type;
351 arrayOop aOop;
352
353 aOop = check_is_primitive_array(thr, jArray);
354 array_type = TypeArrayKlass::cast(aOop->klass())->element_type();
355 if (array_type != elementType) {
356 ReportJNIFatalError(thr, fatal_element_type_mismatch);
357 }
358 }
359
360 static inline void
361 check_is_obj_or_inline_array(JavaThread* thr, jarray jArray) {
362 arrayOop aOop = check_is_array(thr, jArray);
363 if (!aOop->is_objArray() && !aOop->is_flatArray()) {
364 ReportJNIFatalError(thr, fatal_object_array_expected);
365 }
366 }
367
368 // Arbitrary (but well-known) tag for GetStringChars
369 const void* STRING_TAG = (void*)0x47114711;
370
371 // Arbitrary (but well-known) tag for GetStringUTFChars
372 const void* STRING_UTF_TAG = (void*) 0x48124812;
373
374 // Arbitrary (but well-known) tag for GetPrimitiveArrayCritical
375 const void* CRITICAL_TAG = (void*)0x49134913;
376
377 /*
378 * Copy and wrap array elements for bounds checking.
379 * Remember the original elements (GuardedMemory::get_tag())
380 */
381 static void* check_jni_wrap_copy_array(JavaThread* thr, jarray array,
382 void* orig_elements, jboolean is_critical = JNI_FALSE) {
383 void* result;
1650 return result;
1651 JNI_END
1652
1653 JNI_ENTRY_CHECKED(jobjectArray,
1654 checked_jni_NewObjectArray(JNIEnv *env,
1655 jsize len,
1656 jclass clazz,
1657 jobject init))
1658 functionEnter(thr);
1659 jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);
1660 functionExit(thr);
1661 return result;
1662 JNI_END
1663
1664 JNI_ENTRY_CHECKED(jobject,
1665 checked_jni_GetObjectArrayElement(JNIEnv *env,
1666 jobjectArray array,
1667 jsize index))
1668 functionEnter(thr);
1669 IN_VM(
1670 check_is_obj_or_inline_array(thr, array);
1671 )
1672 jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);
1673 functionExit(thr);
1674 return result;
1675 JNI_END
1676
1677 JNI_ENTRY_CHECKED(void,
1678 checked_jni_SetObjectArrayElement(JNIEnv *env,
1679 jobjectArray array,
1680 jsize index,
1681 jobject val))
1682 functionEnter(thr);
1683 IN_VM(
1684 check_is_obj_or_inline_array(thr, array);
1685 )
1686 UNCHECKED()->SetObjectArrayElement(env,array,index,val);
1687 functionExit(thr);
1688 JNI_END
1689
1690 #define WRAPPER_NewScalarArray(Return, Result) \
1691 JNI_ENTRY_CHECKED(Return, \
1692 checked_jni_New##Result##Array(JNIEnv *env, \
1693 jsize len)) \
1694 functionEnter(thr); \
1695 Return result = UNCHECKED()->New##Result##Array(env,len); \
1696 functionExit(thr); \
1697 return (Return) result; \
1698 JNI_END
1699
1700 WRAPPER_NewScalarArray(jbooleanArray, Boolean)
1701 WRAPPER_NewScalarArray(jbyteArray, Byte)
1702 WRAPPER_NewScalarArray(jshortArray, Short)
1703 WRAPPER_NewScalarArray(jcharArray, Char)
1704 WRAPPER_NewScalarArray(jintArray, Int)
|