# HG changeset patch # User redestad # Date 1448464239 -3600 # Wed Nov 25 16:10:39 2015 +0100 # Node ID 984636bbdd15d3a213415dca034bbff7764ad6d4 # Parent db013eafc5c323569b1cf3649ae6376450f86650 8143926: ObjectStreamField constructor eagerly load ObjectStreamClass Reviewed-by: TBD diff --git a/src/java.base/share/classes/java/io/ObjectStreamClass.java b/src/java.base/share/classes/java/io/ObjectStreamClass.java --- a/src/java.base/share/classes/java/io/ObjectStreamClass.java +++ b/src/java.base/share/classes/java/io/ObjectStreamClass.java @@ -49,6 +49,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import jdk.internal.misc.Unsafe; +import sun.invoke.util.BytecodeDescriptor; import sun.reflect.CallerSensitive; import sun.reflect.Reflection; import sun.reflect.ReflectionFactory; @@ -1525,72 +1526,6 @@ } /** - * Returns JVM type signature for given primitive. - */ - private static String getPrimitiveSignature(Class cl) { - if (cl == Integer.TYPE) - return "I"; - else if (cl == Byte.TYPE) - return "B"; - else if (cl == Long.TYPE) - return "J"; - else if (cl == Float.TYPE) - return "F"; - else if (cl == Double.TYPE) - return "D"; - else if (cl == Short.TYPE) - return "S"; - else if (cl == Character.TYPE) - return "C"; - else if (cl == Boolean.TYPE) - return "Z"; - else if (cl == Void.TYPE) - return "V"; - else - throw new InternalError(); - } - - /** - * Returns JVM type signature for given class. - */ - static String getClassSignature(Class cl) { - if (cl.isPrimitive()) - return getPrimitiveSignature(cl); - else - return appendClassSignature(new StringBuilder(), cl).toString(); - } - - private static StringBuilder appendClassSignature(StringBuilder sbuf, Class cl) { - while (cl.isArray()) { - sbuf.append('['); - cl = cl.getComponentType(); - } - - if (cl.isPrimitive()) - sbuf.append(getPrimitiveSignature(cl)); - else - sbuf.append('L').append(cl.getName().replace('.', '/')).append(';'); - - return sbuf; - } - - /** - * Returns JVM type signature for given list of parameters and return type. - */ - private static String getMethodSignature(Class[] paramTypes, - Class retType) - { - StringBuilder sbuf = new StringBuilder(); - sbuf.append('('); - for (int i = 0; i < paramTypes.length; i++) { - appendClassSignature(sbuf, paramTypes[i]); - } - sbuf.append(')'); - appendClassSignature(sbuf, retType); - return sbuf.toString(); - } - - /** * Convenience method for throwing an exception that is either a * RuntimeException, Error, or of some unexpected type (in which case it is * wrapped inside an IOException). @@ -1898,21 +1833,21 @@ public MemberSignature(Field field) { member = field; name = field.getName(); - signature = getClassSignature(field.getType()); + signature = BytecodeDescriptor.unparse(field.getType()); } public MemberSignature(Constructor cons) { member = cons; name = cons.getName(); - signature = getMethodSignature( - cons.getParameterTypes(), Void.TYPE); + signature = BytecodeDescriptor.unparseMethod( + Void.TYPE, cons.getParameterTypes()); } public MemberSignature(Method meth) { member = meth; name = meth.getName(); - signature = getMethodSignature( - meth.getParameterTypes(), meth.getReturnType()); + signature = BytecodeDescriptor.unparseMethod( + meth.getReturnType(), meth.getParameterTypes()); } } diff --git a/src/java.base/share/classes/java/io/ObjectStreamField.java b/src/java.base/share/classes/java/io/ObjectStreamField.java --- a/src/java.base/share/classes/java/io/ObjectStreamField.java +++ b/src/java.base/share/classes/java/io/ObjectStreamField.java @@ -26,6 +26,7 @@ package java.io; import java.lang.reflect.Field; +import sun.invoke.util.BytecodeDescriptor; import sun.reflect.CallerSensitive; import sun.reflect.Reflection; import sun.reflect.misc.ReflectUtil; @@ -91,7 +92,7 @@ this.name = name; this.type = type; this.unshared = unshared; - signature = ObjectStreamClass.getClassSignature(type).intern(); + signature = BytecodeDescriptor.unparse(type).intern(); field = null; } @@ -137,7 +138,7 @@ name = field.getName(); Class ftype = field.getType(); type = (showType || ftype.isPrimitive()) ? ftype : Object.class; - signature = ObjectStreamClass.getClassSignature(ftype).intern(); + signature = BytecodeDescriptor.unparse(ftype).intern(); } /** diff --git a/src/java.base/share/classes/sun/invoke/util/BytecodeDescriptor.java b/src/java.base/share/classes/sun/invoke/util/BytecodeDescriptor.java --- a/src/java.base/share/classes/sun/invoke/util/BytecodeDescriptor.java +++ b/src/java.base/share/classes/sun/invoke/util/BytecodeDescriptor.java @@ -113,7 +113,7 @@ } public static String unparse(MethodType type) { - return unparseMethod(type.returnType(), type.parameterList()); + return unparseMethod(type.returnType(), type.parameterArray()); } public static String unparse(Object type) { @@ -134,10 +134,19 @@ return sb.toString(); } + public static String unparseMethod(Class rtype, Class[] ptypes) { + StringBuilder sb = new StringBuilder(); + sb.append('('); + for (Class pt : ptypes) + unparseSig(pt, sb); + sb.append(')'); + unparseSig(rtype, sb); + return sb.toString(); + } + private static void unparseSig(Class t, StringBuilder sb) { - char c = Wrapper.forBasicType(t).basicTypeChar(); - if (c != 'L') { - sb.append(c); + if (t.isPrimitive()) { + sb.append(getPrimitiveTypeChar(t)); } else { boolean lsemi = (!t.isArray()); if (lsemi) sb.append('L'); @@ -146,4 +155,26 @@ } } + private static char getPrimitiveTypeChar(Class cl) { + if (cl == Integer.TYPE) + return 'I'; + else if (cl == Byte.TYPE) + return 'B'; + else if (cl == Long.TYPE) + return 'J'; + else if (cl == Float.TYPE) + return 'F'; + else if (cl == Double.TYPE) + return 'D'; + else if (cl == Short.TYPE) + return 'S'; + else if (cl == Character.TYPE) + return 'C'; + else if (cl == Boolean.TYPE) + return 'Z'; + else if (cl == Void.TYPE) + return 'V'; + else + throw new InternalError(); + } }