--- old/src/share/vm/interpreter/linkResolver.cpp 2015-12-04 17:51:25.306421856 -0500 +++ new/src/share/vm/interpreter/linkResolver.cpp 2015-12-04 17:51:24.101132164 -0500 @@ -31,9 +31,11 @@ #include "interpreter/bytecode.hpp" #include "interpreter/interpreterRuntime.hpp" #include "interpreter/linkResolver.hpp" +#include "logging/log.hpp" #include "memory/resourceArea.hpp" #include "memory/universe.inline.hpp" #include "oops/instanceKlass.hpp" +#include "oops/method.hpp" #include "oops/objArrayOop.hpp" #include "oops/oop.inline.hpp" #include "prims/methodHandles.hpp" @@ -727,6 +729,36 @@ return resolved_method; } +static void trace_method_resolution(const char* prefix, + KlassHandle klass, + KlassHandle resolved_klass, + const methodHandle& method, + bool logitables, + int index = -1) { +#ifndef PRODUCT + ResourceMark rm; + outputStream* st; + if (logitables) { + st = LogHandle(itables)::trace_stream(); + } else { + st = LogHandle(vtables)::trace_stream(); + } + st->print("%s%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ", + prefix, + (klass.is_null() ? "" : klass->internal_name()), + (resolved_klass.is_null() ? "" : resolved_klass->internal_name()), + Method::name_and_sig_as_C_string(resolved_klass(), + method->name(), + method->signature()), + method->method_holder()->internal_name()); + method->print_linkage_flags(st); + if (index != -1) { + st->print("vtable_index:%d", index); + } + st->cr(); +#endif // PRODUCT +} + methodHandle LinkResolver::resolve_interface_method(const LinkInfo& link_info, bool nostatics, TRAPS) { @@ -783,10 +815,10 @@ THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); } - if (TraceItables && Verbose) { + if (develop_log_is_enabled(Trace, itables)) { trace_method_resolution("invokeinterface resolved method: caller-class", - link_info.current_klass(), resolved_klass, resolved_method); - tty->cr(); + link_info.current_klass(), resolved_klass, + resolved_method, true); } return resolved_method; @@ -1031,10 +1063,9 @@ THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); } - if (TraceItables && Verbose) { + if (develop_log_is_enabled(Trace, itables)) { trace_method_resolution("invokespecial resolved method: caller-class:", - current_klass, resolved_klass, resolved_method); - tty->cr(); + current_klass, resolved_klass, resolved_method, true); } return resolved_method; @@ -1103,10 +1134,9 @@ sel_method->signature())); } - if (TraceItables && Verbose) { + if (develop_log_is_enabled(Trace, itables)) { trace_method_resolution("invokespecial selected method: resolved-class:", - resolved_klass, resolved_klass, sel_method); - tty->cr(); + resolved_klass, resolved_klass, sel_method, true); } // setup result @@ -1157,10 +1187,9 @@ THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); } - if (PrintVtables && Verbose) { + if (develop_log_is_enabled(Trace, vtables)) { trace_method_resolution("invokevirtual resolved method: caller-class:", - current_klass, resolved_klass, resolved_method); - tty->cr(); + current_klass, resolved_klass, resolved_method, false); } return resolved_method; @@ -1238,10 +1267,10 @@ selected_method->signature())); } - if (PrintVtables && Verbose) { + if (develop_log_is_enabled(Trace, vtables)) { trace_method_resolution("invokevirtual selected method: receiver-class:", - recv_klass, resolved_klass, selected_method); - tty->print_cr("vtable_index:%d", vtable_index); + recv_klass, resolved_klass, selected_method, + false, vtable_index); } // setup result result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK); @@ -1337,10 +1366,9 @@ sel_method->signature())); } - if (TraceItables && Verbose) { + if (develop_log_is_enabled(Trace, itables)) { trace_method_resolution("invokeinterface selected method: receiver-class", - recv_klass, resolved_klass, sel_method); - tty->cr(); + recv_klass, resolved_klass, sel_method, true); } // setup result if (!resolved_method->has_itable_index()) { @@ -1587,28 +1615,3 @@ result.set_handle(resolved_method, resolved_appendix, resolved_method_type, THREAD); wrap_invokedynamic_exception(CHECK); } - -#ifndef PRODUCT -void LinkResolver::trace_method_resolution(const char* prefix, - KlassHandle klass, - KlassHandle resolved_klass, - const methodHandle& method) { - ResourceMark rm; - tty->print("%s%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ", - prefix, - (klass.is_null() ? "" : klass->internal_name()), - (resolved_klass.is_null() ? "" : resolved_klass->internal_name()), - Method::name_and_sig_as_C_string(resolved_klass(), - method->name(), - method->signature()), - method->method_holder()->internal_name() - ); - method->access_flags().print_on(tty); - if (method->is_default_method()) { - tty->print("default "); - } - if (method->is_overpass()) { - tty->print("overpass "); - } -} -#endif // PRODUCT