< prev index next >
src/hotspot/share/interpreter/bytecodeInterpreter.cpp
Print this page
@ rev 50381 : 8203188: Add JEP-181 support to the Zero interpreter
| Reviewed-by: dholmes, chrisphi
o rev 50380 : Aphs' tracer code for JDK 11.
|
~
*** 2570,2584 ****
}
istate->set_msg(call_method);
// Special case of invokeinterface called for virtual method of
! // java.lang.Object. See cpCacheOop.cpp for details.
! // This code isn't produced by javac, but could be produced by
! // another compliant java compiler.
if (cache->is_forced_virtual()) {
- Method* callee;
CHECK_NULL(STACK_OBJECT(-(cache->parameter_size())));
if (cache->is_vfinal()) {
callee = cache->f2_as_vfinal_method();
// Profile 'special case of invokeinterface' final call.
BI_PROFILE_UPDATE_FINALCALL();
--- 2570,2582 ----
}
istate->set_msg(call_method);
// Special case of invokeinterface called for virtual method of
! // java.lang.Object. See cpCache.cpp for details.
! Method* callee = NULL;
if (cache->is_forced_virtual()) {
CHECK_NULL(STACK_OBJECT(-(cache->parameter_size())));
if (cache->is_vfinal()) {
callee = cache->f2_as_vfinal_method();
// Profile 'special case of invokeinterface' final call.
BI_PROFILE_UPDATE_FINALCALL();
*** 2591,2600 ****
--- 2589,2621 ----
Klass* rcvrKlass = rcvr->klass();
callee = (Method*) rcvrKlass->method_at_vtable(cache->f2_as_index());
// Profile 'special case of invokeinterface' virtual call.
BI_PROFILE_UPDATE_VIRTUALCALL(rcvrKlass);
}
+ } else if (cache->is_vfinal()) {
+ // private interface method invocations
+ //
+ // Ensure receiver class actually implements
+ // the resolved interface class. The link resolver
+ // does this, but only for the first time this
+ // interface is being called.
+ int parms = cache->parameter_size();
+ oop rcvr = STACK_OBJECT(-parms);
+ CHECK_NULL(rcvr);
+ Klass* recv_klass = rcvr->klass();
+ Klass* resolved_klass = cache->f1_as_klass();
+ if (!recv_klass->is_subtype_of(resolved_klass)) {
+ ResourceMark rm(THREAD);
+ char buf[200];
+ jio_snprintf(buf, sizeof(buf), "Class %s does not implement the requested interface %s",
+ recv_klass->external_name(),
+ resolved_klass->external_name());
+ VM_JAVA_ERROR(vmSymbols::java_lang_IncompatibleClassChangeError(), buf, note_no_trap);
+ }
+ callee = cache->f2_as_vfinal_method();
+ }
+ if (callee != NULL) {
istate->set_callee(callee);
istate->set_callee_entry_point(callee->from_interpreted_entry());
#ifdef VM_JVMTI
if (JvmtiExport::can_post_interpreter_events() && THREAD->is_interp_only_mode()) {
istate->set_callee_entry_point(callee->interpreter_entry());
*** 2603,2613 ****
istate->set_bcp_advance(5);
UPDATE_PC_AND_RETURN(0); // I'll be back...
}
// this could definitely be cleaned up QQQ
- Method* callee;
Method *interface_method = cache->f2_as_interface_method();
InstanceKlass* iclass = interface_method->method_holder();
// get receiver
int parms = cache->parameter_size();
--- 2624,2633 ----
< prev index next >