hotspot/src/share/vm/classfile/javaClasses.cpp
changeset 20378 a296c8e1c5d2
parent 20053 a12bd7991794
child 22186 c97a9d47d257
equal deleted inserted replaced
20377:393ee12eccc8 20378:a296c8e1c5d2
  1374   // Get strings and string lengths
  1374   // Get strings and string lengths
  1375   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
  1375   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
  1376   const char* klass_name  = holder->external_name();
  1376   const char* klass_name  = holder->external_name();
  1377   int buf_len = (int)strlen(klass_name);
  1377   int buf_len = (int)strlen(klass_name);
  1378 
  1378 
  1379   // pushing to the stack trace added one.
  1379   // The method id may point to an obsolete method, can't get more stack information
  1380   Method* method = holder->method_with_idnum(method_id);
  1380   Method* method = holder->method_with_idnum(method_id);
       
  1381   if (method == NULL) {
       
  1382     char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64);
       
  1383     // This is what the java code prints in this case - added Redefined
       
  1384     sprintf(buf, "\tat %s.null (Redefined)", klass_name);
       
  1385     return buf;
       
  1386   }
       
  1387 
  1381   char* method_name = method->name()->as_C_string();
  1388   char* method_name = method->name()->as_C_string();
  1382   buf_len += (int)strlen(method_name);
  1389   buf_len += (int)strlen(method_name);
  1383 
  1390 
  1384   char* source_file_name = NULL;
  1391   char* source_file_name = NULL;
  1385   if (version_matches(method, version)) {
  1392   if (version_matches(method, version)) {
  1771 
  1778 
  1772   oop element = java_lang_StackTraceElement::create(mirror, method, version, bci, CHECK_0);
  1779   oop element = java_lang_StackTraceElement::create(mirror, method, version, bci, CHECK_0);
  1773   return element;
  1780   return element;
  1774 }
  1781 }
  1775 
  1782 
  1776 oop java_lang_StackTraceElement::create(Handle mirror, int method_id, int version, int bci, TRAPS) {
  1783 oop java_lang_StackTraceElement::create(Handle mirror, int method_id,
       
  1784                                         int version, int bci, TRAPS) {
  1777   // Allocate java.lang.StackTraceElement instance
  1785   // Allocate java.lang.StackTraceElement instance
  1778   Klass* k = SystemDictionary::StackTraceElement_klass();
  1786   Klass* k = SystemDictionary::StackTraceElement_klass();
  1779   assert(k != NULL, "must be loaded in 1.4+");
  1787   assert(k != NULL, "must be loaded in 1.4+");
  1780   instanceKlassHandle ik (THREAD, k);
  1788   instanceKlassHandle ik (THREAD, k);
  1781   if (ik->should_be_initialized()) {
  1789   if (ik->should_be_initialized()) {
  1788   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
  1796   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
  1789   const char* str = holder->external_name();
  1797   const char* str = holder->external_name();
  1790   oop classname = StringTable::intern((char*) str, CHECK_0);
  1798   oop classname = StringTable::intern((char*) str, CHECK_0);
  1791   java_lang_StackTraceElement::set_declaringClass(element(), classname);
  1799   java_lang_StackTraceElement::set_declaringClass(element(), classname);
  1792 
  1800 
       
  1801   Method* method = holder->method_with_idnum(method_id);
       
  1802   // Method on stack may be obsolete because it was redefined so cannot be
       
  1803   // found by idnum.
       
  1804   if (method == NULL) {
       
  1805     // leave name and fileName null
       
  1806     java_lang_StackTraceElement::set_lineNumber(element(), -1);
       
  1807     return element();
       
  1808   }
       
  1809 
  1793   // Fill in method name
  1810   // Fill in method name
  1794   Method* method = holder->method_with_idnum(method_id);
       
  1795   oop methodname = StringTable::intern(method->name(), CHECK_0);
  1811   oop methodname = StringTable::intern(method->name(), CHECK_0);
  1796   java_lang_StackTraceElement::set_methodName(element(), methodname);
  1812   java_lang_StackTraceElement::set_methodName(element(), methodname);
  1797 
  1813 
  1798   if (!version_matches(method, version)) {
  1814   if (!version_matches(method, version)) {
  1799     // The method was redefined, accurate line number information isn't available
  1815     // The method was redefined, accurate line number information isn't available