JDK14 spec query : MethodHandles:dropLookupMode(int)
Chris Hegarty
chris.hegarty at oracle.com
Tue Mar 10 11:28:00 UTC 2020
Mandy,
> On 9 Mar 2020, at 18:55, Mandy Chung <mandy.chung at oracle.com> wrote:
>
> ...
>
> Here is the spec clarification I am thinking of that may explain why the focus is not whether MODULE bit is set or not.
>
> @@ -1524,14 +1524,20 @@
> * Creates a lookup on the same lookup class which this lookup object
> * finds members, but with a lookup mode that has lost the given lookup mode.
> * The lookup mode to drop is one of {@link #PUBLIC PUBLIC}, {@link #MODULE
> - * MODULE}, {@link #PACKAGE PACKAGE}, {@link #PROTECTED PROTECTED} or {@link #PRIVATE PRIVATE}.
> - * {@link #PROTECTED PROTECTED} is always
> - * dropped and so the resulting lookup mode will never have this access capability.
> - * When dropping {@code PACKAGE} then the resulting lookup will not have {@code PACKAGE}
> - * or {@code PRIVATE} access. When dropping {@code MODULE} then the resulting lookup will
> - * not have {@code MODULE}, {@code PACKAGE}, or {@code PRIVATE} access. If {@code PUBLIC}
> - * is dropped then the resulting lookup has no access. If {@code UNCONDITIONAL}
> - * is dropped then the resulting lookup has no access.
> + * MODULE}, {@link #PACKAGE PACKAGE}, {@link #PROTECTED PROTECTED},
> + * {@link #PRIVATE PRIVATE}, or {@code UNCONDITIONAL}.
All six lookup modes are enumerated. Good.
> + * If this lookup has at least {@code PUBLIC} mode then
> + * {@link #PROTECTED PROTECTED} is always dropped and so the resulting lookup
> + * mode will never have this access capability. When dropping {@code PACKAGE}
> + * then the resulting lookup will not have {@code PACKAGE} or {@code PRIVATE} access.
> + * When dropping {@code MODULE} then the resulting lookup will not have
> + * {@code MODULE}, {@code PACKAGE}, or {@code PRIVATE} access.
> + * When dropping {@code PUBLIC} then the result lookup has no access.
I’m afraid this is still a little confusing to me ( but that could be just me! ).
> + * <p> If this lookup has {@code UNCONDITIONAL} mode, this lookup is a
> + * {@linkplain MethodHandles#publicLookup() public lookup} and it has no
> + * other mode set. When dropping {@code UNCONDITIONAL} on a public lookup
> + * then the resulting lookup has has no access.
The public lookup scenario is very clear.
Just an idea; now that you have this new UNCONDITIONAL paragraph, it could be simpler to reorder things a little to build upon it. For example:
/**
* Creates a lookup on the same lookup class which this lookup object
* finds members, but with a lookup mode that has lost the given lookup mode.
* The lookup mode to drop is one of {@link #PUBLIC PUBLIC}, {@link #MODULE
* MODULE}, {@link #PACKAGE PACKAGE}, {@link #PROTECTED PROTECTED},
* {@link #PRIVATE PRIVATE}, or {@code UNCONDITIONAL}.
*
* <p> If this lookup has {@code UNCONDITIONAL} mode, this lookup is a
* {@linkplain MethodHandles#publicLookup() public lookup} and it has no
* other mode set. When dropping {@code UNCONDITIONAL} on a public lookup
* then the resulting lookup has has no access.
*
* <p> If this lookup is not a <i>public lookup</i>, then the following
* applies regardless of the actual lookup modes held.
* The {@link #PROTECTED PROTECTED} mode is always dropped and so the resulting lookup
* mode will never have this access capability. When dropping {@code PACKAGE}
* then the resulting lookup will not have {@code PACKAGE} or {@code PRIVATE} access.
* When dropping {@code MODULE} then the resulting lookup will not have
* {@code MODULE}, {@code PACKAGE}, or {@code PRIVATE} access.
* When dropping {@code PUBLIC} then the result lookup has no access.
* ...
-Chris.
More information about the core-libs-dev
mailing list