On 4/20/20 1:06 PM, Chris Plummer wrote:
On 4/18/20 3:28 PM, Mandy Chung wrote:
Hi Chris, Serguei,

On 4/18/20 12:18 AM, Chris Plummer wrote:

Yes. I'd like to see all this as part of the Class/Classloading spec in some sort of section that gives an overview of all these topics, but mostly clarifies what an initiating loader is, and the (non) relationship to hidden classes.

We should refer initiating loader and class loading from JVMS 5.3.   JVM TI needs the clarification w.r.t. GetClassLoaderClasses that does not include hidden classes because the initiating class loader cannot find it.

GetLoadedClasses is about class creation.   While it seems tempted to put the descriptions in some sort of overview section, I found the clarification is specific for each function and hence inlining them in each function helps the readers directly see the difference.

I made a few changes that should ease your concern of duplication:
http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/webrev.06-svc-spec-changes.01/

- The class creation description added in GetLoadedClasses.  Not in JDWP, JDI and Instrumentation. - The description in GetClassLoaderClasses, Instrumentation::getInitiatedClasses, ClassLoaderReference::visibleClasses is revised to take out the details.   Add links from JDWP and JDI to GetClassLoaderClasses. - The details about hidden classes can be found from `Class::isHidden` and      `Lookup::defineHiddenClass`.

Mandy
Hi Mandy,

This looks much better. Thank you for the consolidating and the cross references. I think that's a big improvement.

One minor thing I noticed is a few "JNI-style signature" references. In LocalVariable.java you renamed "JNI signature" to "JNI-style signature", but in JDI Mirror.java you renamed "JNI-style signature" to "type signature".

You meant Type::signature.   Type::signature may return the type signature of a hidden class whereas LocalVariable::signature and TypeComponent::signature return the field/method descriptor where no hidden class will appear in a resolved field/variable/method.

And then in JDI TypeComponent.java you left the "JNI-style signature" reference unchanged. Why the inconsistency?

I made LocalVariable::signature consistent with TypeComponent::signature whereas Type::signature returns the string of the form described in Class::descriptorString.

I tried to keep existing reference to use "JNI-style signature". Since I touched on these files, I can change them to "type signature" which applies to these cases but I will leave the link to the JNI spec as it is.

In VirtualMachine.java:

 145      * @see Class or interface creation specified in
 146      * <a href="{@docRoot}/../specs/jvmti/jvmti.html#GetLoadedClasses">JVM TI GetLoadedClasses</a>

How about:

 145      * @a description of how Class and interface creation can be triggered is specified in  146      * <a href="{@docRoot}/../specs/jvmti/jvmti.html#GetLoadedClasses">JVM TI GetLoadedClasses</a>


     * @see <a href="{@docRoot}/../specs/jvmti/jvmti.html#GetLoadedClasses">      * JVM TI GetLoadedClasses</a> regarding how class and interface creation can be triggered

I read the following incorrectly a few times before I finally understood the meaning:

44     /**
  45      * Returns the {@linkplain com.sun.jdi.Type#name() name of the class}
  46      * that has been unloaded. The returned string may not be a
  47      * <a href="${docRoot}/java.base/java/lang/ClassLoader.html#binary-name">binary name</a>.
  48      *
  49      * @see Class#getName()
  50      */
  51     public String className();
  52
  53     /**
  54      * Returns the {@linkplain com.sun.jdi.Type#signature() type signature of the class}   55      * that has been unloaded.  The returned string may not be a type descriptor
  56      * specified in JVMS {@jvms 4.3.2}.
  57      *
  58      * @see java.lang.invoke.TypeDescriptor#descriptorString()
  59      */
  60     public String classSignature();

"may not be" through me off. I read it as "is not allowed not be". Your intent was "might not be", which might be a better choice of words.


I make it clearer as:

     * Returns the {@linkplain com.sun.jdi.Type#signature() type signature of the class}
     * that has been unloaded.  The result is of the same
     * form as the string returned by {@link Class#descriptorString()}.
     * If this class can be described nominally, the returned string is a
     * type descriptor conforming to JVMS {@jvms 4.3.2}; otherwise, the returned string
     * is not a type descriptor.

Similar clarification is also made in Type::signature:

     * Returns the type signature for this type.  The result is of the same
     * form as the string returned by {@link Class#descriptorString()}.
     * The returned string is a type descriptor conforming to JVMS {@jvms 4.3.2}      * if this type can be described nominally.  Otherwise, the returned string
     * is not a type descriptor.

Mandy

Reply via email to