bootstrap method constant pool entry type question

John Rose john.r.rose at oracle.com
Sun Jan 30 00:08:43 PST 2011


On Jan 29, 2011, at 11:40 PM, Kirill Shirokov wrote:

> The invokedynamic instruction requires a MethodHandle constant pool 
> entry for a bootstrap method.
> 
> This MH CP entry can be one of 9 REF_xxx types.
> 
> Questions:
> 
> Q1. Which types are valid in the case of bootstrap method?

Any CONSTANT_MethodHandle for which the resulting MH can accept an invokeGeneric call on the specified methods, which returns a CallSite.

> Q2. What happens if I try to use invalid types?

The MH will be materialized for the BSM, and the invokeGeneric call will fail, either with WMTE or CCE.  This is an implication of the specification.  Some of the details are spelled out here in the javadoc:

After resolution, the linkage process may fail in a variety of ways. All failures are reported by an BootstrapMethodError, which is thrown as the abnormal termination of the dynamic call site execution. The following circumstances will cause this:

	• the index to the bootstrap method specifier is out of range
	• the bootstrap method cannot be resolved
	• the MethodType to pass to the bootstrap method cannot be resolved
	• a static argument to the bootstrap method cannot be resolved (i.e., a CONSTANT_Class, CONSTANT_MethodType, orCONSTANT_MethodHandle argument cannot be linked)
	• the bootstrap method has the wrong arity, causing invokeGeneric to throw WrongMethodTypeException
	• the bootstrap method has a wrong argument or return type
	• the bootstrap method invocation completes abnormally
	• the result from the bootstrap invocation is not a reference to an object of type CallSite
	• the target of the CallSite does not have a target of the expected MethodType

> I could not find answers in the current specification.

Since we're editing it furiously, maybe you looked at an earlier spec. which didn't have the language above.

> I guess that the correct answers would be:
> 
> A1. The valid types are: REF_getStatic, REF_invokeStatic (? and maybe 
> REF_newInvokeSpecial). All others are invalid for bootstraping.

Not getstatic.  That is always a zero-arity method, which will not accept the 3 or more arguments passed to the BSM.

Yes, invokestatic and newinvokespecial are the key use cases.

Since the Lookup object comes first in the list, if the Lookup class had a method which could accept a name and type and then return a call site, that would work also, as a REF_invokevirtual.  But there is no such method.

> A2. If the type is invalid, JVM throws an exception (and doesn't try to 
> call bootstrap MH taking arguments from Java stack)

It tries to call the MH, and immediately fails.  The failure is wrapped in a bootstrap method error, which is thrown.

Good questions.  Thanks.

-- John
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/mlvm-dev/attachments/20110130/e126e6d3/attachment.html 


More information about the mlvm-dev mailing list