Status of Anno Class loader with constant patches?

John Rose john.r.rose at oracle.com
Thu Jan 6 11:19:43 PST 2011


On Jan 6, 2011, at 1:12 AM, Helmut Eller wrote:

> * John Rose [2011-01-06 02:37] writes:
> 
>> "Live constants" are definitely one of the use cases that
>> invokedynamic is designed for.
> 
> Are/will there be any means to link invokedynamic call sites eagerly
> instead of the lazy linking scheme?  
> 
> E.g. in Lisp there is this form
> 
>  (load-time-value <exp> t) 
> 
> that is essentially a constant but <exp> must be evaluated at load time
> and not later (as would be done with lazy linking).

This is an unusual pattern for the JVM, but it can be done with invokedynamic by pre-executing the constant-load instruction, as follows:

1. Translate the LTV form into an invokedynamic instruction.
2. Emit the invokedynamic instruction into a private static helper method.
3. Call the helper method from two places:  The intended use point, and the <clinit> method.

That way, class loading executes <clinit>, which then "warms up" (links) the invokedynamic instruction.

If you have many LTV forms in a compilation unit, this leads to many small helper methods, which may be inconvenient.  If that is the case, consider a more complex scheme where all LTV forms in a compilation unit are collected, and their evaluation results collected into a private static final object array.  Then, individual lazy-linked invokedynamic instructions can pick from the array..  With such a population of similar invokedynamic instructions, it can help (as Mark discovered) to share a common BSM and use the name field to send in a single simple parameter.

The most direct way to specify a parameter to a BSM for a single invokedynamic instruction is to specify a static argument in the BootstrapMethods attribute.  This is a relatively new feature:

http://cr.openjdk.java.net/~jrose/pres/indy-javadoc-mlvm/java/dyn/package-summary.html#args

If the parameter is a name-string or if you don't mind decoding strings, you can also specify it as the name of the relevant NameAndType.

-- John


More information about the mlvm-dev mailing list