1516 } |
1516 } |
1517 |
1517 |
1518 // After this many redefines, the stack trace is unreliable. |
1518 // After this many redefines, the stack trace is unreliable. |
1519 const int MAX_VERSION = USHRT_MAX; |
1519 const int MAX_VERSION = USHRT_MAX; |
1520 |
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 |
1521 static inline bool version_matches(Method* method, int version) { |
1536 static inline bool version_matches(Method* method, int version) { |
1522 assert(version < MAX_VERSION, "version is too big"); |
1537 assert(version < MAX_VERSION, "version is too big"); |
1523 return method != NULL && (method->constants()->version() == version); |
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; |
1524 } |
1556 } |
1525 |
1557 |
1526 // This class provides a simple wrapper over the internal structure of |
1558 // This class provides a simple wrapper over the internal structure of |
1527 // exception backtrace to insulate users of the backtrace from needing |
1559 // exception backtrace to insulate users of the backtrace from needing |
1528 // to know what it looks like. |
1560 // to know what it looks like. |
2090 // The method was redefined, accurate line number information isn't available |
2134 // The method was redefined, accurate line number information isn't available |
2091 java_lang_StackTraceElement::set_fileName(element(), NULL); |
2135 java_lang_StackTraceElement::set_fileName(element(), NULL); |
2092 java_lang_StackTraceElement::set_lineNumber(element(), -1); |
2136 java_lang_StackTraceElement::set_lineNumber(element(), -1); |
2093 } else { |
2137 } else { |
2094 // Fill in source file name and line number. |
2138 // Fill in source file name and line number. |
2095 Symbol* source = Backtrace::get_source_file_name(holder, version); |
2139 Symbol* source = get_source_file_name(holder, version); |
2096 if (ShowHiddenFrames && source == NULL) |
2140 if (ShowHiddenFrames && source == NULL) |
2097 source = vmSymbols::unknown_class_name(); |
2141 source = vmSymbols::unknown_class_name(); |
2098 oop filename = StringTable::intern(source, CHECK_0); |
2142 oop filename = StringTable::intern(source, CHECK_0); |
2099 java_lang_StackTraceElement::set_fileName(element(), filename); |
2143 java_lang_StackTraceElement::set_fileName(element(), filename); |
2100 |
2144 |
2101 int line_number = Backtrace::get_line_number(method, bci); |
2145 int line_number = get_line_number(method, bci); |
2102 java_lang_StackTraceElement::set_lineNumber(element(), line_number); |
2146 java_lang_StackTraceElement::set_lineNumber(element(), line_number); |
2103 } |
2147 } |
2104 return element(); |
2148 return element(); |
2105 } |
2149 } |
2106 |
2150 |
2107 oop java_lang_StackTraceElement::create(const methodHandle& method, int bci, TRAPS) { |
2151 oop java_lang_StackTraceElement::create(const methodHandle& method, int bci, TRAPS) { |
2108 Handle mirror (THREAD, method->method_holder()->java_mirror()); |
2152 Handle mirror (THREAD, method->method_holder()->java_mirror()); |
2109 int method_id = method->orig_method_idnum(); |
2153 int method_id = method->orig_method_idnum(); |
2110 int cpref = method->name_index(); |
2154 int cpref = method->name_index(); |
2111 return create(mirror, method_id, method->constants()->version(), bci, cpref, THREAD); |
2155 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 } |
2156 } |
2215 |
2157 |
2216 void java_lang_reflect_AccessibleObject::compute_offsets() { |
2158 void java_lang_reflect_AccessibleObject::compute_offsets() { |
2217 Klass* k = SystemDictionary::reflect_AccessibleObject_klass(); |
2159 Klass* k = SystemDictionary::reflect_AccessibleObject_klass(); |
2218 compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature()); |
2160 compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature()); |
3527 int java_lang_System::static_security_offset; |
3469 int java_lang_System::static_security_offset; |
3528 int java_lang_StackTraceElement::declaringClass_offset; |
3470 int java_lang_StackTraceElement::declaringClass_offset; |
3529 int java_lang_StackTraceElement::methodName_offset; |
3471 int java_lang_StackTraceElement::methodName_offset; |
3530 int java_lang_StackTraceElement::fileName_offset; |
3472 int java_lang_StackTraceElement::fileName_offset; |
3531 int java_lang_StackTraceElement::lineNumber_offset; |
3473 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; |
3474 int java_lang_AssertionStatusDirectives::classes_offset; |
3545 int java_lang_AssertionStatusDirectives::classEnabled_offset; |
3475 int java_lang_AssertionStatusDirectives::classEnabled_offset; |
3546 int java_lang_AssertionStatusDirectives::packages_offset; |
3476 int java_lang_AssertionStatusDirectives::packages_offset; |
3547 int java_lang_AssertionStatusDirectives::packageEnabled_offset; |
3477 int java_lang_AssertionStatusDirectives::packageEnabled_offset; |
3548 int java_lang_AssertionStatusDirectives::deflt_offset; |
3478 int java_lang_AssertionStatusDirectives::deflt_offset; |
3568 |
3498 |
3569 void java_lang_StackTraceElement::set_lineNumber(oop element, int value) { |
3499 void java_lang_StackTraceElement::set_lineNumber(oop element, int value) { |
3570 element->int_field_put(lineNumber_offset, value); |
3500 element->int_field_put(lineNumber_offset, value); |
3571 } |
3501 } |
3572 |
3502 |
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 |
3503 |
3618 // Support for java Assertions - java_lang_AssertionStatusDirectives. |
3504 // Support for java Assertions - java_lang_AssertionStatusDirectives. |
3619 |
3505 |
3620 void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) { |
3506 void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) { |
3621 o->obj_field_put(classes_offset, val); |
3507 o->obj_field_put(classes_offset, val); |