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
263 static inline void
264 checkInstanceFieldID(JavaThread* thr, jfieldID fid, jobject obj, int ftype)
265 {
266 fieldDescriptor fd;
267
268 /* make sure it is an instance field */
269 if (jfieldIDWorkaround::is_static_jfieldID(fid))
270 ReportJNIFatalError(thr, fatal_should_be_nonstatic);
271
272 /* validate the object being passed and then get its class */
273 ASSERT_OOPS_ALLOWED;
274 oop oopObj = jniCheck::validate_object(thr, obj);
275 if (oopObj == nullptr) {
276 ReportJNIFatalError(thr, fatal_null_object);
277 }
278 Klass* k_oop = oopObj->klass();
326 if (!aOop->is_typeArray()) {
327 ReportJNIFatalError(thr, fatal_prim_type_array_expected);
328 }
329 return aOop;
330 }
331
332 static inline void
333 check_primitive_array_type(JavaThread* thr, jarray jArray, BasicType elementType)
334 {
335 BasicType array_type;
336 arrayOop aOop;
337
338 aOop = check_is_primitive_array(thr, jArray);
339 array_type = TypeArrayKlass::cast(aOop->klass())->element_type();
340 if (array_type != elementType) {
341 ReportJNIFatalError(thr, fatal_element_type_mismatch);
342 }
343 }
344
345 static inline void
346 check_is_obj_array(JavaThread* thr, jarray jArray) {
347 arrayOop aOop = check_is_array(thr, jArray);
348 if (!aOop->is_objArray()) {
349 ReportJNIFatalError(thr, fatal_object_array_expected);
350 }
351 }
352
353 /*
354 * Copy and wrap array elements for bounds checking.
355 * Remember the original elements (GuardedMemory::get_tag())
356 */
357 static void* check_jni_wrap_copy_array(JavaThread* thr, jarray array,
358 void* orig_elements) {
359 void* result;
360 IN_VM(
361 oop a = JNIHandles::resolve_non_null(array);
362 size_t len = arrayOop(a)->length() <<
363 TypeArrayKlass::cast(a->klass())->log2_element_size();
364 result = GuardedMemory::wrap_copy(orig_elements, len, orig_elements);
365 )
366 return result;
367 }
368
1609 return result;
1610 JNI_END
1611
1612 JNI_ENTRY_CHECKED(jobjectArray,
1613 checked_jni_NewObjectArray(JNIEnv *env,
1614 jsize len,
1615 jclass clazz,
1616 jobject init))
1617 functionEnter(thr);
1618 jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);
1619 functionExit(thr);
1620 return result;
1621 JNI_END
1622
1623 JNI_ENTRY_CHECKED(jobject,
1624 checked_jni_GetObjectArrayElement(JNIEnv *env,
1625 jobjectArray array,
1626 jsize index))
1627 functionEnter(thr);
1628 IN_VM(
1629 check_is_obj_array(thr, array);
1630 )
1631 jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);
1632 functionExit(thr);
1633 return result;
1634 JNI_END
1635
1636 JNI_ENTRY_CHECKED(void,
1637 checked_jni_SetObjectArrayElement(JNIEnv *env,
1638 jobjectArray array,
1639 jsize index,
1640 jobject val))
1641 functionEnter(thr);
1642 IN_VM(
1643 check_is_obj_array(thr, array);
1644 )
1645 UNCHECKED()->SetObjectArrayElement(env,array,index,val);
1646 functionExit(thr);
1647 JNI_END
1648
1649 #define WRAPPER_NewScalarArray(Return, Result) \
1650 JNI_ENTRY_CHECKED(Return, \
1651 checked_jni_New##Result##Array(JNIEnv *env, \
1652 jsize len)) \
1653 functionEnter(thr); \
1654 Return result = UNCHECKED()->New##Result##Array(env,len); \
1655 functionExit(thr); \
1656 return (Return) result; \
1657 JNI_END
1658
1659 WRAPPER_NewScalarArray(jbooleanArray, Boolean)
1660 WRAPPER_NewScalarArray(jbyteArray, Byte)
1661 WRAPPER_NewScalarArray(jshortArray, Short)
1662 WRAPPER_NewScalarArray(jcharArray, Char)
1663 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
263 static inline void
264 checkInstanceFieldID(JavaThread* thr, jfieldID fid, jobject obj, int ftype)
265 {
266 fieldDescriptor fd;
267
268 /* make sure it is an instance field */
269 if (jfieldIDWorkaround::is_static_jfieldID(fid))
270 ReportJNIFatalError(thr, fatal_should_be_nonstatic);
271
272 /* validate the object being passed and then get its class */
273 ASSERT_OOPS_ALLOWED;
274 oop oopObj = jniCheck::validate_object(thr, obj);
275 if (oopObj == nullptr) {
276 ReportJNIFatalError(thr, fatal_null_object);
277 }
278 Klass* k_oop = oopObj->klass();
326 if (!aOop->is_typeArray()) {
327 ReportJNIFatalError(thr, fatal_prim_type_array_expected);
328 }
329 return aOop;
330 }
331
332 static inline void
333 check_primitive_array_type(JavaThread* thr, jarray jArray, BasicType elementType)
334 {
335 BasicType array_type;
336 arrayOop aOop;
337
338 aOop = check_is_primitive_array(thr, jArray);
339 array_type = TypeArrayKlass::cast(aOop->klass())->element_type();
340 if (array_type != elementType) {
341 ReportJNIFatalError(thr, fatal_element_type_mismatch);
342 }
343 }
344
345 static inline void
346 check_is_obj_or_inline_array(JavaThread* thr, jarray jArray) {
347 arrayOop aOop = check_is_array(thr, jArray);
348 if (!aOop->is_objArray() && !aOop->is_flatArray()) {
349 ReportJNIFatalError(thr, fatal_object_array_expected);
350 }
351 }
352
353 /*
354 * Copy and wrap array elements for bounds checking.
355 * Remember the original elements (GuardedMemory::get_tag())
356 */
357 static void* check_jni_wrap_copy_array(JavaThread* thr, jarray array,
358 void* orig_elements) {
359 void* result;
360 IN_VM(
361 oop a = JNIHandles::resolve_non_null(array);
362 size_t len = arrayOop(a)->length() <<
363 TypeArrayKlass::cast(a->klass())->log2_element_size();
364 result = GuardedMemory::wrap_copy(orig_elements, len, orig_elements);
365 )
366 return result;
367 }
368
1609 return result;
1610 JNI_END
1611
1612 JNI_ENTRY_CHECKED(jobjectArray,
1613 checked_jni_NewObjectArray(JNIEnv *env,
1614 jsize len,
1615 jclass clazz,
1616 jobject init))
1617 functionEnter(thr);
1618 jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);
1619 functionExit(thr);
1620 return result;
1621 JNI_END
1622
1623 JNI_ENTRY_CHECKED(jobject,
1624 checked_jni_GetObjectArrayElement(JNIEnv *env,
1625 jobjectArray array,
1626 jsize index))
1627 functionEnter(thr);
1628 IN_VM(
1629 check_is_obj_or_inline_array(thr, array);
1630 )
1631 jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);
1632 functionExit(thr);
1633 return result;
1634 JNI_END
1635
1636 JNI_ENTRY_CHECKED(void,
1637 checked_jni_SetObjectArrayElement(JNIEnv *env,
1638 jobjectArray array,
1639 jsize index,
1640 jobject val))
1641 functionEnter(thr);
1642 IN_VM(
1643 check_is_obj_or_inline_array(thr, array);
1644 )
1645 UNCHECKED()->SetObjectArrayElement(env,array,index,val);
1646 functionExit(thr);
1647 JNI_END
1648
1649 #define WRAPPER_NewScalarArray(Return, Result) \
1650 JNI_ENTRY_CHECKED(Return, \
1651 checked_jni_New##Result##Array(JNIEnv *env, \
1652 jsize len)) \
1653 functionEnter(thr); \
1654 Return result = UNCHECKED()->New##Result##Array(env,len); \
1655 functionExit(thr); \
1656 return (Return) result; \
1657 JNI_END
1658
1659 WRAPPER_NewScalarArray(jbooleanArray, Boolean)
1660 WRAPPER_NewScalarArray(jbyteArray, Byte)
1661 WRAPPER_NewScalarArray(jshortArray, Short)
1662 WRAPPER_NewScalarArray(jcharArray, Char)
1663 WRAPPER_NewScalarArray(jintArray, Int)
|