1 /*
2 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 /*
27 * @test
28 * @run main/othervm -Xint -Xverify:none -XX:+EnableMVT -XX:+ValueArrayFlatten MVTAccessCheck
29 * @run main/othervm -Xint -Xverify:none -XX:+EnableMVT -XX:-ValueArrayFlatten MVTAccessCheck
30 * @run main/othervm -Xint -Xverify:none -XX:+EnableMVT -Dvalhalla.enableValueLambdaForms=true MVTAccessCheck
31 * @run main/othervm -Xint -Xverify:none -XX:+EnableMVT -Dvalhalla.enableValueLambdaForms=true -Dvalhalla.enablePoolPatches=true MVTAccessCheck
32 */
33
34 import jdk.experimental.value.ValueType;
35
36 import java.lang.invoke.MethodHandle;
37 import java.lang.invoke.MethodHandles;
38
39 public class MVTAccessCheck {
40
41 public static void main(String[] args) throws Throwable {
42 MethodHandles.Lookup lookup = MethodHandles.lookup();
43 Class<?> VCC = PrivatePoint.class;
44 ValueType<?> VT = ValueType.forClass(VCC);
45 String[] fieldNames = {"x", "y", "z"};
46 Class<?>[] fieldTypes = {int.class, short.class, short.class};
47
48 for (int i = 0; i < fieldNames.length; i++) {
49 final int offset = i;
50 assertThrow(() -> VT.findGetter(lookup, fieldNames[offset], fieldTypes[offset]),IllegalAccessException.class);
51 }
52
53 for (int i = 0; i < fieldNames.length; i++) {
54 final int offset = i;
55 assertThrow(() -> VT.findWither(lookup, fieldNames[offset], fieldTypes[offset]), IllegalAccessException.class);
56 }
57
58 PrivatePoint[] pts = {new PrivatePoint(1, (short) 6, (short) 3), new PrivatePoint(1, (short) 2, (short) 3)};
59
60 MethodHandle substTest = VT.substitutabilityTest();
61 for (PrivatePoint p1 : pts) {
62 for (PrivatePoint p2 : pts) {
63 boolean b1 = (boolean) substTest.invoke(p1, p2);
64 boolean b2 = p1.equals(p2);
65 assertTrue(b1 == b2);
66 }
67 }
68
69 MethodHandle hash = VT.substitutabilityHashCode();
70 for (PrivatePoint p1 : pts) {
71 for (PrivatePoint p2 : pts) {
72 boolean vHashEq = (int) hash.invoke(p1) == (int) hash.invoke(p2);
73 boolean rHashEq = p1.hashCode() == p2.hashCode();
74 assertTrue(vHashEq == rHashEq);
75 }
76 }
77 }
78
79 static int assertCount = 0;
80
81 interface MHAction {
82 void run() throws Throwable;
83 }
84
85 static void assertThrow(MHAction action, Class<? extends Throwable> ex) {
86 try {
87 action.run();
88 assertTrue(false);
89 } catch (Throwable t) {
90 assertTrue(ex.isAssignableFrom(t.getClass()));
91 }
92 }
93
94 static void assertTrue(boolean cond) {
95 assertCount++;
96 if (!cond) {
97 throw new AssertionError();
98 }
99 }
100 }
|
1 /*
2 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 /*
25 * @test
26 * @run testng/othervm -Xint -Xverify:none -XX:+EnableMVT -XX:+ValueArrayFlatten MVTAccessCheck
27 * @run testng/othervm -Xint -Xverify:none -XX:+EnableMVT -XX:-ValueArrayFlatten MVTAccessCheck
28 * @run testng/othervm -Xint -Xverify:none -XX:+EnableMVT -Dvalhalla.enableValueLambdaForms=true MVTAccessCheck
29 * @run testng/othervm -Xint -Xverify:none -XX:+EnableMVT -Dvalhalla.enableValueLambdaForms=true -Dvalhalla.enablePoolPatches=true MVTAccessCheck
30 */
31
32 import jdk.experimental.value.ValueType;
33 import org.testng.Assert;
34 import org.testng.annotations.Test;
35
36 import java.lang.invoke.MethodHandle;
37 import java.lang.invoke.MethodHandles;
38
39 import static org.testng.Assert.assertEquals;
40 import static org.testng.Assert.assertTrue;
41
42 @Test
43 public class MVTAccessCheck {
44
45 static final ValueType<?> VT_Point = ValueType.forClass(Point.class);
46 static final ValueType<?> VT_PrivatePoint = ValueType.forClass(PrivatePoint.class);
47
48 static final String[] FIELD_NAMES = {"x", "y", "z"};
49 static final Class<?>[] FIELD_TYPES = {int.class, short.class, short.class};
50
51 public void testGetter() throws Throwable {
52 for (int i = 0; i < FIELD_NAMES.length; i++) {
53 final int offset = i;
54 assertThrow(() -> VT_PrivatePoint.findGetter(
55 MethodHandles.lookup(), FIELD_NAMES[offset], FIELD_TYPES[offset]), IllegalAccessException.class);
56 }
57 }
58
59 public void testWither() throws Throwable {
60 testWither(VT_Point);
61 testWither(VT_PrivatePoint);
62 }
63
64 void testWither(ValueType<?> vt) throws Throwable {
65 for (int i = 0; i < FIELD_NAMES.length; i++) {
66 final int offset = i;
67 assertThrow(() -> vt.findWither(
68 MethodHandles.lookup(), FIELD_NAMES[offset], FIELD_TYPES[offset]), IllegalAccessException.class);
69 }
70 }
71
72 public void testSubstitutability() throws Throwable {
73 PrivatePoint[] pts = {new PrivatePoint(1, (short) 6, (short) 3), new PrivatePoint(1, (short) 2, (short) 3)};
74
75 MethodHandle substTest = VT_PrivatePoint.substitutabilityTest();
76 for (PrivatePoint p1 : pts) {
77 for (PrivatePoint p2 : pts) {
78 boolean b1 = (boolean) substTest.invoke(p1, p2);
79 boolean b2 = p1.equals(p2);
80 assertEquals(b1, b2);
81 }
82 }
83
84 MethodHandle hash = VT_PrivatePoint.substitutabilityHashCode();
85 for (PrivatePoint p1 : pts) {
86 for (PrivatePoint p2 : pts) {
87 boolean vHashEq = (int) hash.invoke(p1) == (int) hash.invoke(p2);
88 boolean rHashEq = p1.hashCode() == p2.hashCode();
89 assertEquals(vHashEq, rHashEq);
90 }
91 }
92 }
93
94 interface MHAction {
95 void run() throws Throwable;
96 }
97
98 static void assertThrow(MHAction action, Class<? extends Throwable> ex) {
99 try {
100 action.run();
101 Assert.fail();
102 } catch (Throwable t) {
103 assertTrue(ex.isAssignableFrom(t.getClass()));
104 }
105 }
106 }
|