[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-serviceability-dev
Subject:    Re: Review Request: 8238358: Implementation of JEP 371: Hidden Classes
From:       Mandy Chung <mandy.chung () oracle ! com>
Date:       2020-03-31 19:25:53
Message-ID: cfe9c4ae-f70e-6408-9d8b-70f02158ff3a () oracle ! com
[Download RAW message or body]

Alex's feedback:  rename isHiddenClass to isHidden as it can be a hidden 
class or interface.

`isLocalClass` and `sAnonymousClass` are correct because the Java 
language only has local classes and anon classes, not local interfaces 
or anon. interfaces.  `isHidden` is like `isSynthetic`, it could be a 
class or interface.

Although isHiddenClass seems clearer, I'm okay to rename it to `isHidden`.

Mandy

On 3/31/20 11:06 AM, Mandy Chung wrote:
> This patch addresses Joe's feedback on the CSR [1]:
>
> http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/webrev.03-delta-jdarcy/ 
>
>
> Specifically, it adds to the class specification of java.lang.Class to 
> describe how the relevant methods behave for hidden classes.  In 
> addition, use the new inline @jvms tag.
>
> Thanks
> Mandy
> [1] https://bugs.openjdk.java.net/browse/JDK-8238359
>
> On 3/26/20 4:57 PM, Mandy Chung wrote:
>> Please review the implementation of JEP 371: Hidden Classes. The main 
>> changes are in core-libs and hotspot runtime area.  Small changes are 
>> made in javac, VM compiler (intrinsification of 
>> Class::isHiddenClass), JFR, JDI, and jcmd.  CSR [1]has been reviewed 
>> and is in the finalized state (see specdiff and javadoc below for 
>> reference).
>>
>> Webrev:
>> http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/webrev.03 
>>
>>
>> Hidden class is created via `Lookup::defineHiddenClass`. From JVM's 
>> point
>> of view, a hidden class is a normal class except the following:
>>
>> - A hidden class has no initiating class loader and is not registered 
>> in any dictionary.
>> - A hidden class has a name containing an illegal character 
>> `Class::getName` returns `p.Foo/0x1234` whereas `GetClassSignature` 
>> returns "Lp/Foo.0x1234;".
>> - A hidden class is not modifiable, i.e. cannot be redefined or 
>> retransformed. JVM TI IsModifableClass returns false on a hidden.
>> - Final fields in a hidden class is "final".  The value of final 
>> fields cannot be overriden via reflection.  setAccessible(true) can 
>> still be called on reflected objects representing final fields in a 
>> hidden class and its access check will be suppressed but only have 
>> read-access (i.e. can do Field::getXXX but not setXXX).
>>
>> Brief summary of this patch:
>>
>> 1. A new Lookup::defineHiddenClass method is the API to create a 
>> hidden class.
>> 2. A new Lookup.ClassOption enum class defines NESTMATE and STRONG 
>> option that
>>    can be specified when creating a hidden class.
>> 3. A new Class::isHiddenClass method tests if a class is a hidden class.
>> 4. Field::setXXX method will throw IAE on a final field of a hidden 
>> class
>>    regardless of the value of the accessible flag.
>> 5. JVM_LookupDefineClass is the new JVM entry point for 
>> Lookup::defineClass
>>    and defineHiddenClass to create a class from the given bytes.
>> 6. ClassLoaderData implementation is not changed.  There is one 
>> primary CLD
>>    that holds the classes strongly referenced by its defining 
>> loader.  There
>>    can be zero or more additional CLDs - one per weak class.
>> 7. Nest host determination is updated per revised JVMS 5.4.4. Access 
>> control
>>    check no longer throws LinkageError but instead it will throw IAE 
>> with
>>    a clear message if a class fails to resolve/validate the nest host 
>> declared
>>    in NestHost/NestMembers attribute.
>> 8. JFR, jcmd, JDI are updated to support hidden classes.
>> 9. update javac LambdaToMethod as lambda proxy starts using nestmates
>>    and generate a bridge method to desuger a method reference to a 
>> protected
>>    method in its supertype in a different package
>>
>> This patch also updates StringConcatFactory, LambdaMetaFactory, and 
>> LambdaForms
>> to use hidden classes.  The webrev includes changes in nashorn to 
>> hidden class
>> and I will update the webrev if JEP 372 removes it any time soon.
>>
>> We uncovered a bug in Lookup::defineClass spec throws LinkageError 
>> and intends
>> to have the newly created class linked.  However, the implementation 
>> in 14
>> does not link the class.  A separate CSR [2] proposes to update the
>> implementation to match the spec.  This patch fixes the implementation.
>>
>> The spec update on JVM TI, JDI and Instrumentation will be done as
>> a separate RFE [3].  This patch includes new tests for JVM TI and
>> java.instrument that validates how the existing APIs work for hidden 
>> classes.
>>
>> javadoc/specdiff
>> http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/api/
>> http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/specdiff/ 
>>
>>
>> JVMS 5.4.4 change:
>> http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/Draft-JVMS-HiddenClasses.pdf 
>>
>>
>> CSR:
>> https://bugs.openjdk.java.net/browse/JDK-8238359
>>
>> Thanks
>> Mandy
>> [1] https://bugs.openjdk.java.net/browse/JDK-8238359
>> [2] https://bugs.openjdk.java.net/browse/JDK-8240338
>> [3] https://bugs.openjdk.java.net/browse/JDK-8230502
>


[Attachment #3 (text/html)]

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    Alex's feedback:  rename isHiddenClass to isHidden as it can be a
    hidden class or interface.<br>
    <br>
    `isLocalClass` and `sAnonymousClass` are correct because the Java
    language only has local classes and anon classes, not local
    interfaces or anon. interfaces.  `isHidden` is like `isSynthetic`,
    it could be a class or interface. <br>
    <br>
    Although isHiddenClass seems clearer, I'm okay to rename it to
    `isHidden`.<br>
    <br>
    Mandy<br>
    <br>
    <div class="moz-cite-prefix">On 3/31/20 11:06 AM, Mandy Chung wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:940c6907-612e-8744-376c-5362991d4a42@oracle.com">This
      patch addresses Joe's feedback on the CSR [1]:
      <br>
      <br>
<a class="moz-txt-link-freetext" \
href="http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/webrev.03-del \
ta-jdarcy/">http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/webrev.03-delta-jdarcy/</a>
  <br>
      <br>
      Specifically, it adds to the class specification of
      java.lang.Class to describe how the relevant methods behave for
      hidden classes.  In addition, use the new inline @jvms tag.
      <br>
      <br>
      Thanks
      <br>
      Mandy
      <br>
      [1] <a class="moz-txt-link-freetext" \
href="https://bugs.openjdk.java.net/browse/JDK-8238359">https://bugs.openjdk.java.net/browse/JDK-8238359</a>
  <br>
      <br>
      On 3/26/20 4:57 PM, Mandy Chung wrote:
      <br>
      <blockquote type="cite">Please review the implementation of JEP
        371: Hidden Classes. The main changes are in core-libs and
        hotspot runtime area.  Small changes are made in javac, VM
        compiler (intrinsification of Class::isHiddenClass), JFR, JDI,
        and jcmd.  CSR [1]has been reviewed and is in the finalized
        state (see specdiff and javadoc below for reference).
        <br>
        <br>
        Webrev:
        <br>
<a class="moz-txt-link-freetext" \
href="http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/webrev.03">http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/webrev.03</a>
  <br>
        <br>
        Hidden class is created via `Lookup::defineHiddenClass`. From
        JVM's point
        <br>
        of view, a hidden class is a normal class except the following:
        <br>
        <br>
        - A hidden class has no initiating class loader and is not
        registered in any dictionary.
        <br>
        - A hidden class has a name containing an illegal character
        `Class::getName` returns `p.Foo/0x1234` whereas
        `GetClassSignature` returns "Lp/Foo.0x1234;".
        <br>
        - A hidden class is not modifiable, i.e. cannot be redefined or
        retransformed. JVM TI IsModifableClass returns false on a
        hidden.
        <br>
        - Final fields in a hidden class is "final".  The value of final
        fields cannot be overriden via reflection.  setAccessible(true)
        can still be called on reflected objects representing final
        fields in a hidden class and its access check will be suppressed
        but only have read-access (i.e. can do Field::getXXX but not
        setXXX).
        <br>
        <br>
        Brief summary of this patch:
        <br>
        <br>
        1. A new Lookup::defineHiddenClass method is the API to create a
        hidden class.
        <br>
        2. A new Lookup.ClassOption enum class defines NESTMATE and
        STRONG option that
        <br>
           can be specified when creating a hidden class.
        <br>
        3. A new Class::isHiddenClass method tests if a class is a
        hidden class.
        <br>
        4. Field::setXXX method will throw IAE on a final field of a
        hidden class
        <br>
           regardless of the value of the accessible flag.
        <br>
        5. JVM_LookupDefineClass is the new JVM entry point for
        Lookup::defineClass
        <br>
           and defineHiddenClass to create a class from the given bytes.
        <br>
        6. ClassLoaderData implementation is not changed.  There is one
        primary CLD
        <br>
           that holds the classes strongly referenced by its defining
        loader.  There
        <br>
           can be zero or more additional CLDs - one per weak class.
        <br>
        7. Nest host determination is updated per revised JVMS 5.4.4.
        Access control
        <br>
           check no longer throws LinkageError but instead it will throw
        IAE with
        <br>
           a clear message if a class fails to resolve/validate the nest
        host declared
        <br>
           in NestHost/NestMembers attribute.
        <br>
        8. JFR, jcmd, JDI are updated to support hidden classes.
        <br>
        9. update javac LambdaToMethod as lambda proxy starts using
        nestmates
        <br>
           and generate a bridge method to desuger a method reference to
        a protected
        <br>
           method in its supertype in a different package
        <br>
        <br>
        This patch also updates StringConcatFactory, LambdaMetaFactory,
        and LambdaForms
        <br>
        to use hidden classes.  The webrev includes changes in nashorn
        to hidden class
        <br>
        and I will update the webrev if JEP 372 removes it any time
        soon.
        <br>
        <br>
        We uncovered a bug in Lookup::defineClass spec throws
        LinkageError and intends
        <br>
        to have the newly created class linked.  However, the
        implementation in 14
        <br>
        does not link the class.  A separate CSR [2] proposes to update
        the
        <br>
        implementation to match the spec.  This patch fixes the
        implementation.
        <br>
        <br>
        The spec update on JVM TI, JDI and Instrumentation will be done
        as
        <br>
        a separate RFE [3].  This patch includes new tests for JVM TI
        and
        <br>
        java.instrument that validates how the existing APIs work for
        hidden classes.
        <br>
        <br>
        javadoc/specdiff
        <br>
<a class="moz-txt-link-freetext" \
href="http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/api/">http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/api/</a>
  <br>
<a class="moz-txt-link-freetext" \
href="http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/specdiff/">http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/specdiff/</a>
  <br>
        <br>
        JVMS 5.4.4 change:
        <br>
<a class="moz-txt-link-freetext" \
href="http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/Draft-JVMS-Hi \
ddenClasses.pdf">http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/Draft-JVMS-HiddenClasses.pdf</a>
  <br>
        <br>
        CSR:
        <br>
        <a class="moz-txt-link-freetext" \
href="https://bugs.openjdk.java.net/browse/JDK-8238359">https://bugs.openjdk.java.net/browse/JDK-8238359</a>
  <br>
        <br>
        Thanks
        <br>
        Mandy
        <br>
        [1] <a class="moz-txt-link-freetext" \
href="https://bugs.openjdk.java.net/browse/JDK-8238359">https://bugs.openjdk.java.net/browse/JDK-8238359</a>
  <br>
        [2] <a class="moz-txt-link-freetext" \
href="https://bugs.openjdk.java.net/browse/JDK-8240338">https://bugs.openjdk.java.net/browse/JDK-8240338</a>
  <br>
        [3] <a class="moz-txt-link-freetext" \
href="https://bugs.openjdk.java.net/browse/JDK-8230502">https://bugs.openjdk.java.net/browse/JDK-8230502</a>
  <br>
      </blockquote>
      <br>
    </blockquote>
    <br>
  </body>
</html>



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic