> On Jun 4, 2020, at 12:31 PM, Mandy Chung <mandy.ch...@oracle.com> wrote: > > JVMS 5.5 is the spec for class initialization. Step 3 describes the > recursive request for initialization. >
Ok. (From quick offline chat we agreed its not worth explicitly highlighting this case.) > I have @jvms 5.5 in the javadoc. I can make it explicit: > > * Ensures that {@code targetClass} has been initialized. The class > * to be initialized must be {@linkplain #accessClass accessible} > * to this {@code Lookup} object. This method causes {@code > targetClass} > * to be initialized if it has not been already initialized, > * as specified in JVMS {@jvms 5.5}. > LGTM, Paul. > There are detailed rules about class initialization in JVMS 5.5. > > Mandy > > On 6/4/20 12:13 PM, Paul Sandoz wrote: >> Hi Mandy, >> >> What about this case: >> >> class Test { >> static { >> MethodHandles.lookup().ensureClassInitialized(Test.class); >> // not yet initialized >> } >> } >> >> (I see you do that for m/p1/A.java and >> Test.clinitInvokeEnsureClassInitialized.) >> >> Do we need mention this in the spec? e.g. this method does nothing if the >> class is already initialized or if the class is in the process of being >> initialized? >> >> Paul. >> >>> On Jun 3, 2020, at 4:16 PM, Mandy Chung <mandy.ch...@oracle.com> >>> <mailto:mandy.ch...@oracle.com> wrote: >>> >>> This proposes a new `Lookup::ensureClassInitialized` API as a replacement >>> for `sun.misc.Unsafe::ensureClassInitialized`.The Lookup object must have >>> the access to the given class being initialized. >>> >>> CSR: https://bugs.openjdk.java.net/browse/JDK-8245871 >>> <https://bugs.openjdk.java.net/browse/JDK-8245871> >>> >>> webrev: >>> http://cr.openjdk.java.net/~mchung/jdk15/webrevs/8235521/webrev.01/ >>> <http://cr.openjdk.java.net/~mchung/jdk15/webrevs/8235521/webrev.01/> >>> >>> This patch converts the JDK use of >>> `jdk.internal.misc.Unsafe::ensureClassInitialized` to >>> call this new API where appropriate. `Unsafe::ensureClassInitialized` >>> remains for java.lang.invoke.* internal implementation use. >>> >>> A framework can use `Lookup::privateLookupIn` to access a class in another >>> module if the module authorizes it by opening the packages for it to >>> access. Or a user can produce a less privileged lookup by >>> Lookup::dropLookupMode and pass it to the framework. >>> >>> `Class::ensureInitialized` was considered as an alternative. The downside >>> for this option is that it would be caller sensitive in order to ensure the >>> caller has the proper access to this class. And it may not work for >>> frameworks which have no access to user classes. It would have to fallback >>> toClass::forName` limited solution. >>> >>> Thanks >>> Mandy >>> >