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();
|