From 4e062cde34690111fa6d98cbbabf355bcd261c14 Mon Sep 17 00:00:00 2001 From: Claes Redestad Date: Sat, 19 Dec 2015 02:24:27 +0100 Subject: [PATCH] 8144723: MethodHandleImpl.initStatics is no longer needed Reviewed-by: vlivanov, mhaupt, forax --- .../classes/java/lang/invoke/CallSite.java | 1 - .../classes/java/lang/invoke/MemberName.java | 5 -- .../java/lang/invoke/MethodHandle.java | 1 - .../java/lang/invoke/MethodHandleImpl.java | 67 +++++++++---------- .../java/lang/invoke/MethodHandleNatives.java | 3 - .../java/lang/invoke/MethodHandles.java | 2 +- 6 files changed, 32 insertions(+), 47 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java b/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java index 13cf24ca0f2..df245e661e9 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java @@ -83,7 +83,6 @@ private static CallSite bootstrapDynamic(MethodHandles.Lookup caller, String nam */ abstract public class CallSite { - static { MethodHandleImpl.initStatics(); } // The actual payload of this call site: /*package-private*/ diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java b/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java index 6e8293e78a6..50e28e56cab 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java @@ -1073,11 +1073,6 @@ import java.util.Objects; } } -// static { -// System.out.println("Hello world! My methods are:"); -// System.out.println(Factory.INSTANCE.getMethods(MemberName.class, true, null)); -// } - static { // Allow privileged classes outside of java.lang jdk.internal.misc.SharedSecrets.setJavaLangInvokeAccess(new jdk.internal.misc.JavaLangInvokeAccess() { diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandle.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandle.java index 2db85563d71..a3f6f47b00f 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandle.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandle.java @@ -420,7 +420,6 @@ mh.invokeExact(System.out, "Hello, world."); * @author John Rose, JSR 292 EG */ public abstract class MethodHandle { - static { MethodHandleImpl.initStatics(); } /** * Internal marker interface which distinguishes (to the Java compiler) diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java index 7ad49cd38aa..51d6b0665e2 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java @@ -32,7 +32,6 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.function.Function; -import java.util.stream.Collectors; import sun.invoke.empty.Empty; import sun.invoke.util.ValueConversions; @@ -65,11 +64,6 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; /// Factory methods to create method handles: - static void initStatics() { - // Trigger selected static initializations. - MemberName.Factory.INSTANCE.getClass(); - } - static MethodHandle makeArrayElementAccessor(Class arrayClass, boolean isSetter) { if (arrayClass == Object[].class) return (isSetter ? ArrayAccessor.OBJECT_ARRAY_SETTER : ArrayAccessor.OBJECT_ARRAY_GETTER); @@ -700,33 +694,43 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; MethodHandle makeBlockInliningWrapper(MethodHandle target) { LambdaForm lform; if (DONT_INLINE_THRESHOLD > 0) { - lform = PRODUCE_BLOCK_INLINING_FORM.apply(target); + lform = Makers.PRODUCE_BLOCK_INLINING_FORM.apply(target); } else { - lform = PRODUCE_REINVOKER_FORM.apply(target); + lform = Makers.PRODUCE_REINVOKER_FORM.apply(target); } return new CountingWrapper(target, lform, - PRODUCE_BLOCK_INLINING_FORM, PRODUCE_REINVOKER_FORM, + Makers.PRODUCE_BLOCK_INLINING_FORM, Makers.PRODUCE_REINVOKER_FORM, DONT_INLINE_THRESHOLD); } - /** Constructs reinvoker lambda form which block inlining during JIT-compilation for a particular method handle */ - private static final Function PRODUCE_BLOCK_INLINING_FORM = new Function() { - @Override - public LambdaForm apply(MethodHandle target) { - return DelegatingMethodHandle.makeReinvokerForm(target, - MethodTypeForm.LF_DELEGATE_BLOCK_INLINING, CountingWrapper.class, "reinvoker.dontInline", false, - DelegatingMethodHandle.NF_getTarget, CountingWrapper.NF_maybeStopCounting); - } - }; + private final static class Makers { + /** Constructs reinvoker lambda form which block inlining during JIT-compilation for a particular method handle */ + static final Function PRODUCE_BLOCK_INLINING_FORM = new Function() { + @Override + public LambdaForm apply(MethodHandle target) { + return DelegatingMethodHandle.makeReinvokerForm(target, + MethodTypeForm.LF_DELEGATE_BLOCK_INLINING, CountingWrapper.class, "reinvoker.dontInline", false, + DelegatingMethodHandle.NF_getTarget, CountingWrapper.NF_maybeStopCounting); + } + }; - /** Constructs simple reinvoker lambda form for a particular method handle */ - private static final Function PRODUCE_REINVOKER_FORM = new Function() { - @Override - public LambdaForm apply(MethodHandle target) { - return DelegatingMethodHandle.makeReinvokerForm(target, - MethodTypeForm.LF_DELEGATE, DelegatingMethodHandle.class, DelegatingMethodHandle.NF_getTarget); - } - }; + /** Constructs simple reinvoker lambda form for a particular method handle */ + static final Function PRODUCE_REINVOKER_FORM = new Function() { + @Override + public LambdaForm apply(MethodHandle target) { + return DelegatingMethodHandle.makeReinvokerForm(target, + MethodTypeForm.LF_DELEGATE, DelegatingMethodHandle.class, DelegatingMethodHandle.NF_getTarget); + } + }; + + /** Maker of type-polymorphic varargs */ + static final ClassValue TYPED_COLLECTORS = new ClassValue() { + @Override + protected MethodHandle[] computeValue(Class type) { + return new MethodHandle[MAX_JVM_ARITY + 1]; + } + }; + } /** * Counting method handle. It has 2 states: counting and non-counting. @@ -1527,15 +1531,6 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; return MethodHandles.collectArguments(rightFill, 0, midFill); } - // Type-polymorphic version of varargs maker. - private static final ClassValue TYPED_COLLECTORS - = new ClassValue() { - @Override - protected MethodHandle[] computeValue(Class type) { - return new MethodHandle[256]; - } - }; - static final int MAX_JVM_ARITY = 255; // limit imposed by the JVM /** Return a method handle that takes the indicated number of @@ -1557,7 +1552,7 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; if (elemType == Object.class) return varargsArray(nargs); // other cases: primitive arrays, subtypes of Object[] - MethodHandle cache[] = TYPED_COLLECTORS.get(elemType); + MethodHandle cache[] = Makers.TYPED_COLLECTORS.get(elemType); MethodHandle mh = nargs < cache.length ? cache[nargs] : null; if (mh != null) return mh; if (nargs == 0) { diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java index f983b2d792a..f00be9c067e 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java @@ -87,9 +87,6 @@ class MethodHandleNatives { private static native void registerNatives(); static { registerNatives(); - - // The JVM calls MethodHandleNatives.. Cascade the calls as needed: - MethodHandleImpl.initStatics(); } /** diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java index 535a7781cf7..0c8317db5c1 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java @@ -61,7 +61,7 @@ public class MethodHandles { private MethodHandles() { } // do not instantiate private static final MemberName.Factory IMPL_NAMES = MemberName.getFactory(); - static { MethodHandleImpl.initStatics(); } + // See IMPL_LOOKUP below. //// Method handle creation from ordinary methods.