< prev index next >

hotspot/src/share/vm/classfile/javaClasses.cpp

Print this page




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


< prev index next >