< prev index next >

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

Print this page




1501   if (msg != NULL) {
1502     st->print(": %s", java_lang_String::as_utf8_string(msg));
1503   }
1504 }
1505 
1506 
1507 void java_lang_Throwable::print(Handle throwable, outputStream* st) {
1508   ResourceMark rm;
1509   Klass* k = throwable->klass();
1510   assert(k != NULL, "just checking");
1511   st->print("%s", k->external_name());
1512   oop msg = message(throwable);
1513   if (msg != NULL) {
1514     st->print(": %s", java_lang_String::as_utf8_string(msg));
1515   }
1516 }
1517 
1518 // After this many redefines, the stack trace is unreliable.
1519 const int MAX_VERSION = USHRT_MAX;
1520 
1521 // Helper backtrace functions to store bci|version together.
1522 static inline int merge_bci_and_version(int bci, int version) {
1523   // only store u2 for version, checking for overflow.
1524   if (version > USHRT_MAX || version < 0) version = MAX_VERSION;
1525   assert((jushort)bci == bci, "bci should be short");
1526   return build_int_from_shorts(version, bci);
1527 }
1528 
1529 static inline int bci_at(unsigned int merged) {
1530   return extract_high_short_from_int(merged);
1531 }
1532 static inline int version_at(unsigned int merged) {
1533   return extract_low_short_from_int(merged);
1534 }
1535 
1536 static inline bool version_matches(Method* method, int version) {
1537   assert(version < MAX_VERSION, "version is too big");
1538   return method != NULL && (method->constants()->version() == version);
1539 }
1540 
1541 static inline int get_line_number(Method* method, int bci) {
1542   int line_number = 0;
1543   if (method->is_native()) {
1544     // Negative value different from -1 below, enabling Java code in
1545     // class java.lang.StackTraceElement to distinguish "native" from
1546     // "no LineNumberTable".  JDK tests for -2.
1547     line_number = -2;
1548   } else {
1549     // Returns -1 if no LineNumberTable, and otherwise actual line number
1550     line_number = method->line_number_from_bci(bci);
1551     if (line_number == -1 && ShowHiddenFrames) {
1552       line_number = bci + 1000000;
1553     }
1554   }
1555   return line_number;
1556 }
1557 
1558 // This class provides a simple wrapper over the internal structure of
1559 // exception backtrace to insulate users of the backtrace from needing
1560 // to know what it looks like.
1561 class BacktraceBuilder: public StackObj {
1562  private:
1563   Handle          _backtrace;
1564   objArrayOop     _head;
1565   typeArrayOop    _methods;
1566   typeArrayOop    _bcis;
1567   objArrayOop     _mirrors;
1568   typeArrayOop    _cprefs; // needed to insulate method name against redefinition
1569   int             _index;
1570   No_Safepoint_Verifier _nsv;
1571 
1572  public:
1573 
1574   enum {
1575     trace_methods_offset = java_lang_Throwable::trace_methods_offset,
1576     trace_bcis_offset    = java_lang_Throwable::trace_bcis_offset,
1577     trace_mirrors_offset = java_lang_Throwable::trace_mirrors_offset,


1659     _index = 0;
1660   }
1661 
1662   oop backtrace() {
1663     return _backtrace();
1664   }
1665 
1666   inline void push(Method* method, int bci, TRAPS) {
1667     // Smear the -1 bci to 0 since the array only holds unsigned
1668     // shorts.  The later line number lookup would just smear the -1
1669     // to a 0 even if it could be recorded.
1670     if (bci == SynchronizationEntryBCI) bci = 0;
1671 
1672     if (_index >= trace_chunk_size) {
1673       methodHandle mhandle(THREAD, method);
1674       expand(CHECK);
1675       method = mhandle();
1676     }
1677 
1678     _methods->short_at_put(_index, method->orig_method_idnum());
1679     _bcis->int_at_put(_index, merge_bci_and_version(bci, method->constants()->version()));
1680     _cprefs->short_at_put(_index, method->name_index());
1681 
1682     // We need to save the mirrors in the backtrace to keep the class
1683     // from being unloaded while we still have this stack trace.
1684     assert(method->method_holder()->java_mirror() != NULL, "never push null for mirror");
1685     _mirrors->obj_at_put(_index, method->method_holder()->java_mirror());
1686     _index++;
1687   }
1688 
1689 };
1690 
1691 Symbol* get_source_file_name(InstanceKlass* holder, int version) {
1692   // Find the specific ik version that contains this source_file_name_index
1693   // via the previous versions list, but use the current version's
1694   // constant pool to look it up.  The previous version's index has been
1695   // merged for the current constant pool.
1696   InstanceKlass* ik = holder->get_klass_version(version);
1697   // This version has been cleaned up.
1698   if (ik == NULL) return NULL;
1699   int source_file_name_index = ik->source_file_name_index();
1700   return (source_file_name_index == 0) ?
1701       (Symbol*)NULL : holder->constants()->symbol_at(source_file_name_index);
1702 }
1703 
1704 // Print stack trace element to resource allocated buffer
1705 char* java_lang_Throwable::print_stack_element_to_buffer(Handle mirror,
1706                                   int method_id, int version, int bci, int cpref) {
1707 
1708   // Get strings and string lengths
1709   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
1710   const char* klass_name  = holder->external_name();
1711   int buf_len = (int)strlen(klass_name);
1712 
1713   Method* method = holder->method_with_orig_idnum(method_id, version);
1714 
1715   // The method can be NULL if the requested class version is gone
1716   Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref);
1717   char* method_name = sym->as_C_string();
1718   buf_len += (int)strlen(method_name);
1719 
1720   char* source_file_name = NULL;
1721   Symbol* source = get_source_file_name(holder, version);
1722   if (source != NULL) {
1723     source_file_name = source->as_C_string();
1724     buf_len += (int)strlen(source_file_name);
1725   }
1726 
1727   // Allocate temporary buffer with extra space for formatting and line number
1728   char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64);
1729 
1730   // Print stack trace line in buffer
1731   sprintf(buf, "\tat %s.%s", klass_name, method_name);
1732 
1733   if (!version_matches(method, version)) {
1734     strcat(buf, "(Redefined)");
1735   } else {
1736     int line_number = get_line_number(method, bci);
1737     if (line_number == -2) {
1738       strcat(buf, "(Native Method)");
1739     } else {
1740       if (source_file_name != NULL && (line_number != -1)) {
1741         // Sourcename and linenumber
1742         sprintf(buf + (int)strlen(buf), "(%s:%d)", source_file_name, line_number);
1743       } else if (source_file_name != NULL) {
1744         // Just sourcename
1745         sprintf(buf + (int)strlen(buf), "(%s)", source_file_name);
1746       } else {
1747         // Neither sourcename nor linenumber
1748         sprintf(buf + (int)strlen(buf), "(Unknown Source)");
1749       }
1750       nmethod* nm = method->code();
1751       if (WizardMode && nm != NULL) {
1752         sprintf(buf + (int)strlen(buf), "(nmethod " INTPTR_FORMAT ")", (intptr_t)nm);
1753       }
1754     }
1755   }
1756 


