couple questions on method handle combinators
Paul Sandoz
paul.sandoz at oracle.com
Wed Jun 14 17:27:10 UTC 2017
> On 14 Jun 2017, at 10:04, Vladimir Ivanov <vladimir.x.ivanov at oracle.com> wrote:
>
>>> The is due to the call to invoke, which performs an asType
>>> transformation and thus the receiver is not constant.
>>
>> So it's effectively constant but the compiler can't see it? I had a
>> patch that added profiling of that receiver value. It didn't seem to
>> show any benefit at the time. I wonder it would make sense to experiment
>> with something similar again.
>
> There's a simpler solution: since MH.asType() already uses 1-element cache [1], it should be enough to just mark MH.asTypeCache as @Stable.
>
Would not invalidate the contract of @Stable where the value changes at most once? thereby causes issues for already compiled methods treating that as a constant when other code updates the value via an asType call.
i realize that we break similar rules for updating the LF, but that is a special case where we are in control where as we don’t control who calls MH.asType.
Paul.
> The problem with MH.asType() is more general: 1-element caching scheme doesn't scale for multiple MH.invoke() call sites with different signatures. Every cache miss requires a new method handle to be created.
>
> Best regards,
> Vladimir Ivanov
>
> [1] jdk/src/java.base/share/classes/java/lang/invoke/MethodHandle.java:
> ...
> public abstract class MethodHandle {
> ...
> /*private*/ MethodHandle asTypeCache;
> ...
> public MethodHandle asType(MethodType newType) {
> // Fast path alternative to a heavyweight {@code asType} call.
> // Return 'this' if the conversion will be a no-op.
> if (newType == type) {
> return this;
> }
> // Return 'this.asTypeCache' if the conversion is already memoized.
> MethodHandle atc = asTypeCached(newType);
> if (atc != null) {
> return atc;
> }
> return asTypeUncached(newType);
> }
>
> private MethodHandle asTypeCached(MethodType newType) {
> MethodHandle atc = asTypeCache;
> if (atc != null && newType == atc.type) {
> return atc;
> }
> return null;
> }
More information about the valhalla-dev
mailing list