OpenJDK / jdk8u / jdk8u / jdk
changeset 13896:34bb0aa775b2
8235274: Enhance typing of methods
Reviewed-by: andrew
author | avoitylov |
---|---|
date | Thu, 20 Feb 2020 19:35:42 +0300 |
parents | a6dcbf49526c |
children | a8f0a9ef1797 |
files | src/share/classes/java/lang/invoke/MethodType.java |
diffstat | 1 files changed, 14 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/java/lang/invoke/MethodType.java Mon Mar 30 05:13:42 2020 +0100 +++ b/src/share/classes/java/lang/invoke/MethodType.java Thu Feb 20 19:35:42 2020 +0300 @@ -97,7 +97,8 @@ // The remaining fields are caches of various sorts: private @Stable MethodTypeForm form; // erased form, plus cached data about primitives - private @Stable MethodType wrapAlt; // alternative wrapped/unwrapped version + private @Stable Object wrapAlt; // alternative wrapped/unwrapped version and + // private communication for readObject and readResolve private @Stable Invokers invokers; // cache of handy higher-order adapters private @Stable String methodDescriptor; // cache for toMethodDescriptorString @@ -673,7 +674,7 @@ private static MethodType wrapWithPrims(MethodType pt) { assert(pt.hasPrimitives()); - MethodType wt = pt.wrapAlt; + MethodType wt = (MethodType)pt.wrapAlt; if (wt == null) { // fill in lazily wt = MethodTypeForm.canonicalize(pt, MethodTypeForm.WRAP, MethodTypeForm.WRAP); @@ -685,7 +686,7 @@ private static MethodType unwrapWithNoPrims(MethodType wt) { assert(!wt.hasPrimitives()); - MethodType uwt = wt.wrapAlt; + MethodType uwt = (MethodType)wt.wrapAlt; if (uwt == null) { // fill in lazily uwt = MethodTypeForm.canonicalize(wt, MethodTypeForm.UNWRAP, MethodTypeForm.UNWRAP); @@ -1144,27 +1145,18 @@ * @see #writeObject */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { - // Assign temporary defaults in case this object escapes - MethodType_init(void.class, NO_PTYPES); + // Assign defaults in case this object escapes + UNSAFE.putObject(this, rtypeOffset, void.class); + UNSAFE.putObject(this, ptypesOffset, NO_PTYPES); s.defaultReadObject(); // requires serialPersistentFields to be an empty array Class<?> returnType = (Class<?>) s.readObject(); Class<?>[] parameterArray = (Class<?>[]) s.readObject(); - parameterArray = parameterArray.clone(); // make sure it is unshared - // Assign deserialized values - MethodType_init(returnType, parameterArray); - } - - // Initialization of state for deserialization only - private void MethodType_init(Class<?> rtype, Class<?>[] ptypes) { - // In order to communicate these values to readResolve, we must - // store them into the implementation-specific final fields. - checkRtype(rtype); - checkPtypes(ptypes); - UNSAFE.putObject(this, rtypeOffset, rtype); - UNSAFE.putObject(this, ptypesOffset, ptypes); + // Verify all operands, and make sure ptypes is unshared + // Cache the new MethodType for readResolve + wrapAlt = new MethodType[]{MethodType.methodType(returnType, parameterArray)}; } // Support for resetting final fields while deserializing @@ -1189,12 +1181,10 @@ // Do not use a trusted path for deserialization: // return makeImpl(rtype, ptypes, true); // Verify all operands, and make sure ptypes is unshared: - try { - return methodType(rtype, ptypes); - } finally { - // Re-assign defaults in case this object escapes - MethodType_init(void.class, NO_PTYPES); - } + // Return a new validated MethodType for the rtype and ptypes passed from readObject. + MethodType mt = ((MethodType[])wrapAlt)[0]; + wrapAlt = null; + return mt; } /**