< prev index next >

src/hotspot/share/prims/jniCheck.cpp

Print this page

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