src/share/vm/prims/jni.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
8014013 Cdiff src/share/vm/prims/jni.cpp
src/share/vm/prims/jni.cpp
Print this page
*** 1334,1343 ****
--- 1334,1344 ----
// non-interface call -- for that little speed boost, don't handlize
debug_only(No_Safepoint_Verifier nosafepoint;)
if (call_type == JNI_VIRTUAL) {
// jni_GetMethodID makes sure class is linked and initialized
// so m should have a valid vtable index.
+ assert(!m->has_itable_index(), "");
int vtbl_index = m->vtable_index();
if (vtbl_index != Method::nonvirtual_vtable_index) {
Klass* k = h_recv->klass();
// k might be an arrayKlassOop but all vtables start at
// the same place. The cast is to avoid virtual call and assertion.
*** 1353,1368 ****
}
} else {
// interface call
KlassHandle h_holder(THREAD, holder);
! int itbl_index = m->cached_itable_index();
! if (itbl_index == -1) {
! itbl_index = klassItable::compute_itable_index(m);
! m->set_cached_itable_index(itbl_index);
! // the above may have grabbed a lock, 'm' and anything non-handlized can't be used again
! }
Klass* k = h_recv->klass();
selected_method = InstanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK);
}
}
--- 1354,1364 ----
}
} else {
// interface call
KlassHandle h_holder(THREAD, holder);
! int itbl_index = m->itable_index();
Klass* k = h_recv->klass();
selected_method = InstanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK);
}
}
src/share/vm/prims/jni.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File