8198831: Lazy initialization of ValueConversions MethodHandles
authorredestad
Wed, 28 Feb 2018 15:28:46 +0100
changeset 49003 64fafabcdb21
parent 49002 94e7f6601ff1
child 49067 c153e9daadce
8198831: Lazy initialization of ValueConversions MethodHandles Reviewed-by: shade
src/java.base/share/classes/sun/invoke/util/ValueConversions.java
--- a/src/java.base/share/classes/sun/invoke/util/ValueConversions.java	Wed Feb 28 19:16:51 2018 +0800
+++ b/src/java.base/share/classes/sun/invoke/util/ValueConversions.java	Wed Feb 28 15:28:46 2018 +0100
@@ -377,7 +377,7 @@
         MethodType type = MethodType.methodType(wrap.primitiveType());
         switch (wrap) {
             case VOID:
-                mh = EMPTY;
+                mh = Handles.EMPTY;
                 break;
             case OBJECT:
             case INT: case LONG: case FLOAT: case DOUBLE:
@@ -400,26 +400,28 @@
         throw new IllegalArgumentException("cannot find zero constant for " + wrap);
     }
 
-    private static final MethodHandle CAST_REFERENCE, IGNORE, EMPTY;
-    static {
-        try {
-            MethodType idType = MethodType.genericMethodType(1);
-            MethodType ignoreType = idType.changeReturnType(void.class);
-            CAST_REFERENCE = IMPL_LOOKUP.findVirtual(Class.class, "cast", idType);
-            IGNORE = IMPL_LOOKUP.findStatic(THIS_CLASS, "ignore", ignoreType);
-            EMPTY = IMPL_LOOKUP.findStatic(THIS_CLASS, "empty", ignoreType.dropParameterTypes(0, 1));
-        } catch (NoSuchMethodException | IllegalAccessException ex) {
-            throw newInternalError("uncaught exception", ex);
+    private static class Handles {
+        static final MethodHandle CAST_REFERENCE, IGNORE, EMPTY;
+        static {
+            try {
+                MethodType idType = MethodType.genericMethodType(1);
+                MethodType ignoreType = idType.changeReturnType(void.class);
+                CAST_REFERENCE = IMPL_LOOKUP.findVirtual(Class.class, "cast", idType);
+                IGNORE = IMPL_LOOKUP.findStatic(THIS_CLASS, "ignore", ignoreType);
+                EMPTY = IMPL_LOOKUP.findStatic(THIS_CLASS, "empty", ignoreType.dropParameterTypes(0, 1));
+            } catch (NoSuchMethodException | IllegalAccessException ex) {
+                throw newInternalError("uncaught exception", ex);
+            }
         }
     }
 
     public static MethodHandle ignore() {
-        return IGNORE;
+        return Handles.IGNORE;
     }
 
     /** Return a method that casts its second argument (an Object) to the given type (a Class). */
     public static MethodHandle cast() {
-        return CAST_REFERENCE;
+        return Handles.CAST_REFERENCE;
     }
 
     /// Primitive conversions.