< prev index next >

src/hotspot/share/prims/jniCheck.cpp

Print this page

 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)
< prev index next >