On Tue, 28 Feb 2023 10:53:14 GMT, Viktor Klang <d...@openjdk.org> wrote:

>> src/java.base/share/classes/java/util/stream/ForEachOps.java line 513:
>> 
>>> 511:             // of right subtree (if any, which can be this task's 
>>> right sibling)
>>> 512:             //
>>> 513:             var leftDescendant = (ForEachOrderedTask<S, 
>>> T>)NEXT.getAndSet(this, null);
>> 
>> Casting the `null` is required for the resolved method descriptor to be 
>> `(ForEachOrderedTask, ForEachOrderedTask)ForEachOrderedTask` instead of 
>> `(ForEachOrderedTask, Object)ForEachOrderedTask`, which prevents unnecessary 
>> type conversion `LambdaForm`s from being introduced and allows 
>> [`VarHandle::withInvokeExactBehavior`] to be used:
>> Suggestion:
>> 
>>             var leftDescendant = (ForEachOrderedTask<S, T>) 
>> NEXT.getAndSet(this, (ForEachOrderedTask<S, T>) null);
>> 
>> 
>> [`VarHandle::withInvokeExactBehavior`]: 
>> https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/invoke/VarHandle.html#withInvokeExactBehavior()
>
> @ExE-Boss Ah, sorry, it was meant to be there. :)

VarHandles are more optimized than MethodHandles when the signature at the call 
site does not match the signature of the handle. For referenced casts of 
arguments VarHandles avoid the `asType` conversion that would occur with method 
handles. This makes it much easier to write/read. 

VarHandle::withInvokeExactBehavior was introduced to deal with cases where an 
exact signature match is required. Sometimes this is useful to avoid 
performance potholes resulting from unintended primitive casts/conversions, 
where VarHandles otherwise resort to `asType` conversion.

-------------

PR: https://git.openjdk.org/jdk/pull/12320

Reply via email to