# HG changeset patch # User vlivanov # Date 1410362390 -14400 # Node ID 2b814465aaa33deb0d2223a08b43fddc579c181d # Parent acf0c98309d30d173652e9a56e06d4feb4cdc402 8050887: Intrinsify constants for default values Reviewed-by: vlivanov, psandoz Contributed-by: john.r.rose@oracle.com diff -r acf0c98309d3 -r 2b814465aaa3 jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Wed Sep 10 19:19:50 2014 +0400 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Wed Sep 10 19:19:50 2014 +0400 @@ -668,6 +668,10 @@ assert(name.arguments.length == 1); emitPushArguments(name); continue; + case ZERO: + assert(name.arguments.length == 0); + emitConst(name.type.basicTypeWrapper().zero()); + continue; case NONE: // no intrinsic associated break; diff -r acf0c98309d3 -r 2b814465aaa3 jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java Wed Sep 10 19:19:50 2014 +0400 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java Wed Sep 10 19:19:50 2014 +0400 @@ -1054,6 +1054,7 @@ ARRAY_LOAD, ARRAY_STORE, IDENTITY, + ZERO, NONE // no intrinsic associated } diff -r acf0c98309d3 -r 2b814465aaa3 jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java Wed Sep 10 19:19:50 2014 +0400 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java Wed Sep 10 19:19:50 2014 +0400 @@ -2184,9 +2184,14 @@ if (type == void.class) throw newIllegalArgumentException("void type"); Wrapper w = Wrapper.forPrimitiveType(type); - return insertArguments(identity(type), 0, w.convert(value, type)); + value = w.convert(value, type); + if (w.zero().equals(value)) + return zero(w, type); + return insertArguments(identity(type), 0, value); } else { - return identity(type).bindTo(type.cast(value)); + if (value == null) + return zero(Wrapper.OBJECT, type); + return identity(type).bindTo(value); } } @@ -2217,6 +2222,25 @@ LambdaForm lform = LambdaForm.identityForm(BasicType.basicType(ptype)); return MethodHandleImpl.makeIntrinsic(mtype, lform, Intrinsic.IDENTITY); } + + private static MethodHandle zero(Wrapper btw, Class rtype) { + int pos = btw.ordinal(); + MethodHandle zero = ZERO_MHS[pos]; + if (zero == null) { + zero = setCachedMethodHandle(ZERO_MHS, pos, makeZero(btw.primitiveType())); + } + if (zero.type().returnType() == rtype) + return zero; + assert(btw == Wrapper.OBJECT); + return makeZero(rtype); + } + private static final MethodHandle[] ZERO_MHS = new MethodHandle[Wrapper.values().length]; + private static MethodHandle makeZero(Class rtype) { + MethodType mtype = MethodType.methodType(rtype); + LambdaForm lform = LambdaForm.zeroForm(BasicType.basicType(rtype)); + return MethodHandleImpl.makeIntrinsic(mtype, lform, Intrinsic.ZERO); + } + synchronized private static MethodHandle setCachedMethodHandle(MethodHandle[] cache, int pos, MethodHandle value) { // Simulate a CAS, to avoid racy duplication of results. MethodHandle prev = cache[pos];