--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp Thu Jan 07 16:25:53 2016 +0100
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Thu Jan 07 13:53:20 2016 -0500
@@ -32,9 +32,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"
@@ -728,6 +730,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() ? "<NULL>" : klass->internal_name()),
+ (resolved_klass.is_null() ? "<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) {
@@ -784,10 +816,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;
@@ -1032,10 +1064,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;
@@ -1104,10 +1135,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
@@ -1158,10 +1188,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;
@@ -1239,10 +1268,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);
@@ -1338,10 +1367,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()) {
@@ -1588,28 +1616,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() ? "<NULL>" : klass->internal_name()),
- (resolved_klass.is_null() ? "<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