1785     objArrayHandle result (THREAD, objArrayOop(backtrace(h_throwable())));
1786     if (result.is_null()) {
1787       st->print_raw_cr(no_stack_trace_message());
1788       return;
1789     }
1790 
1791     while (result.not_null()) {
1792 
1793       // Get method id, bci, version and mirror from chunk
1794       typeArrayHandle methods (THREAD, BacktraceBuilder::get_methods(result));
1795       typeArrayHandle bcis (THREAD, BacktraceBuilder::get_bcis(result));
1796       objArrayHandle mirrors (THREAD, BacktraceBuilder::get_mirrors(result));
1797       typeArrayHandle cprefs (THREAD, BacktraceBuilder::get_cprefs(result));
1798 
1799       int length = methods()->length();
1800       for (int index = 0; index < length; index++) {
1801         Handle mirror(THREAD, mirrors->obj_at(index));
1802         // NULL mirror means end of stack trace
1803         if (mirror.is_null()) goto handle_cause;
1804         int method = methods->short_at(index);
1805         int version = version_at(bcis->int_at(index));
1806         int bci = bci_at(bcis->int_at(index));
1807         int cpref = cprefs->short_at(index);
1808         print_stack_element(st, mirror, method, version, bci, cpref);
1809       }
1810       result = objArrayHandle(THREAD, objArrayOop(result->obj_at(trace_next_offset)));
1811     }
1812   handle_cause:
1813     {
1814       EXCEPTION_MARK;
1815       JavaValue cause(T_OBJECT);
1816       JavaCalls::call_virtual(&cause,
1817                               h_throwable,
1818                               KlassHandle(THREAD, h_throwable->klass()),
1819                               vmSymbols::getCause_name(),
1820                               vmSymbols::void_throwable_signature(),
1821                               THREAD);
1822       // Ignore any exceptions. we are in the middle of exception handling. Same as classic VM.
1823       if (HAS_PENDING_EXCEPTION) {
1824         CLEAR_PENDING_EXCEPTION;
1825         h_throwable = Handle();
1826       } else {


2073   // Compute how many chunks to skip and index into actual chunk
2074   objArrayOop chunk = objArrayOop(backtrace(throwable));
2075   int skip_chunks = index / trace_chunk_size;
2076   int chunk_index = index % trace_chunk_size;
2077   while (chunk != NULL && skip_chunks > 0) {
2078     chunk = objArrayOop(chunk->obj_at(trace_next_offset));
2079         skip_chunks--;
2080   }
2081   if (chunk == NULL) {
2082     THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL);
2083   }
2084   // Get method id, bci, version, mirror and cpref from chunk
2085   typeArrayOop methods = BacktraceBuilder::get_methods(chunk);
2086   typeArrayOop bcis = BacktraceBuilder::get_bcis(chunk);
2087   objArrayOop mirrors = BacktraceBuilder::get_mirrors(chunk);
2088   typeArrayOop cprefs = BacktraceBuilder::get_cprefs(chunk);
2089 
2090   assert(methods != NULL && bcis != NULL && mirrors != NULL, "sanity check");
2091 
2092   int method = methods->short_at(chunk_index);
2093   int version = version_at(bcis->int_at(chunk_index));
2094   int bci = bci_at(bcis->int_at(chunk_index));
2095   int cpref = cprefs->short_at(chunk_index);
2096   Handle mirror(THREAD, mirrors->obj_at(chunk_index));
2097 
2098   // Chunk can be partial full
2099   if (mirror.is_null()) {
2100     THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL);
2101   }
2102   oop element = java_lang_StackTraceElement::create(mirror, method, version, bci, cpref, CHECK_0);
2103   return element;
2104 }
2105 
2106 oop java_lang_StackTraceElement::create(Handle mirror, int method_id,
2107                                         int version, int bci, int cpref, TRAPS) {
2108   // Allocate java.lang.StackTraceElement instance
2109   Klass* k = SystemDictionary::StackTraceElement_klass();
2110   assert(k != NULL, "must be loaded in 1.4+");
2111   instanceKlassHandle ik (THREAD, k);
2112   if (ik->should_be_initialized()) {
2113     ik->initialize(CHECK_0);
2114   }
2115 
2116   Handle element = ik->allocate_instance_handle(CHECK_0);

2117   // Fill in class name
2118   ResourceMark rm(THREAD);
2119   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
2120   const char* str = holder->external_name();
2121   oop classname = StringTable::intern((char*) str, CHECK_0);
2122   java_lang_StackTraceElement::set_declaringClass(element(), classname);
2123 
2124   Method* method = holder->method_with_orig_idnum(method_id, version);
2125 
2126   // The method can be NULL if the requested class version is gone
2127   Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref);
2128 
2129   // Fill in method name
2130   oop methodname = StringTable::intern(sym, CHECK_0);
2131   java_lang_StackTraceElement::set_methodName(element(), methodname);
2132 
2133   if (!version_matches(method, version)) {
2134     // The method was redefined, accurate line number information isn't available
2135     java_lang_StackTraceElement::set_fileName(element(), NULL);
2136     java_lang_StackTraceElement::set_lineNumber(element(), -1);
2137   } else {
2138     // Fill in source file name and line number.
2139     Symbol* source = get_source_file_name(holder, version);
2140     if (ShowHiddenFrames && source == NULL)
2141       source = vmSymbols::unknown_class_name();
2142     oop filename = StringTable::intern(source, CHECK_0);
2143     java_lang_StackTraceElement::set_fileName(element(), filename);
2144 
2145     int line_number = get_line_number(method, bci);
2146     java_lang_StackTraceElement::set_lineNumber(element(), line_number);
2147   }
2148   return element();
2149 }
2150 
2151 oop java_lang_StackTraceElement::create(const methodHandle& method, int bci, TRAPS) {
2152   Handle mirror (THREAD, method->method_holder()->java_mirror());
2153   int method_id = method->orig_method_idnum();
2154   int cpref = method->name_index();
2155   return create(mirror, method_id, method->constants()->version(), bci, cpref, THREAD);
2156 }
2157 




































































































