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 short version = stackFrame->short_field(_version_offset);
2133 return Backtrace::get_source_file_name(holder, version);
2134 }
2135 }
2136
2137 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) {
2138 // set Method* or mid/cpref
2139 if (MemberNameInStackFrame) {
2140 oop mname = stackFrame->obj_field(_memberName_offset);
2141 InstanceKlass* ik = method->method_holder();
2142 CallInfo info(method(), ik);
2143 MethodHandles::init_method_MemberName(mname, info);
2144 } else {
2145 int mid = method->orig_method_idnum();
2146 int cpref = method->name_index();
2147 assert((jushort)mid == mid, "mid should be short");
2148 assert((jushort)cpref == cpref, "cpref should be short");
2149 java_lang_StackFrameInfo::set_mid(stackFrame(), (short)mid);
2150 java_lang_StackFrameInfo::set_cpref(stackFrame(), (short)cpref);
2151 }
2152 // set bci
2153 java_lang_StackFrameInfo::set_bci(stackFrame(), bci);
2154 // method may be redefined; store the version
2155 int version = method->constants()->version();
2156 assert((jushort)version == version, "version should be short");
2157 java_lang_StackFrameInfo::set_version(stackFrame(), (short)version);
2158 }
2159
2160 void java_lang_StackFrameInfo::fill_methodInfo(Handle stackFrame, TRAPS) {
2161 ResourceMark rm(THREAD);
2162 oop k = stackFrame->obj_field(_declaringClass_offset);
2163 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(k));
2164 Method* method = java_lang_StackFrameInfo::get_method(stackFrame, holder, CHECK);
2165 int bci = stackFrame->int_field(_bci_offset);
2166
2167 // The method can be NULL if the requested class version is gone
2168 Symbol* sym = (method != NULL) ? method->name() : NULL;
2169 if (MemberNameInStackFrame) {
2170 assert(sym != NULL, "MemberName must have method name");
2171 } else {
2172 // The method can be NULL if the requested class version is gone
2173 if (sym == NULL) {
2174 short cpref = stackFrame->short_field(_cpref_offset);
2175 sym = holder->constants()->symbol_at(cpref);
2176 }
2177 }
2178
2179 // set method name
2180 oop methodname = StringTable::intern(sym, CHECK);
2181 java_lang_StackFrameInfo::set_methodName(stackFrame(), methodname);
2182
2183 // set file name and line number
2184 Symbol* source = get_file_name(stackFrame, holder);
2185 if (source != NULL) {
2186 oop filename = StringTable::intern(source, CHECK);
2187 java_lang_StackFrameInfo::set_fileName(stackFrame(), filename);
2188 }
2189
2190 // if the method has been redefined, the bci is no longer applicable
2191 short version = stackFrame->short_field(_version_offset);
2192 if (version_matches(method, version)) {
2193 int line_number = Backtrace::get_line_number(method, bci);
2194 java_lang_StackFrameInfo::set_lineNumber(stackFrame(), line_number);
2195 }
2196 }
2197
2198 void java_lang_StackFrameInfo::compute_offsets() {
2199 Klass* k = SystemDictionary::StackFrameInfo_klass();
2200 compute_offset(_declaringClass_offset, k, vmSymbols::declaringClass_name(), vmSymbols::class_signature());
2201 compute_offset(_memberName_offset, k, vmSymbols::memberName_name(), vmSymbols::object_signature());
2202 compute_offset(_bci_offset, k, vmSymbols::bci_name(), vmSymbols::int_signature());
2203 compute_offset(_methodName_offset, k, vmSymbols::methodName_name(), vmSymbols::string_signature());
2204 compute_offset(_fileName_offset, k, vmSymbols::fileName_name(), vmSymbols::string_signature());
2205 compute_offset(_lineNumber_offset, k, vmSymbols::lineNumber_name(), vmSymbols::int_signature());
2206 STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
2207 }
2208
2209 void java_lang_LiveStackFrameInfo::compute_offsets() {
2210 Klass* k = SystemDictionary::LiveStackFrameInfo_klass();
2211 compute_offset(_monitors_offset, k, vmSymbols::monitors_name(), vmSymbols::object_array_signature());
2212 compute_offset(_locals_offset, k, vmSymbols::locals_name(), vmSymbols::object_array_signature());
2213 compute_offset(_operands_offset, k, vmSymbols::operands_name(), vmSymbols::object_array_signature());
2214 }
2215
2216 void java_lang_reflect_AccessibleObject::compute_offsets() {
2217 Klass* k = SystemDictionary::reflect_AccessibleObject_klass();
2218 compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature());
2219 }
2220
2221 jboolean java_lang_reflect_AccessibleObject::override(oop reflect) {
2222 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2223 return (jboolean) reflect->bool_field(override_offset);
2224 }
2225
2226 void java_lang_reflect_AccessibleObject::set_override(oop reflect, jboolean value) {
2227 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2228 reflect->bool_field_put(override_offset, (int) value);
2229 }
2230
2231 void java_lang_reflect_Method::compute_offsets() {
2232 Klass* k = SystemDictionary::reflect_Method_klass();
2233 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature());
2234 compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature());
2235 compute_offset(returnType_offset, k, vmSymbols::returnType_name(), vmSymbols::class_signature());
3512 int java_lang_boxing_object::value_offset;
3513 int java_lang_boxing_object::long_value_offset;
3514 int java_lang_ref_Reference::referent_offset;
3515 int java_lang_ref_Reference::queue_offset;
3516 int java_lang_ref_Reference::next_offset;
3517 int java_lang_ref_Reference::discovered_offset;
3518 int java_lang_ref_Reference::static_lock_offset;
3519 int java_lang_ref_Reference::static_pending_offset;
3520 int java_lang_ref_Reference::number_of_fake_oop_fields;
3521 int java_lang_ref_SoftReference::timestamp_offset;
3522 int java_lang_ref_SoftReference::static_clock_offset;
3523 int java_lang_ClassLoader::parent_offset;
3524 int java_lang_System::static_in_offset;
3525 int java_lang_System::static_out_offset;
3526 int java_lang_System::static_err_offset;
3527 int java_lang_System::static_security_offset;
3528 int java_lang_StackTraceElement::declaringClass_offset;
3529 int java_lang_StackTraceElement::methodName_offset;
3530 int java_lang_StackTraceElement::fileName_offset;
3531 int java_lang_StackTraceElement::lineNumber_offset;
3532 int java_lang_StackFrameInfo::_declaringClass_offset;
3533 int java_lang_StackFrameInfo::_memberName_offset;
3534 int java_lang_StackFrameInfo::_bci_offset;
3535 int java_lang_StackFrameInfo::_methodName_offset;
3536 int java_lang_StackFrameInfo::_fileName_offset;
3537 int java_lang_StackFrameInfo::_lineNumber_offset;
3538 int java_lang_StackFrameInfo::_mid_offset;
3539 int java_lang_StackFrameInfo::_version_offset;
3540 int java_lang_StackFrameInfo::_cpref_offset;
3541 int java_lang_LiveStackFrameInfo::_monitors_offset;
3542 int java_lang_LiveStackFrameInfo::_locals_offset;
3543 int java_lang_LiveStackFrameInfo::_operands_offset;
3544 int java_lang_AssertionStatusDirectives::classes_offset;
3545 int java_lang_AssertionStatusDirectives::classEnabled_offset;
3546 int java_lang_AssertionStatusDirectives::packages_offset;
3547 int java_lang_AssertionStatusDirectives::packageEnabled_offset;
3548 int java_lang_AssertionStatusDirectives::deflt_offset;
3549 int java_nio_Buffer::_limit_offset;
3550 int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0;
3551 int sun_reflect_ConstantPool::_oop_offset;
3552 int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset;
3553
3554
3555 // Support for java_lang_StackTraceElement
3556
3557 void java_lang_StackTraceElement::set_fileName(oop element, oop value) {
3558 element->obj_field_put(fileName_offset, value);
3559 }
3560
3561 void java_lang_StackTraceElement::set_declaringClass(oop element, oop value) {
3562 element->obj_field_put(declaringClass_offset, value);
3563 }
3564
3565 void java_lang_StackTraceElement::set_methodName(oop element, oop value) {
3566 element->obj_field_put(methodName_offset, value);
3567 }
3568
3569 void java_lang_StackTraceElement::set_lineNumber(oop element, int value) {
3570 element->int_field_put(lineNumber_offset, value);
3571 }
3572
3573 // Support for java_lang_StackFrameInfo
3574 void java_lang_StackFrameInfo::set_declaringClass(oop element, oop value) {
3575 element->obj_field_put(_declaringClass_offset, value);
3576 }
3577
3578 void java_lang_StackFrameInfo::set_mid(oop element, short value) {
3579 element->short_field_put(_mid_offset, value);
3580 }
3581
3582 void java_lang_StackFrameInfo::set_version(oop element, short value) {
3583 element->short_field_put(_version_offset, value);
3584 }
3585
3586 void java_lang_StackFrameInfo::set_cpref(oop element, short value) {
3587 element->short_field_put(_cpref_offset, value);
3588 }
3589
3590 void java_lang_StackFrameInfo::set_bci(oop element, int value) {
3591 element->int_field_put(_bci_offset, value);
3592 }
3593
3594 void java_lang_StackFrameInfo::set_fileName(oop element, oop value) {
3595 element->obj_field_put(_fileName_offset, value);
3596 }
3597
3598 void java_lang_StackFrameInfo::set_methodName(oop element, oop value) {
3599 element->obj_field_put(_methodName_offset, value);
3600 }
3601
3602 void java_lang_StackFrameInfo::set_lineNumber(oop element, int value) {
3603 element->int_field_put(_lineNumber_offset, value);
3604 }
3605
3606 void java_lang_LiveStackFrameInfo::set_monitors(oop element, oop value) {
3607 element->obj_field_put(_monitors_offset, value);
3608 }
3609
3610 void java_lang_LiveStackFrameInfo::set_locals(oop element, oop value) {
3611 element->obj_field_put(_locals_offset, value);
3612 }
3613
3614 void java_lang_LiveStackFrameInfo::set_operands(oop element, oop value) {
3615 element->obj_field_put(_operands_offset, value);
3616 }
3617
3618 // Support for java Assertions - java_lang_AssertionStatusDirectives.
3619
3620 void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) {
3621 o->obj_field_put(classes_offset, val);
3622 }
3623
3624 void java_lang_AssertionStatusDirectives::set_classEnabled(oop o, oop val) {
3625 o->obj_field_put(classEnabled_offset, val);
3626 }
3627
3628 void java_lang_AssertionStatusDirectives::set_packages(oop o, oop val) {
3629 o->obj_field_put(packages_offset, val);
3630 }
3631
3632 void java_lang_AssertionStatusDirectives::set_packageEnabled(oop o, oop val) {
3633 o->obj_field_put(packageEnabled_offset, val);
3634 }
3635
3636 void java_lang_AssertionStatusDirectives::set_deflt(oop o, bool val) {
3730 java_lang_invoke_MethodHandle::compute_offsets();
3731 java_lang_invoke_DirectMethodHandle::compute_offsets();
3732 java_lang_invoke_MemberName::compute_offsets();
3733 java_lang_invoke_LambdaForm::compute_offsets();
3734 java_lang_invoke_MethodType::compute_offsets();
3735 java_lang_invoke_CallSite::compute_offsets();
3736 java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets();
3737 java_security_AccessControlContext::compute_offsets();
3738 // Initialize reflection classes. The layouts of these classes
3739 // changed with the new reflection implementation in JDK 1.4, and
3740 // since the Universe doesn't know what JDK version it is until this
3741 // point we defer computation of these offsets until now.
3742 java_lang_reflect_AccessibleObject::compute_offsets();
3743 java_lang_reflect_Method::compute_offsets();
3744 java_lang_reflect_Constructor::compute_offsets();
3745 java_lang_reflect_Field::compute_offsets();
3746 java_nio_Buffer::compute_offsets();
3747 sun_reflect_ConstantPool::compute_offsets();
3748 sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets();
3749 java_lang_reflect_Parameter::compute_offsets();
3750 java_lang_StackFrameInfo::compute_offsets();
3751 java_lang_LiveStackFrameInfo::compute_offsets();
3752
3753 // generated interpreter code wants to know about the offsets we just computed:
3754 AbstractAssembler::update_delayed_values();
3755 }
3756
3757 #ifndef PRODUCT
3758
3759 // These functions exist to assert the validity of hard-coded field offsets to guard
3760 // against changes in the class files
3761
3762 bool JavaClasses::check_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) {
3763 EXCEPTION_MARK;
3764 fieldDescriptor fd;
3765 TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH);
3766 Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
3767 instanceKlassHandle h_klass (THREAD, k);
3768 TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH);
3769 TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig, CATCH);
3770 if (!h_klass->find_local_field(f_name, f_sig, &fd)) {
3771 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 // 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);
|