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