[asm] Re: bootstrap methods in the constant pool

Eugene Kuleshov ekuleshov at gmail.com
Tue Jul 13 05:39:08 PDT 2010


  Perhaps we could split it into two visit calls... or introduce a micro 
language, e.g. in desc field.
  BTW, what would be the meaning of bootstrap method pointing to a 
method handle of get/putField or get/putStatic type?

  An alternative way to represent bootstrap method in the bytecode could 
be to introduce a new attribute at the class, method and code level. 
This would be also closer to semantic John is suggesting. Though that 
way you couldn't enforce constrains on a pretense of the bootstrap 
methods, but that can be done in the verifier.

  regards,
  Eugene
 

Rémi Forax wrote:
> 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
>>   
>



More information about the mlvm-dev mailing list