src/hotspot/share/classfile/javaClasses.cpp
Index Unified diffs Context diffs Sdiffs Frames Patch New Old Previous File Next File open Cdiff src/hotspot/share/classfile/javaClasses.cpp

src/hotspot/share/classfile/javaClasses.cpp

Print this page

        

*** 2631,2640 **** --- 2631,2677 ---- int line_number = Backtrace::get_line_number(method, bci); java_lang_StackTraceElement::set_lineNumber(element(), line_number); } } + void java_lang_StackTraceElement::decode(Handle mirror, methodHandle method, int bci, Symbol*& methodname, Symbol*& filename, int& line_number) { + int method_id = method->orig_method_idnum(); + int cpref = method->name_index(); + decode(mirror, method_id, method->constants()->version(), bci, cpref, methodname, filename, line_number); + } + + void java_lang_StackTraceElement::decode(Handle mirror, int method_id, int version, int bci, int cpref, Symbol*& methodname, Symbol*& filename, int& line_number) { + // Fill in class name + InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror())); + Method* method = holder->method_with_orig_idnum(method_id, version); + + // The method can be NULL if the requested class version is gone + Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref); + + // Fill in method name + methodname = sym; + + if (!version_matches(method, version)) { + // If the method was redefined, accurate line number information isn't available + filename = NULL; + line_number = -1; + } else { + // Fill in source file name and line number. + // Use a specific ik version as a holder since the mirror might + // refer to a version that is now obsolete and no longer accessible + // via the previous versions list. + holder = holder->get_klass_version(version); + assert(holder != NULL, "sanity check"); + Symbol* source = holder->source_file_name(); + if (ShowHiddenFrames && source == NULL) { + source = vmSymbols::unknown_class_name(); + } + filename = source; + line_number = Backtrace::get_line_number(method, bci); + } + } + Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* holder, TRAPS) { HandleMark hm(THREAD); Handle mname(THREAD, stackFrame->obj_field(_memberName_offset)); Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mname()); // we should expand MemberName::name when Throwable uses StackTrace
src/hotspot/share/classfile/javaClasses.cpp
Index Unified diffs Context diffs Sdiffs Frames Patch New Old Previous File Next File