src/java.base/share/classes/jdk/experimental/value/MethodHandleBuilder.java

Print this page

        

@@ -35,21 +35,17 @@
 import jdk.experimental.bytecode.TypeHelper;
 import jdk.experimental.bytecode.TypeTag;
 import jdk.experimental.bytecode.TypedCodeBuilder;
 import jdk.experimental.value.MethodHandleBuilder.IsolatedMethodBuilder.IsolatedMethodPoolHelper;
 import jdk.internal.misc.Unsafe;
-import sun.security.action.GetBooleanAction;
+import sun.security.action.GetPropertyAction;
 import valhalla.shady.MinimalValueTypes_1_0;
 
 import java.lang.invoke.MethodHandle;
 import java.lang.invoke.MethodHandles.Lookup;
 import java.lang.invoke.MethodType;
-import java.security.AccessController;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.PropertyPermission;
+import java.util.*;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
 /**
  * Utility class for building method handles.

@@ -57,17 +53,18 @@
 public class MethodHandleBuilder {
 
     static final Unsafe UNSAFE = Unsafe.getUnsafe();
 
     static final boolean ENABLE_POOL_PATCHES;
+    static final boolean MANGLE_CLASS_INFO;
 
     static {
-        final String key = "valhalla.enablePoolPatches";
-        ENABLE_POOL_PATCHES = key == null ? false :
-                AccessController.doPrivileged(
-                new GetBooleanAction(key), null,
-                new PropertyPermission(key , "read"));
+        Properties props = GetPropertyAction.privilegedGetProperties();
+        ENABLE_POOL_PATCHES = Boolean.parseBoolean(
+                props.getProperty("valhalla.enablePoolPatches"));
+        MANGLE_CLASS_INFO = Boolean.parseBoolean(
+                props.getProperty("valhalla.mangleClassInfo"));
     }
 
     public static MethodHandle loadCode(Lookup lookup, String name, MethodType type, Consumer<? super MethodHandleCodeBuilder> builder) {
         return loadCode(lookup, name, type.toMethodDescriptorString(), builder);
     }

@@ -212,11 +209,20 @@
             IsolatedMethodPoolHelper(String clazz) {
                 this.clazz = clazz;
             }
 
             String from(Class<?> c) {
-                String name = c == THIS_CLASS ? clazz : c.getName();
+                String name;
+                boolean isValue = MinimalValueTypes_1_0.isValueType(c);
+                if (c == THIS_CLASS) {
+                    //THIS_CLASS cannot be a DVT (by construction) - never mangle
+                    name = clazz;
+                } else {
+                    name = (isValue && MANGLE_CLASS_INFO) ?
+                            ";Q" + c.getName() + ";" : //mangle DVT name
+                            c.getName();
+                }
                 return name.replaceAll("\\.", "/");
             }
 
             @Override
             public int putClass(Class<?> symbol) {