2613 JNIWrapper("GetObjectField");
2614 #ifndef USDT2
2615 DTRACE_PROBE3(hotspot_jni, GetObjectField__entry, env, obj, fieldID);
2616 #else /* USDT2 */
2617 HOTSPOT_JNI_GETOBJECTFIELD_ENTRY(
2618 env, obj, (uintptr_t) fieldID);
2619 #endif /* USDT2 */
2620 oop o = JNIHandles::resolve_non_null(obj);
2621 Klass* k = o->klass();
2622 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
2623 // Keep JVMTI addition small and only check enabled flag here.
2624 // jni_GetField_probe() assumes that is okay to create handles.
2625 if (JvmtiExport::should_post_field_access()) {
2626 o = JvmtiExport::jni_GetField_probe(thread, obj, o, k, fieldID, false);
2627 }
2628 jobject ret = JNIHandles::make_local(env, o->obj_field(offset));
2629 #if INCLUDE_ALL_GCS
2630 // If G1 is enabled and we are accessing the value of the referent
2631 // field in a reference object then we need to register a non-null
2632 // referent with the SATB barrier.
2633 if (UseG1GC || (UseShenandoahGC && ShenandoahSATBBarrier)) {
2634 bool needs_barrier = false;
2635
2636 if (ret != NULL &&
2637 offset == java_lang_ref_Reference::referent_offset &&
2638 InstanceKlass::cast(k)->reference_type() != REF_NONE) {
2639 assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
2640 needs_barrier = true;
2641 }
2642
2643 if (needs_barrier) {
2644 oop referent = JNIHandles::resolve(ret);
2645 G1SATBCardTableModRefBS::enqueue(referent);
2646 }
2647 }
2648 #endif // INCLUDE_ALL_GCS
2649 #ifndef USDT2
2650 DTRACE_PROBE1(hotspot_jni, GetObjectField__return, ret);
2651 #else /* USDT2 */
2652 HOTSPOT_JNI_GETOBJECTFIELD_RETURN(
2653 ret);
|
2613 JNIWrapper("GetObjectField");
2614 #ifndef USDT2
2615 DTRACE_PROBE3(hotspot_jni, GetObjectField__entry, env, obj, fieldID);
2616 #else /* USDT2 */
2617 HOTSPOT_JNI_GETOBJECTFIELD_ENTRY(
2618 env, obj, (uintptr_t) fieldID);
2619 #endif /* USDT2 */
2620 oop o = JNIHandles::resolve_non_null(obj);
2621 Klass* k = o->klass();
2622 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
2623 // Keep JVMTI addition small and only check enabled flag here.
2624 // jni_GetField_probe() assumes that is okay to create handles.
2625 if (JvmtiExport::should_post_field_access()) {
2626 o = JvmtiExport::jni_GetField_probe(thread, obj, o, k, fieldID, false);
2627 }
2628 jobject ret = JNIHandles::make_local(env, o->obj_field(offset));
2629 #if INCLUDE_ALL_GCS
2630 // If G1 is enabled and we are accessing the value of the referent
2631 // field in a reference object then we need to register a non-null
2632 // referent with the SATB barrier.
2633 if (UseG1GC || (UseShenandoahGC && ShenandoahKeepAliveBarrier)) {
2634 bool needs_barrier = false;
2635
2636 if (ret != NULL &&
2637 offset == java_lang_ref_Reference::referent_offset &&
2638 InstanceKlass::cast(k)->reference_type() != REF_NONE) {
2639 assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
2640 needs_barrier = true;
2641 }
2642
2643 if (needs_barrier) {
2644 oop referent = JNIHandles::resolve(ret);
2645 G1SATBCardTableModRefBS::enqueue(referent);
2646 }
2647 }
2648 #endif // INCLUDE_ALL_GCS
2649 #ifndef USDT2
2650 DTRACE_PROBE1(hotspot_jni, GetObjectField__return, ret);
2651 #else /* USDT2 */
2652 HOTSPOT_JNI_GETOBJECTFIELD_RETURN(
2653 ret);
|