30 #include "compiler/compileBroker.hpp" |
30 #include "compiler/compileBroker.hpp" |
31 #include "gc/shared/collectedHeap.inline.hpp" |
31 #include "gc/shared/collectedHeap.inline.hpp" |
32 #include "interpreter/bytecode.hpp" |
32 #include "interpreter/bytecode.hpp" |
33 #include "interpreter/interpreterRuntime.hpp" |
33 #include "interpreter/interpreterRuntime.hpp" |
34 #include "interpreter/linkResolver.hpp" |
34 #include "interpreter/linkResolver.hpp" |
|
35 #include "logging/log.hpp" |
35 #include "memory/resourceArea.hpp" |
36 #include "memory/resourceArea.hpp" |
36 #include "memory/universe.inline.hpp" |
37 #include "memory/universe.inline.hpp" |
37 #include "oops/instanceKlass.hpp" |
38 #include "oops/instanceKlass.hpp" |
|
39 #include "oops/method.hpp" |
38 #include "oops/objArrayOop.hpp" |
40 #include "oops/objArrayOop.hpp" |
39 #include "oops/oop.inline.hpp" |
41 #include "oops/oop.inline.hpp" |
40 #include "prims/methodHandles.hpp" |
42 #include "prims/methodHandles.hpp" |
41 #include "prims/nativeLookup.hpp" |
43 #include "prims/nativeLookup.hpp" |
42 #include "runtime/compilationPolicy.hpp" |
44 #include "runtime/compilationPolicy.hpp" |
726 } |
728 } |
727 |
729 |
728 return resolved_method; |
730 return resolved_method; |
729 } |
731 } |
730 |
732 |
|
733 static void trace_method_resolution(const char* prefix, |
|
734 KlassHandle klass, |
|
735 KlassHandle resolved_klass, |
|
736 const methodHandle& method, |
|
737 bool logitables, |
|
738 int index = -1) { |
|
739 #ifndef PRODUCT |
|
740 ResourceMark rm; |
|
741 outputStream* st; |
|
742 if (logitables) { |
|
743 st = LogHandle(itables)::trace_stream(); |
|
744 } else { |
|
745 st = LogHandle(vtables)::trace_stream(); |
|
746 } |
|
747 st->print("%s%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ", |
|
748 prefix, |
|
749 (klass.is_null() ? "<NULL>" : klass->internal_name()), |
|
750 (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()), |
|
751 Method::name_and_sig_as_C_string(resolved_klass(), |
|
752 method->name(), |
|
753 method->signature()), |
|
754 method->method_holder()->internal_name()); |
|
755 method->print_linkage_flags(st); |
|
756 if (index != -1) { |
|
757 st->print("vtable_index:%d", index); |
|
758 } |
|
759 st->cr(); |
|
760 #endif // PRODUCT |
|
761 } |
|
762 |
731 methodHandle LinkResolver::resolve_interface_method(const LinkInfo& link_info, |
763 methodHandle LinkResolver::resolve_interface_method(const LinkInfo& link_info, |
732 bool nostatics, TRAPS) { |
764 bool nostatics, TRAPS) { |
733 |
765 |
734 KlassHandle resolved_klass = link_info.resolved_klass(); |
766 KlassHandle resolved_klass = link_info.resolved_klass(); |
735 |
767 |
782 Method::name_and_sig_as_C_string(resolved_klass(), |
814 Method::name_and_sig_as_C_string(resolved_klass(), |
783 resolved_method->name(), resolved_method->signature())); |
815 resolved_method->name(), resolved_method->signature())); |
784 THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); |
816 THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); |
785 } |
817 } |
786 |
818 |
787 if (TraceItables && Verbose) { |
819 if (develop_log_is_enabled(Trace, itables)) { |
788 trace_method_resolution("invokeinterface resolved method: caller-class", |
820 trace_method_resolution("invokeinterface resolved method: caller-class", |
789 link_info.current_klass(), resolved_klass, resolved_method); |
821 link_info.current_klass(), resolved_klass, |
790 tty->cr(); |
822 resolved_method, true); |
791 } |
823 } |
792 |
824 |
793 return resolved_method; |
825 return resolved_method; |
794 } |
826 } |
795 |
827 |
1030 resolved_method->name(), |
1062 resolved_method->name(), |
1031 resolved_method->signature())); |
1063 resolved_method->signature())); |
1032 THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); |
1064 THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); |
1033 } |
1065 } |
1034 |
1066 |
1035 if (TraceItables && Verbose) { |
1067 if (develop_log_is_enabled(Trace, itables)) { |
1036 trace_method_resolution("invokespecial resolved method: caller-class:", |
1068 trace_method_resolution("invokespecial resolved method: caller-class:", |
1037 current_klass, resolved_klass, resolved_method); |
1069 current_klass, resolved_klass, resolved_method, true); |
1038 tty->cr(); |
|
1039 } |
1070 } |
1040 |
1071 |
1041 return resolved_method; |
1072 return resolved_method; |
1042 } |
1073 } |
1043 |
1074 |
1102 Method::name_and_sig_as_C_string(resolved_klass(), |
1133 Method::name_and_sig_as_C_string(resolved_klass(), |
1103 sel_method->name(), |
1134 sel_method->name(), |
1104 sel_method->signature())); |
1135 sel_method->signature())); |
1105 } |
1136 } |
1106 |
1137 |
1107 if (TraceItables && Verbose) { |
1138 if (develop_log_is_enabled(Trace, itables)) { |
1108 trace_method_resolution("invokespecial selected method: resolved-class:", |
1139 trace_method_resolution("invokespecial selected method: resolved-class:", |
1109 resolved_klass, resolved_klass, sel_method); |
1140 resolved_klass, resolved_klass, sel_method, true); |
1110 tty->cr(); |
|
1111 } |
1141 } |
1112 |
1142 |
1113 // setup result |
1143 // setup result |
1114 result.set_static(resolved_klass, sel_method, CHECK); |
1144 result.set_static(resolved_klass, sel_method, CHECK); |
1115 } |
1145 } |
1156 resolved_method->name(), |
1186 resolved_method->name(), |
1157 resolved_method->signature())); |
1187 resolved_method->signature())); |
1158 THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); |
1188 THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); |
1159 } |
1189 } |
1160 |
1190 |
1161 if (PrintVtables && Verbose) { |
1191 if (develop_log_is_enabled(Trace, vtables)) { |
1162 trace_method_resolution("invokevirtual resolved method: caller-class:", |
1192 trace_method_resolution("invokevirtual resolved method: caller-class:", |
1163 current_klass, resolved_klass, resolved_method); |
1193 current_klass, resolved_klass, resolved_method, false); |
1164 tty->cr(); |
|
1165 } |
1194 } |
1166 |
1195 |
1167 return resolved_method; |
1196 return resolved_method; |
1168 } |
1197 } |
1169 |
1198 |
1237 Method::name_and_sig_as_C_string(resolved_klass(), |
1266 Method::name_and_sig_as_C_string(resolved_klass(), |
1238 selected_method->name(), |
1267 selected_method->name(), |
1239 selected_method->signature())); |
1268 selected_method->signature())); |
1240 } |
1269 } |
1241 |
1270 |
1242 if (PrintVtables && Verbose) { |
1271 if (develop_log_is_enabled(Trace, vtables)) { |
1243 trace_method_resolution("invokevirtual selected method: receiver-class:", |
1272 trace_method_resolution("invokevirtual selected method: receiver-class:", |
1244 recv_klass, resolved_klass, selected_method); |
1273 recv_klass, resolved_klass, selected_method, |
1245 tty->print_cr("vtable_index:%d", vtable_index); |
1274 false, vtable_index); |
1246 } |
1275 } |
1247 // setup result |
1276 // setup result |
1248 result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK); |
1277 result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK); |
1249 } |
1278 } |
1250 |
1279 |
1336 Method::name_and_sig_as_C_string(recv_klass(), |
1365 Method::name_and_sig_as_C_string(recv_klass(), |
1337 sel_method->name(), |
1366 sel_method->name(), |
1338 sel_method->signature())); |
1367 sel_method->signature())); |
1339 } |
1368 } |
1340 |
1369 |
1341 if (TraceItables && Verbose) { |
1370 if (develop_log_is_enabled(Trace, itables)) { |
1342 trace_method_resolution("invokeinterface selected method: receiver-class", |
1371 trace_method_resolution("invokeinterface selected method: receiver-class", |
1343 recv_klass, resolved_klass, sel_method); |
1372 recv_klass, resolved_klass, sel_method, true); |
1344 tty->cr(); |
|
1345 } |
1373 } |
1346 // setup result |
1374 // setup result |
1347 if (!resolved_method->has_itable_index()) { |
1375 if (!resolved_method->has_itable_index()) { |
1348 int vtable_index = resolved_method->vtable_index(); |
1376 int vtable_index = resolved_method->vtable_index(); |
1349 assert(vtable_index == sel_method->vtable_index(), "sanity check"); |
1377 assert(vtable_index == sel_method->vtable_index(), "sanity check"); |
1586 THREAD); |
1614 THREAD); |
1587 wrap_invokedynamic_exception(CHECK); |
1615 wrap_invokedynamic_exception(CHECK); |
1588 result.set_handle(resolved_method, resolved_appendix, resolved_method_type, THREAD); |
1616 result.set_handle(resolved_method, resolved_appendix, resolved_method_type, THREAD); |
1589 wrap_invokedynamic_exception(CHECK); |
1617 wrap_invokedynamic_exception(CHECK); |
1590 } |
1618 } |
1591 |
|
1592 #ifndef PRODUCT |
|
1593 void LinkResolver::trace_method_resolution(const char* prefix, |
|
1594 KlassHandle klass, |
|
1595 KlassHandle resolved_klass, |
|
1596 const methodHandle& method) { |
|
1597 ResourceMark rm; |
|
1598 tty->print("%s%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ", |
|
1599 prefix, |
|
1600 (klass.is_null() ? "<NULL>" : klass->internal_name()), |
|
1601 (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()), |
|
1602 Method::name_and_sig_as_C_string(resolved_klass(), |
|
1603 method->name(), |
|
1604 method->signature()), |
|
1605 method->method_holder()->internal_name() |
|
1606 ); |
|
1607 method->access_flags().print_on(tty); |
|
1608 if (method->is_default_method()) { |
|
1609 tty->print("default "); |
|
1610 } |
|
1611 if (method->is_overpass()) { |
|
1612 tty->print("overpass "); |
|
1613 } |
|
1614 } |
|
1615 #endif // PRODUCT |
|