772 return NULL;
773 }
774 return CURRENT_THREAD_ENV->get_method(target());
775 }
776
777 // ------------------------------------------------------------------
778 // ciMethod::resolve_invoke
779 //
780 // Given a known receiver klass, find the target for the call.
781 // Return NULL if the call has no target or the target is abstract.
782 ciMethod* ciMethod::resolve_invoke(ciKlass* caller, ciKlass* exact_receiver, bool check_access) {
783 check_is_loaded();
784 VM_ENTRY_MARK;
785
786 KlassHandle caller_klass (THREAD, caller->get_Klass());
787 KlassHandle h_recv (THREAD, exact_receiver->get_Klass());
788 KlassHandle h_resolved (THREAD, holder()->get_Klass());
789 Symbol* h_name = name()->get_symbol();
790 Symbol* h_signature = signature()->get_symbol();
791
792 LinkInfo link_info(h_resolved, h_name, h_signature, caller_klass, check_access);
793 methodHandle m;
794 // Only do exact lookup if receiver klass has been linked. Otherwise,
795 // the vtable has not been setup, and the LinkResolver will fail.
796 if (h_recv->is_array_klass()
797 ||
798 InstanceKlass::cast(h_recv())->is_linked() && !exact_receiver->is_interface()) {
799 if (holder()->is_interface()) {
800 m = LinkResolver::resolve_interface_call_or_null(h_recv, link_info);
801 } else {
802 m = LinkResolver::resolve_virtual_call_or_null(h_recv, link_info);
803 }
804 }
805
806 if (m.is_null()) {
807 // Return NULL only if there was a problem with lookup (uninitialized class, etc.)
808 return NULL;
809 }
810
811 ciMethod* result = this;
812 if (m() != get_Method()) {
826 // ciMethod::resolve_vtable_index
827 //
828 // Given a known receiver klass, find the vtable index for the call.
829 // Return Method::invalid_vtable_index if the vtable_index is unknown.
830 int ciMethod::resolve_vtable_index(ciKlass* caller, ciKlass* receiver) {
831 check_is_loaded();
832
833 int vtable_index = Method::invalid_vtable_index;
834 // Only do lookup if receiver klass has been linked. Otherwise,
835 // the vtable has not been setup, and the LinkResolver will fail.
836 if (!receiver->is_interface()
837 && (!receiver->is_instance_klass() ||
838 receiver->as_instance_klass()->is_linked())) {
839 VM_ENTRY_MARK;
840
841 KlassHandle caller_klass (THREAD, caller->get_Klass());
842 KlassHandle h_recv (THREAD, receiver->get_Klass());
843 Symbol* h_name = name()->get_symbol();
844 Symbol* h_signature = signature()->get_symbol();
845
846 LinkInfo link_info(h_recv, h_name, h_signature, caller_klass);
847 vtable_index = LinkResolver::resolve_virtual_vtable_index(h_recv, link_info);
848 if (vtable_index == Method::nonvirtual_vtable_index) {
849 // A statically bound method. Return "no such index".
850 vtable_index = Method::invalid_vtable_index;
851 }
852 }
853
854 return vtable_index;
855 }
856
857 // ------------------------------------------------------------------
858 // ciMethod::interpreter_call_site_count
859 int ciMethod::interpreter_call_site_count(int bci) {
860 if (method_data() != NULL) {
861 ResourceMark rm;
862 ciProfileData* data = method_data()->bci_to_data(bci);
863 if (data != NULL && data->is_CounterData()) {
864 return scale_count(data->as_CounterData()->count());
865 }
866 }
|
772 return NULL;
773 }
774 return CURRENT_THREAD_ENV->get_method(target());
775 }
776
777 // ------------------------------------------------------------------
778 // ciMethod::resolve_invoke
779 //
780 // Given a known receiver klass, find the target for the call.
781 // Return NULL if the call has no target or the target is abstract.
782 ciMethod* ciMethod::resolve_invoke(ciKlass* caller, ciKlass* exact_receiver, bool check_access) {
783 check_is_loaded();
784 VM_ENTRY_MARK;
785
786 KlassHandle caller_klass (THREAD, caller->get_Klass());
787 KlassHandle h_recv (THREAD, exact_receiver->get_Klass());
788 KlassHandle h_resolved (THREAD, holder()->get_Klass());
789 Symbol* h_name = name()->get_symbol();
790 Symbol* h_signature = signature()->get_symbol();
791
792 LinkInfo link_info(h_resolved, h_name, h_signature, caller_klass, NULL, check_access);
793 methodHandle m;
794 // Only do exact lookup if receiver klass has been linked. Otherwise,
795 // the vtable has not been setup, and the LinkResolver will fail.
796 if (h_recv->is_array_klass()
797 ||
798 InstanceKlass::cast(h_recv())->is_linked() && !exact_receiver->is_interface()) {
799 if (holder()->is_interface()) {
800 m = LinkResolver::resolve_interface_call_or_null(h_recv, link_info);
801 } else {
802 m = LinkResolver::resolve_virtual_call_or_null(h_recv, link_info);
803 }
804 }
805
806 if (m.is_null()) {
807 // Return NULL only if there was a problem with lookup (uninitialized class, etc.)
808 return NULL;
809 }
810
811 ciMethod* result = this;
812 if (m() != get_Method()) {
826 // ciMethod::resolve_vtable_index
827 //
828 // Given a known receiver klass, find the vtable index for the call.
829 // Return Method::invalid_vtable_index if the vtable_index is unknown.
830 int ciMethod::resolve_vtable_index(ciKlass* caller, ciKlass* receiver) {
831 check_is_loaded();
832
833 int vtable_index = Method::invalid_vtable_index;
834 // Only do lookup if receiver klass has been linked. Otherwise,
835 // the vtable has not been setup, and the LinkResolver will fail.
836 if (!receiver->is_interface()
837 && (!receiver->is_instance_klass() ||
838 receiver->as_instance_klass()->is_linked())) {
839 VM_ENTRY_MARK;
840
841 KlassHandle caller_klass (THREAD, caller->get_Klass());
842 KlassHandle h_recv (THREAD, receiver->get_Klass());
843 Symbol* h_name = name()->get_symbol();
844 Symbol* h_signature = signature()->get_symbol();
845
846 LinkInfo link_info(h_recv, h_name, h_signature, caller_klass, NULL);
847 vtable_index = LinkResolver::resolve_virtual_vtable_index(h_recv, link_info);
848 if (vtable_index == Method::nonvirtual_vtable_index) {
849 // A statically bound method. Return "no such index".
850 vtable_index = Method::invalid_vtable_index;
851 }
852 }
853
854 return vtable_index;
855 }
856
857 // ------------------------------------------------------------------
858 // ciMethod::interpreter_call_site_count
859 int ciMethod::interpreter_call_site_count(int bci) {
860 if (method_data() != NULL) {
861 ResourceMark rm;
862 ciProfileData* data = method_data()->bci_to_data(bci);
863 if (data != NULL && data->is_CounterData()) {
864 return scale_count(data->as_CounterData()->count());
865 }
866 }
|