src/share/vm/prims/jvm.cpp

changeset 1092
715dceaa89b7
parent 1014
0fbdb4381b99
child 1111
d3676b4cb78c
     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  

mercurial