bootstrap methods in the constant pool

Rémi Forax forax at univ-mlv.fr
Tue Jul 13 03:44:20 PDT 2010


Le 13/07/2010 04:59, John Rose a écrit :
> Folks, the 292 EG has decided to register bootstrap methods in the 
> constant pool, instead of via a call from the <clinit> method.
>
> Here's a summary of constant pool formats as of the latest push to mlvm.
>
> This will require further changes to asm, Mirah, and other 
> bytecode-aware tools.

The biggest problem of this change is that at first look it requires an 
incompatible
change of current ASM instruction visitor.

>
> For now, the JVM accepts both old and new formats of invokedynamic. 
>  But old format support will go away when 292 is finalized.
>
> Best wishes,
> -- John

cheers,
Rémi

>
> Begin forwarded message:
>
> *From: *John Rose <john.r.rose at oracle.com <mailto:john.r.rose at oracle.com>>
> *Date: *July 12, 2010 4:20:03 PM PDT
> *To: *jsr-292-eg at jcp.org <mailto:jsr-292-eg at jcp.org>
> *Subject: **ISSUE: explicit bootstrap methods (resolution)*
>
> ...
>
> Here are the constant pool entries defined by JSR 292:
>
> CONSTANT_MethodHandle = 15
> u1 RefType ref_type
> u2 NameAndType ref_index
>
> enum RefType {
>     REF_getField         = 1,
>     REF_getStatic        = 2,
>     REF_putField         = 3,
>     REF_putStatic        = 4,
>     REF_invokeVirtual    = 5,
>     REF_invokeStatic     = 6,
>     REF_invokeSpecial    = 7,
>     REF_newInvokeSpecial = 8,
>     REF_invokeInterface  = 9
> }
>
> CONSTANT_MethodType = 16
> u2 Utf8 signature_index
>
> CONSTANT_InvokeDynamic = 17
> u2 MethodHandle bootstrap_method_index
> u2 NameAndType name_and_type_index
>
> The format of the invokedynamic instruction is {u1 op = 186; u2 
> invokedynamic_index; u2 zero}.
>
> The EDR RI has a backward-compatibility mode which (a) allows the Java 
> app. to call the deprecated methods Linkage.registerBootstrapMethod 
> and (b) allows (but does not require) the invokedynamic instruction to 
> specify merely a NameAndType instead of a full InvokeDynamic CP entry. 
>  The PFD will not include this mode.
>
> The CONSTANT_InvokeDynamic CP entry does not allow a null 
> bootstrap_method index.
>
> The call to the BSM specified for a given invokedynamic instruction 
> will be made as if by invokeGeneric, not invokeExact.  This allows 
> direct access to constructors via REF_newInvokeSpecial, as well more 
> flexible linkage to factory method calls via REF_invokeStatic.  (Other 
> ref-types are not relevant, unless somebody puts an interesting 
> virtual method on java.lang.Class.)
>
> There seems to be no benefit to defining a default BSM notation in the 
> class file (e.g., attribute DefaultBootstrapMethod {u2 MethodHandle 
> default_bootstrap_method_index).  Let the constant pool deal with it. 
>  Pack200's column-wise compression will chew up the slack.
>
> Language notes:  I expect the Java language support to allow an 
> annotation-like mechanism to specify the BSM, as a symbolic method 
> reference, for a whole class, and/or a whole method, and/or a single 
> InvokeDynamic expression.  (I have prototyped this in terms of 
> @BootstrapMethod annotations, but I don't think this will fly with the 
> language mavens.)  Such a notation (if adopted) will enable 
> refactoring at the source level at two "cut points":  First, by 
> editing the annotation-like syntax for the per-class or per-method 
> defaults, and second by using a private class-local BSM whose body can 
> be edited at will.
>
> ...
>
>
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>    

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/mlvm-dev/attachments/20100713/8954523c/attachment.html 


More information about the mlvm-dev mailing list