From ff90534bb53f3b5e764ecbfe7d1a465541827ed3 Mon Sep 17 00:00:00 2001 From: Claes Redestad Date: Mon, 9 Nov 2015 17:15:07 +0100 Subject: [PATCH] 8141678: sun.invoke.util.Wrapper eagerly initializes all integral type caches Reviewed-by: vlivanov, psandoz, shade, plevart --- .../classes/sun/invoke/util/Wrapper.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/jdk/src/java.base/share/classes/sun/invoke/util/Wrapper.java b/jdk/src/java.base/share/classes/sun/invoke/util/Wrapper.java index e69330b6846..ef27a08c132 100644 --- a/jdk/src/java.base/share/classes/sun/invoke/util/Wrapper.java +++ b/jdk/src/java.base/share/classes/sun/invoke/util/Wrapper.java @@ -27,18 +27,19 @@ package sun.invoke.util; public enum Wrapper { // wrapperType primitiveType char zero emptyArray format - BOOLEAN( Boolean.class, boolean.class, 'Z', (Boolean)false, new boolean[0], Format.unsigned( 1)), + BOOLEAN( Boolean.class, boolean.class, 'Z', Boolean.FALSE, new boolean[0], Format.unsigned( 1)), // These must be in the order defined for widening primitive conversions in JLS 5.1.2 - BYTE ( Byte.class, byte.class, 'B', (Byte)(byte)0, new byte[0], Format.signed( 8)), - SHORT ( Short.class, short.class, 'S', (Short)(short)0, new short[0], Format.signed( 16)), - CHAR (Character.class, char.class, 'C', (Character)(char)0, new char[0], Format.unsigned(16)), - INT ( Integer.class, int.class, 'I', (Integer)/*(int)*/0, new int[0], Format.signed( 32)), - LONG ( Long.class, long.class, 'J', (Long)(long)0, new long[0], Format.signed( 64)), - FLOAT ( Float.class, float.class, 'F', (Float)(float)0, new float[0], Format.floating(32)), - DOUBLE ( Double.class, double.class, 'D', (Double)(double)0, new double[0], Format.floating(64)), - OBJECT ( Object.class, Object.class, 'L', null, new Object[0], Format.other( 1)), + // Avoid boxing integral types here to defer initialization of internal caches + BYTE ( Byte.class, byte.class, 'B', new Byte((byte)0), new byte[0], Format.signed( 8)), + SHORT ( Short.class, short.class, 'S', new Short((short)0), new short[0], Format.signed( 16)), + CHAR (Character.class, char.class, 'C', new Character((char)0), new char[0], Format.unsigned(16)), + INT ( Integer.class, int.class, 'I', new Integer(0), new int[0], Format.signed( 32)), + LONG ( Long.class, long.class, 'J', new Long(0), new long[0], Format.signed( 64)), + FLOAT ( Float.class, float.class, 'F', (Float)(float)0, new float[0], Format.floating(32)), + DOUBLE ( Double.class, double.class, 'D', (Double)(double)0, new double[0], Format.floating(64)), + OBJECT ( Object.class, Object.class, 'L', null, new Object[0], Format.other( 1)), // VOID must be the last type, since it is "assignable" from any other type: - VOID ( Void.class, void.class, 'V', null, null, Format.other( 0)), + VOID ( Void.class, void.class, 'V', null, null, Format.other( 0)), ; private final Class wrapperType;