2158 void java_lang_reflect_AccessibleObject::compute_offsets() {
2159   Klass* k = SystemDictionary::reflect_AccessibleObject_klass();
2160   compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature());
2161 }
2162 
2163 jboolean java_lang_reflect_AccessibleObject::override(oop reflect) {
2164   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2165   return (jboolean) reflect->bool_field(override_offset);
2166 }
2167 
2168 void java_lang_reflect_AccessibleObject::set_override(oop reflect, jboolean value) {
2169   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2170   reflect->bool_field_put(override_offset, (int) value);
2171 }
2172 
2173 void java_lang_reflect_Method::compute_offsets() {
2174   Klass* k = SystemDictionary::reflect_Method_klass();
2175   compute_offset(clazz_offset,          k, vmSymbols::clazz_name(),          vmSymbols::class_signature());
2176   compute_offset(name_offset,           k, vmSymbols::name_name(),           vmSymbols::string_signature());
2177   compute_offset(returnType_offset,     k, vmSymbols::returnType_name(),     vmSymbols::class_signature());


3454 int java_lang_boxing_object::value_offset;
3455 int java_lang_boxing_object::long_value_offset;
3456 int java_lang_ref_Reference::referent_offset;
3457 int java_lang_ref_Reference::queue_offset;
3458 int java_lang_ref_Reference::next_offset;
3459 int java_lang_ref_Reference::discovered_offset;
3460 int java_lang_ref_Reference::static_lock_offset;
3461 int java_lang_ref_Reference::static_pending_offset;
3462 int java_lang_ref_Reference::number_of_fake_oop_fields;
3463 int java_lang_ref_SoftReference::timestamp_offset;
3464 int java_lang_ref_SoftReference::static_clock_offset;
3465 int java_lang_ClassLoader::parent_offset;
3466 int java_lang_System::static_in_offset;
3467 int java_lang_System::static_out_offset;
3468 int java_lang_System::static_err_offset;
3469 int java_lang_System::static_security_offset;
3470 int java_lang_StackTraceElement::declaringClass_offset;
3471 int java_lang_StackTraceElement::methodName_offset;
3472 int java_lang_StackTraceElement::fileName_offset;
3473 int java_lang_StackTraceElement::lineNumber_offset;












3474 int java_lang_AssertionStatusDirectives::classes_offset;
3475 int java_lang_AssertionStatusDirectives::classEnabled_offset;
3476 int java_lang_AssertionStatusDirectives::packages_offset;
3477 int java_lang_AssertionStatusDirectives::packageEnabled_offset;
3478 int java_lang_AssertionStatusDirectives::deflt_offset;
3479 int java_nio_Buffer::_limit_offset;
3480 int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0;
3481 int sun_reflect_ConstantPool::_oop_offset;
3482 int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset;
3483 
3484 
3485 // Support for java_lang_StackTraceElement
3486 
3487 void java_lang_StackTraceElement::set_fileName(oop element, oop value) {
3488   element->obj_field_put(fileName_offset, value);
3489 }
3490 
3491 void java_lang_StackTraceElement::set_declaringClass(oop element, oop value) {
3492   element->obj_field_put(declaringClass_offset, value);
3493 }
3494 
3495 void java_lang_StackTraceElement::set_methodName(oop element, oop value) {
3496   element->obj_field_put(methodName_offset, value);
3497 }
3498 
3499 void java_lang_StackTraceElement::set_lineNumber(oop element, int value) {
3500   element->int_field_put(lineNumber_offset, value);
3501 }
3502 












































3503 
3504 // Support for java Assertions - java_lang_AssertionStatusDirectives.
3505 
3506 void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) {
3507   o->obj_field_put(classes_offset, val);
3508 }
3509 
3510 void java_lang_AssertionStatusDirectives::set_classEnabled(oop o, oop val) {
3511   o->obj_field_put(classEnabled_offset, val);
3512 }
3513 
3514 void java_lang_AssertionStatusDirectives::set_packages(oop o, oop val) {
3515   o->obj_field_put(packages_offset, val);
3516 }
3517 
3518 void java_lang_AssertionStatusDirectives::set_packageEnabled(oop o, oop val) {
3519   o->obj_field_put(packageEnabled_offset, val);
3520 }
3521 
3522 void java_lang_AssertionStatusDirectives::set_deflt(oop o, bool val) {


3616   java_lang_invoke_MethodHandle::compute_offsets();
3617   java_lang_invoke_DirectMethodHandle::compute_offsets();
3618   java_lang_invoke_MemberName::compute_offsets();
3619   java_lang_invoke_LambdaForm::compute_offsets();
3620   java_lang_invoke_MethodType::compute_offsets();
3621   java_lang_invoke_CallSite::compute_offsets();
3622   java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets();
3623   java_security_AccessControlContext::compute_offsets();
3624   // Initialize reflection classes. The layouts of these classes
3625   // changed with the new reflection implementation in JDK 1.4, and
3626   // since the Universe doesn't know what JDK version it is until this
3627   // point we defer computation of these offsets until now.
3628   java_lang_reflect_AccessibleObject::compute_offsets();
3629   java_lang_reflect_Method::compute_offsets();
3630   java_lang_reflect_Constructor::compute_offsets();
3631   java_lang_reflect_Field::compute_offsets();
3632   java_nio_Buffer::compute_offsets();
3633   sun_reflect_ConstantPool::compute_offsets();
3634   sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets();
3635   java_lang_reflect_Parameter::compute_offsets();


3636 
3637   // generated interpreter code wants to know about the offsets we just computed:
3638   AbstractAssembler::update_delayed_values();
3639 }
3640 
3641 #ifndef PRODUCT
3642 
3643 // These functions exist to assert the validity of hard-coded field offsets to guard
3644 // against changes in the class files
3645 
3646 bool JavaClasses::check_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) {
3647   EXCEPTION_MARK;
3648   fieldDescriptor fd;
3649   TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH);
3650   Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
3651   instanceKlassHandle h_klass (THREAD, k);
3652   TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH);
3653   TempNewSymbol f_sig  = SymbolTable::new_symbol(field_sig, CATCH);
3654   if (!h_klass->find_local_field(f_name, f_sig, &fd)) {
3655     tty->print_cr("Nonstatic field %s.%s not found", klass_name, field_name);




1501   if (msg != NULL) {
1502     st->print(": %s", java_lang_String::as_utf8_string(msg));
1503   }
1504 }
1505 
1506 
1507 void java_lang_Throwable::print(Handle throwable, outputStream* st) {
1508   ResourceMark rm;
1509   Klass* k = throwable->klass();
1510   assert(k != NULL, "just checking");
1511   st->print("%s", k->external_name());
1512   oop msg = message(throwable);
1513   if (msg != NULL) {
1514     st->print(": %s", java_lang_String::as_utf8_string(msg));
1515   }
1516 }
1517 
1518 // After this many redefines, the stack trace is unreliable.
1519 const int MAX_VERSION = USHRT_MAX;
1520 















