< prev index next >

src/java.base/share/classes/java/lang/invoke/LambdaForm.java

Print this page

        

*** 1090,1106 **** static class NamedFunction { final MemberName member; private @Stable MethodHandle resolvedHandle; @Stable MethodHandle invoker; NamedFunction(MethodHandle resolvedHandle) { ! this(resolvedHandle.internalMemberName(), resolvedHandle); } NamedFunction(MemberName member, MethodHandle resolvedHandle) { this.member = member; this.resolvedHandle = resolvedHandle; // The following assert is almost always correct, but will fail for corner cases, such as PrivateInvokeTest. //assert(!isInvokeBasic(member)); } NamedFunction(MethodType basicInvokerType) { assert(basicInvokerType == basicInvokerType.basicType()) : basicInvokerType; --- 1090,1117 ---- static class NamedFunction { final MemberName member; private @Stable MethodHandle resolvedHandle; @Stable MethodHandle invoker; + private final MethodHandleImpl.Intrinsic intrinsicName; NamedFunction(MethodHandle resolvedHandle) { ! this(resolvedHandle.internalMemberName(), resolvedHandle, MethodHandleImpl.Intrinsic.NONE); ! } ! NamedFunction(MethodHandle resolvedHandle, MethodHandleImpl.Intrinsic intrinsic) { ! this(resolvedHandle.internalMemberName(), resolvedHandle, intrinsic); } NamedFunction(MemberName member, MethodHandle resolvedHandle) { + this(member, resolvedHandle, MethodHandleImpl.Intrinsic.NONE); + } + NamedFunction(MemberName member, MethodHandle resolvedHandle, MethodHandleImpl.Intrinsic intrinsic) { this.member = member; this.resolvedHandle = resolvedHandle; + this.intrinsicName = intrinsic; + assert(resolvedHandle == null || + resolvedHandle.intrinsicName() == MethodHandleImpl.Intrinsic.NONE || + resolvedHandle.intrinsicName() == intrinsic) : resolvedHandle.intrinsicName() + " != " + intrinsic; // The following assert is almost always correct, but will fail for corner cases, such as PrivateInvokeTest. //assert(!isInvokeBasic(member)); } NamedFunction(MethodType basicInvokerType) { assert(basicInvokerType == basicInvokerType.basicType()) : basicInvokerType;
*** 1109,1118 **** --- 1120,1130 ---- this.member = resolvedHandle.internalMemberName(); } else { // necessary to pass BigArityTest this.member = Invokers.invokeBasicMethod(basicInvokerType); } + this.intrinsicName = MethodHandleImpl.Intrinsic.NONE; assert(isInvokeBasic(member)); } private static boolean isInvokeBasic(MemberName member) { return member != null &&
*** 1261,1272 **** public boolean isConstantZero() { return this.equals(constantZero(returnType())); } public MethodHandleImpl.Intrinsic intrinsicName() { ! return resolvedHandle == null ? MethodHandleImpl.Intrinsic.NONE ! : resolvedHandle.intrinsicName(); } } public static String basicTypeSignature(MethodType type) { int params = type.parameterCount(); --- 1273,1283 ---- public boolean isConstantZero() { return this.equals(constantZero(returnType())); } public MethodHandleImpl.Intrinsic intrinsicName() { ! return intrinsicName; } } public static String basicTypeSignature(MethodType type) { int params = type.parameterCount();
*** 1739,1757 **** zeFun = idFun; } else { Name[] idNames = new Name[] { argument(0, L_TYPE), argument(1, type) }; idForm = new LambdaForm(2, idNames, 1, Kind.IDENTITY); idForm.compileToBytecode(); ! idFun = new NamedFunction(idMem, MethodHandleImpl.makeIntrinsic( ! idMem.getInvocationType(), idForm, MethodHandleImpl.Intrinsic.IDENTITY)); Object zeValue = Wrapper.forBasicType(btChar).zero(); Name[] zeNames = new Name[] { argument(0, L_TYPE), new Name(idFun, zeValue) }; zeForm = new LambdaForm(1, zeNames, 1, Kind.ZERO); zeForm.compileToBytecode(); ! zeFun = new NamedFunction(zeMem, MethodHandleImpl.makeIntrinsic( ! zeMem.getInvocationType(), zeForm, MethodHandleImpl.Intrinsic.ZERO)); } LF_zero[ord] = zeForm; NF_zero[ord] = zeFun; LF_identity[ord] = idForm; --- 1750,1768 ---- zeFun = idFun; } else { Name[] idNames = new Name[] { argument(0, L_TYPE), argument(1, type) }; idForm = new LambdaForm(2, idNames, 1, Kind.IDENTITY); idForm.compileToBytecode(); ! idFun = new NamedFunction(idMem, SimpleMethodHandle.make(idMem.getInvocationType(), idForm), ! MethodHandleImpl.Intrinsic.IDENTITY); Object zeValue = Wrapper.forBasicType(btChar).zero(); Name[] zeNames = new Name[] { argument(0, L_TYPE), new Name(idFun, zeValue) }; zeForm = new LambdaForm(1, zeNames, 1, Kind.ZERO); zeForm.compileToBytecode(); ! zeFun = new NamedFunction(zeMem, SimpleMethodHandle.make(zeMem.getInvocationType(), zeForm), ! MethodHandleImpl.Intrinsic.ZERO); } LF_zero[ord] = zeForm; NF_zero[ord] = zeFun; LF_identity[ord] = idForm;
< prev index next >