bootstrap method constant pool entry type question
Rémi Forax
forax at univ-mlv.fr
Sun Jan 30 04:05:29 PST 2011
On 01/30/2011 09:08 AM, John Rose wrote:
> 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.
And Lookup is final.
>
>> 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.
If the failure is an error (a subtype of Error), should it wrapped too ?
The backport doesn't wrap errors.
>
> Good questions. Thanks.
>
> -- John
Rémi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/mlvm-dev/attachments/20110130/3420f26a/attachment-0001.html
More information about the mlvm-dev
mailing list