bootstrap methods in the constant pool
John Rose
john.r.rose at oracle.com
Mon Jul 12 19:59:18 PDT 2010
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.
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
Begin forwarded message:
From: John Rose <john.r.rose at oracle.com>
Date: July 12, 2010 4:20:03 PM PDT
To: 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.
...
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/mlvm-dev/attachments/20100712/4039f2aa/attachment.html
More information about the mlvm-dev
mailing list