< prev index next >

jdk/src/java.base/share/classes/valhalla/shady/MinimalValueTypes_1_0.java

Print this page

        

@@ -24,10 +24,11 @@
  */
 package valhalla.shady;
 
 import jdk.experimental.bytecode.BasicClassBuilder;
 import jdk.internal.misc.Unsafe;
+import jdk.internal.misc.VM;
 import sun.security.action.GetPropertyAction;
 
 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.IOException;

@@ -52,18 +53,22 @@
     public static final String DERIVE_VALUE_TYPE_DESC = "Ljvm/internal/value/ValueCapableClass;";
     public static final String DERIVE_VT_CLASSNAME_POSTFIX = "$Value";
     public static final int    DERIVE_VT_CLASS_ACCESS = ACC_PUBLIC|ACC_SUPER|ACC_FINAL|ACC_VALUE|ACC_SYNTHETIC;
 
     public static final boolean DUMP_CLASS_FILES;
+    private static final boolean VALUE_TYPE_ENABLED;
     private static final JavaLangAccess JLA;
 
     static {
         // Use same property as in j.l.invoke.MethodHandleStatics
         Properties props = GetPropertyAction.privilegedGetProperties();
         DUMP_CLASS_FILES = Boolean.parseBoolean(
             props.getProperty("java.lang.invoke.MethodHandle.DUMP_CLASS_FILES"));
 
+        VALUE_TYPE_ENABLED = Boolean.parseBoolean(
+            props.getProperty("valhalla.enableValueType"));
+
         JLA = SharedSecrets.getJavaLangAccess();
     }
 
     public static String getValueTypeClassName(ValueTypeDesc valueTypeDesc) {
         return getValueTypeClassName(valueTypeDesc.getName());

@@ -191,12 +196,22 @@
     }
 
     private final native Class<?> getDerivedValueType(Class<?> ofClass);
 
     public static Class<?> getValueClass() {
-        return (Class<?>)(Object)__Value.class; //hack around static type-system checks
+        return VALUE_TYPE_ENABLED ? ValueClassHolder.CLASS_OBJECT : null;
     }
 
     public static String mangleValueClassName(String name) {
         return ";Q" + name + ";";
     }
+
+    /*
+     * A holder class that references __Value to be loaded only when MVT is enabled.
+     *
+     * This holder class would fail verification if loaded if MVT is not enabled.
+     */
+    private static class ValueClassHolder {
+         static final Class<?> CLASS_OBJECT =
+             (Class<?>)(Object)__Value.class; //hack around static type-system checks
+    }
 }
< prev index next >