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.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* 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.MethodHandle;
|
||||||
import java.lang.invoke.MethodHandleHelper;
|
import java.lang.invoke.MethodHandleHelper;
|
||||||
import java.lang.invoke.MethodHandleHelper.NonInlinedReinvoker;
|
|
||||||
import java.lang.invoke.MethodHandles;
|
import java.lang.invoke.MethodHandles;
|
||||||
import java.lang.invoke.MethodType;
|
import java.lang.invoke.MethodType;
|
||||||
|
|
||||||
@ -58,7 +57,6 @@ public class InvokeTest {
|
|||||||
static final MethodHandle defaultMH; // invokevirtual T.f3
|
static final MethodHandle defaultMH; // invokevirtual T.f3
|
||||||
static final MethodHandle specialMH; // invokespecial T.f4 T
|
static final MethodHandle specialMH; // invokespecial T.f4 T
|
||||||
static final MethodHandle privateMH; // invokespecial I.f4 T
|
static final MethodHandle privateMH; // invokespecial I.f4 T
|
||||||
static final MethodHandle basicMH;
|
|
||||||
|
|
||||||
static final MethodHandle intrinsicMH; // invokevirtual Object.hashCode
|
static final MethodHandle intrinsicMH; // invokevirtual Object.hashCode
|
||||||
|
|
||||||
@ -76,7 +74,6 @@ public class InvokeTest {
|
|||||||
defaultMH = LOOKUP.findVirtual(T.class, "f3", mtype);
|
defaultMH = LOOKUP.findVirtual(T.class, "f3", mtype);
|
||||||
specialMH = LOOKUP.findSpecial(T.class, "f4", mtype, T.class);
|
specialMH = LOOKUP.findSpecial(T.class, "f4", mtype, T.class);
|
||||||
privateMH = LOOKUP.findSpecial(I.class, "f4", mtype, I.class);
|
privateMH = LOOKUP.findSpecial(I.class, "f4", mtype, I.class);
|
||||||
basicMH = NonInlinedReinvoker.make(staticMH);
|
|
||||||
intrinsicMH = LOOKUP.findVirtual(Object.class, "hashCode", MethodType.methodType(int.class));
|
intrinsicMH = LOOKUP.findVirtual(Object.class, "hashCode", MethodType.methodType(int.class));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new Error(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) {
|
static void run(Runnable r) {
|
||||||
for (int i = 0; i < 20_000; i++) {
|
for (int i = 0; i < 20_000; i++) {
|
||||||
r.run();
|
r.run();
|
||||||
@ -290,17 +277,10 @@ public class InvokeTest {
|
|||||||
run(() -> linkToStatic());
|
run(() -> linkToStatic());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void testBasic() {
|
|
||||||
System.out.println("invokeBasic");
|
|
||||||
// static call
|
|
||||||
run(() -> invokeBasic());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
testVirtual();
|
testVirtual();
|
||||||
testInterface();
|
testInterface();
|
||||||
testSpecial();
|
testSpecial();
|
||||||
testStatic();
|
testStatic();
|
||||||
testBasic();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -114,7 +114,7 @@ public class RedefineTest {
|
|||||||
static final WhiteBox WB = WhiteBox.getWhiteBox();
|
static final WhiteBox WB = WhiteBox.getWhiteBox();
|
||||||
|
|
||||||
@DontInline
|
@DontInline
|
||||||
static int invokeBasic() {
|
static int invokeExact() {
|
||||||
try {
|
try {
|
||||||
return (int)mh.invokeExact();
|
return (int)mh.invokeExact();
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
@ -130,7 +130,7 @@ public class RedefineTest {
|
|||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
for (int i = 0; i < 20_000; i++) {
|
for (int i = 0; i < 20_000; i++) {
|
||||||
int r = invokeBasic();
|
int r = invokeExact();
|
||||||
if (r != 0) {
|
if (r != 0) {
|
||||||
throw new Error(r + " != 0");
|
throw new Error(r + " != 0");
|
||||||
}
|
}
|
||||||
@ -142,7 +142,7 @@ public class RedefineTest {
|
|||||||
int exp = (instr != null) ? 1 : 0;
|
int exp = (instr != null) ? 1 : 0;
|
||||||
|
|
||||||
for (int i = 0; i < 20_000; i++) {
|
for (int i = 0; i < 20_000; i++) {
|
||||||
if (invokeBasic() != exp) {
|
if (invokeExact() != exp) {
|
||||||
throw new Error();
|
throw new Error();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -150,7 +150,7 @@ public class RedefineTest {
|
|||||||
WB.clearInlineCaches();
|
WB.clearInlineCaches();
|
||||||
|
|
||||||
for (int i = 0; i < 20_000; i++) {
|
for (int i = 0; i < 20_000; i++) {
|
||||||
if (invokeBasic() != exp) {
|
if (invokeExact() != exp) {
|
||||||
throw new Error();
|
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.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* 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 java.lang.invoke.MethodHandles.Lookup;
|
||||||
import jdk.internal.vm.annotation.DontInline;
|
import jdk.internal.vm.annotation.DontInline;
|
||||||
import jdk.internal.vm.annotation.ForceInline;
|
import jdk.internal.vm.annotation.ForceInline;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper class to inject into java.lang.invoke that provides access to
|
* Helper class to inject into java.lang.invoke that provides access to
|
||||||
* package-private methods in this package.
|
* package-private methods in this package.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class MethodHandleHelper {
|
public class MethodHandleHelper {
|
||||||
|
|
||||||
private MethodHandleHelper() { }
|
private MethodHandleHelper() { }
|
||||||
@ -79,29 +79,4 @@ public class MethodHandleHelper {
|
|||||||
public static LambdaForm getLambdaForm(MethodHandle mh) {
|
public static LambdaForm getLambdaForm(MethodHandle mh) {
|
||||||
return mh.form;
|
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