hotspot/src/share/vm/classfile/javaClasses.cpp
changeset 37438 873c4aea8d1b
parent 37179 4dbcb3a642d2
child 37479 14a195eaf2c5
child 38014 8731fa11f766
child 38133 78b95467b9f1
equal deleted inserted replaced
37437:f824aabc7af8 37438:873c4aea8d1b
  2185     java_lang_StackTraceElement::set_lineNumber(element(), line_number);
  2185     java_lang_StackTraceElement::set_lineNumber(element(), line_number);
  2186   }
  2186   }
  2187 }
  2187 }
  2188 
  2188 
  2189 Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* holder, TRAPS) {
  2189 Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* holder, TRAPS) {
  2190   if (MemberNameInStackFrame) {
  2190   Handle mname(THREAD, stackFrame->obj_field(_memberName_offset));
  2191     Handle mname(THREAD, stackFrame->obj_field(_memberName_offset));
  2191   Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mname());
  2192     Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mname());
  2192   // we should expand MemberName::name when Throwable uses StackTrace
  2193     // we should expand MemberName::name when Throwable uses StackTrace
  2193   // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL);
  2194     // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL);
  2194   return method;
  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 }
  2195 }
  2211 
  2196 
  2212 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) {
  2197 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) {
  2213   // set Method* or mid/cpref
  2198   // set Method* or mid/cpref
  2214   if (MemberNameInStackFrame) {
  2199   oop mname = stackFrame->obj_field(_memberName_offset);
  2215     oop mname = stackFrame->obj_field(_memberName_offset);
  2200   InstanceKlass* ik = method->method_holder();
  2216     InstanceKlass* ik = method->method_holder();
  2201   CallInfo info(method(), ik);
  2217     CallInfo info(method(), ik);
  2202   MethodHandles::init_method_MemberName(mname, info);
  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
  2203   // set bci
  2228   java_lang_StackFrameInfo::set_bci(stackFrame(), bci);
  2204   java_lang_StackFrameInfo::set_bci(stackFrame(), bci);
  2229   // method may be redefined; store the version
  2205   // method may be redefined; store the version
  2230   int version = method->constants()->version();
  2206   int version = method->constants()->version();
  2231   assert((jushort)version == version, "version should be short");
  2207   assert((jushort)version == version, "version should be short");
  2232   java_lang_StackFrameInfo::set_version(stackFrame(), (short)version);
  2208   java_lang_StackFrameInfo::set_version(stackFrame(), (short)version);
  2233 }
  2209 }
  2234 
  2210 
  2235 void java_lang_StackFrameInfo::fill_methodInfo(Handle stackFrame, TRAPS) {
  2211 void java_lang_StackFrameInfo::to_stack_trace_element(Handle stackFrame, Handle stack_trace_element, TRAPS) {
  2236   ResourceMark rm(THREAD);
  2212   ResourceMark rm(THREAD);
  2237   oop k = stackFrame->obj_field(_declaringClass_offset);
  2213   Handle k (THREAD, stackFrame->obj_field(_declaringClass_offset));
  2238   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(k));
  2214   InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(k()));
  2239   Method* method = java_lang_StackFrameInfo::get_method(stackFrame, holder, CHECK);
  2215   Method* method = java_lang_StackFrameInfo::get_method(stackFrame, holder, CHECK);
  2240   int bci = stackFrame->int_field(_bci_offset);
  2216 
  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);
  2217   short version = stackFrame->short_field(_version_offset);
  2267   if (version_matches(method, version)) {
  2218   short bci = stackFrame->short_field(_bci_offset);
  2268     int line_number = Backtrace::get_line_number(method, bci);
  2219   int cpref = method->name_index();
  2269     java_lang_StackFrameInfo::set_lineNumber(stackFrame(), line_number);
  2220   java_lang_StackTraceElement::fill_in(stack_trace_element, holder, method, version, bci, cpref, CHECK);
  2270   }
       
  2271 }
  2221 }
  2272 
  2222 
  2273 void java_lang_StackFrameInfo::compute_offsets() {
  2223 void java_lang_StackFrameInfo::compute_offsets() {
  2274   Klass* k = SystemDictionary::StackFrameInfo_klass();
  2224   Klass* k = SystemDictionary::StackFrameInfo_klass();
  2275   compute_offset(_declaringClass_offset, k, vmSymbols::declaringClass_name(),  vmSymbols::class_signature());
  2225   compute_offset(_declaringClass_offset, k, vmSymbols::declaringClass_name(),  vmSymbols::class_signature());
  2276   compute_offset(_memberName_offset,     k, vmSymbols::memberName_name(),  vmSymbols::object_signature());
  2226   compute_offset(_memberName_offset,     k, vmSymbols::memberName_name(),  vmSymbols::object_signature());
  2277   compute_offset(_bci_offset,            k, vmSymbols::bci_name(),         vmSymbols::int_signature());
  2227   compute_offset(_bci_offset,            k, vmSymbols::bci_name(),         vmSymbols::short_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);
  2228   STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  2282 }
  2229 }
  2283 
  2230 
  2284 void java_lang_LiveStackFrameInfo::compute_offsets() {
  2231 void java_lang_LiveStackFrameInfo::compute_offsets() {
  2285   Klass* k = SystemDictionary::LiveStackFrameInfo_klass();
  2232   Klass* k = SystemDictionary::LiveStackFrameInfo_klass();
  3688 int java_lang_StackTraceElement::moduleName_offset;
  3635 int java_lang_StackTraceElement::moduleName_offset;
  3689 int java_lang_StackTraceElement::moduleVersion_offset;
  3636 int java_lang_StackTraceElement::moduleVersion_offset;
  3690 int java_lang_StackFrameInfo::_declaringClass_offset;
  3637 int java_lang_StackFrameInfo::_declaringClass_offset;
  3691 int java_lang_StackFrameInfo::_memberName_offset;
  3638 int java_lang_StackFrameInfo::_memberName_offset;
  3692 int java_lang_StackFrameInfo::_bci_offset;
  3639 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;
  3640 int java_lang_StackFrameInfo::_version_offset;
  3698 int java_lang_StackFrameInfo::_cpref_offset;
       
  3699 int java_lang_LiveStackFrameInfo::_monitors_offset;
  3641 int java_lang_LiveStackFrameInfo::_monitors_offset;
  3700 int java_lang_LiveStackFrameInfo::_locals_offset;
  3642 int java_lang_LiveStackFrameInfo::_locals_offset;
  3701 int java_lang_LiveStackFrameInfo::_operands_offset;
  3643 int java_lang_LiveStackFrameInfo::_operands_offset;
  3702 int java_lang_AssertionStatusDirectives::classes_offset;
  3644 int java_lang_AssertionStatusDirectives::classes_offset;
  3703 int java_lang_AssertionStatusDirectives::classEnabled_offset;
  3645 int java_lang_AssertionStatusDirectives::classEnabled_offset;
  3739 // Support for java_lang_StackFrameInfo
  3681 // Support for java_lang_StackFrameInfo
  3740 void java_lang_StackFrameInfo::set_declaringClass(oop element, oop value) {
  3682 void java_lang_StackFrameInfo::set_declaringClass(oop element, oop value) {
  3741   element->obj_field_put(_declaringClass_offset, value);
  3683   element->obj_field_put(_declaringClass_offset, value);
  3742 }
  3684 }
  3743 
  3685 
  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) {
  3686 void java_lang_StackFrameInfo::set_version(oop element, short value) {
  3749   element->short_field_put(_version_offset, value);
  3687   element->short_field_put(_version_offset, value);
  3750 }
  3688 }
  3751 
  3689 
  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) {
  3690 void java_lang_StackFrameInfo::set_bci(oop element, int value) {
  3757   element->int_field_put(_bci_offset, value);
  3691   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 }
  3692 }
  3771 
  3693 
  3772 void java_lang_LiveStackFrameInfo::set_monitors(oop element, oop value) {
  3694 void java_lang_LiveStackFrameInfo::set_monitors(oop element, oop value) {
  3773   element->obj_field_put(_monitors_offset, value);
  3695   element->obj_field_put(_monitors_offset, value);
  3774 }
  3696 }