Error in sequence initialisation of Lookup
John Rose
John.Rose at Sun.COM
Mon Jun 8 22:57:49 PDT 2009
On Jun 5, 2009, at 1:31 AM, Rémi Forax wrote:
> This program throw an Internal Error
> ...
> MethodHandles$Lookup static init calls MethodHandles.<clinit>
> but *before* the call to initLookup(), the class MethodHandleImpl need
> to be initialized,
> so its <clinit> is called and raise the InternalError.
>
> static final Lookup IMPL_LOOKUP = new Lookup(null);
> static { MethodHandleImpl.initLookup(IMPL_TOKEN, IMPL_LOOKUP);
>
> A simple patch, even if it doesn't solve the real problem is to
> change the visibility of the constant PUBLIC_LOOKUP in Lookup
> and to provide an access through a method in MethodHandles
>
> public static Lookup lookup() {
> return new Lookup();
> }
>
> public static Lookup publicLookup() {
> return Lookup.PUBLIC_LOOKUP;
> }
That's a good fix, and in fact a better API than PUBLIC_LOOKUP. Let's
use MHs.publicLookup() as the API.
An alternate fix (and something I put in also just for stability) is
to have MHs.Lookup trigger static initialization of MHs before it does
anything else.
-- John
More information about the mlvm-dev
mailing list