1521 static inline bool version_matches(Method* method, int version) {
1522   assert(version < MAX_VERSION, "version is too big");
1523   return method != NULL && (method->constants()->version() == version);
1524 }
1525 

















1526 // This class provides a simple wrapper over the internal structure of
1527 // exception backtrace to insulate users of the backtrace from needing
1528 // to know what it looks like.
1529 class BacktraceBuilder: public StackObj {
1530  private:
1531   Handle          _backtrace;
1532   objArrayOop     _head;
1533   typeArrayOop    _methods;
1534   typeArrayOop    _bcis;
1535   objArrayOop     _mirrors;
1536   typeArrayOop    _cprefs; // needed to insulate method name against redefinition
1537   int             _index;
1538   No_Safepoint_Verifier _nsv;
1539 
1540  public:
1541 
1542   enum {
1543     trace_methods_offset = java_lang_Throwable::trace_methods_offset,
1544     trace_bcis_offset    = java_lang_Throwable::trace_bcis_offset,
1545     trace_mirrors_offset = java_lang_Throwable::trace_mirrors_offset,


1627     _index = 0;
1628   }
1629 
1630   oop backtrace() {
1631     return _backtrace();
1632   }
1633 
1634   inline void push(Method* method, int bci, TRAPS) {
1635     // Smear the -1 bci to 0 since the array only holds unsigned
1636     // shorts.  The later line number lookup would just smear the -1
1637     // to a 0 even if it could be recorded.
1638     if (bci == SynchronizationEntryBCI) bci = 0;
1639 
1640     if (_index >= trace_chunk_size) {
1641       methodHandle mhandle(THREAD, method);
1642       expand(CHECK);
1643       method = mhandle();
1644     }
1645 
1646     _methods->short_at_put(_index, method->orig_method_idnum());
1647     _bcis->int_at_put(_index, BackTrace::merge_bci_and_version(bci, method->constants()->version()));
1648     _cprefs->short_at_put(_index, method->name_index());
1649 
1650     // We need to save the mirrors in the backtrace to keep the class
1651     // from being unloaded while we still have this stack trace.
1652     assert(method->method_holder()->java_mirror() != NULL, "never push null for mirror");
1653     _mirrors->obj_at_put(_index, method->method_holder()->java_mirror());
1654     _index++;
1655   }
1656 
1657 };
1658 













