recursive lambda as a local variable
peter.levart at gmail.com
Fri Sep 13 05:45:19 PDT 2013
On 09/13/2013 12:51 PM, Remi Forax wrote:
> On 09/13/2013 10:21 AM, Peter Levart wrote:
>> On 09/12/2013 05:17 PM, Brian Goetz wrote:
>>>> - The part left of the '::' can be an arbitrarily long expression that will
>>>> be evaluated immediately, while the method invocation itself will be
>>>> deferred until the corresponding SAM method is invoked. Thus, 'null' might
>>>> by bound now and detected much later.
>>> This is just a compiler bug; if the part to the left evaluates to null,
>>> it should throw NPE immediately (see jsr335-15.28.2-30-A2: If the result
>>> of evaluation of the subexpression is null, then a NullPointerException
>>> is thrown.)
>>> Thanks for reporting this. I will file a bug.
>> This could be checked in lambda metafactory generated constructor,
>> right? It doesn't have to be compiler generated code.
>> Regards, Peter
> but it requires to change the protocol between javac and the lambda
> to signal if a captured parameter is bound or not.
Does it? The "MethodHandle implMethod" meta factory argument is a target
method to be called. With MethodHandleInfo API, the metafactory can find
out whether it's a static method or not. if it's an instance method and
the receiver is passed-in at capture time (as opposed to be passed-in at
call time), then it must be a bound receiver. Is there a case where the
target method is an instance method and the bound receiver should be
allowed to be null at capture time?
> It seems simpler, to me, to modify javac to generate
> INVOKEVIRTUAL Object.getClass()
> in front of the first argument of the invokedynamic call.
More information about the lambda-dev