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) {