1659 // Print stack trace element to resource allocated buffer
1660 char* java_lang_Throwable::print_stack_element_to_buffer(Handle mirror,
1661                                   int method_id, int version, int bci, int cpref) {
1662 
1663   // Get strings and string lengths
1664   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
1665   const char* klass_name  = holder->external_name();
1666   int buf_len = (int)strlen(klass_name);
1667 
1668   Method* method = holder->method_with_orig_idnum(method_id, version);
1669 
1670   // The method can be NULL if the requested class version is gone
1671   Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref);
1672   char* method_name = sym->as_C_string();
1673   buf_len += (int)strlen(method_name);
1674 
1675   char* source_file_name = NULL;
1676   Symbol* source = BackTrace::get_source_file_name(holder, version);
1677   if (source != NULL) {
1678     source_file_name = source->as_C_string();
1679     buf_len += (int)strlen(source_file_name);
1680   }
1681 
1682   // Allocate temporary buffer with extra space for formatting and line number
1683   char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64);
1684 
1685   // Print stack trace line in buffer
1686   sprintf(buf, "\tat %s.%s", klass_name, method_name);
1687 
1688   if (!version_matches(method, version)) {
1689     strcat(buf, "(Redefined)");
1690   } else {
1691     int line_number = BackTrace::get_line_number(method, bci);
1692     if (line_number == -2) {
1693       strcat(buf, "(Native Method)");
1694     } else {
1695       if (source_file_name != NULL && (line_number != -1)) {
1696         // Sourcename and linenumber
1697         sprintf(buf + (int)strlen(buf), "(%s:%d)", source_file_name, line_number);
1698       } else if (source_file_name != NULL) {
1699         // Just sourcename
1700         sprintf(buf + (int)strlen(buf), "(%s)", source_file_name);
1701       } else {
1702         // Neither sourcename nor linenumber
1703         sprintf(buf + (int)strlen(buf), "(Unknown Source)");
1704       }
1705       nmethod* nm = method->code();
1706       if (WizardMode && nm != NULL) {
1707         sprintf(buf + (int)strlen(buf), "(nmethod " INTPTR_FORMAT ")", (intptr_t)nm);
1708       }
1709     }
1710   }
1711 


