613 THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Method %s is not held by an interface, this case should be handled in Java code", method->name_and_sig_as_C_string())); 614 } 615 if (!InstanceKlass::cast(klass)->is_linked()) { 616 THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Class %s must be linked", klass->external_name())); 617 } 618 return LinkResolver::vtable_index_of_interface_method(klass, method); 619 C2V_END 620 621 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv *, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type)) 622 Klass* recv_klass = CompilerToVM::asKlass(receiver_jvmci_type); 623 Klass* caller_klass = CompilerToVM::asKlass(caller_jvmci_type); 624 Method* method = CompilerToVM::asMethod(jvmci_method); 625 626 if (recv_klass->is_array_klass() || (InstanceKlass::cast(recv_klass)->is_linked())) { 627 Klass* holder_klass = method->method_holder(); 628 Symbol* method_name = method->name(); 629 Symbol* method_signature = method->signature(); 630 631 if (holder_klass->is_interface()) { 632 // do link-time resolution to check all access rules. 633 LinkInfo link_info(holder_klass, method_name, method_signature, caller_klass, true); 634 methodHandle resolved_method = LinkResolver::linktime_resolve_interface_method_or_null(link_info); 635 if (resolved_method.is_null() || resolved_method->is_private()) { 636 return NULL; 637 } 638 assert(recv_klass->is_subtype_of(holder_klass), ""); 639 // do actual lookup 640 methodHandle sel_method = LinkResolver::lookup_instance_method_in_klasses(recv_klass, resolved_method->name(), resolved_method->signature(), CHECK_AND_CLEAR_0); 641 oop result = CompilerToVM::get_jvmci_method(sel_method, CHECK_NULL); 642 return JNIHandles::make_local(THREAD, result); 643 } else { 644 // do link-time resolution to check all access rules. 645 LinkInfo link_info(holder_klass, method_name, method_signature, caller_klass, true); 646 methodHandle resolved_method = LinkResolver::linktime_resolve_virtual_method_or_null(link_info); 647 if (resolved_method.is_null()) { 648 return NULL; 649 } 650 // do actual lookup (see LinkResolver::runtime_resolve_virtual_method) 651 int vtable_index = Method::invalid_vtable_index; 652 Method* selected_method; 653 654 if (resolved_method->method_holder()->is_interface()) { // miranda method 655 vtable_index = LinkResolver::vtable_index_of_interface_method(holder_klass, resolved_method); 656 assert(vtable_index >= 0 , "we should have valid vtable index at this point"); 657 658 InstanceKlass* inst = InstanceKlass::cast(recv_klass); 659 selected_method = inst->method_at_vtable(vtable_index); 660 } else { 661 // at this point we are sure that resolved_method is virtual and not 662 // a miranda method; therefore, it must have a valid vtable index. 663 assert(!resolved_method->has_itable_index(), ""); 664 vtable_index = resolved_method->vtable_index(); 665 // We could get a negative vtable_index for final methods, | 613 THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Method %s is not held by an interface, this case should be handled in Java code", method->name_and_sig_as_C_string())); 614 } 615 if (!InstanceKlass::cast(klass)->is_linked()) { 616 THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Class %s must be linked", klass->external_name())); 617 } 618 return LinkResolver::vtable_index_of_interface_method(klass, method); 619 C2V_END 620 621 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv *, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type)) 622 Klass* recv_klass = CompilerToVM::asKlass(receiver_jvmci_type); 623 Klass* caller_klass = CompilerToVM::asKlass(caller_jvmci_type); 624 Method* method = CompilerToVM::asMethod(jvmci_method); 625 626 if (recv_klass->is_array_klass() || (InstanceKlass::cast(recv_klass)->is_linked())) { 627 Klass* holder_klass = method->method_holder(); 628 Symbol* method_name = method->name(); 629 Symbol* method_signature = method->signature(); 630 631 if (holder_klass->is_interface()) { 632 // do link-time resolution to check all access rules. 633 LinkInfo link_info(holder_klass, method_name, method_signature, caller_klass); 634 methodHandle resolved_method = LinkResolver::linktime_resolve_interface_method_or_null(link_info); 635 if (resolved_method.is_null() || resolved_method->is_private()) { 636 return NULL; 637 } 638 assert(recv_klass->is_subtype_of(holder_klass), ""); 639 // do actual lookup 640 methodHandle sel_method = LinkResolver::lookup_instance_method_in_klasses(recv_klass, resolved_method->name(), resolved_method->signature(), CHECK_AND_CLEAR_0); 641 oop result = CompilerToVM::get_jvmci_method(sel_method, CHECK_NULL); 642 return JNIHandles::make_local(THREAD, result); 643 } else { 644 // do link-time resolution to check all access rules. 645 LinkInfo link_info(holder_klass, method_name, method_signature, caller_klass); 646 methodHandle resolved_method = LinkResolver::linktime_resolve_virtual_method_or_null(link_info); 647 if (resolved_method.is_null()) { 648 return NULL; 649 } 650 // do actual lookup (see LinkResolver::runtime_resolve_virtual_method) 651 int vtable_index = Method::invalid_vtable_index; 652 Method* selected_method; 653 654 if (resolved_method->method_holder()->is_interface()) { // miranda method 655 vtable_index = LinkResolver::vtable_index_of_interface_method(holder_klass, resolved_method); 656 assert(vtable_index >= 0 , "we should have valid vtable index at this point"); 657 658 InstanceKlass* inst = InstanceKlass::cast(recv_klass); 659 selected_method = inst->method_at_vtable(vtable_index); 660 } else { 661 // at this point we are sure that resolved_method is virtual and not 662 // a miranda method; therefore, it must have a valid vtable index. 663 assert(!resolved_method->has_itable_index(), ""); 664 vtable_index = resolved_method->vtable_index(); 665 // We could get a negative vtable_index for final methods, |