recursive lambda as a local variable

Peter Levart 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
> yes,
> but it requires to change the protocol between javac and the lambda
> metafactory
> 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?

Regards, Peter

>
> It seems simpler, to me, to modify javac to generate
>     DUP
>     INVOKEVIRTUAL Object.getClass()
> in front of the first argument of the invokedynamic call.
>
> Rémi
>
>



More information about the lambda-dev mailing list