8149040: Cleanup compiler/jsr292/NonInlinedCall tests after JDK-8148994
Reviewed-by: kvn, thartmann
This commit is contained in:
parent
c6783a9362
commit
f2f26ca775
@ -1,116 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8072008
|
||||
* @requires vm.opt.final.ClassUnloading
|
||||
* @library /test/lib ../patches
|
||||
* @modules java.base/jdk.internal.misc
|
||||
* java.base/jdk.internal.vm.annotation
|
||||
*
|
||||
* @build java.base/java.lang.invoke.MethodHandleHelper
|
||||
* @build sun.hotspot.WhiteBox
|
||||
* @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions
|
||||
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
|
||||
* -Xbatch -XX:-TieredCompilation -XX:CICompilerCount=1
|
||||
* -XX:+FoldStableValues
|
||||
* compiler.jsr292.NonInlinedCall.GCTest
|
||||
*/
|
||||
|
||||
package compiler.jsr292.NonInlinedCall;
|
||||
|
||||
import jdk.internal.vm.annotation.DontInline;
|
||||
import jdk.internal.vm.annotation.Stable;
|
||||
import sun.hotspot.WhiteBox;
|
||||
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodHandleHelper;
|
||||
import java.lang.invoke.MethodHandleHelper.NonInlinedReinvoker;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.lang.ref.PhantomReference;
|
||||
import java.lang.ref.Reference;
|
||||
import java.lang.ref.ReferenceQueue;
|
||||
|
||||
import static jdk.test.lib.Asserts.assertEquals;
|
||||
|
||||
public class GCTest {
|
||||
static final MethodHandles.Lookup LOOKUP = MethodHandleHelper.IMPL_LOOKUP;
|
||||
|
||||
static class T {
|
||||
static int f1() { return 0; }
|
||||
static int f2() { return 1; }
|
||||
}
|
||||
|
||||
static @Stable MethodHandle mh;
|
||||
static PhantomReference<Object> lform;
|
||||
|
||||
static final ReferenceQueue<Object> rq = new ReferenceQueue<>();
|
||||
static final WhiteBox WB = WhiteBox.getWhiteBox();
|
||||
|
||||
@DontInline
|
||||
static int invokeBasic() {
|
||||
try {
|
||||
return MethodHandleHelper.invokeBasicI(mh);
|
||||
} catch (Throwable e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
static void test(int expected) {
|
||||
for (int i = 0; i < 20_000; i++) {
|
||||
invokeBasic();
|
||||
}
|
||||
assertEquals(invokeBasic(), expected);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
mh = NonInlinedReinvoker.make(
|
||||
LOOKUP.findStatic(T.class, "f1", MethodType.methodType(int.class)));
|
||||
|
||||
// Monitor LambdaForm GC
|
||||
lform = new PhantomReference<>(MethodHandleHelper.getLambdaForm(mh), rq);
|
||||
|
||||
test(0);
|
||||
WB.clearInlineCaches();
|
||||
test(0);
|
||||
|
||||
mh = NonInlinedReinvoker.make(
|
||||
LOOKUP.findStatic(T.class, "f2", MethodType.methodType(int.class)));
|
||||
|
||||
Reference<?> ref = null;
|
||||
while (ref == null) {
|
||||
WB.fullGC();
|
||||
try {
|
||||
ref = rq.remove(1000);
|
||||
} catch (InterruptedException e) { /*ignore*/ }
|
||||
}
|
||||
|
||||
test(1);
|
||||
WB.clearInlineCaches();
|
||||
test(1);
|
||||
|
||||
System.out.println("TEST PASSED");
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -43,7 +43,6 @@ import sun.hotspot.WhiteBox;
|
||||
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodHandleHelper;
|
||||
import java.lang.invoke.MethodHandleHelper.NonInlinedReinvoker;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.MethodType;
|
||||
|
||||
@ -58,7 +57,6 @@ public class InvokeTest {
|
||||
static final MethodHandle defaultMH; // invokevirtual T.f3
|
||||
static final MethodHandle specialMH; // invokespecial T.f4 T
|
||||
static final MethodHandle privateMH; // invokespecial I.f4 T
|
||||
static final MethodHandle basicMH;
|
||||
|
||||
static final MethodHandle intrinsicMH; // invokevirtual Object.hashCode
|
||||
|
||||
@ -76,7 +74,6 @@ public class InvokeTest {
|
||||
defaultMH = LOOKUP.findVirtual(T.class, "f3", mtype);
|
||||
specialMH = LOOKUP.findSpecial(T.class, "f4", mtype, T.class);
|
||||
privateMH = LOOKUP.findSpecial(I.class, "f4", mtype, I.class);
|
||||
basicMH = NonInlinedReinvoker.make(staticMH);
|
||||
intrinsicMH = LOOKUP.findVirtual(Object.class, "hashCode", MethodType.methodType(int.class));
|
||||
} catch (Exception e) {
|
||||
throw new Error(e);
|
||||
@ -194,16 +191,6 @@ public class InvokeTest {
|
||||
}
|
||||
}
|
||||
|
||||
@DontInline
|
||||
static void invokeBasic() {
|
||||
try {
|
||||
Class<?> cls = (Class<?>)MethodHandleHelper.invokeBasicL(basicMH);
|
||||
assertEquals(cls, T.class);
|
||||
} catch (Throwable e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
static void run(Runnable r) {
|
||||
for (int i = 0; i < 20_000; i++) {
|
||||
r.run();
|
||||
@ -290,17 +277,10 @@ public class InvokeTest {
|
||||
run(() -> linkToStatic());
|
||||
}
|
||||
|
||||
static void testBasic() {
|
||||
System.out.println("invokeBasic");
|
||||
// static call
|
||||
run(() -> invokeBasic());
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
testVirtual();
|
||||
testInterface();
|
||||
testSpecial();
|
||||
testStatic();
|
||||
testBasic();
|
||||
}
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ public class RedefineTest {
|
||||
static final WhiteBox WB = WhiteBox.getWhiteBox();
|
||||
|
||||
@DontInline
|
||||
static int invokeBasic() {
|
||||
static int invokeExact() {
|
||||
try {
|
||||
return (int)mh.invokeExact();
|
||||
} catch (Throwable e) {
|
||||
@ -130,7 +130,7 @@ public class RedefineTest {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
for (int i = 0; i < 20_000; i++) {
|
||||
int r = invokeBasic();
|
||||
int r = invokeExact();
|
||||
if (r != 0) {
|
||||
throw new Error(r + " != 0");
|
||||
}
|
||||
@ -142,7 +142,7 @@ public class RedefineTest {
|
||||
int exp = (instr != null) ? 1 : 0;
|
||||
|
||||
for (int i = 0; i < 20_000; i++) {
|
||||
if (invokeBasic() != exp) {
|
||||
if (invokeExact() != exp) {
|
||||
throw new Error();
|
||||
}
|
||||
}
|
||||
@ -150,7 +150,7 @@ public class RedefineTest {
|
||||
WB.clearInlineCaches();
|
||||
|
||||
for (int i = 0; i < 20_000; i++) {
|
||||
if (invokeBasic() != exp) {
|
||||
if (invokeExact() != exp) {
|
||||
throw new Error();
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,11 +26,11 @@ package java.lang.invoke;
|
||||
import java.lang.invoke.MethodHandles.Lookup;
|
||||
import jdk.internal.vm.annotation.DontInline;
|
||||
import jdk.internal.vm.annotation.ForceInline;
|
||||
|
||||
/**
|
||||
* Helper class to inject into java.lang.invoke that provides access to
|
||||
* package-private methods in this package.
|
||||
*/
|
||||
|
||||
public class MethodHandleHelper {
|
||||
|
||||
private MethodHandleHelper() { }
|
||||
@ -79,29 +79,4 @@ public class MethodHandleHelper {
|
||||
public static LambdaForm getLambdaForm(MethodHandle mh) {
|
||||
return mh.form;
|
||||
}
|
||||
|
||||
public static class NonInlinedReinvoker extends DelegatingMethodHandle {
|
||||
private final MethodHandle target;
|
||||
|
||||
private NonInlinedReinvoker(MethodHandle target, LambdaForm lf) {
|
||||
super(target.type(), lf);
|
||||
this.target = target;
|
||||
}
|
||||
@Override
|
||||
public MethodHandle getTarget() {
|
||||
return target;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MethodHandle asTypeUncached(MethodType newType) {
|
||||
return asTypeCache = target.asType(newType);
|
||||
}
|
||||
|
||||
public static MethodHandle make(MethodHandle target) {
|
||||
LambdaForm lform = DelegatingMethodHandle.makeReinvokerForm(
|
||||
target, -1, DelegatingMethodHandle.class,
|
||||
/*forceInline=*/false, DelegatingMethodHandle.NF_getTarget, null);
|
||||
return new NonInlinedReinvoker(target, lform);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user