1740     objArrayHandle result (THREAD, objArrayOop(backtrace(h_throwable())));
1741     if (result.is_null()) {
1742       st->print_raw_cr(no_stack_trace_message());
1743       return;
1744     }
1745 
1746     while (result.not_null()) {
1747 
1748       // Get method id, bci, version and mirror from chunk
1749       typeArrayHandle methods (THREAD, BacktraceBuilder::get_methods(result));
1750       typeArrayHandle bcis (THREAD, BacktraceBuilder::get_bcis(result));
1751       objArrayHandle mirrors (THREAD, BacktraceBuilder::get_mirrors(result));
1752       typeArrayHandle cprefs (THREAD, BacktraceBuilder::get_cprefs(result));
1753 
1754       int length = methods()->length();
1755       for (int index = 0; index < length; index++) {
1756         Handle mirror(THREAD, mirrors->obj_at(index));
1757         // NULL mirror means end of stack trace
1758         if (mirror.is_null()) goto handle_cause;
1759         int method = methods->short_at(index);
1760         int version = BackTrace::version_at(bcis->int_at(index));
1761         int bci = BackTrace::bci_at(bcis->int_at(index));
1762         int cpref = cprefs->short_at(index);
1763         print_stack_element(st, mirror, method, version, bci, cpref);
1764       }
1765       result = objArrayHandle(THREAD, objArrayOop(result->obj_at(trace_next_offset)));
1766     }
1767   handle_cause:
1768     {
1769       EXCEPTION_MARK;
1770       JavaValue cause(T_OBJECT);
1771       JavaCalls::call_virtual(&cause,
1772                               h_throwable,
1773                               KlassHandle(THREAD, h_throwable->klass()),
1774                               vmSymbols::getCause_name(),
1775                               vmSymbols::void_throwable_signature(),
1776                               THREAD);
1777       // Ignore any exceptions. we are in the middle of exception handling. Same as classic VM.
1778       if (HAS_PENDING_EXCEPTION) {
1779         CLEAR_PENDING_EXCEPTION;
1780         h_throwable = Handle();
1781       } else {


2028   // Compute how many chunks to skip and index into actual chunk
2029   objArrayOop chunk = objArrayOop(backtrace(throwable));
2030   int skip_chunks = index / trace_chunk_size;
2031   int chunk_index = index % trace_chunk_size;
2032   while (chunk != NULL && skip_chunks > 0) {
2033     chunk = objArrayOop(chunk->obj_at(trace_next_offset));
2034         skip_chunks--;
2035   }
2036   if (chunk == NULL) {
2037     THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL);
2038   }
2039   // Get method id, bci, version, mirror and cpref from chunk
2040   typeArrayOop methods = BacktraceBuilder::get_methods(chunk);
2041   typeArrayOop bcis = BacktraceBuilder::get_bcis(chunk);
2042   objArrayOop mirrors = BacktraceBuilder::get_mirrors(chunk);
2043   typeArrayOop cprefs = BacktraceBuilder::get_cprefs(chunk);
2044 
2045   assert(methods != NULL && bcis != NULL && mirrors != NULL, "sanity check");
2046 
2047   int method = methods->short_at(chunk_index);
2048   int version = BackTrace::version_at(bcis->int_at(chunk_index));
2049   int bci = BackTrace::bci_at(bcis->int_at(chunk_index));
2050   int cpref = cprefs->short_at(chunk_index);
2051   Handle mirror(THREAD, mirrors->obj_at(chunk_index));
2052 
2053   // Chunk can be partial full
2054   if (mirror.is_null()) {
2055     THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL);
2056   }
2057   oop element = java_lang_StackTraceElement::create(mirror, method, version, bci, cpref, CHECK_0);
2058   return element;
2059 }
2060 
2061 oop java_lang_StackTraceElement::create(Handle mirror, int method_id,
2062                                         int version, int bci, int cpref, TRAPS) {
2063   // Allocate java.lang.StackTraceElement instance
2064   Klass* k = SystemDictionary::StackTraceElement_klass();
2065   assert(k != NULL, "must be loaded in 1.4+");
2066   instanceKlassHandle ik (THREAD, k);
2067   if (ik->should_be_initialized()) {
2068     ik->initialize(CHECK_0);
2069   }
2070 
2071   Handle element = ik->allocate_instance_handle(CHECK_0);
2072 
2073   // Fill in class name
2074   ResourceMark rm(THREAD);
2075   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror()));
2076   const char* str = holder->external_name();
2077   oop classname = StringTable::intern((char*) str, CHECK_0);
2078   java_lang_StackTraceElement::set_declaringClass(element(), classname);
2079 
2080   Method* method = holder->method_with_orig_idnum(method_id, version);
2081 
2082   // The method can be NULL if the requested class version is gone
2083   Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref);
2084 
2085   // Fill in method name
2086   oop methodname = StringTable::intern(sym, CHECK_0);
2087   java_lang_StackTraceElement::set_methodName(element(), methodname);
2088 
2089   if (!version_matches(method, version)) {
2090     // The method was redefined, accurate line number information isn't available
2091     java_lang_StackTraceElement::set_fileName(element(), NULL);
2092     java_lang_StackTraceElement::set_lineNumber(element(), -1);
2093   } else {
2094     // Fill in source file name and line number.
2095     Symbol* source = BackTrace::get_source_file_name(holder, version);
2096     if (ShowHiddenFrames && source == NULL)
2097       source = vmSymbols::unknown_class_name();
2098     oop filename = StringTable::intern(source, CHECK_0);
2099     java_lang_StackTraceElement::set_fileName(element(), filename);
2100 
2101     int line_number = BackTrace::get_line_number(method, bci);
2102     java_lang_StackTraceElement::set_lineNumber(element(), line_number);
2103   }
2104   return element();
2105 }
2106 
2107 oop java_lang_StackTraceElement::create(const methodHandle& method, int bci, TRAPS) {
2108   Handle mirror (THREAD, method->method_holder()->java_mirror());
2109   int method_id = method->orig_method_idnum();
2110   int cpref = method->name_index();
2111   return create(mirror, method_id, method->constants()->version(), bci, cpref, THREAD);
2112 }
2113 
2114 Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* holder, TRAPS) {
2115   if (MemberNameInStackFrame) {
2116     Handle mname(THREAD, stackFrame->obj_field(_memberName_offset));
2117     Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mname());
2118     // we should expand MemberName::name when Throwable uses StackTrace
2119     // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL);
2120     return method;
2121   } else {
2122     short mid       = stackFrame->short_field(_mid_offset);
2123     short version   = stackFrame->short_field(_version_offset);
2124     return holder->method_with_orig_idnum(mid, version);
2125   }
2126 }
2127 
2128 Symbol* java_lang_StackFrameInfo::get_file_name(Handle stackFrame, InstanceKlass* holder) {
2129   if (MemberNameInStackFrame) {
2130     return holder->source_file_name();
2131   } else {
2132     int bci = stackFrame->int_field(_bci_offset);
2133     short version = stackFrame->short_field(_version_offset);
2134 
2135     return BackTrace::get_source_file_name(holder, version);
2136   }
2137 }
2138 
2139 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) {
2140   if (MemberNameInStackFrame) {
2141     oop mname = stackFrame->obj_field(_memberName_offset);
2142     InstanceKlass* ik = method->method_holder();
2143     CallInfo info(method(), ik);
2144     MethodHandles::init_method_MemberName(mname, info);
2145     java_lang_StackFrameInfo::set_bci(stackFrame(), bci);
2146   } else {
2147     int mid = method->orig_method_idnum();
2148     int version = method->constants()->version();
2149     int cpref = method->name_index();
2150     assert((jushort)mid == mid,         "mid should be short");
2151     assert((jushort)version == version, "version should be short");
2152     assert((jushort)cpref == cpref,     "cpref should be short");
2153 
2154     java_lang_StackFrameInfo::set_mid(stackFrame(),     (short)mid);
2155     java_lang_StackFrameInfo::set_version(stackFrame(), (short)version);
2156     java_lang_StackFrameInfo::set_cpref(stackFrame(),   (short)cpref);
2157     java_lang_StackFrameInfo::set_bci(stackFrame(), bci);
2158   }
2159 }
2160 
2161 void java_lang_StackFrameInfo::fill_methodInfo(Handle stackFrame, TRAPS) {
2162   ResourceMark rm(THREAD);
2163   oop k = stackFrame->obj_field(_declaringClass_offset);
2164   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(k));
2165   Method* method = java_lang_StackFrameInfo::get_method(stackFrame, holder, CHECK);
2166   int bci = stackFrame->int_field(_bci_offset);
2167 
2168   // The method can be NULL if the requested class version is gone
2169   Symbol* sym = (method != NULL) ? method->name() : NULL;
2170   if (MemberNameInStackFrame) {
2171     assert(sym != NULL, "MemberName must have method name");
2172   } else {
2173       // The method can be NULL if the requested class version is gone
2174     if (sym == NULL) {
2175       short cpref   = stackFrame->short_field(_cpref_offset);
2176       sym = holder->constants()->symbol_at(cpref);
2177     }
2178   }
2179 
2180   // set method name
2181   oop methodname = StringTable::intern(sym, CHECK);
2182   java_lang_StackFrameInfo::set_methodName(stackFrame(), methodname);
2183 
2184   // set file name and line number
2185   Symbol* source = get_file_name(stackFrame, holder);
2186   if (source != NULL) {
2187     oop filename = StringTable::intern(source, CHECK);
2188     java_lang_StackFrameInfo::set_fileName(stackFrame(), filename);
2189   }
2190   if (method != NULL) {
2191     int line_number = BackTrace::get_line_number(method, bci);
2192     java_lang_StackFrameInfo::set_lineNumber(stackFrame(), line_number);
2193   }
2194 }
2195 
2196 void java_lang_StackFrameInfo::compute_offsets() {
2197   Klass* k = SystemDictionary::StackFrameInfo_klass();
2198   compute_offset(_declaringClass_offset, k, vmSymbols::declaringClass_name(),  vmSymbols::class_signature());
2199   compute_offset(_memberName_offset,     k, vmSymbols::memberName_name(),  vmSymbols::object_signature());
2200   compute_offset(_bci_offset,            k, vmSymbols::bci_name(),         vmSymbols::int_signature());
2201   compute_offset(_methodName_offset,     k, vmSymbols::methodName_name(),  vmSymbols::string_signature());
2202   compute_offset(_fileName_offset,       k, vmSymbols::fileName_name(),    vmSymbols::string_signature());
2203   compute_offset(_lineNumber_offset,     k, vmSymbols::lineNumber_name(),  vmSymbols::int_signature());
2204   STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
2205 }
2206 
2207 void java_lang_LiveStackFrameInfo::compute_offsets() {
2208   Klass* k = SystemDictionary::LiveStackFrameInfo_klass();
2209   compute_offset(_monitors_offset,   k, vmSymbols::monitors_name(),    vmSymbols::object_array_signature());
2210   compute_offset(_locals_offset,     k, vmSymbols::locals_name(),      vmSymbols::object_array_signature());
2211   compute_offset(_operands_offset,   k, vmSymbols::operands_name(),    vmSymbols::object_array_signature());
2212 }
2213 
2214 void java_lang_reflect_AccessibleObject::compute_offsets() {
2215   Klass* k = SystemDictionary::reflect_AccessibleObject_klass();
2216   compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature());
2217 }
2218 
2219 jboolean java_lang_reflect_AccessibleObject::override(oop reflect) {
2220   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2221   return (jboolean) reflect->bool_field(override_offset);
2222 }
2223 
2224 void java_lang_reflect_AccessibleObject::set_override(oop reflect, jboolean value) {
2225   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2226   reflect->bool_field_put(override_offset, (int) value);
2227 }
2228 
2229 void java_lang_reflect_Method::compute_offsets() {
2230   Klass* k = SystemDictionary::reflect_Method_klass();
2231   compute_offset(clazz_offset,          k, vmSymbols::clazz_name(),          vmSymbols::class_signature());
2232   compute_offset(name_offset,           k, vmSymbols::name_name(),           vmSymbols::string_signature());
2233   compute_offset(returnType_offset,     k, vmSymbols::returnType_name(),     vmSymbols::class_signature());


3510 int java_lang_boxing_object::value_offset;
3511 int java_lang_boxing_object::long_value_offset;
3512 int java_lang_ref_Reference::referent_offset;
3513 int java_lang_ref_Reference::queue_offset;
3514 int java_lang_ref_Reference::next_offset;
3515 int java_lang_ref_Reference::discovered_offset;
3516 int java_lang_ref_Reference::static_lock_offset;
3517 int java_lang_ref_Reference::static_pending_offset;
3518 int java_lang_ref_Reference::number_of_fake_oop_fields;
3519 int java_lang_ref_SoftReference::timestamp_offset;
3520 int java_lang_ref_SoftReference::static_clock_offset;
3521 int java_lang_ClassLoader::parent_offset;
3522 int java_lang_System::static_in_offset;
3523 int java_lang_System::static_out_offset;
3524 int java_lang_System::static_err_offset;
3525 int java_lang_System::static_security_offset;
3526 int java_lang_StackTraceElement::declaringClass_offset;
3527 int java_lang_StackTraceElement::methodName_offset;
3528 int java_lang_StackTraceElement::fileName_offset;
3529 int java_lang_StackTraceElement::lineNumber_offset;
3530 int java_lang_StackFrameInfo::_declaringClass_offset;
3531 int java_lang_StackFrameInfo::_memberName_offset;
3532 int java_lang_StackFrameInfo::_bci_offset;
3533 int java_lang_StackFrameInfo::_methodName_offset;
3534 int java_lang_StackFrameInfo::_fileName_offset;
3535 int java_lang_StackFrameInfo::_lineNumber_offset;
3536 int java_lang_StackFrameInfo::_mid_offset;
3537 int java_lang_StackFrameInfo::_version_offset;
3538 int java_lang_StackFrameInfo::_cpref_offset;
3539 int java_lang_LiveStackFrameInfo::_monitors_offset;
3540 int java_lang_LiveStackFrameInfo::_locals_offset;
3541 int java_lang_LiveStackFrameInfo::_operands_offset;
3542 int java_lang_AssertionStatusDirectives::classes_offset;
3543 int java_lang_AssertionStatusDirectives::classEnabled_offset;
3544 int java_lang_AssertionStatusDirectives::packages_offset;
3545 int java_lang_AssertionStatusDirectives::packageEnabled_offset;
3546 int java_lang_AssertionStatusDirectives::deflt_offset;
3547 int java_nio_Buffer::_limit_offset;
3548 int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0;
3549 int sun_reflect_ConstantPool::_oop_offset;
3550 int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset;
3551 
3552 
3553 // Support for java_lang_StackTraceElement
3554 
3555 void java_lang_StackTraceElement::set_fileName(oop element, oop value) {
3556   element->obj_field_put(fileName_offset, value);
3557 }
3558 
3559 void java_lang_StackTraceElement::set_declaringClass(oop element, oop value) {
3560   element->obj_field_put(declaringClass_offset, value);
3561 }
3562 
3563 void java_lang_StackTraceElement::set_methodName(oop element, oop value) {
3564   element->obj_field_put(methodName_offset, value);
3565 }
3566 
3567 void java_lang_StackTraceElement::set_lineNumber(oop element, int value) {
3568   element->int_field_put(lineNumber_offset, value);
3569 }
3570 
3571 // Support for java_lang_StackFrameInfo
3572 void java_lang_StackFrameInfo::set_declaringClass(oop element, oop value) {
3573   element->obj_field_put(_declaringClass_offset, value);
3574 }
3575 
3576 void java_lang_StackFrameInfo::set_mid(oop element, short value) {
3577   element->short_field_put(_mid_offset, value);
3578 }
3579 
3580 void java_lang_StackFrameInfo::set_version(oop element, short value) {
3581   element->short_field_put(_version_offset, value);
3582 }
3583 
3584 void java_lang_StackFrameInfo::set_cpref(oop element, short value) {
3585   element->short_field_put(_cpref_offset, value);
3586 }
3587 
3588 void java_lang_StackFrameInfo::set_bci(oop element, int value) {
3589   element->int_field_put(_bci_offset, value);
3590 }
3591 
3592 void java_lang_StackFrameInfo::set_fileName(oop element, oop value) {
3593   element->obj_field_put(_fileName_offset, value);
3594 }
3595 
3596 void java_lang_StackFrameInfo::set_methodName(oop element, oop value) {
3597   element->obj_field_put(_methodName_offset, value);
3598 }
3599 
3600 void java_lang_StackFrameInfo::set_lineNumber(oop element, int value) {
3601   element->int_field_put(_lineNumber_offset, value);
3602 }
3603 
3604 void java_lang_LiveStackFrameInfo::set_monitors(oop element, oop value) {
3605   element->obj_field_put(_monitors_offset, value);
3606 }
3607 
3608 void java_lang_LiveStackFrameInfo::set_locals(oop element, oop value) {
3609   element->obj_field_put(_locals_offset, value);
3610 }
3611 
3612 void java_lang_LiveStackFrameInfo::set_operands(oop element, oop value) {
3613   element->obj_field_put(_operands_offset, value);
3614 }
3615 
3616 // Support for java Assertions - java_lang_AssertionStatusDirectives.
3617 
3618 void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) {
3619   o->obj_field_put(classes_offset, val);
3620 }
3621 
3622 void java_lang_AssertionStatusDirectives::set_classEnabled(oop o, oop val) {
3623   o->obj_field_put(classEnabled_offset, val);
3624 }
3625 
3626 void java_lang_AssertionStatusDirectives::set_packages(oop o, oop val) {
3627   o->obj_field_put(packages_offset, val);
3628 }
3629 
3630 void java_lang_AssertionStatusDirectives::set_packageEnabled(oop o, oop val) {
3631   o->obj_field_put(packageEnabled_offset, val);
3632 }
3633 
3634 void java_lang_AssertionStatusDirectives::set_deflt(oop o, bool val) {


3728   java_lang_invoke_MethodHandle::compute_offsets();
3729   java_lang_invoke_DirectMethodHandle::compute_offsets();
3730   java_lang_invoke_MemberName::compute_offsets();
3731   java_lang_invoke_LambdaForm::compute_offsets();
3732   java_lang_invoke_MethodType::compute_offsets();
3733   java_lang_invoke_CallSite::compute_offsets();
3734   java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets();
3735   java_security_AccessControlContext::compute_offsets();
3736   // Initialize reflection classes. The layouts of these classes
3737   // changed with the new reflection implementation in JDK 1.4, and
3738   // since the Universe doesn't know what JDK version it is until this
3739   // point we defer computation of these offsets until now.
3740   java_lang_reflect_AccessibleObject::compute_offsets();
3741   java_lang_reflect_Method::compute_offsets();
3742   java_lang_reflect_Constructor::compute_offsets();
3743   java_lang_reflect_Field::compute_offsets();
3744   java_nio_Buffer::compute_offsets();
3745   sun_reflect_ConstantPool::compute_offsets();
3746   sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets();
3747   java_lang_reflect_Parameter::compute_offsets();
3748   java_lang_StackFrameInfo::compute_offsets();
3749   java_lang_LiveStackFrameInfo::compute_offsets();
3750 
3751   // generated interpreter code wants to know about the offsets we just computed:
3752   AbstractAssembler::update_delayed_values();
3753 }
3754 
3755 #ifndef PRODUCT
3756 
3757 // These functions exist to assert the validity of hard-coded field offsets to guard
3758 // against changes in the class files
3759 
3760 bool JavaClasses::check_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) {
3761   EXCEPTION_MARK;
3762   fieldDescriptor fd;
3763   TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH);
3764   Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
3765   instanceKlassHandle h_klass (THREAD, k);
3766   TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH);
3767   TempNewSymbol f_sig  = SymbolTable::new_symbol(field_sig, CATCH);
3768   if (!h_klass->find_local_field(f_name, f_sig, &fd)) {
3769     tty->print_cr("Nonstatic field %s.%s not found", klass_name, field_name);


< prev index next >