Merge

Sat, 05 Oct 2013 00:58:43 +0200

author
coleenp
date
Sat, 05 Oct 2013 00:58:43 +0200
changeset 5839
a1fd44b003c7
parent 5838
675ffabf3798
parent 5835
07f8c2a453f8
child 5840
4212bfb33d76

Merge

     1.1 --- a/src/share/vm/classfile/javaClasses.cpp	Wed Oct 02 09:18:56 2013 -0700
     1.2 +++ b/src/share/vm/classfile/javaClasses.cpp	Sat Oct 05 00:58:43 2013 +0200
     1.3 @@ -1376,8 +1376,15 @@
     1.4    const char* klass_name  = holder->external_name();
     1.5    int buf_len = (int)strlen(klass_name);
     1.6  
     1.7 -  // pushing to the stack trace added one.
     1.8 +  // The method id may point to an obsolete method, can't get more stack information
     1.9    Method* method = holder->method_with_idnum(method_id);
    1.10 +  if (method == NULL) {
    1.11 +    char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64);
    1.12 +    // This is what the java code prints in this case - added Redefined
    1.13 +    sprintf(buf, "\tat %s.null (Redefined)", klass_name);
    1.14 +    return buf;
    1.15 +  }
    1.16 +
    1.17    char* method_name = method->name()->as_C_string();
    1.18    buf_len += (int)strlen(method_name);
    1.19  
    1.20 @@ -1773,7 +1780,8 @@
    1.21    return element;
    1.22  }
    1.23  
    1.24 -oop java_lang_StackTraceElement::create(Handle mirror, int method_id, int version, int bci, TRAPS) {
    1.25 +oop java_lang_StackTraceElement::create(Handle mirror, int method_id,
    1.26 +                                        int version, int bci, TRAPS) {
    1.27    // Allocate java.lang.StackTraceElement instance
    1.28    Klass* k = SystemDictionary::StackTraceElement_klass();
    1.29    assert(k != NULL, "must be loaded in 1.4+");
    1.30 @@ -1790,8 +1798,16 @@
    1.31    oop classname = StringTable::intern((char*) str, CHECK_0);
    1.32    java_lang_StackTraceElement::set_declaringClass(element(), classname);
    1.33  
    1.34 +  Method* method = holder->method_with_idnum(method_id);
    1.35 +  // Method on stack may be obsolete because it was redefined so cannot be
    1.36 +  // found by idnum.
    1.37 +  if (method == NULL) {
    1.38 +    // leave name and fileName null
    1.39 +    java_lang_StackTraceElement::set_lineNumber(element(), -1);
    1.40 +    return element();
    1.41 +  }
    1.42 +
    1.43    // Fill in method name
    1.44 -  Method* method = holder->method_with_idnum(method_id);
    1.45    oop methodname = StringTable::intern(method->name(), CHECK_0);
    1.46    java_lang_StackTraceElement::set_methodName(element(), methodname);
    1.47  
     2.1 --- a/src/share/vm/prims/jvmtiRedefineClasses.cpp	Wed Oct 02 09:18:56 2013 -0700
     2.2 +++ b/src/share/vm/prims/jvmtiRedefineClasses.cpp	Sat Oct 05 00:58:43 2013 +0200
     2.3 @@ -2931,7 +2931,8 @@
     2.4        old_method->set_is_obsolete();
     2.5        obsolete_count++;
     2.6  
     2.7 -      // obsolete methods need a unique idnum
     2.8 +      // obsolete methods need a unique idnum so they become new entries in
     2.9 +      // the jmethodID cache in InstanceKlass
    2.10        u2 num = InstanceKlass::cast(_the_class_oop)->next_method_idnum();
    2.11        if (num != ConstMethod::UNSET_IDNUM) {
    2.12          old_method->set_method_idnum(num);

mercurial