1.1 --- a/src/share/vm/prims/jvm.cpp Mon Mar 23 10:42:20 2009 -0400 1.2 +++ b/src/share/vm/prims/jvm.cpp Wed Mar 25 13:09:28 2009 -0400 1.3 @@ -64,6 +64,7 @@ 1.4 ResourceMark rm; 1.5 int line_number = -1; 1.6 const char * source_file = NULL; 1.7 + const char * trace = "explicit"; 1.8 klassOop caller = NULL; 1.9 JavaThread* jthread = JavaThread::current(); 1.10 if (jthread->has_last_Java_frame()) { 1.11 @@ -107,12 +108,21 @@ 1.12 (last_caller->name() == vmSymbols::loadClassInternal_name() || 1.13 last_caller->name() == vmSymbols::loadClass_name())) { 1.14 found_it = true; 1.15 + } else if (!vfst.at_end()) { 1.16 + if (vfst.method()->is_native()) { 1.17 + // JNI call 1.18 + found_it = true; 1.19 + } 1.20 } 1.21 if (found_it && !vfst.at_end()) { 1.22 // found the caller 1.23 caller = vfst.method()->method_holder(); 1.24 line_number = vfst.method()->line_number_from_bci(vfst.bci()); 1.25 - symbolOop s = instanceKlass::cast(vfst.method()->method_holder())->source_file_name(); 1.26 + if (line_number == -1) { 1.27 + // show method name if it's a native method 1.28 + trace = vfst.method()->name_and_sig_as_C_string(); 1.29 + } 1.30 + symbolOop s = instanceKlass::cast(caller)->source_file_name(); 1.31 if (s != NULL) { 1.32 source_file = s->as_C_string(); 1.33 } 1.34 @@ -124,15 +134,15 @@ 1.35 const char * to = Klass::cast(to_class)->external_name(); 1.36 // print in a single call to reduce interleaving between threads 1.37 if (source_file != NULL) { 1.38 - tty->print("RESOLVE %s %s %s:%d (explicit)\n", from, to, source_file, line_number); 1.39 + tty->print("RESOLVE %s %s %s:%d (%s)\n", from, to, source_file, line_number, trace); 1.40 } else { 1.41 - tty->print("RESOLVE %s %s (explicit)\n", from, to); 1.42 + tty->print("RESOLVE %s %s (%s)\n", from, to, trace); 1.43 } 1.44 } 1.45 } 1.46 } 1.47 1.48 -static void trace_class_resolution(klassOop to_class) { 1.49 +void trace_class_resolution(klassOop to_class) { 1.50 EXCEPTION_MARK; 1.51 trace_class_resolution_impl(to_class, THREAD); 1.52 if (HAS_PENDING_EXCEPTION) { 1.53 @@ -3213,8 +3223,12 @@ 1.54 } 1.55 Handle h_loader(THREAD, loader); 1.56 Handle h_prot (THREAD, protection_domain); 1.57 - return find_class_from_class_loader(env, name, true, h_loader, h_prot, 1.58 - false, thread); 1.59 + jclass result = find_class_from_class_loader(env, name, true, h_loader, h_prot, 1.60 + false, thread); 1.61 + if (TraceClassResolution && result != NULL) { 1.62 + trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result))); 1.63 + } 1.64 + return result; 1.65 JVM_END 1.66 1.67