src/share/vm/classfile/javaClasses.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 8087315.01 Sdiff src/share/vm/classfile

src/share/vm/classfile/javaClasses.cpp

Print this page




1451 
1452     if (_index >= trace_chunk_size) {
1453       methodHandle mhandle(THREAD, method);
1454       expand(CHECK);
1455       method = mhandle();
1456     }
1457 
1458     _methods->short_at_put(_index, method->orig_method_idnum());
1459     _bcis->int_at_put(_index, merge_bci_and_version(bci, method->constants()->version()));
1460     _cprefs->short_at_put(_index, method->name_index());
1461 
1462     // We need to save the mirrors in the backtrace to keep the class
1463     // from being unloaded while we still have this stack trace.
1464     assert(method->method_holder()->java_mirror() != NULL, "never push null for mirror");
1465     _mirrors->obj_at_put(_index, method->method_holder()->java_mirror());
1466     _index++;
1467   }
1468 
1469 };
1470 













1471 // Print stack trace element to resource allocated buffer
1472 char* java_lang_Throwable::print_stack_element_to_buffer(Handle mirror,
1473                                   int method_id, int version, int bci, int cpref) {
1474 
1475   // Get strings and string lengths
1476   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
1477   const char* klass_name  = holder->external_name();
1478   int buf_len = (int)strlen(klass_name);
1479 
1480   Method* method = holder->method_with_orig_idnum(method_id, version);
1481 
1482   // The method can be NULL if the requested class version is gone
1483   Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref);
1484   char* method_name = sym->as_C_string();
1485   buf_len += (int)strlen(method_name);
1486 
1487   // Use specific ik version as a holder since the mirror might
1488   // refer to version that is now obsolete and no longer accessible
1489   // via the previous versions list.
1490   holder = holder->get_klass_version(version);
1491   char* source_file_name = NULL;
1492   if (holder != NULL) {
1493     Symbol* source = holder->source_file_name();
1494     if (source != NULL) {
1495       source_file_name = source->as_C_string();
1496       buf_len += (int)strlen(source_file_name);
1497     }
1498   }
1499 
1500   // Allocate temporary buffer with extra space for formatting and line number
1501   char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64);
1502 
1503   // Print stack trace line in buffer
1504   sprintf(buf, "\tat %s.%s", klass_name, method_name);
1505 
1506   if (!version_matches(method, version)) {
1507     strcat(buf, "(Redefined)");
1508   } else {
1509     int line_number = get_line_number(method, bci);
1510     if (line_number == -2) {
1511       strcat(buf, "(Native Method)");
1512     } else {
1513       if (source_file_name != NULL && (line_number != -1)) {
1514         // Sourcename and linenumber
1515         sprintf(buf + (int)strlen(buf), "(%s:%d)", source_file_name, line_number);
1516       } else if (source_file_name != NULL) {
1517         // Just sourcename
1518         sprintf(buf + (int)strlen(buf), "(%s)", source_file_name);


1892   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
1893   const char* str = holder->external_name();
1894   oop classname = StringTable::intern((char*) str, CHECK_0);
1895   java_lang_StackTraceElement::set_declaringClass(element(), classname);
1896 
1897   Method* method = holder->method_with_orig_idnum(method_id, version);
1898 
1899   // The method can be NULL if the requested class version is gone
1900   Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref);
1901 
1902   // Fill in method name
1903   oop methodname = StringTable::intern(sym, CHECK_0);
1904   java_lang_StackTraceElement::set_methodName(element(), methodname);
1905 
1906   if (!version_matches(method, version)) {
1907     // The method was redefined, accurate line number information isn't available
1908     java_lang_StackTraceElement::set_fileName(element(), NULL);
1909     java_lang_StackTraceElement::set_lineNumber(element(), -1);
1910   } else {
1911     // Fill in source file name and line number.
1912     // Use specific ik version as a holder since the mirror might
1913     // refer to version that is now obsolete and no longer accessible
1914     // via the previous versions list.
1915     holder = holder->get_klass_version(version);
1916     assert(holder != NULL, "sanity check");
1917     Symbol* source = holder->source_file_name();
1918     if (ShowHiddenFrames && source == NULL)
1919       source = vmSymbols::unknown_class_name();
1920     oop filename = StringTable::intern(source, CHECK_0);
1921     java_lang_StackTraceElement::set_fileName(element(), filename);
1922 
1923     int line_number = get_line_number(method, bci);
1924     java_lang_StackTraceElement::set_lineNumber(element(), line_number);
1925   }
1926   return element();
1927 }
1928 
1929 oop java_lang_StackTraceElement::create(methodHandle method, int bci, TRAPS) {
1930   Handle mirror (THREAD, method->method_holder()->java_mirror());
1931   int method_id = method->orig_method_idnum();
1932   int cpref = method->name_index();
1933   return create(mirror, method_id, method->constants()->version(), bci, cpref, THREAD);
1934 }
1935 
1936 void java_lang_reflect_AccessibleObject::compute_offsets() {
1937   Klass* k = SystemDictionary::reflect_AccessibleObject_klass();




1451 
1452     if (_index >= trace_chunk_size) {
1453       methodHandle mhandle(THREAD, method);
1454       expand(CHECK);
1455       method = mhandle();
1456     }
1457 
1458     _methods->short_at_put(_index, method->orig_method_idnum());
1459     _bcis->int_at_put(_index, merge_bci_and_version(bci, method->constants()->version()));
1460     _cprefs->short_at_put(_index, method->name_index());
1461 
1462     // We need to save the mirrors in the backtrace to keep the class
1463     // from being unloaded while we still have this stack trace.
1464     assert(method->method_holder()->java_mirror() != NULL, "never push null for mirror");
1465     _mirrors->obj_at_put(_index, method->method_holder()->java_mirror());
1466     _index++;
1467   }
1468 
1469 };
1470 
1471 Symbol* get_source_file_name(InstanceKlass* holder, int version) {
1472   // Find the specific ik version that contains this source_file_name_index
1473   // via the previous versions list, but use the current version's
1474   // constant pool to look it up.  The previous version's index has been
1475   // merged for the current constant pool.
1476   InstanceKlass* ik = holder->get_klass_version(version);
1477   // This version has been cleaned up.
1478   if (ik == NULL) return NULL;
1479   int source_file_name_index = ik->source_file_name_index();
1480   return (source_file_name_index == 0) ?
1481       (Symbol*)NULL : holder->constants()->symbol_at(source_file_name_index);
1482 }
1483 
1484 // Print stack trace element to resource allocated buffer
1485 char* java_lang_Throwable::print_stack_element_to_buffer(Handle mirror,
1486                                   int method_id, int version, int bci, int cpref) {
1487 
1488   // Get strings and string lengths
1489   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
1490   const char* klass_name  = holder->external_name();
1491   int buf_len = (int)strlen(klass_name);
1492 
1493   Method* method = holder->method_with_orig_idnum(method_id, version);
1494 
1495   // The method can be NULL if the requested class version is gone
1496   Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref);
1497   char* method_name = sym->as_C_string();
1498   buf_len += (int)strlen(method_name);
1499 




