8172905: Minor startup cleanup of CallSite and MethodType
Reviewed-by: psandoz, jrose
--- a/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java Wed Jan 18 11:18:13 2017 -0800
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java Thu Jan 19 13:37:05 2017 +0100
@@ -28,6 +28,8 @@
import static java.lang.invoke.MethodHandleStatics.*;
import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
+import jdk.internal.vm.annotation.Stable;
+
/**
* A {@code CallSite} is a holder for a variable {@link MethodHandle},
* which is called its {@code target}.
@@ -215,19 +217,36 @@
public abstract MethodHandle dynamicInvoker();
/*non-public*/ MethodHandle makeDynamicInvoker() {
- MethodHandle getTarget = GET_TARGET.bindArgumentL(0, this);
+ MethodHandle getTarget = getTargetHandle().bindArgumentL(0, this);
MethodHandle invoker = MethodHandles.exactInvoker(this.type());
return MethodHandles.foldArguments(invoker, getTarget);
}
- private static final MethodHandle GET_TARGET;
- private static final MethodHandle THROW_UCS;
- static {
+ private static @Stable MethodHandle GET_TARGET;
+ private static MethodHandle getTargetHandle() {
+ MethodHandle handle = GET_TARGET;
+ if (handle != null) {
+ return handle;
+ }
try {
- GET_TARGET = IMPL_LOOKUP.
- findVirtual(CallSite.class, "getTarget", MethodType.methodType(MethodHandle.class));
- THROW_UCS = IMPL_LOOKUP.
- findStatic(CallSite.class, "uninitializedCallSite", MethodType.methodType(Object.class, Object[].class));
+ return GET_TARGET = IMPL_LOOKUP.
+ findVirtual(CallSite.class, "getTarget",
+ MethodType.methodType(MethodHandle.class));
+ } catch (ReflectiveOperationException e) {
+ throw newInternalError(e);
+ }
+ }
+
+ private static @Stable MethodHandle THROW_UCS;
+ private static MethodHandle uninitializedCallSiteHandle() {
+ MethodHandle handle = THROW_UCS;
+ if (handle != null) {
+ return handle;
+ }
+ try {
+ return THROW_UCS = IMPL_LOOKUP.
+ findStatic(CallSite.class, "uninitializedCallSite",
+ MethodType.methodType(Object.class, Object[].class));
} catch (ReflectiveOperationException e) {
throw newInternalError(e);
}
@@ -242,7 +261,7 @@
MethodType basicType = targetType.basicType();
MethodHandle invoker = basicType.form().cachedMethodHandle(MethodTypeForm.MH_UNINIT_CS);
if (invoker == null) {
- invoker = THROW_UCS.asType(basicType);
+ invoker = uninitializedCallSiteHandle().asType(basicType);
invoker = basicType.form().setCachedMethodHandle(MethodTypeForm.MH_UNINIT_CS, invoker);
}
// unchecked view is OK since no values will be received or returned
@@ -250,12 +269,16 @@
}
// unsafe stuff:
- private static final long TARGET_OFFSET;
- private static final long CONTEXT_OFFSET;
- static {
+ private static @Stable long TARGET_OFFSET;
+ private static long getTargetOffset() {
+ long offset = TARGET_OFFSET;
+ if (offset > 0) {
+ return offset;
+ }
try {
- TARGET_OFFSET = UNSAFE.objectFieldOffset(CallSite.class.getDeclaredField("target"));
- CONTEXT_OFFSET = UNSAFE.objectFieldOffset(CallSite.class.getDeclaredField("context"));
+ offset = TARGET_OFFSET = UNSAFE.objectFieldOffset(CallSite.class.getDeclaredField("target"));
+ assert(offset > 0);
+ return offset;
} catch (Exception ex) { throw newInternalError(ex); }
}
@@ -265,7 +288,7 @@
}
/*package-private*/
MethodHandle getTargetVolatile() {
- return (MethodHandle) UNSAFE.getObjectVolatile(this, TARGET_OFFSET);
+ return (MethodHandle) UNSAFE.getObjectVolatile(this, getTargetOffset());
}
/*package-private*/
void setTargetVolatile(MethodHandle newTarget) {
@@ -324,7 +347,7 @@
final int NON_SPREAD_ARG_COUNT = 3; // (caller, name, type)
if (NON_SPREAD_ARG_COUNT + argv.length > MethodType.MAX_MH_ARITY)
throw new BootstrapMethodError("too many bootstrap method arguments");
- MethodType bsmType = bootstrapMethod.type();
+
MethodType invocationType = MethodType.genericMethodType(NON_SPREAD_ARG_COUNT + argv.length);
MethodHandle typedBSM = bootstrapMethod.asType(invocationType);
MethodHandle spreader = invocationType.invokers().spreadInvoker(NON_SPREAD_ARG_COUNT);
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodType.java Wed Jan 18 11:18:13 2017 -0800
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodType.java Thu Jan 19 13:37:05 2017 +0100
@@ -1128,7 +1128,7 @@
public String toMethodDescriptorString() {
String desc = methodDescriptor;
if (desc == null) {
- desc = BytecodeDescriptor.unparse(this);
+ desc = BytecodeDescriptor.unparseMethod(this.rtype, this.ptypes);
methodDescriptor = desc;
}
return desc;
@@ -1256,7 +1256,7 @@
private final ReferenceQueue<T> stale;
public ConcurrentWeakInternSet() {
- this.map = new ConcurrentHashMap<>();
+ this.map = new ConcurrentHashMap<>(512);
this.stale = new ReferenceQueue<>();
}