Hi Mandy,

It looks pretty good to me.
At least, I do not see any obvious issues.


Just some minor comments below.


webrev.03/hotspot/src/share/vm/classfile/javaClasses.cpp

2128 Symbol* java_lang_StackFrameInfo::get_file_name(Handle stackFrame, InstanceKlass* holder) {
2129 if (MemberNameInStackFrame) {
2130 return holder->source_file_name();
2131 } else {
2132 int bci = stackFrame->int_field(_bci_offset);
2133 short version = stackFrame->short_field(_version_offset);
2134
2135 return Backtrace::get_source_file_name(holder, version);
2136 }
2137 }

 The 'int bci' is not used above.

2139 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) {
2140 if (MemberNameInStackFrame) {
2141 oop mname = stackFrame->obj_field(_memberName_offset);
2142 InstanceKlass* ik = method->method_holder();
2143 CallInfo info(method(), ik);
2144 MethodHandles::init_method_MemberName(mname, info);
2145 java_lang_StackFrameInfo::set_bci(stackFrame(), bci);
2146 // method may be redefined; store the version
2147 int version = method->constants()->version();
2148 assert((jushort)version == version, "version should be short");
2149 java_lang_StackFrameInfo::set_version(stackFrame(), (short)version);
2150 } else {
2151 int mid = method->orig_method_idnum();
2152 int version = method->constants()->version();
2153 int cpref = method->name_index();
2154 assert((jushort)mid == mid, "mid should be short");
2155 assert((jushort)version == version, "version should be short");
2156 assert((jushort)cpref == cpref, "cpref should be short");
2157
2158 java_lang_StackFrameInfo::set_mid(stackFrame(), (short)mid);
2159 java_lang_StackFrameInfo::set_version(stackFrame(), (short)version);
2160 java_lang_StackFrameInfo::set_cpref(stackFrame(), (short)cpref);
2161 java_lang_StackFrameInfo::set_bci(stackFrame(), bci);
2162 }
2163 } Minor: The calls to set_version() and set_bci() are the same for both alternatives and can be done just once before the if-else statement as below. With such refactoring it is clear what the common part is. void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) { java_lang_StackFrameInfo::set_bci(stackFrame(), bci); // method may be redefined; store the version int version = method->constants()->version(); assert((jushort)version == version, "version should be short"); java_lang_StackFrameInfo::set_version(stackFrame(), (short)version); if (MemberNameInStackFrame) { oop mname = stackFrame->obj_field(_memberName_offset); InstanceKlass* ik = method->method_holder(); CallInfo info(method(), ik); MethodHandles::init_method_MemberName(mname, info); } else { int mid = method->orig_method_idnum(); int cpref = method->name_index(); assert((jushort)mid == mid, "mid should be short"); assert((jushort)cpref == cpref, "cpref should be short"); java_lang_StackFrameInfo::set_mid(stackFrame(), (short)mid); java_lang_StackFrameInfo::set_cpref(stackFrame(), (short)cpref); } }


webrev.03/hotspot/src/share/vm/prims/jvm.cpp

572 int limit = start_index+frame_count; 597 int limit = start_index+frame_count;

Minor: Need spaces around the '+'. webrev.03/hotspot/src/share/vm/prims/stackwalk.cpp

  62 // Parameters:
  63 //  thread.        Current Java thread.
  64 //  magic.         Magic value used for each stack walking
  65 //  classes_array  User-supplied buffers.  The 0th element is reserved
  . . .

  86 // Parameters:
  87 //   mode.          Restrict which frames to be decoded.
  88 //   decode_limit.  Maximum of frames to be decoded.
  89 //   start_index.   Start index to the user-supplied buffers.
  90 //   classes_array. Buffer to store classes in, starting at start_index.
  91 //   frames_array.  Buffer to store StackFrame in, starting at start_index.
  92 //                  NULL if not used.
  93 //   end_index.     End index to the user-supplied buffers with unpacked 
frames.
  94 //
  . . .
 274 // Parameters:
 275 //   stackStream.   StackStream object
 276 //   mode.          Stack walking mode.
 277 //   skip_frames.   Number of frames to be skipped.
 278 //   frame_count.   Number of frames to be traversed.
 279 //   start_index.   Start index to the user-supplied buffers.
 280 //   classes_array. Buffer to store classes in, starting at start_index.
 281 //   frames_array.  Buffer to store StackFrame in, starting at start_index.
 . . .
 414 // Parameters:
 415 //   stackStream.   StackStream object
 416 //   mode.          Stack walking mode.
 417 //   magic.         Must be valid value to continue the stack walk
 418 //   frame_count.   Number of frames to be decoded.
 419 //   start_index.   Start index to the user-supplied buffers.
 420 //   classes_array. Buffer to store classes in, starting at start_index.
 421 //   frames_array.  Buffer to store StackFrame in, starting at start_index.

Minor: Dots after the parameter names looks strange. Probably better to remove them or replace with colons. Also, the line 65 is inconsistent with others.

 114     if (!ShowHiddenFrames && StackWalk::skip_hidden_frames(mode)) {
 115         if (method->is_hidden()) {
 116           if (TraceStackWalk) {
 117             tty->print("  hidden method: "); method->print_short_name();
 118             tty->print("\n");
 119           }
 120           continue;
 121         }
 122     }

  Minor: Indent at the line 115 must be +2.

 338         if (!skip_to_fillInStackTrace) {
 339           if (ik == SystemDictionary::Throwable_klass() &&
 340               method->name() == vmSymbols::fillInStackTrace_name()) {
 341               // this frame will be skipped
 342               skip_to_fillInStackTrace = true;
 343           }
 344         } else if (!(ik->is_subclass_of(SystemDictionary::Throwable_klass()) 
&&
 345                      method->name() == 
vmSymbols::object_initializer_name())) {
 346             // there are none or we've seen them all - either way stop 
checking
 347             skip_throwableInit_check = true;
 348             break;
 349         }

   Minor: Indent must be +2 at 341 and 347.

 360     for (int n=0; n < skip_frames && !vfst.at_end(); vfst.next(), n++) {
 451   int count = frame_count+start_index;

  Minor: Need spaces around the '=' and '+'.

 392   // Link the thread and vframe stream into the callee-visible object:
 397   // Do this before anything else happens, to disable any lingering stream 
objects:
 400   // Throw pending exception if we must:

Minor: Better to place dots instead of colons at the end. Thanks, Serguei On 11/19/15 18:13, Mandy Chung wrote:
Cross-posting to core-libs-dev.

Delta webrev incorporating feedback from Coleen and Brent and also a fix that 
Daniel made:
    http://cr.openjdk.java.net/~mchung/jdk9/jep259/webrev.03-delta/

Full webrev:
    http://cr.openjdk.java.net/~mchung/jdk9/jep259/webrev.03/

This also includes a couple of new tests Hamlin has contributed.

Mandy

On Nov 19, 2015, at 1:38 PM, Coleen Phillimore <coleen.phillim...@oracle.com> 
wrote:


Hi Mandy,
Thank you for making these changes.  I think it looks really good!

On 11/19/15 4:09 PM, Mandy Chung wrote:
Hi Coleen,

Here is the revised webrev incorporating your suggestions and a couple other 
minor java side change:
    http://cr.openjdk.java.net/~mchung/jdk9/jep259/webrev.03-delta

I got some idea how to prepare Throwable to switch to StackWalker API to 
address the footprint/performance concern.  I agree with you that it would have 
to use mid/cpref in the short term for Throwable.  StackWalker::walk should use 
MemberName and should improve the footprint/performance issue in the long term.

Are you okay to follow that up with JDK-8141239 and Throwable continues to use 
the VM backtrace until JDK-8141239 is resolved?
Yes, and as we discussed, I'd like to help with this.

Thanks!
Coleen

Reply via email to