1500   char* source_file_name = NULL;
1501   Symbol* source = get_source_file_name(holder, version);

1502   if (source != NULL) {
1503     source_file_name = source->as_C_string();
1504     buf_len += (int)strlen(source_file_name);
1505   }

1506 
1507   // Allocate temporary buffer with extra space for formatting and line number
1508   char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64);
1509 
1510   // Print stack trace line in buffer
1511   sprintf(buf, "\tat %s.%s", klass_name, method_name);
1512 
1513   if (!version_matches(method, version)) {
1514     strcat(buf, "(Redefined)");
1515   } else {
1516     int line_number = get_line_number(method, bci);
1517     if (line_number == -2) {
1518       strcat(buf, "(Native Method)");
1519     } else {
1520       if (source_file_name != NULL && (line_number != -1)) {
1521         // Sourcename and linenumber
1522         sprintf(buf + (int)strlen(buf), "(%s:%d)", source_file_name, line_number);
1523       } else if (source_file_name != NULL) {
1524         // Just sourcename
1525         sprintf(buf + (int)strlen(buf), "(%s)", source_file_name);


1899   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
1900   const char* str = holder->external_name();
1901   oop classname = StringTable::intern((char*) str, CHECK_0);
1902   java_lang_StackTraceElement::set_declaringClass(element(), classname);
1903 
1904   Method* method = holder->method_with_orig_idnum(method_id, version);
1905 
1906   // The method can be NULL if the requested class version is gone
1907   Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref);
1908 
1909   // Fill in method name
1910   oop methodname = StringTable::intern(sym, CHECK_0);
1911   java_lang_StackTraceElement::set_methodName(element(), methodname);
1912 
1913   if (!version_matches(method, version)) {
1914     // The method was redefined, accurate line number information isn't available
1915     java_lang_StackTraceElement::set_fileName(element(), NULL);
1916     java_lang_StackTraceElement::set_lineNumber(element(), -1);
1917   } else {
1918     // Fill in source file name and line number.
1919     Symbol* source = get_source_file_name(holder, version);





1920     if (ShowHiddenFrames && source == NULL)
1921       source = vmSymbols::unknown_class_name();
1922     oop filename = StringTable::intern(source, CHECK_0);
1923     java_lang_StackTraceElement::set_fileName(element(), filename);
1924 
1925     int line_number = get_line_number(method, bci);
1926     java_lang_StackTraceElement::set_lineNumber(element(), line_number);
1927   }
1928   return element();
1929 }
1930 
1931 oop java_lang_StackTraceElement::create(methodHandle method, int bci, TRAPS) {
1932   Handle mirror (THREAD, method->method_holder()->java_mirror());
1933   int method_id = method->orig_method_idnum();
1934   int cpref = method->name_index();
1935   return create(mirror, method_id, method->constants()->version(), bci, cpref, THREAD);
1936 }
1937 
1938 void java_lang_reflect_AccessibleObject::compute_offsets() {
1939   Klass* k = SystemDictionary::reflect_AccessibleObject_klass();


src/share/vm/classfile/javaClasses.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File