TestCatchException.java revision 12745:f068a4ffddd2
1/*
2 * Copyright (c) 2013, 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 * @bug 8027823
29 * @run junit test.java.lang.invoke.TestCatchException
30 */
31package test.java.lang.invoke;
32
33import java.lang.invoke.*;
34import org.junit.*;
35import static org.junit.Assert.*;
36
37public class TestCatchException {
38    static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
39    static final 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
49    private static int handler(Exception e) {
50        return 17;
51    }
52
53    @Test
54    public void testNoThrowPath() throws Throwable {
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    static final Object masterParam = new Object();
76    static final Object[] masterTail = new Object[] { "str" };
77    static Exception masterEx = new Exception();
78
79    public static Object m1(Object o1, Object o2, Object o3, Object o4, Object o5,
80                            Object o6, Object o7, Object o8, Object... tail) {
81        assertEquals(masterParam, o1);
82        assertEquals(masterParam, o2);
83        assertEquals(masterParam, o3);
84        assertEquals(masterParam, o4);
85        assertEquals(masterParam, o5);
86        assertEquals(masterParam, o6);
87        assertEquals(masterParam, o7);
88        assertEquals(masterParam, o8);
89        assertEquals(masterTail, tail);
90        return tail;
91    }
92
93    public static Object m2(Exception e, Object o1, Object o2, Object o3, Object o4,
94                            Object o5, Object o6, Object o7, Object o8, Object... tail) {
95        assertEquals(masterEx, e);
96        assertEquals(masterParam, o1);
97        assertEquals(masterParam, o2);
98        assertEquals(masterParam, o3);
99        assertEquals(masterParam, o4);
100        assertEquals(masterParam, o5);
101        assertEquals(masterParam, o6);
102        assertEquals(masterParam, o7);
103        assertEquals(masterParam, o8);
104        assertEquals(masterTail, tail);
105        return tail;
106    }
107
108    public static Object throwEx(Object o1, Object o2, Object o3, Object o4, Object o5,
109                                 Object o6, Object o7, Object o8, Object... tail) throws Exception {
110        assertEquals(masterParam, o1);
111        assertEquals(masterParam, o2);
112        assertEquals(masterParam, o3);
113        assertEquals(masterParam, o4);
114        assertEquals(masterParam, o5);
115        assertEquals(masterParam, o6);
116        assertEquals(masterParam, o7);
117        assertEquals(masterParam, o8);
118        assertEquals(masterTail, tail);
119        throw masterEx;
120    }
121
122    @Test
123    public void testVarargsCollectorNoThrow() throws Throwable {
124        MethodType t1 = MethodType.methodType(Object.class, Object.class, Object.class, Object.class, Object.class,
125                Object.class, Object.class, Object.class, Object.class, Object[].class);
126
127        MethodType t2 = t1.insertParameterTypes(0, Exception.class);
128
129        MethodHandle target = LOOKUP.findStatic(TestCatchException.class, "m1", t1)
130                                    .asVarargsCollector(Object[].class);
131        MethodHandle catcher = LOOKUP.findStatic(TestCatchException.class, "m2", t2)
132                                     .asVarargsCollector(Object[].class);
133        MethodHandle gwc = MethodHandles.catchException(target, Exception.class, catcher);
134
135        Object o = masterParam;
136        Object[] obj1 = masterTail;
137
138        Object r2 = gwc.invokeExact(o, o, o, o, o, o, o, o, obj1);
139        assertEquals(r2, obj1);
140    }
141
142    @Test
143    public void testVarargsCollectorThrow() throws Throwable {
144        MethodType t1 = MethodType.methodType(Object.class, Object.class, Object.class, Object.class, Object.class,
145                Object.class, Object.class, Object.class, Object.class, Object[].class);
146
147        MethodType t2 = t1.insertParameterTypes(0, Exception.class);
148
149        MethodHandle target = LOOKUP.findStatic(TestCatchException.class, "throwEx", t1)
150                                    .asVarargsCollector(Object[].class);
151        MethodHandle catcher = LOOKUP.findStatic(TestCatchException.class, "m2", t2)
152                                     .asVarargsCollector(Object[].class);
153        MethodHandle gwc = MethodHandles.catchException(target, Exception.class, catcher);
154
155        Object o = masterParam;
156        Object[] obj1 = masterTail;
157
158        Object r2 = gwc.invokeExact(o, o, o, o, o, o, o, o, obj1);
159        assertEquals(r2, obj1);
160    }
161
162    public static void main(String[] args) throws Throwable {
163        TestCatchException test = new TestCatchException();
164        test.testNoThrowPath();
165        test.testThrowPath();
166        test.testVarargsCollectorNoThrow();
167        test.testVarargsCollectorThrow();
168        System.out.println("TEST PASSED");
169    }
170}
171