Somehow some of the formatting in my reply is gone.
I'm trying to fix it below...

Thanks,
Serguei


On 11/20/15 01:59, serguei.spit...@oracle.com wrote:
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