239 fieldDescriptor fd;
240
241 /* make sure it is a static field */
242 if (!jfieldIDWorkaround::is_static_jfieldID(fid))
243 ReportJNIFatalError(thr, fatal_should_be_static);
244
245 /* validate the class being passed */
246 ASSERT_OOPS_ALLOWED;
247 Klass* k_oop = jniCheck::validate_class(thr, cls, false);
248
249 /* check for proper subclass hierarchy */
250 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fid);
251 Klass* f_oop = id->holder();
252 if (!k_oop->is_subtype_of(f_oop))
253 ReportJNIFatalError(thr, fatal_wrong_static_field);
254
255 /* check for proper field type */
256 if (!id->find_local_field(&fd))
257 ReportJNIFatalError(thr, fatal_static_field_not_found);
258 if ((fd.field_type() != ftype) &&
259 !(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {
260 ReportJNIFatalError(thr, fatal_static_field_mismatch);
261 }
262 }
263
264 static inline void
265 checkInstanceFieldID(JavaThread* thr, jfieldID fid, jobject obj, int ftype)
266 {
267 fieldDescriptor fd;
268
269 /* make sure it is an instance field */
270 if (jfieldIDWorkaround::is_static_jfieldID(fid))
271 ReportJNIFatalError(thr, fatal_should_be_nonstatic);
272
273 /* validate the object being passed and then get its class */
274 ASSERT_OOPS_ALLOWED;
275 oop oopObj = jniCheck::validate_object(thr, obj);
276 if (oopObj == nullptr) {
277 ReportJNIFatalError(thr, fatal_null_object);
278 }
279 Klass* k_oop = oopObj->klass();
327 if (!aOop->is_typeArray()) {
328 ReportJNIFatalError(thr, fatal_prim_type_array_expected);
329 }
330 return aOop;
331 }
332
333 static inline void
334 check_primitive_array_type(JavaThread* thr, jarray jArray, BasicType elementType)
335 {
336 BasicType array_type;
337 arrayOop aOop;
338
339 aOop = check_is_primitive_array(thr, jArray);
340 array_type = TypeArrayKlass::cast(aOop->klass())->element_type();
341 if (array_type != elementType) {
342 ReportJNIFatalError(thr, fatal_element_type_mismatch);
343 }
344 }
345
346 static inline void
347 check_is_obj_array(JavaThread* thr, jarray jArray) {
348 arrayOop aOop = check_is_array(thr, jArray);
349 if (!aOop->is_objArray()) {
350 ReportJNIFatalError(thr, fatal_object_array_expected);
351 }
352 }
353
354 /*
355 * Copy and wrap array elements for bounds checking.
356 * Remember the original elements (GuardedMemory::get_tag())
357 */
358 static void* check_jni_wrap_copy_array(JavaThread* thr, jarray array,
359 void* orig_elements) {
360 void* result;
361 IN_VM(
362 oop a = JNIHandles::resolve_non_null(array);
363 size_t len = arrayOop(a)->length() <<
364 TypeArrayKlass::cast(a->klass())->log2_element_size();
365 result = GuardedMemory::wrap_copy(orig_elements, len, orig_elements);
366 )
367 return result;
368 }
369
1589 return result;
1590 JNI_END
1591
1592 JNI_ENTRY_CHECKED(jobjectArray,
1593 checked_jni_NewObjectArray(JNIEnv *env,
1594 jsize len,
1595 jclass clazz,
1596 jobject init))
1597 functionEnter(thr);
1598 jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);
1599 functionExit(thr);
1600 return result;
1601 JNI_END
1602
1603 JNI_ENTRY_CHECKED(jobject,
1604 checked_jni_GetObjectArrayElement(JNIEnv *env,
1605 jobjectArray array,
1606 jsize index))
1607 functionEnter(thr);
1608 IN_VM(
1609 check_is_obj_array(thr, array);
1610 )
1611 jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);
1612 functionExit(thr);
1613 return result;
1614 JNI_END
1615
1616 JNI_ENTRY_CHECKED(void,
1617 checked_jni_SetObjectArrayElement(JNIEnv *env,
1618 jobjectArray array,
1619 jsize index,
1620 jobject val))
1621 functionEnter(thr);
1622 IN_VM(
1623 check_is_obj_array(thr, array);
1624 )
1625 UNCHECKED()->SetObjectArrayElement(env,array,index,val);
1626 functionExit(thr);
1627 JNI_END
1628
1629 #define WRAPPER_NewScalarArray(Return, Result) \
1630 JNI_ENTRY_CHECKED(Return, \
1631 checked_jni_New##Result##Array(JNIEnv *env, \
1632 jsize len)) \
1633 functionEnter(thr); \
1634 Return result = UNCHECKED()->New##Result##Array(env,len); \
1635 functionExit(thr); \
1636 return (Return) result; \
1637 JNI_END
1638
1639 WRAPPER_NewScalarArray(jbooleanArray, Boolean)
1640 WRAPPER_NewScalarArray(jbyteArray, Byte)
1641 WRAPPER_NewScalarArray(jshortArray, Short)
1642 WRAPPER_NewScalarArray(jcharArray, Char)
1643 WRAPPER_NewScalarArray(jintArray, Int)
|
239 fieldDescriptor fd;
240
241 /* make sure it is a static field */
242 if (!jfieldIDWorkaround::is_static_jfieldID(fid))
243 ReportJNIFatalError(thr, fatal_should_be_static);
244
245 /* validate the class being passed */
246 ASSERT_OOPS_ALLOWED;
247 Klass* k_oop = jniCheck::validate_class(thr, cls, false);
248
249 /* check for proper subclass hierarchy */
250 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fid);
251 Klass* f_oop = id->holder();
252 if (!k_oop->is_subtype_of(f_oop))
253 ReportJNIFatalError(thr, fatal_wrong_static_field);
254
255 /* check for proper field type */
256 if (!id->find_local_field(&fd))
257 ReportJNIFatalError(thr, fatal_static_field_not_found);
258 if ((fd.field_type() != ftype) &&
259 !(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {
260 ReportJNIFatalError(thr, fatal_static_field_mismatch);
261 }
262 }
263
264 static inline void
265 checkInstanceFieldID(JavaThread* thr, jfieldID fid, jobject obj, int ftype)
266 {
267 fieldDescriptor fd;
268
269 /* make sure it is an instance field */
270 if (jfieldIDWorkaround::is_static_jfieldID(fid))
271 ReportJNIFatalError(thr, fatal_should_be_nonstatic);
272
273 /* validate the object being passed and then get its class */
274 ASSERT_OOPS_ALLOWED;
275 oop oopObj = jniCheck::validate_object(thr, obj);
276 if (oopObj == nullptr) {
277 ReportJNIFatalError(thr, fatal_null_object);
278 }
279 Klass* k_oop = oopObj->klass();
327 if (!aOop->is_typeArray()) {
328 ReportJNIFatalError(thr, fatal_prim_type_array_expected);
329 }
330 return aOop;
331 }
332
333 static inline void
334 check_primitive_array_type(JavaThread* thr, jarray jArray, BasicType elementType)
335 {
336 BasicType array_type;
337 arrayOop aOop;
338
339 aOop = check_is_primitive_array(thr, jArray);
340 array_type = TypeArrayKlass::cast(aOop->klass())->element_type();
341 if (array_type != elementType) {
342 ReportJNIFatalError(thr, fatal_element_type_mismatch);
343 }
344 }
345
346 static inline void
347 check_is_obj_or_inline_array(JavaThread* thr, jarray jArray) {
348 arrayOop aOop = check_is_array(thr, jArray);
349 if (!aOop->is_objArray() && !aOop->is_flatArray()) {
350 ReportJNIFatalError(thr, fatal_object_array_expected);
351 }
352 }
353
354 /*
355 * Copy and wrap array elements for bounds checking.
356 * Remember the original elements (GuardedMemory::get_tag())
357 */
358 static void* check_jni_wrap_copy_array(JavaThread* thr, jarray array,
359 void* orig_elements) {
360 void* result;
361 IN_VM(
362 oop a = JNIHandles::resolve_non_null(array);
363 size_t len = arrayOop(a)->length() <<
364 TypeArrayKlass::cast(a->klass())->log2_element_size();
365 result = GuardedMemory::wrap_copy(orig_elements, len, orig_elements);
366 )
367 return result;
368 }
369
1589 return result;
1590 JNI_END
1591
1592 JNI_ENTRY_CHECKED(jobjectArray,
1593 checked_jni_NewObjectArray(JNIEnv *env,
1594 jsize len,
1595 jclass clazz,
1596 jobject init))
1597 functionEnter(thr);
1598 jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);
1599 functionExit(thr);
1600 return result;
1601 JNI_END
1602
1603 JNI_ENTRY_CHECKED(jobject,
1604 checked_jni_GetObjectArrayElement(JNIEnv *env,
1605 jobjectArray array,
1606 jsize index))
1607 functionEnter(thr);
1608 IN_VM(
1609 check_is_obj_or_inline_array(thr, array);
1610 )
1611 jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);
1612 functionExit(thr);
1613 return result;
1614 JNI_END
1615
1616 JNI_ENTRY_CHECKED(void,
1617 checked_jni_SetObjectArrayElement(JNIEnv *env,
1618 jobjectArray array,
1619 jsize index,
1620 jobject val))
1621 functionEnter(thr);
1622 IN_VM(
1623 check_is_obj_or_inline_array(thr, array);
1624 )
1625 UNCHECKED()->SetObjectArrayElement(env,array,index,val);
1626 functionExit(thr);
1627 JNI_END
1628
1629 #define WRAPPER_NewScalarArray(Return, Result) \
1630 JNI_ENTRY_CHECKED(Return, \
1631 checked_jni_New##Result##Array(JNIEnv *env, \
1632 jsize len)) \
1633 functionEnter(thr); \
1634 Return result = UNCHECKED()->New##Result##Array(env,len); \
1635 functionExit(thr); \
1636 return (Return) result; \
1637 JNI_END
1638
1639 WRAPPER_NewScalarArray(jbooleanArray, Boolean)
1640 WRAPPER_NewScalarArray(jbyteArray, Byte)
1641 WRAPPER_NewScalarArray(jshortArray, Short)
1642 WRAPPER_NewScalarArray(jcharArray, Char)
1643 WRAPPER_NewScalarArray(jintArray, Int)
|