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 * @bug 8027823
29 * @run junit test.java.lang.invoke.TestCatchException
30 */
31 package test.java.lang.invoke;
32
33 import java.lang.invoke.*;
34 import org.junit.*;
35 import static org.junit.Assert.*;
36
37 public class TestCatchException {
38 final static MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
39 final static MethodType M_TYPE = MethodType.methodType(int.class, Object.class, Object.class, int.class, int.class, int.class, int.class, int.class, int.class, int.class);
40
41 private static int noThrow(Object o1, Object o2, int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
42 return 42;
43 }
44
45 private static int throwEx(Object o1, Object o2, int i1, int i2, int i3, int i4, int i5, int i6, int i7) throws Exception {
46 throw new Exception();
47 }
48
55 MethodHandle target = LOOKUP.findStatic(TestCatchException.class, "noThrow", M_TYPE);
56 MethodHandle handler = LOOKUP.findStatic(TestCatchException.class, "handler", MethodType.methodType(int.class, Exception.class));
57
58 MethodHandle h = MethodHandles.catchException(target, Exception.class, handler);
59
60 int x = (int)h.invokeExact(new Object(), new Object(), 1, 2, 3, 4, 5, 6, 7);
61 assertEquals(x, 42);
62 }
63
64 @Test
65 public void testThrowPath() throws Throwable {
66 MethodHandle target = LOOKUP.findStatic(TestCatchException.class, "throwEx", M_TYPE);
67 MethodHandle handler = LOOKUP.findStatic(TestCatchException.class, "handler", MethodType.methodType(int.class, Exception.class));
68
69 MethodHandle h = MethodHandles.catchException(target, Exception.class, handler);
70
71 int x = (int)h.invokeExact(new Object(), new Object(), 1, 2, 3, 4, 5, 6, 7);
72 assertEquals(x, 17);
73 }
74
75 public static void main(String[] args) throws Throwable {
76 TestCatchException test = new TestCatchException();
77 test.testNoThrowPath();
78 test.testThrowPath();
79 System.out.println("TEST PASSED");
80 }
81 }
|
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 * @bug 8027823 8034120
29 * @run junit test.java.lang.invoke.TestCatchException
30 */
31 package test.java.lang.invoke;
32
33 import java.lang.invoke.*;
34 import org.junit.*;
35 import static org.junit.Assert.*;
36
37 public class TestCatchException {
38 final static MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
39 final static MethodType M_TYPE = MethodType.methodType(int.class, Object.class, Object.class, int.class, int.class, int.class, int.class, int.class, int.class, int.class);
40
41 private static int noThrow(Object o1, Object o2, int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
42 return 42;
43 }
44
45 private static int throwEx(Object o1, Object o2, int i1, int i2, int i3, int i4, int i5, int i6, int i7) throws Exception {
46 throw new Exception();
47 }
48
55 MethodHandle target = LOOKUP.findStatic(TestCatchException.class, "noThrow", M_TYPE);
56 MethodHandle handler = LOOKUP.findStatic(TestCatchException.class, "handler", MethodType.methodType(int.class, Exception.class));
57
58 MethodHandle h = MethodHandles.catchException(target, Exception.class, handler);
59
60 int x = (int)h.invokeExact(new Object(), new Object(), 1, 2, 3, 4, 5, 6, 7);
61 assertEquals(x, 42);
62 }
63
64 @Test
65 public void testThrowPath() throws Throwable {
66 MethodHandle target = LOOKUP.findStatic(TestCatchException.class, "throwEx", M_TYPE);
67 MethodHandle handler = LOOKUP.findStatic(TestCatchException.class, "handler", MethodType.methodType(int.class, Exception.class));
68
69 MethodHandle h = MethodHandles.catchException(target, Exception.class, handler);
70
71 int x = (int)h.invokeExact(new Object(), new Object(), 1, 2, 3, 4, 5, 6, 7);
72 assertEquals(x, 17);
73 }
74
75
76 public static Object m1(Object o1, Object o2, Object o3, Object o4, Object o5,
77 Object o6, Object o7, Object o8, Object... tail) {
78 return tail;
79 }
80
81 public static Object m2(Exception e, Object o1, Object o2, Object o3, Object o4,
82 Object o5, Object o6, Object o7, Object o8, Object... tail) {
83 return tail;
84 }
85
86 @Test
87 public void testVarargsCollector() throws Throwable {
88 MethodType t1 = MethodType.methodType(Object.class, Object.class, Object.class, Object.class, Object.class,
89 Object.class, Object.class, Object.class, Object.class, Object[].class);
90
91 MethodType t2 = t1.insertParameterTypes(0, Exception.class);
92
93 MethodHandle target = LOOKUP.findStatic(TestCatchException.class, "m1", t1)
94 .asVarargsCollector(Object[].class);
95
96 MethodHandle catcher = LOOKUP.findStatic(TestCatchException.class, "m2", t2);
97
98 MethodHandle gwc = MethodHandles.catchException(target, Exception.class, catcher);
99
100 Object o = new Object();
101 Object[] obj1 = new Object[] { "str" };
102
103 Object r1 = target.invokeExact(o, o, o, o, o, o, o, o, obj1);
104 Object r2 = gwc.invokeExact(o, o, o, o, o, o, o, o, obj1);
105 assertTrue(r1 != null);
106 assertTrue(r1.equals(r2));
107 }
108
109 public static void main(String[] args) throws Throwable {
110 TestCatchException test = new TestCatchException();
111 test.testNoThrowPath();
112 test.testThrowPath();
113 test.testVarargsCollector();
114 System.out.println("TEST PASSED");
115 }
116 }
|