326 } UNSAFE_END 327 328 UNSAFE_ENTRY(void, Unsafe_PutObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) { 329 oop x = JNIHandles::resolve(x_h); 330 oop p = JNIHandles::resolve(obj); 331 assert_field_offset_sane(p, offset); 332 HeapAccess<ON_UNKNOWN_OOP_REF>::oop_store_at(p, offset, x); 333 } UNSAFE_END 334 335 UNSAFE_ENTRY(jboolean, Unsafe_IsFlattenedArray(JNIEnv *env, jobject unsafe, jclass c)) { 336 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(c)); 337 return k->is_valueArray_klass(); 338 } UNSAFE_END 339 340 UNSAFE_ENTRY(jobject, Unsafe_GetValue(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jclass c)) { 341 oop p = JNIHandles::resolve(obj); 342 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(c)); 343 ValueKlass* vk = ValueKlass::cast(k); 344 assert_and_log_unsafe_value_type_access(p, offset, vk); 345 Handle p_h(THREAD, p); 346 bool in_heap; 347 oop v = vk->allocate_buffered_or_heap_instance(&in_heap, CHECK_NULL); // allocate instance 348 vk->initialize(CHECK_NULL); // If field is a default value, value class might not be initialized yet 349 vk->value_store(((char*)(oopDesc*)p_h()) + offset, 350 vk->data_for_oop(v), 351 in_heap, true); 352 return JNIHandles::make_local(env, v); 353 } UNSAFE_END 354 355 UNSAFE_ENTRY(void, Unsafe_PutValue(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jclass c, jobject value)) { 356 oop v = JNIHandles::resolve(value); 357 oop p = JNIHandles::resolve(obj); 358 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(c)); 359 ValueKlass* vk = ValueKlass::cast(k); 360 assert_and_log_unsafe_value_type_access(p, offset, vk); 361 vk->value_store(vk->data_for_oop(v), 362 ((char*)(oopDesc*)p) + offset, true, true); 363 } UNSAFE_END 364 365 UNSAFE_ENTRY(jobject, Unsafe_GetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) { 366 oop p = JNIHandles::resolve(obj); 367 assert_field_offset_sane(p, offset); 368 oop v = HeapAccess<MO_SEQ_CST | ON_UNKNOWN_OOP_REF>::oop_load_at(p, offset); 369 return JNIHandles::make_local(env, v); 370 } UNSAFE_END 371 | 326 } UNSAFE_END 327 328 UNSAFE_ENTRY(void, Unsafe_PutObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) { 329 oop x = JNIHandles::resolve(x_h); 330 oop p = JNIHandles::resolve(obj); 331 assert_field_offset_sane(p, offset); 332 HeapAccess<ON_UNKNOWN_OOP_REF>::oop_store_at(p, offset, x); 333 } UNSAFE_END 334 335 UNSAFE_ENTRY(jboolean, Unsafe_IsFlattenedArray(JNIEnv *env, jobject unsafe, jclass c)) { 336 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(c)); 337 return k->is_valueArray_klass(); 338 } UNSAFE_END 339 340 UNSAFE_ENTRY(jobject, Unsafe_GetValue(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jclass c)) { 341 oop p = JNIHandles::resolve(obj); 342 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(c)); 343 ValueKlass* vk = ValueKlass::cast(k); 344 assert_and_log_unsafe_value_type_access(p, offset, vk); 345 Handle p_h(THREAD, p); 346 oop v = vk->allocate_instance(CHECK_NULL); // allocate instance 347 vk->initialize(CHECK_NULL); // If field is a default value, value class might not be initialized yet 348 vk->value_store(((char*)(oopDesc*)p_h()) + offset, 349 vk->data_for_oop(v), 350 true, true); 351 return JNIHandles::make_local(env, v); 352 } UNSAFE_END 353 354 UNSAFE_ENTRY(void, Unsafe_PutValue(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jclass c, jobject value)) { 355 oop v = JNIHandles::resolve(value); 356 oop p = JNIHandles::resolve(obj); 357 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(c)); 358 ValueKlass* vk = ValueKlass::cast(k); 359 assert_and_log_unsafe_value_type_access(p, offset, vk); 360 vk->value_store(vk->data_for_oop(v), 361 ((char*)(oopDesc*)p) + offset, true, true); 362 } UNSAFE_END 363 364 UNSAFE_ENTRY(jobject, Unsafe_GetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) { 365 oop p = JNIHandles::resolve(obj); 366 assert_field_offset_sane(p, offset); 367 oop v = HeapAccess<MO_SEQ_CST | ON_UNKNOWN_OOP_REF>::oop_load_at(p, offset); 368 return JNIHandles::make_local(env, v); 369 } UNSAFE_END 370 |