< prev index next >

src/share/vm/jvmci/jvmciCompilerToVM.cpp

Print this page




 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,


< prev index next >