1424 _index = 0; 1425 } 1426 1427 oop backtrace() { 1428 return _backtrace(); 1429 } 1430 1431 inline void push(Method* method, int bci, TRAPS) { 1432 // Smear the -1 bci to 0 since the array only holds unsigned 1433 // shorts. The later line number lookup would just smear the -1 1434 // to a 0 even if it could be recorded. 1435 if (bci == SynchronizationEntryBCI) bci = 0; 1436 1437 if (_index >= trace_chunk_size) { 1438 methodHandle mhandle(THREAD, method); 1439 expand(CHECK); 1440 method = mhandle(); 1441 } 1442 1443 _methods->short_at_put(_index, method->orig_method_idnum()); 1444 _bcis->int_at_put(_index, BackTrace::merge_bci_and_version(bci, method->constants()->version())); 1445 _cprefs->short_at_put(_index, method->name_index()); 1446 1447 // We need to save the mirrors in the backtrace to keep the class 1448 // from being unloaded while we still have this stack trace. 1449 assert(method->method_holder()->java_mirror() != NULL, "never push null for mirror"); 1450 _mirrors->obj_at_put(_index, method->method_holder()->java_mirror()); 1451 _index++; 1452 } 1453 1454 }; 1455 1456 // Print stack trace element to resource allocated buffer 1457 char* java_lang_Throwable::print_stack_element_to_buffer(Handle mirror, 1458 int method_id, int version, int bci, int cpref) { 1459 1460 // Get strings and string lengths 1461 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror())); 1462 const char* klass_name = holder->external_name(); 1463 int buf_len = (int)strlen(klass_name); 1464 1465 Method* method = holder->method_with_orig_idnum(method_id, version); 1466 1467 // The method can be NULL if the requested class version is gone 1468 Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref); 1469 char* method_name = sym->as_C_string(); 1470 buf_len += (int)strlen(method_name); 1471 1472 char* source_file_name = NULL; 1473 Symbol* source = BackTrace::get_source_file_name(holder, version); 1474 if (source != NULL) { 1475 source_file_name = source->as_C_string(); 1476 buf_len += (int)strlen(source_file_name); 1477 } 1478 1479 // Allocate temporary buffer with extra space for formatting and line number 1480 char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64); 1481 1482 // Print stack trace line in buffer 1483 sprintf(buf, "\tat %s.%s", klass_name, method_name); 1484 1485 if (!version_matches(method, version)) { 1486 strcat(buf, "(Redefined)"); 1487 } else { 1488 int line_number = BackTrace::get_line_number(method, bci); 1489 if (line_number == -2) { 1490 strcat(buf, "(Native Method)"); 1491 } else { 1492 if (source_file_name != NULL && (line_number != -1)) { 1493 // Sourcename and linenumber 1494 sprintf(buf + (int)strlen(buf), "(%s:%d)", source_file_name, line_number); 1495 } else if (source_file_name != NULL) { 1496 // Just sourcename 1497 sprintf(buf + (int)strlen(buf), "(%s)", source_file_name); 1498 } else { 1499 // Neither sourcename nor linenumber 1500 sprintf(buf + (int)strlen(buf), "(Unknown Source)"); 1501 } 1502 nmethod* nm = method->code(); 1503 if (WizardMode && nm != NULL) { 1504 sprintf(buf + (int)strlen(buf), "(nmethod " INTPTR_FORMAT ")", (intptr_t)nm); 1505 } 1506 } 1507 } 1508 1537 objArrayHandle result (THREAD, objArrayOop(backtrace(h_throwable()))); 1538 if (result.is_null()) { 1539 st->print_raw_cr(no_stack_trace_message()); 1540 return; 1541 } 1542 1543 while (result.not_null()) { 1544 1545 // Get method id, bci, version and mirror from chunk 1546 typeArrayHandle methods (THREAD, BacktraceBuilder::get_methods(result)); 1547 typeArrayHandle bcis (THREAD, BacktraceBuilder::get_bcis(result)); 1548 objArrayHandle mirrors (THREAD, BacktraceBuilder::get_mirrors(result)); 1549 typeArrayHandle cprefs (THREAD, BacktraceBuilder::get_cprefs(result)); 1550 1551 int length = methods()->length(); 1552 for (int index = 0; index < length; index++) { 1553 Handle mirror(THREAD, mirrors->obj_at(index)); 1554 // NULL mirror means end of stack trace 1555 if (mirror.is_null()) goto handle_cause; 1556 int method = methods->short_at(index); 1557 int version = BackTrace::version_at(bcis->int_at(index)); 1558 int bci = BackTrace::bci_at(bcis->int_at(index)); 1559 int cpref = cprefs->short_at(index); 1560 print_stack_element(st, mirror, method, version, bci, cpref); 1561 } 1562 result = objArrayHandle(THREAD, objArrayOop(result->obj_at(trace_next_offset))); 1563 } 1564 handle_cause: 1565 { 1566 EXCEPTION_MARK; 1567 JavaValue cause(T_OBJECT); 1568 JavaCalls::call_virtual(&cause, 1569 h_throwable, 1570 KlassHandle(THREAD, h_throwable->klass()), 1571 vmSymbols::getCause_name(), 1572 vmSymbols::void_throwable_signature(), 1573 THREAD); 1574 // Ignore any exceptions. we are in the middle of exception handling. Same as classic VM. 1575 if (HAS_PENDING_EXCEPTION) { 1576 CLEAR_PENDING_EXCEPTION; 1577 h_throwable = Handle(); 1578 } else { 1825 // Compute how many chunks to skip and index into actual chunk 1826 objArrayOop chunk = objArrayOop(backtrace(throwable)); 1827 int skip_chunks = index / trace_chunk_size; 1828 int chunk_index = index % trace_chunk_size; 1829 while (chunk != NULL && skip_chunks > 0) { 1830 chunk = objArrayOop(chunk->obj_at(trace_next_offset)); 1831 skip_chunks--; 1832 } 1833 if (chunk == NULL) { 1834 THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL); 1835 } 1836 // Get method id, bci, version, mirror and cpref from chunk 1837 typeArrayOop methods = BacktraceBuilder::get_methods(chunk); 1838 typeArrayOop bcis = BacktraceBuilder::get_bcis(chunk); 1839 objArrayOop mirrors = BacktraceBuilder::get_mirrors(chunk); 1840 typeArrayOop cprefs = BacktraceBuilder::get_cprefs(chunk); 1841 1842 assert(methods != NULL && bcis != NULL && mirrors != NULL, "sanity check"); 1843 1844 int method = methods->short_at(chunk_index); 1845 int version = BackTrace::version_at(bcis->int_at(chunk_index)); 1846 int bci = BackTrace::bci_at(bcis->int_at(chunk_index)); 1847 int cpref = cprefs->short_at(chunk_index); 1848 Handle mirror(THREAD, mirrors->obj_at(chunk_index)); 1849 1850 // Chunk can be partial full 1851 if (mirror.is_null()) { 1852 THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL); 1853 } 1854 oop element = java_lang_StackTraceElement::create(mirror, method, version, bci, cpref, CHECK_0); 1855 return element; 1856 } 1857 1858 oop java_lang_StackTraceElement::create(Handle mirror, int method_id, 1859 int version, int bci, int cpref, TRAPS) { 1860 // Allocate java.lang.StackTraceElement instance 1861 Klass* k = SystemDictionary::StackTraceElement_klass(); 1862 assert(k != NULL, "must be loaded in 1.4+"); 1863 instanceKlassHandle ik (THREAD, k); 1864 if (ik->should_be_initialized()) { 1865 ik->initialize(CHECK_0); 1866 } 1872 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror())); 1873 const char* str = holder->external_name(); 1874 oop classname = StringTable::intern((char*) str, CHECK_0); 1875 java_lang_StackTraceElement::set_declaringClass(element(), classname); 1876 1877 Method* method = holder->method_with_orig_idnum(method_id, version); 1878 1879 // The method can be NULL if the requested class version is gone 1880 Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref); 1881 1882 // Fill in method name 1883 oop methodname = StringTable::intern(sym, CHECK_0); 1884 java_lang_StackTraceElement::set_methodName(element(), methodname); 1885 1886 if (!version_matches(method, version)) { 1887 // The method was redefined, accurate line number information isn't available 1888 java_lang_StackTraceElement::set_fileName(element(), NULL); 1889 java_lang_StackTraceElement::set_lineNumber(element(), -1); 1890 } else { 1891 // Fill in source file name and line number. 1892 Symbol* source = BackTrace::get_source_file_name(holder, version); 1893 if (ShowHiddenFrames && source == NULL) 1894 source = vmSymbols::unknown_class_name(); 1895 oop filename = StringTable::intern(source, CHECK_0); 1896 java_lang_StackTraceElement::set_fileName(element(), filename); 1897 1898 int line_number = BackTrace::get_line_number(method, bci); 1899 java_lang_StackTraceElement::set_lineNumber(element(), line_number); 1900 } 1901 return element(); 1902 } 1903 1904 oop java_lang_StackTraceElement::create(methodHandle method, int bci, TRAPS) { 1905 Handle mirror (THREAD, method->method_holder()->java_mirror()); 1906 int method_id = method->orig_method_idnum(); 1907 int cpref = method->name_index(); 1908 return create(mirror, method_id, method->constants()->version(), bci, cpref, THREAD); 1909 } 1910 1911 Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* holder, TRAPS) { 1912 if (MemberNameInStackFrame) { 1913 Handle mname(THREAD, stackFrame->obj_field(_memberName_offset)); 1914 Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mname()); 1915 // we should expand MemberName::name when Throwable uses StackTrace 1916 // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL); 1917 return method; 1918 } else { 1919 short mid = stackFrame->short_field(_mid_offset); 1920 short version = stackFrame->short_field(_version_offset); 1921 return holder->method_with_orig_idnum(mid, version); 1922 } 1923 } 1924 1925 Symbol* java_lang_StackFrameInfo::get_file_name(Handle stackFrame, InstanceKlass* holder) { 1926 if (MemberNameInStackFrame) { 1927 return holder->source_file_name(); 1928 } else { 1929 int bci = stackFrame->int_field(_bci_offset); 1930 short version = stackFrame->short_field(_version_offset); 1931 1932 return BackTrace::get_source_file_name(holder, version); 1933 } 1934 } 1935 1936 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) { 1937 if (MemberNameInStackFrame) { 1938 oop mname = stackFrame->obj_field(_memberName_offset); 1939 InstanceKlass* ik = method->method_holder(); 1940 CallInfo info(method(), ik); 1941 MethodHandles::init_method_MemberName(mname, info); 1942 java_lang_StackFrameInfo::set_bci(stackFrame(), bci); 1943 } else { 1944 int mid = method->orig_method_idnum(); 1945 int version = method->constants()->version(); 1946 int cpref = method->name_index(); 1947 assert((jushort)mid == mid, "mid should be short"); 1948 assert((jushort)version == version, "version should be short"); 1949 assert((jushort)cpref == cpref, "cpref should be short"); 1950 1951 java_lang_StackFrameInfo::set_mid(stackFrame(), (short)mid); 1952 java_lang_StackFrameInfo::set_version(stackFrame(), (short)version); 1953 java_lang_StackFrameInfo::set_cpref(stackFrame(), (short)cpref); 1954 java_lang_StackFrameInfo::set_bci(stackFrame(), bci); 1955 } 1956 } 1957 1958 void java_lang_StackFrameInfo::fill_methodInfo(Handle stackFrame, TRAPS) { 1959 ResourceMark rm(THREAD); 1960 oop k = stackFrame->obj_field(_declaringClass_offset); 1961 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(k)); 1962 Method* method = java_lang_StackFrameInfo::get_method(stackFrame, holder, CHECK); 1967 if (MemberNameInStackFrame) { 1968 assert(sym != NULL, "MemberName must have method name"); 1969 } else { 1970 // The method can be NULL if the requested class version is gone 1971 if (sym == NULL) { 1972 short cpref = stackFrame->short_field(_cpref_offset); 1973 sym = holder->constants()->symbol_at(cpref); 1974 } 1975 } 1976 1977 // set method name 1978 oop methodname = StringTable::intern(sym, CHECK); 1979 java_lang_StackFrameInfo::set_methodName(stackFrame(), methodname); 1980 1981 // set file name and line number 1982 Symbol* source = get_file_name(stackFrame, holder); 1983 if (source != NULL) { 1984 oop filename = StringTable::intern(source, CHECK); 1985 java_lang_StackFrameInfo::set_fileName(stackFrame(), filename); 1986 } 1987 if (method != NULL) { 1988 int line_number = BackTrace::get_line_number(method, bci); 1989 java_lang_StackFrameInfo::set_lineNumber(stackFrame(), line_number); 1990 } 1991 } 1992 1993 void java_lang_StackFrameInfo::compute_offsets() { 1994 Klass* k = SystemDictionary::StackFrameInfo_klass(); 1995 compute_offset(_declaringClass_offset, k, vmSymbols::declaringClass_name(), vmSymbols::class_signature()); 1996 compute_offset(_memberName_offset, k, vmSymbols::memberName_name(), vmSymbols::object_signature()); 1997 compute_offset(_bci_offset, k, vmSymbols::bci_name(), vmSymbols::int_signature()); 1998 compute_offset(_methodName_offset, k, vmSymbols::methodName_name(), vmSymbols::string_signature()); 1999 compute_offset(_fileName_offset, k, vmSymbols::fileName_name(), vmSymbols::string_signature()); 2000 compute_offset(_lineNumber_offset, k, vmSymbols::lineNumber_name(), vmSymbols::int_signature()); 2001 STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); 2002 } 2003 2004 void java_lang_LiveStackFrameInfo::compute_offsets() { 2005 Klass* k = SystemDictionary::LiveStackFrameInfo_klass(); 2006 compute_offset(_monitors_offset, k, vmSymbols::monitors_name(), vmSymbols::object_array_signature()); 2007 compute_offset(_locals_offset, k, vmSymbols::locals_name(), vmSymbols::object_array_signature()); 2008 compute_offset(_operands_offset, k, vmSymbols::operands_name(), vmSymbols::object_array_signature()); | 1424 _index = 0; 1425 } 1426 1427 oop backtrace() { 1428 return _backtrace(); 1429 } 1430 1431 inline void push(Method* method, int bci, TRAPS) { 1432 // Smear the -1 bci to 0 since the array only holds unsigned 1433 // shorts. The later line number lookup would just smear the -1 1434 // to a 0 even if it could be recorded. 1435 if (bci == SynchronizationEntryBCI) bci = 0; 1436 1437 if (_index >= trace_chunk_size) { 1438 methodHandle mhandle(THREAD, method); 1439 expand(CHECK); 1440 method = mhandle(); 1441 } 1442 1443 _methods->short_at_put(_index, method->orig_method_idnum()); 1444 _bcis->int_at_put(_index, Backtrace::merge_bci_and_version(bci, method->constants()->version())); 1445 _cprefs->short_at_put(_index, method->name_index()); 1446 1447 // We need to save the mirrors in the backtrace to keep the class 1448 // from being unloaded while we still have this stack trace. 1449 assert(method->method_holder()->java_mirror() != NULL, "never push null for mirror"); 1450 _mirrors->obj_at_put(_index, method->method_holder()->java_mirror()); 1451 _index++; 1452 } 1453 1454 }; 1455 1456 // Print stack trace element to resource allocated buffer 1457 char* java_lang_Throwable::print_stack_element_to_buffer(Handle mirror, 1458 int method_id, int version, int bci, int cpref) { 1459 1460 // Get strings and string lengths 1461 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror())); 1462 const char* klass_name = holder->external_name(); 1463 int buf_len = (int)strlen(klass_name); 1464 1465 Method* method = holder->method_with_orig_idnum(method_id, version); 1466 1467 // The method can be NULL if the requested class version is gone 1468 Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref); 1469 char* method_name = sym->as_C_string(); 1470 buf_len += (int)strlen(method_name); 1471 1472 char* source_file_name = NULL; 1473 Symbol* source = Backtrace::get_source_file_name(holder, version); 1474 if (source != NULL) { 1475 source_file_name = source->as_C_string(); 1476 buf_len += (int)strlen(source_file_name); 1477 } 1478 1479 // Allocate temporary buffer with extra space for formatting and line number 1480 char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64); 1481 1482 // Print stack trace line in buffer 1483 sprintf(buf, "\tat %s.%s", klass_name, method_name); 1484 1485 if (!version_matches(method, version)) { 1486 strcat(buf, "(Redefined)"); 1487 } else { 1488 int line_number = Backtrace::get_line_number(method, bci); 1489 if (line_number == -2) { 1490 strcat(buf, "(Native Method)"); 1491 } else { 1492 if (source_file_name != NULL && (line_number != -1)) { 1493 // Sourcename and linenumber 1494 sprintf(buf + (int)strlen(buf), "(%s:%d)", source_file_name, line_number); 1495 } else if (source_file_name != NULL) { 1496 // Just sourcename 1497 sprintf(buf + (int)strlen(buf), "(%s)", source_file_name); 1498 } else { 1499 // Neither sourcename nor linenumber 1500 sprintf(buf + (int)strlen(buf), "(Unknown Source)"); 1501 } 1502 nmethod* nm = method->code(); 1503 if (WizardMode && nm != NULL) { 1504 sprintf(buf + (int)strlen(buf), "(nmethod " INTPTR_FORMAT ")", (intptr_t)nm); 1505 } 1506 } 1507 } 1508 1537 objArrayHandle result (THREAD, objArrayOop(backtrace(h_throwable()))); 1538 if (result.is_null()) { 1539 st->print_raw_cr(no_stack_trace_message()); 1540 return; 1541 } 1542 1543 while (result.not_null()) { 1544 1545 // Get method id, bci, version and mirror from chunk 1546 typeArrayHandle methods (THREAD, BacktraceBuilder::get_methods(result)); 1547 typeArrayHandle bcis (THREAD, BacktraceBuilder::get_bcis(result)); 1548 objArrayHandle mirrors (THREAD, BacktraceBuilder::get_mirrors(result)); 1549 typeArrayHandle cprefs (THREAD, BacktraceBuilder::get_cprefs(result)); 1550 1551 int length = methods()->length(); 1552 for (int index = 0; index < length; index++) { 1553 Handle mirror(THREAD, mirrors->obj_at(index)); 1554 // NULL mirror means end of stack trace 1555 if (mirror.is_null()) goto handle_cause; 1556 int method = methods->short_at(index); 1557 int version = Backtrace::version_at(bcis->int_at(index)); 1558 int bci = Backtrace::bci_at(bcis->int_at(index)); 1559 int cpref = cprefs->short_at(index); 1560 print_stack_element(st, mirror, method, version, bci, cpref); 1561 } 1562 result = objArrayHandle(THREAD, objArrayOop(result->obj_at(trace_next_offset))); 1563 } 1564 handle_cause: 1565 { 1566 EXCEPTION_MARK; 1567 JavaValue cause(T_OBJECT); 1568 JavaCalls::call_virtual(&cause, 1569 h_throwable, 1570 KlassHandle(THREAD, h_throwable->klass()), 1571 vmSymbols::getCause_name(), 1572 vmSymbols::void_throwable_signature(), 1573 THREAD); 1574 // Ignore any exceptions. we are in the middle of exception handling. Same as classic VM. 1575 if (HAS_PENDING_EXCEPTION) { 1576 CLEAR_PENDING_EXCEPTION; 1577 h_throwable = Handle(); 1578 } else { 1825 // Compute how many chunks to skip and index into actual chunk 1826 objArrayOop chunk = objArrayOop(backtrace(throwable)); 1827 int skip_chunks = index / trace_chunk_size; 1828 int chunk_index = index % trace_chunk_size; 1829 while (chunk != NULL && skip_chunks > 0) { 1830 chunk = objArrayOop(chunk->obj_at(trace_next_offset)); 1831 skip_chunks--; 1832 } 1833 if (chunk == NULL) { 1834 THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL); 1835 } 1836 // Get method id, bci, version, mirror and cpref from chunk 1837 typeArrayOop methods = BacktraceBuilder::get_methods(chunk); 1838 typeArrayOop bcis = BacktraceBuilder::get_bcis(chunk); 1839 objArrayOop mirrors = BacktraceBuilder::get_mirrors(chunk); 1840 typeArrayOop cprefs = BacktraceBuilder::get_cprefs(chunk); 1841 1842 assert(methods != NULL && bcis != NULL && mirrors != NULL, "sanity check"); 1843 1844 int method = methods->short_at(chunk_index); 1845 int version = Backtrace::version_at(bcis->int_at(chunk_index)); 1846 int bci = Backtrace::bci_at(bcis->int_at(chunk_index)); 1847 int cpref = cprefs->short_at(chunk_index); 1848 Handle mirror(THREAD, mirrors->obj_at(chunk_index)); 1849 1850 // Chunk can be partial full 1851 if (mirror.is_null()) { 1852 THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL); 1853 } 1854 oop element = java_lang_StackTraceElement::create(mirror, method, version, bci, cpref, CHECK_0); 1855 return element; 1856 } 1857 1858 oop java_lang_StackTraceElement::create(Handle mirror, int method_id, 1859 int version, int bci, int cpref, TRAPS) { 1860 // Allocate java.lang.StackTraceElement instance 1861 Klass* k = SystemDictionary::StackTraceElement_klass(); 1862 assert(k != NULL, "must be loaded in 1.4+"); 1863 instanceKlassHandle ik (THREAD, k); 1864 if (ik->should_be_initialized()) { 1865 ik->initialize(CHECK_0); 1866 } 1872 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror())); 1873 const char* str = holder->external_name(); 1874 oop classname = StringTable::intern((char*) str, CHECK_0); 1875 java_lang_StackTraceElement::set_declaringClass(element(), classname); 1876 1877 Method* method = holder->method_with_orig_idnum(method_id, version); 1878 1879 // The method can be NULL if the requested class version is gone 1880 Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref); 1881 1882 // Fill in method name 1883 oop methodname = StringTable::intern(sym, CHECK_0); 1884 java_lang_StackTraceElement::set_methodName(element(), methodname); 1885 1886 if (!version_matches(method, version)) { 1887 // The method was redefined, accurate line number information isn't available 1888 java_lang_StackTraceElement::set_fileName(element(), NULL); 1889 java_lang_StackTraceElement::set_lineNumber(element(), -1); 1890 } else { 1891 // Fill in source file name and line number. 1892 Symbol* source = Backtrace::get_source_file_name(holder, version); 1893 if (ShowHiddenFrames && source == NULL) 1894 source = vmSymbols::unknown_class_name(); 1895 oop filename = StringTable::intern(source, CHECK_0); 1896 java_lang_StackTraceElement::set_fileName(element(), filename); 1897 1898 int line_number = Backtrace::get_line_number(method, bci); 1899 java_lang_StackTraceElement::set_lineNumber(element(), line_number); 1900 } 1901 return element(); 1902 } 1903 1904 oop java_lang_StackTraceElement::create(methodHandle method, int bci, TRAPS) { 1905 Handle mirror (THREAD, method->method_holder()->java_mirror()); 1906 int method_id = method->orig_method_idnum(); 1907 int cpref = method->name_index(); 1908 return create(mirror, method_id, method->constants()->version(), bci, cpref, THREAD); 1909 } 1910 1911 Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* holder, TRAPS) { 1912 if (MemberNameInStackFrame) { 1913 Handle mname(THREAD, stackFrame->obj_field(_memberName_offset)); 1914 Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mname()); 1915 // we should expand MemberName::name when Throwable uses StackTrace 1916 // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL); 1917 return method; 1918 } else { 1919 short mid = stackFrame->short_field(_mid_offset); 1920 short version = stackFrame->short_field(_version_offset); 1921 return holder->method_with_orig_idnum(mid, version); 1922 } 1923 } 1924 1925 Symbol* java_lang_StackFrameInfo::get_file_name(Handle stackFrame, InstanceKlass* holder) { 1926 if (MemberNameInStackFrame) { 1927 return holder->source_file_name(); 1928 } else { 1929 short version = stackFrame->short_field(_version_offset); 1930 return Backtrace::get_source_file_name(holder, version); 1931 } 1932 } 1933 1934 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) { 1935 if (MemberNameInStackFrame) { 1936 oop mname = stackFrame->obj_field(_memberName_offset); 1937 InstanceKlass* ik = method->method_holder(); 1938 CallInfo info(method(), ik); 1939 MethodHandles::init_method_MemberName(mname, info); 1940 java_lang_StackFrameInfo::set_bci(stackFrame(), bci); 1941 // method may be redefined; store the version 1942 int version = method->constants()->version(); 1943 assert((jushort)version == version, "version should be short"); 1944 java_lang_StackFrameInfo::set_version(stackFrame(), (short)version); 1945 } else { 1946 int mid = method->orig_method_idnum(); 1947 int version = method->constants()->version(); 1948 int cpref = method->name_index(); 1949 assert((jushort)mid == mid, "mid should be short"); 1950 assert((jushort)version == version, "version should be short"); 1951 assert((jushort)cpref == cpref, "cpref should be short"); 1952 1953 java_lang_StackFrameInfo::set_mid(stackFrame(), (short)mid); 1954 java_lang_StackFrameInfo::set_version(stackFrame(), (short)version); 1955 java_lang_StackFrameInfo::set_cpref(stackFrame(), (short)cpref); 1956 java_lang_StackFrameInfo::set_bci(stackFrame(), bci); 1957 } 1958 } 1959 1960 void java_lang_StackFrameInfo::fill_methodInfo(Handle stackFrame, TRAPS) { 1961 ResourceMark rm(THREAD); 1962 oop k = stackFrame->obj_field(_declaringClass_offset); 1963 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(k)); 1964 Method* method = java_lang_StackFrameInfo::get_method(stackFrame, holder, CHECK); 1969 if (MemberNameInStackFrame) { 1970 assert(sym != NULL, "MemberName must have method name"); 1971 } else { 1972 // The method can be NULL if the requested class version is gone 1973 if (sym == NULL) { 1974 short cpref = stackFrame->short_field(_cpref_offset); 1975 sym = holder->constants()->symbol_at(cpref); 1976 } 1977 } 1978 1979 // set method name 1980 oop methodname = StringTable::intern(sym, CHECK); 1981 java_lang_StackFrameInfo::set_methodName(stackFrame(), methodname); 1982 1983 // set file name and line number 1984 Symbol* source = get_file_name(stackFrame, holder); 1985 if (source != NULL) { 1986 oop filename = StringTable::intern(source, CHECK); 1987 java_lang_StackFrameInfo::set_fileName(stackFrame(), filename); 1988 } 1989 1990 // if the method has been redefined, the bci is no longer applicable 1991 short version = stackFrame->short_field(_version_offset); 1992 if (version_matches(method, version)) { 1993 int line_number = Backtrace::get_line_number(method, bci); 1994 java_lang_StackFrameInfo::set_lineNumber(stackFrame(), line_number); 1995 } 1996 } 1997 1998 void java_lang_StackFrameInfo::compute_offsets() { 1999 Klass* k = SystemDictionary::StackFrameInfo_klass(); 2000 compute_offset(_declaringClass_offset, k, vmSymbols::declaringClass_name(), vmSymbols::class_signature()); 2001 compute_offset(_memberName_offset, k, vmSymbols::memberName_name(), vmSymbols::object_signature()); 2002 compute_offset(_bci_offset, k, vmSymbols::bci_name(), vmSymbols::int_signature()); 2003 compute_offset(_methodName_offset, k, vmSymbols::methodName_name(), vmSymbols::string_signature()); 2004 compute_offset(_fileName_offset, k, vmSymbols::fileName_name(), vmSymbols::string_signature()); 2005 compute_offset(_lineNumber_offset, k, vmSymbols::lineNumber_name(), vmSymbols::int_signature()); 2006 STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); 2007 } 2008 2009 void java_lang_LiveStackFrameInfo::compute_offsets() { 2010 Klass* k = SystemDictionary::LiveStackFrameInfo_klass(); 2011 compute_offset(_monitors_offset, k, vmSymbols::monitors_name(), vmSymbols::object_array_signature()); 2012 compute_offset(_locals_offset, k, vmSymbols::locals_name(), vmSymbols::object_array_signature()); 2013 compute_offset(_operands_offset, k, vmSymbols::operands_name(), vmSymbols::object_array_signature()); |