2170 } 2171 2172 if (!version_matches(method(), version)) { 2173 // The method was redefined, accurate line number information isn't available 2174 java_lang_StackTraceElement::set_fileName(element(), NULL); 2175 java_lang_StackTraceElement::set_lineNumber(element(), -1); 2176 } else { 2177 // Fill in source file name and line number. 2178 Symbol* source = Backtrace::get_source_file_name(holder, version); 2179 if (ShowHiddenFrames && source == NULL) 2180 source = vmSymbols::unknown_class_name(); 2181 oop filename = StringTable::intern(source, CHECK); 2182 java_lang_StackTraceElement::set_fileName(element(), filename); 2183 2184 int line_number = Backtrace::get_line_number(method, bci); 2185 java_lang_StackTraceElement::set_lineNumber(element(), line_number); 2186 } 2187 } 2188 2189 Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* holder, TRAPS) { 2190 if (MemberNameInStackFrame) { 2191 Handle mname(THREAD, stackFrame->obj_field(_memberName_offset)); 2192 Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mname()); 2193 // we should expand MemberName::name when Throwable uses StackTrace 2194 // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL); 2195 return method; 2196 } else { 2197 short mid = stackFrame->short_field(_mid_offset); 2198 short version = stackFrame->short_field(_version_offset); 2199 return holder->method_with_orig_idnum(mid, version); 2200 } 2201 } 2202 2203 Symbol* java_lang_StackFrameInfo::get_file_name(Handle stackFrame, InstanceKlass* holder) { 2204 if (MemberNameInStackFrame) { 2205 return holder->source_file_name(); 2206 } else { 2207 short version = stackFrame->short_field(_version_offset); 2208 return Backtrace::get_source_file_name(holder, version); 2209 } 2210 } 2211 2212 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) { 2213 // set Method* or mid/cpref 2214 if (MemberNameInStackFrame) { 2215 oop mname = stackFrame->obj_field(_memberName_offset); 2216 InstanceKlass* ik = method->method_holder(); 2217 CallInfo info(method(), ik); 2218 MethodHandles::init_method_MemberName(mname, info); 2219 } else { 2220 int mid = method->orig_method_idnum(); 2221 int cpref = method->name_index(); 2222 assert((jushort)mid == mid, "mid should be short"); 2223 assert((jushort)cpref == cpref, "cpref should be short"); 2224 java_lang_StackFrameInfo::set_mid(stackFrame(), (short)mid); 2225 java_lang_StackFrameInfo::set_cpref(stackFrame(), (short)cpref); 2226 } 2227 // set bci 2228 java_lang_StackFrameInfo::set_bci(stackFrame(), bci); 2229 // method may be redefined; store the version 2230 int version = method->constants()->version(); 2231 assert((jushort)version == version, "version should be short"); 2232 java_lang_StackFrameInfo::set_version(stackFrame(), (short)version); 2233 } 2234 2235 void java_lang_StackFrameInfo::fill_methodInfo(Handle stackFrame, TRAPS) { 2236 ResourceMark rm(THREAD); 2237 oop k = stackFrame->obj_field(_declaringClass_offset); 2238 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(k)); 2239 Method* method = java_lang_StackFrameInfo::get_method(stackFrame, holder, CHECK); 2240 int bci = stackFrame->int_field(_bci_offset); 2241 2242 // The method can be NULL if the requested class version is gone 2243 Symbol* sym = (method != NULL) ? method->name() : NULL; 2244 if (MemberNameInStackFrame) { 2245 assert(sym != NULL, "MemberName must have method name"); 2246 } else { 2247 // The method can be NULL if the requested class version is gone 2248 if (sym == NULL) { 2249 short cpref = stackFrame->short_field(_cpref_offset); 2250 sym = holder->constants()->symbol_at(cpref); 2251 } 2252 } 2253 2254 // set method name 2255 oop methodname = StringTable::intern(sym, CHECK); 2256 java_lang_StackFrameInfo::set_methodName(stackFrame(), methodname); 2257 2258 // set file name and line number 2259 Symbol* source = get_file_name(stackFrame, holder); 2260 if (source != NULL) { 2261 oop filename = StringTable::intern(source, CHECK); 2262 java_lang_StackFrameInfo::set_fileName(stackFrame(), filename); 2263 } 2264 2265 // if the method has been redefined, the bci is no longer applicable 2266 short version = stackFrame->short_field(_version_offset); 2267 if (version_matches(method, version)) { 2268 int line_number = Backtrace::get_line_number(method, bci); 2269 java_lang_StackFrameInfo::set_lineNumber(stackFrame(), line_number); 2270 } 2271 } 2272 2273 void java_lang_StackFrameInfo::compute_offsets() { 2274 Klass* k = SystemDictionary::StackFrameInfo_klass(); 2275 compute_offset(_declaringClass_offset, k, vmSymbols::declaringClass_name(), vmSymbols::class_signature()); 2276 compute_offset(_memberName_offset, k, vmSymbols::memberName_name(), vmSymbols::object_signature()); 2277 compute_offset(_bci_offset, k, vmSymbols::bci_name(), vmSymbols::int_signature()); 2278 compute_offset(_methodName_offset, k, vmSymbols::methodName_name(), vmSymbols::string_signature()); 2279 compute_offset(_fileName_offset, k, vmSymbols::fileName_name(), vmSymbols::string_signature()); 2280 compute_offset(_lineNumber_offset, k, vmSymbols::lineNumber_name(), vmSymbols::int_signature()); 2281 STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); 2282 } 2283 2284 void java_lang_LiveStackFrameInfo::compute_offsets() { 2285 Klass* k = SystemDictionary::LiveStackFrameInfo_klass(); 2286 compute_offset(_monitors_offset, k, vmSymbols::monitors_name(), vmSymbols::object_array_signature()); 2287 compute_offset(_locals_offset, k, vmSymbols::locals_name(), vmSymbols::object_array_signature()); 2288 compute_offset(_operands_offset, k, vmSymbols::operands_name(), vmSymbols::object_array_signature()); 2289 } 2290 2291 void java_lang_reflect_AccessibleObject::compute_offsets() { 2292 Klass* k = SystemDictionary::reflect_AccessibleObject_klass(); 2293 compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature()); 2294 } 2295 2296 jboolean java_lang_reflect_AccessibleObject::override(oop reflect) { 2297 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); 2298 return (jboolean) reflect->bool_field(override_offset); 2299 } 2300 3673 int java_lang_ref_Reference::discovered_offset; 3674 int java_lang_ref_Reference::static_lock_offset; 3675 int java_lang_ref_Reference::static_pending_offset; 3676 int java_lang_ref_Reference::number_of_fake_oop_fields; 3677 int java_lang_ref_SoftReference::timestamp_offset; 3678 int java_lang_ref_SoftReference::static_clock_offset; 3679 int java_lang_ClassLoader::parent_offset; 3680 int java_lang_System::static_in_offset; 3681 int java_lang_System::static_out_offset; 3682 int java_lang_System::static_err_offset; 3683 int java_lang_System::static_security_offset; 3684 int java_lang_StackTraceElement::declaringClass_offset; 3685 int java_lang_StackTraceElement::methodName_offset; 3686 int java_lang_StackTraceElement::fileName_offset; 3687 int java_lang_StackTraceElement::lineNumber_offset; 3688 int java_lang_StackTraceElement::moduleName_offset; 3689 int java_lang_StackTraceElement::moduleVersion_offset; 3690 int java_lang_StackFrameInfo::_declaringClass_offset; 3691 int java_lang_StackFrameInfo::_memberName_offset; 3692 int java_lang_StackFrameInfo::_bci_offset; 3693 int java_lang_StackFrameInfo::_methodName_offset; 3694 int java_lang_StackFrameInfo::_fileName_offset; 3695 int java_lang_StackFrameInfo::_lineNumber_offset; 3696 int java_lang_StackFrameInfo::_mid_offset; 3697 int java_lang_StackFrameInfo::_version_offset; 3698 int java_lang_StackFrameInfo::_cpref_offset; 3699 int java_lang_LiveStackFrameInfo::_monitors_offset; 3700 int java_lang_LiveStackFrameInfo::_locals_offset; 3701 int java_lang_LiveStackFrameInfo::_operands_offset; 3702 int java_lang_AssertionStatusDirectives::classes_offset; 3703 int java_lang_AssertionStatusDirectives::classEnabled_offset; 3704 int java_lang_AssertionStatusDirectives::packages_offset; 3705 int java_lang_AssertionStatusDirectives::packageEnabled_offset; 3706 int java_lang_AssertionStatusDirectives::deflt_offset; 3707 int java_nio_Buffer::_limit_offset; 3708 int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0; 3709 int sun_reflect_ConstantPool::_oop_offset; 3710 int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset; 3711 3712 3713 // Support for java_lang_StackTraceElement 3714 3715 void java_lang_StackTraceElement::set_fileName(oop element, oop value) { 3716 element->obj_field_put(fileName_offset, value); 3717 } 3718 3724 element->obj_field_put(methodName_offset, value); 3725 } 3726 3727 void java_lang_StackTraceElement::set_lineNumber(oop element, int value) { 3728 element->int_field_put(lineNumber_offset, value); 3729 } 3730 3731 void java_lang_StackTraceElement::set_moduleName(oop element, oop value) { 3732 element->obj_field_put(moduleName_offset, value); 3733 } 3734 3735 void java_lang_StackTraceElement::set_moduleVersion(oop element, oop value) { 3736 element->obj_field_put(moduleVersion_offset, value); 3737 } 3738 3739 // Support for java_lang_StackFrameInfo 3740 void java_lang_StackFrameInfo::set_declaringClass(oop element, oop value) { 3741 element->obj_field_put(_declaringClass_offset, value); 3742 } 3743 3744 void java_lang_StackFrameInfo::set_mid(oop element, short value) { 3745 element->short_field_put(_mid_offset, value); 3746 } 3747 3748 void java_lang_StackFrameInfo::set_version(oop element, short value) { 3749 element->short_field_put(_version_offset, value); 3750 } 3751 3752 void java_lang_StackFrameInfo::set_cpref(oop element, short value) { 3753 element->short_field_put(_cpref_offset, value); 3754 } 3755 3756 void java_lang_StackFrameInfo::set_bci(oop element, int value) { 3757 element->int_field_put(_bci_offset, value); 3758 } 3759 3760 void java_lang_StackFrameInfo::set_fileName(oop element, oop value) { 3761 element->obj_field_put(_fileName_offset, value); 3762 } 3763 3764 void java_lang_StackFrameInfo::set_methodName(oop element, oop value) { 3765 element->obj_field_put(_methodName_offset, value); 3766 } 3767 3768 void java_lang_StackFrameInfo::set_lineNumber(oop element, int value) { 3769 element->int_field_put(_lineNumber_offset, value); 3770 } 3771 3772 void java_lang_LiveStackFrameInfo::set_monitors(oop element, oop value) { 3773 element->obj_field_put(_monitors_offset, value); 3774 } 3775 3776 void java_lang_LiveStackFrameInfo::set_locals(oop element, oop value) { 3777 element->obj_field_put(_locals_offset, value); 3778 } 3779 3780 void java_lang_LiveStackFrameInfo::set_operands(oop element, oop value) { 3781 element->obj_field_put(_operands_offset, value); 3782 } 3783 3784 // Support for java Assertions - java_lang_AssertionStatusDirectives. 3785 3786 void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) { 3787 o->obj_field_put(classes_offset, val); 3788 } 3789 | 2170 } 2171 2172 if (!version_matches(method(), version)) { 2173 // The method was redefined, accurate line number information isn't available 2174 java_lang_StackTraceElement::set_fileName(element(), NULL); 2175 java_lang_StackTraceElement::set_lineNumber(element(), -1); 2176 } else { 2177 // Fill in source file name and line number. 2178 Symbol* source = Backtrace::get_source_file_name(holder, version); 2179 if (ShowHiddenFrames && source == NULL) 2180 source = vmSymbols::unknown_class_name(); 2181 oop filename = StringTable::intern(source, CHECK); 2182 java_lang_StackTraceElement::set_fileName(element(), filename); 2183 2184 int line_number = Backtrace::get_line_number(method, bci); 2185 java_lang_StackTraceElement::set_lineNumber(element(), line_number); 2186 } 2187 } 2188 2189 Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* holder, TRAPS) { 2190 Handle mname(THREAD, stackFrame->obj_field(_memberName_offset)); 2191 Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mname()); 2192 // we should expand MemberName::name when Throwable uses StackTrace 2193 // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL); 2194 return method; 2195 } 2196 2197 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) { 2198 // set Method* or mid/cpref 2199 oop mname = stackFrame->obj_field(_memberName_offset); 2200 InstanceKlass* ik = method->method_holder(); 2201 CallInfo info(method(), ik); 2202 MethodHandles::init_method_MemberName(mname, info); 2203 // set bci 2204 java_lang_StackFrameInfo::set_bci(stackFrame(), bci); 2205 // method may be redefined; store the version 2206 int version = method->constants()->version(); 2207 assert((jushort)version == version, "version should be short"); 2208 java_lang_StackFrameInfo::set_version(stackFrame(), (short)version); 2209 } 2210 2211 void java_lang_StackFrameInfo::fill_methodInfo(Handle stackFrame, Handle stack_trace_element, TRAPS) { 2212 ResourceMark rm(THREAD); 2213 Handle k (THREAD, stackFrame->obj_field(_declaringClass_offset)); 2214 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(k())); 2215 Method* method = java_lang_StackFrameInfo::get_method(stackFrame, holder, CHECK); 2216 2217 short version = stackFrame->short_field(_version_offset); 2218 short bci = stackFrame->short_field(_bci_offset); 2219 int cpref = method->name_index(); 2220 java_lang_StackTraceElement::fill_in(stack_trace_element, holder, method, version, bci, cpref, CHECK); 2221 } 2222 2223 void java_lang_StackFrameInfo::compute_offsets() { 2224 Klass* k = SystemDictionary::StackFrameInfo_klass(); 2225 compute_offset(_declaringClass_offset, k, vmSymbols::declaringClass_name(), vmSymbols::class_signature()); 2226 compute_offset(_memberName_offset, k, vmSymbols::memberName_name(), vmSymbols::object_signature()); 2227 compute_offset(_bci_offset, k, vmSymbols::bci_name(), vmSymbols::short_signature()); 2228 STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); 2229 } 2230 2231 void java_lang_LiveStackFrameInfo::compute_offsets() { 2232 Klass* k = SystemDictionary::LiveStackFrameInfo_klass(); 2233 compute_offset(_monitors_offset, k, vmSymbols::monitors_name(), vmSymbols::object_array_signature()); 2234 compute_offset(_locals_offset, k, vmSymbols::locals_name(), vmSymbols::object_array_signature()); 2235 compute_offset(_operands_offset, k, vmSymbols::operands_name(), vmSymbols::object_array_signature()); 2236 } 2237 2238 void java_lang_reflect_AccessibleObject::compute_offsets() { 2239 Klass* k = SystemDictionary::reflect_AccessibleObject_klass(); 2240 compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature()); 2241 } 2242 2243 jboolean java_lang_reflect_AccessibleObject::override(oop reflect) { 2244 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); 2245 return (jboolean) reflect->bool_field(override_offset); 2246 } 2247 3620 int java_lang_ref_Reference::discovered_offset; 3621 int java_lang_ref_Reference::static_lock_offset; 3622 int java_lang_ref_Reference::static_pending_offset; 3623 int java_lang_ref_Reference::number_of_fake_oop_fields; 3624 int java_lang_ref_SoftReference::timestamp_offset; 3625 int java_lang_ref_SoftReference::static_clock_offset; 3626 int java_lang_ClassLoader::parent_offset; 3627 int java_lang_System::static_in_offset; 3628 int java_lang_System::static_out_offset; 3629 int java_lang_System::static_err_offset; 3630 int java_lang_System::static_security_offset; 3631 int java_lang_StackTraceElement::declaringClass_offset; 3632 int java_lang_StackTraceElement::methodName_offset; 3633 int java_lang_StackTraceElement::fileName_offset; 3634 int java_lang_StackTraceElement::lineNumber_offset; 3635 int java_lang_StackTraceElement::moduleName_offset; 3636 int java_lang_StackTraceElement::moduleVersion_offset; 3637 int java_lang_StackFrameInfo::_declaringClass_offset; 3638 int java_lang_StackFrameInfo::_memberName_offset; 3639 int java_lang_StackFrameInfo::_bci_offset; 3640 int java_lang_StackFrameInfo::_version_offset; 3641 int java_lang_LiveStackFrameInfo::_monitors_offset; 3642 int java_lang_LiveStackFrameInfo::_locals_offset; 3643 int java_lang_LiveStackFrameInfo::_operands_offset; 3644 int java_lang_AssertionStatusDirectives::classes_offset; 3645 int java_lang_AssertionStatusDirectives::classEnabled_offset; 3646 int java_lang_AssertionStatusDirectives::packages_offset; 3647 int java_lang_AssertionStatusDirectives::packageEnabled_offset; 3648 int java_lang_AssertionStatusDirectives::deflt_offset; 3649 int java_nio_Buffer::_limit_offset; 3650 int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0; 3651 int sun_reflect_ConstantPool::_oop_offset; 3652 int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset; 3653 3654 3655 // Support for java_lang_StackTraceElement 3656 3657 void java_lang_StackTraceElement::set_fileName(oop element, oop value) { 3658 element->obj_field_put(fileName_offset, value); 3659 } 3660 3666 element->obj_field_put(methodName_offset, value); 3667 } 3668 3669 void java_lang_StackTraceElement::set_lineNumber(oop element, int value) { 3670 element->int_field_put(lineNumber_offset, value); 3671 } 3672 3673 void java_lang_StackTraceElement::set_moduleName(oop element, oop value) { 3674 element->obj_field_put(moduleName_offset, value); 3675 } 3676 3677 void java_lang_StackTraceElement::set_moduleVersion(oop element, oop value) { 3678 element->obj_field_put(moduleVersion_offset, value); 3679 } 3680 3681 // Support for java_lang_StackFrameInfo 3682 void java_lang_StackFrameInfo::set_declaringClass(oop element, oop value) { 3683 element->obj_field_put(_declaringClass_offset, value); 3684 } 3685 3686 void java_lang_StackFrameInfo::set_version(oop element, short value) { 3687 element->short_field_put(_version_offset, value); 3688 } 3689 3690 void java_lang_StackFrameInfo::set_bci(oop element, int value) { 3691 element->int_field_put(_bci_offset, value); 3692 } 3693 3694 void java_lang_LiveStackFrameInfo::set_monitors(oop element, oop value) { 3695 element->obj_field_put(_monitors_offset, value); 3696 } 3697 3698 void java_lang_LiveStackFrameInfo::set_locals(oop element, oop value) { 3699 element->obj_field_put(_locals_offset, value); 3700 } 3701 3702 void java_lang_LiveStackFrameInfo::set_operands(oop element, oop value) { 3703 element->obj_field_put(_operands_offset, value); 3704 } 3705 3706 // Support for java Assertions - java_lang_AssertionStatusDirectives. 3707 3708 void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) { 3709 o->obj_field_put(classes_offset, val); 3710 } 3711 |