mirror of
https://github.com/openjdk/jdk.git
synced 2026-03-16 19:03:22 +00:00
8194739: Zero port of 8174962: Better interface invocations
Reviewed-by: adinn, coleenp
This commit is contained in:
parent
d017b5b2f5
commit
22c23d5081
@ -183,3 +183,9 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) {
|
||||
// This is just a stub.
|
||||
}
|
||||
#endif //PRODUCT
|
||||
|
||||
@ -2535,13 +2535,35 @@ run:
|
||||
|
||||
// this could definitely be cleaned up QQQ
|
||||
Method* callee;
|
||||
Klass* iclass = cache->f1_as_klass();
|
||||
// InstanceKlass* interface = (InstanceKlass*) iclass;
|
||||
Method *interface_method = cache->f2_as_interface_method();
|
||||
InstanceKlass* iclass = interface_method->method_holder();
|
||||
|
||||
// get receiver
|
||||
int parms = cache->parameter_size();
|
||||
oop rcvr = STACK_OBJECT(-parms);
|
||||
CHECK_NULL(rcvr);
|
||||
InstanceKlass* int2 = (InstanceKlass*) rcvr->klass();
|
||||
|
||||
// Receiver subtype check against resolved interface klass (REFC).
|
||||
{
|
||||
Klass* refc = cache->f1_as_klass();
|
||||
itableOffsetEntry* scan;
|
||||
for (scan = (itableOffsetEntry*) int2->start_of_itable();
|
||||
scan->interface_klass() != NULL;
|
||||
scan++) {
|
||||
if (scan->interface_klass() == refc) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Check that the entry is non-null. A null entry means
|
||||
// that the receiver class doesn't implement the
|
||||
// interface, and wasn't the same as when the caller was
|
||||
// compiled.
|
||||
if (scan->interface_klass() == NULL) {
|
||||
VM_JAVA_ERROR(vmSymbols::java_lang_IncompatibleClassChangeError(), "", note_no_trap);
|
||||
}
|
||||
}
|
||||
|
||||
itableOffsetEntry* ki = (itableOffsetEntry*) int2->start_of_itable();
|
||||
int i;
|
||||
for ( i = 0 ; i < int2->itable_length() ; i++, ki++ ) {
|
||||
@ -2553,7 +2575,8 @@ run:
|
||||
if (i == int2->itable_length()) {
|
||||
VM_JAVA_ERROR(vmSymbols::java_lang_IncompatibleClassChangeError(), "", note_no_trap);
|
||||
}
|
||||
int mindex = cache->f2_as_index();
|
||||
int mindex = interface_method->itable_index();
|
||||
|
||||
itableMethodEntry* im = ki->first_method_entry(rcvr->klass());
|
||||
callee = im[mindex].method();
|
||||
if (callee == NULL) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user