author | jrose |
Sat, 05 Oct 2013 05:30:38 -0700 | |
changeset 20528 | 0b1e2130d3f7 |
parent 14408 | db08012d1d6f |
child 20531 | 14c2a04f21e6 |
permissions | -rw-r--r-- |
4535 | 1 |
/* |
14342
8435a30053c1
7197491: update copyright year to match last edit in jdk8 jdk repository
alanb
parents:
13610
diff
changeset
|
2 |
* Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. |
4535 | 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 |
|
5506 | 7 |
* published by the Free Software Foundation. Oracle designates this |
4535 | 8 |
* particular file as subject to the "Classpath" exception as provided |
5506 | 9 |
* by Oracle in the LICENSE file that accompanied this code. |
4535 | 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 |
* |
|
5506 | 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. |
|
4535 | 24 |
*/ |
25 |
||
26 |
/* @test |
|
8822
8145ab9f5f86
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
8347
diff
changeset
|
27 |
* @summary unit tests for java.lang.invoke.MethodHandles |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
28 |
* @compile MethodHandlesTest.java remote/RemoteExample.java |
14408
db08012d1d6f
7197210: java/lang/invoke/CallSiteTest.java failing on armsflt.
jiangli
parents:
14342
diff
changeset
|
29 |
* @run junit/othervm/timeout=2500 -XX:+IgnoreUnrecognizedVMOptions -XX:-VerifyDependencies -esa test.java.lang.invoke.MethodHandlesTest |
4535 | 30 |
*/ |
31 |
||
8822
8145ab9f5f86
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
8347
diff
changeset
|
32 |
package test.java.lang.invoke; |
4535 | 33 |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
34 |
import test.java.lang.invoke.remote.RemoteExample; |
8822
8145ab9f5f86
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
8347
diff
changeset
|
35 |
import java.lang.invoke.*; |
8145ab9f5f86
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
8347
diff
changeset
|
36 |
import java.lang.invoke.MethodHandles.Lookup; |
4535 | 37 |
import java.lang.reflect.*; |
38 |
import java.util.*; |
|
39 |
import org.junit.*; |
|
40 |
import static org.junit.Assert.*; |
|
41 |
||
42 |
||
43 |
/** |
|
44 |
* |
|
45 |
* @author jrose |
|
46 |
*/ |
|
47 |
public class MethodHandlesTest { |
|
10081 | 48 |
static final Class<?> THIS_CLASS = MethodHandlesTest.class; |
4535 | 49 |
// How much output? |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
50 |
static int verbosity = 0; |
5726 | 51 |
static { |
10081 | 52 |
String vstr = System.getProperty(THIS_CLASS.getSimpleName()+".verbosity"); |
53 |
if (vstr == null) |
|
54 |
vstr = System.getProperty(THIS_CLASS.getName()+".verbosity"); |
|
5726 | 55 |
if (vstr != null) verbosity = Integer.parseInt(vstr); |
56 |
} |
|
4535 | 57 |
|
58 |
// Set this true during development if you want to fast-forward to |
|
59 |
// a particular new, non-working test. Tests which are known to |
|
60 |
// work (or have recently worked) test this flag and return on true. |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
61 |
static final boolean CAN_SKIP_WORKING; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
62 |
static { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
63 |
String vstr = System.getProperty(THIS_CLASS.getSimpleName()+".CAN_SKIP_WORKING"); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
64 |
if (vstr == null) |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
65 |
vstr = System.getProperty(THIS_CLASS.getName()+".CAN_SKIP_WORKING"); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
66 |
CAN_SKIP_WORKING = Boolean.parseBoolean(vstr); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
67 |
} |
4535 | 68 |
|
10081 | 69 |
// Set 'true' to do about 15x fewer tests, especially those redundant with RicochetTest. |
70 |
// This might be useful with -Xcomp stress tests that compile all method handles. |
|
71 |
static boolean CAN_TEST_LIGHTLY = Boolean.getBoolean(THIS_CLASS.getName()+".CAN_TEST_LIGHTLY"); |
|
4535 | 72 |
|
73 |
@Test |
|
74 |
public void testFirst() throws Throwable { |
|
75 |
verbosity += 9; try { |
|
76 |
// left blank for debugging |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
77 |
} finally { printCounts(); verbosity -= 9; } |
4535 | 78 |
} |
79 |
||
80 |
static final int MAX_ARG_INCREASE = 3; |
|
81 |
||
82 |
public MethodHandlesTest() { |
|
83 |
} |
|
84 |
||
85 |
String testName; |
|
5726 | 86 |
static int allPosTests, allNegTests; |
4535 | 87 |
int posTests, negTests; |
88 |
@After |
|
89 |
public void printCounts() { |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
90 |
if (verbosity >= 2 && (posTests | negTests) != 0) { |
4535 | 91 |
System.out.println(); |
92 |
if (posTests != 0) System.out.println("=== "+testName+": "+posTests+" positive test cases run"); |
|
93 |
if (negTests != 0) System.out.println("=== "+testName+": "+negTests+" negative test cases run"); |
|
5726 | 94 |
allPosTests += posTests; |
95 |
allNegTests += negTests; |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
96 |
posTests = negTests = 0; |
4535 | 97 |
} |
98 |
} |
|
99 |
void countTest(boolean positive) { |
|
100 |
if (positive) ++posTests; |
|
101 |
else ++negTests; |
|
102 |
} |
|
103 |
void countTest() { countTest(true); } |
|
104 |
void startTest(String name) { |
|
105 |
if (testName != null) printCounts(); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
106 |
if (verbosity >= 1) |
4535 | 107 |
System.out.println(name); |
108 |
posTests = negTests = 0; |
|
109 |
testName = name; |
|
110 |
} |
|
111 |
||
112 |
@BeforeClass |
|
113 |
public static void setUpClass() throws Exception { |
|
114 |
calledLog.clear(); |
|
115 |
calledLog.add(null); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
116 |
nextArgVal = INITIAL_ARG_VAL; |
4535 | 117 |
} |
118 |
||
119 |
@AfterClass |
|
120 |
public static void tearDownClass() throws Exception { |
|
5726 | 121 |
int posTests = allPosTests, negTests = allNegTests; |
10081 | 122 |
if (verbosity >= 0 && (posTests | negTests) != 0) { |
5726 | 123 |
System.out.println(); |
124 |
if (posTests != 0) System.out.println("=== "+posTests+" total positive test cases"); |
|
125 |
if (negTests != 0) System.out.println("=== "+negTests+" total negative test cases"); |
|
126 |
} |
|
4535 | 127 |
} |
128 |
||
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
129 |
static List<Object> calledLog = new ArrayList<>(); |
4535 | 130 |
static Object logEntry(String name, Object... args) { |
131 |
return Arrays.asList(name, Arrays.asList(args)); |
|
132 |
} |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
133 |
public static Object called(String name, Object... args) { |
4535 | 134 |
Object entry = logEntry(name, args); |
135 |
calledLog.add(entry); |
|
136 |
return entry; |
|
137 |
} |
|
138 |
static void assertCalled(String name, Object... args) { |
|
139 |
Object expected = logEntry(name, args); |
|
140 |
Object actual = calledLog.get(calledLog.size() - 1); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
141 |
if (expected.equals(actual) && verbosity < 9) return; |
4535 | 142 |
System.out.println("assertCalled "+name+":"); |
20528
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
143 |
System.out.println("expected: "+deepToString(expected)); |
4535 | 144 |
System.out.println("actual: "+actual); |
145 |
System.out.println("ex. types: "+getClasses(expected)); |
|
146 |
System.out.println("act. types: "+getClasses(actual)); |
|
147 |
assertEquals("previous method call", expected, actual); |
|
148 |
} |
|
149 |
static void printCalled(MethodHandle target, String name, Object... args) { |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
150 |
if (verbosity >= 3) |
20528
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
151 |
System.out.println("calling MH="+target+" to "+name+deepToString(args)); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
152 |
} |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
153 |
static String deepToString(Object x) { |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
154 |
if (x == null) return "null"; |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
155 |
if (x instanceof Collection) |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
156 |
x = ((Collection)x).toArray(); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
157 |
if (x instanceof Object[]) { |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
158 |
Object[] ax = (Object[]) x; |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
159 |
ax = Arrays.copyOf(ax, ax.length, Object[].class); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
160 |
for (int i = 0; i < ax.length; i++) |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
161 |
ax[i] = deepToString(ax[i]); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
162 |
x = Arrays.deepToString(ax); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
163 |
} |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
164 |
if (x.getClass().isArray()) |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
165 |
try { |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
166 |
x = Arrays.class.getMethod("toString", x.getClass()).invoke(null, x); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
167 |
} catch (ReflectiveOperationException ex) { throw new Error(ex); } |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
168 |
assert(!(x instanceof Object[])); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
169 |
return x.toString(); |
4535 | 170 |
} |
171 |
||
172 |
static Object castToWrapper(Object value, Class<?> dst) { |
|
173 |
Object wrap = null; |
|
174 |
if (value instanceof Number) |
|
175 |
wrap = castToWrapperOrNull(((Number)value).longValue(), dst); |
|
176 |
if (value instanceof Character) |
|
177 |
wrap = castToWrapperOrNull((char)(Character)value, dst); |
|
178 |
if (wrap != null) return wrap; |
|
179 |
return dst.cast(value); |
|
180 |
} |
|
181 |
||
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
182 |
@SuppressWarnings("cast") // primitive cast to (long) is part of the pattern |
4535 | 183 |
static Object castToWrapperOrNull(long value, Class<?> dst) { |
184 |
if (dst == int.class || dst == Integer.class) |
|
185 |
return (int)(value); |
|
186 |
if (dst == long.class || dst == Long.class) |
|
187 |
return (long)(value); |
|
188 |
if (dst == char.class || dst == Character.class) |
|
189 |
return (char)(value); |
|
190 |
if (dst == short.class || dst == Short.class) |
|
191 |
return (short)(value); |
|
192 |
if (dst == float.class || dst == Float.class) |
|
193 |
return (float)(value); |
|
194 |
if (dst == double.class || dst == Double.class) |
|
195 |
return (double)(value); |
|
4537 | 196 |
if (dst == byte.class || dst == Byte.class) |
197 |
return (byte)(value); |
|
198 |
if (dst == boolean.class || dst == boolean.class) |
|
199 |
return ((value % 29) & 1) == 0; |
|
4535 | 200 |
return null; |
201 |
} |
|
202 |
||
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
203 |
static final int ONE_MILLION = (1000*1000), // first int value |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
204 |
TEN_BILLION = (10*1000*1000*1000), // scale factor to reach upper 32 bits |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
205 |
INITIAL_ARG_VAL = ONE_MILLION << 1; // <<1 makes space for sign bit; |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
206 |
static long nextArgVal; |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
207 |
static long nextArg(boolean moreBits) { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
208 |
long val = nextArgVal++; |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
209 |
long sign = -(val & 1); // alternate signs |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
210 |
val >>= 1; |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
211 |
if (moreBits) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
212 |
// Guarantee some bits in the high word. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
213 |
// In any case keep the decimal representation simple-looking, |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
214 |
// with lots of zeroes, so as not to make the printed decimal |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
215 |
// strings unnecessarily noisy. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
216 |
val += (val % ONE_MILLION) * TEN_BILLION; |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
217 |
return val ^ sign; |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
218 |
} |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
219 |
static int nextArg() { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
220 |
// Produce a 32-bit result something like ONE_MILLION+(smallint). |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
221 |
// Example: 1_000_042. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
222 |
return (int) nextArg(false); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
223 |
} |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
224 |
static long nextArg(Class<?> kind) { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
225 |
if (kind == long.class || kind == Long.class || |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
226 |
kind == double.class || kind == Double.class) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
227 |
// produce a 64-bit result something like |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
228 |
// ((TEN_BILLION+1) * (ONE_MILLION+(smallint))) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
229 |
// Example: 10_000_420_001_000_042. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
230 |
return nextArg(true); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
231 |
return (long) nextArg(); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
232 |
} |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
233 |
|
4535 | 234 |
static Object randomArg(Class<?> param) { |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
235 |
Object wrap = castToWrapperOrNull(nextArg(param), param); |
4535 | 236 |
if (wrap != null) { |
237 |
return wrap; |
|
238 |
} |
|
8822
8145ab9f5f86
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
8347
diff
changeset
|
239 |
// import sun.invoke.util.Wrapper; |
4535 | 240 |
// Wrapper wrap = Wrapper.forBasicType(dst); |
241 |
// if (wrap == Wrapper.OBJECT && Wrapper.isWrapperType(dst)) |
|
242 |
// wrap = Wrapper.forWrapperType(dst); |
|
243 |
// if (wrap != Wrapper.OBJECT) |
|
244 |
// return wrap.wrap(nextArg++); |
|
7053 | 245 |
if (param.isInterface()) { |
246 |
for (Class<?> c : param.getClasses()) { |
|
247 |
if (param.isAssignableFrom(c) && !c.isInterface()) |
|
248 |
{ param = c; break; } |
|
249 |
} |
|
250 |
} |
|
20528
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
251 |
if (param.isArray()) { |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
252 |
Class<?> ctype = param.getComponentType(); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
253 |
Object arg = Array.newInstance(ctype, 2); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
254 |
Array.set(arg, 0, randomArg(ctype)); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
255 |
return arg; |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
256 |
} |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
257 |
if (param.isInterface() && param.isAssignableFrom(List.class)) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
258 |
return Arrays.asList("#"+nextArg()); |
4535 | 259 |
if (param.isInterface() || param.isAssignableFrom(String.class)) |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
260 |
return "#"+nextArg(); |
4535 | 261 |
else |
262 |
try { |
|
263 |
return param.newInstance(); |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
264 |
} catch (InstantiationException | IllegalAccessException ex) { |
4535 | 265 |
} |
266 |
return null; // random class not Object, String, Integer, etc. |
|
267 |
} |
|
268 |
static Object[] randomArgs(Class<?>... params) { |
|
269 |
Object[] args = new Object[params.length]; |
|
270 |
for (int i = 0; i < args.length; i++) |
|
271 |
args[i] = randomArg(params[i]); |
|
272 |
return args; |
|
273 |
} |
|
274 |
static Object[] randomArgs(int nargs, Class<?> param) { |
|
275 |
Object[] args = new Object[nargs]; |
|
276 |
for (int i = 0; i < args.length; i++) |
|
277 |
args[i] = randomArg(param); |
|
278 |
return args; |
|
279 |
} |
|
280 |
||
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
281 |
@SafeVarargs @SuppressWarnings("varargs") |
4535 | 282 |
static <T, E extends T> T[] array(Class<T[]> atype, E... a) { |
283 |
return Arrays.copyOf(a, a.length, atype); |
|
284 |
} |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
285 |
@SafeVarargs @SuppressWarnings("varargs") |
4535 | 286 |
static <T> T[] cat(T[] a, T... b) { |
287 |
int alen = a.length, blen = b.length; |
|
288 |
if (blen == 0) return a; |
|
289 |
T[] c = Arrays.copyOf(a, alen + blen); |
|
290 |
System.arraycopy(b, 0, c, alen, blen); |
|
291 |
return c; |
|
292 |
} |
|
293 |
static Integer[] boxAll(int... vx) { |
|
294 |
Integer[] res = new Integer[vx.length]; |
|
295 |
for (int i = 0; i < res.length; i++) { |
|
296 |
res[i] = vx[i]; |
|
297 |
} |
|
298 |
return res; |
|
299 |
} |
|
300 |
static Object getClasses(Object x) { |
|
301 |
if (x == null) return x; |
|
302 |
if (x instanceof String) return x; // keep the name |
|
303 |
if (x instanceof List) { |
|
304 |
// recursively report classes of the list elements |
|
305 |
Object[] xa = ((List)x).toArray(); |
|
306 |
for (int i = 0; i < xa.length; i++) |
|
307 |
xa[i] = getClasses(xa[i]); |
|
308 |
return Arrays.asList(xa); |
|
309 |
} |
|
310 |
return x.getClass().getSimpleName(); |
|
311 |
} |
|
312 |
||
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
313 |
/** Return lambda(arg...[arity]) { new Object[]{ arg... } } */ |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
314 |
static MethodHandle varargsList(int arity) { |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
315 |
return ValueConversions.varargsList(arity); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
316 |
} |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
317 |
/** Return lambda(arg...[arity]) { Arrays.asList(arg...) } */ |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
318 |
static MethodHandle varargsArray(int arity) { |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
319 |
return ValueConversions.varargsArray(arity); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
320 |
} |
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
321 |
static MethodHandle varargsArray(Class<?> arrayType, int arity) { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
322 |
return ValueConversions.varargsArray(arrayType, arity); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
323 |
} |
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
324 |
/** Variation of varargsList, but with the given rtype. */ |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
325 |
static MethodHandle varargsList(int arity, Class<?> rtype) { |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
326 |
MethodHandle list = varargsList(arity); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
327 |
MethodType listType = list.type().changeReturnType(rtype); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
328 |
if (List.class.isAssignableFrom(rtype) || rtype == void.class || rtype == Object.class) { |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
329 |
// OK |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
330 |
} else if (rtype.isAssignableFrom(String.class)) { |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
331 |
if (LIST_TO_STRING == null) |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
332 |
try { |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
333 |
LIST_TO_STRING = PRIVATE.findStatic(PRIVATE.lookupClass(), "listToString", |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
334 |
MethodType.methodType(String.class, List.class)); |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
335 |
} catch (NoSuchMethodException | IllegalAccessException ex) { throw new RuntimeException(ex); } |
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
336 |
list = MethodHandles.filterReturnValue(list, LIST_TO_STRING); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
337 |
} else if (rtype.isPrimitive()) { |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
338 |
if (LIST_TO_INT == null) |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
339 |
try { |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
340 |
LIST_TO_INT = PRIVATE.findStatic(PRIVATE.lookupClass(), "listToInt", |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
341 |
MethodType.methodType(int.class, List.class)); |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
342 |
} catch (NoSuchMethodException | IllegalAccessException ex) { throw new RuntimeException(ex); } |
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
343 |
list = MethodHandles.filterReturnValue(list, LIST_TO_INT); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
344 |
list = MethodHandles.explicitCastArguments(list, listType); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
345 |
} else { |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
346 |
throw new RuntimeException("varargsList: "+rtype); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
347 |
} |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
348 |
return list.asType(listType); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
349 |
} |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
350 |
private static MethodHandle LIST_TO_STRING, LIST_TO_INT; |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
351 |
private static String listToString(List<?> x) { return x.toString(); } |
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
352 |
private static int listToInt(List<?> x) { return x.toString().hashCode(); } |
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
353 |
|
4535 | 354 |
static MethodHandle changeArgTypes(MethodHandle target, Class<?> argType) { |
355 |
return changeArgTypes(target, 0, 999, argType); |
|
356 |
} |
|
357 |
static MethodHandle changeArgTypes(MethodHandle target, |
|
358 |
int beg, int end, Class<?> argType) { |
|
359 |
MethodType targetType = target.type(); |
|
360 |
end = Math.min(end, targetType.parameterCount()); |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
361 |
ArrayList<Class<?>> argTypes = new ArrayList<>(targetType.parameterList()); |
4535 | 362 |
Collections.fill(argTypes.subList(beg, end), argType); |
4537 | 363 |
MethodType ttype2 = MethodType.methodType(targetType.returnType(), argTypes); |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
364 |
return target.asType(ttype2); |
4535 | 365 |
} |
10081 | 366 |
static MethodHandle addTrailingArgs(MethodHandle target, int nargs, Class<?> argClass) { |
367 |
int targetLen = target.type().parameterCount(); |
|
368 |
int extra = (nargs - targetLen); |
|
369 |
if (extra <= 0) return target; |
|
370 |
List<Class<?>> fakeArgs = Collections.<Class<?>>nCopies(extra, argClass); |
|
371 |
return MethodHandles.dropArguments(target, targetLen, fakeArgs); |
|
372 |
} |
|
4535 | 373 |
|
374 |
// This lookup is good for all members in and under MethodHandlesTest. |
|
375 |
static final Lookup PRIVATE = MethodHandles.lookup(); |
|
376 |
// This lookup is good for package-private members but not private ones. |
|
377 |
static final Lookup PACKAGE = PackageSibling.lookup(); |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
378 |
// This lookup is good for public members and protected members of PubExample |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
379 |
static final Lookup SUBCLASS = RemoteExample.lookup(); |
4535 | 380 |
// This lookup is good only for public members. |
4537 | 381 |
static final Lookup PUBLIC = MethodHandles.publicLookup(); |
4535 | 382 |
|
383 |
// Subject methods... |
|
384 |
static class Example implements IntExample { |
|
385 |
final String name; |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
386 |
public Example() { name = "Example#"+nextArg(); } |
4535 | 387 |
protected Example(String name) { this.name = name; } |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
388 |
@SuppressWarnings("LeakingThisInConstructor") |
4535 | 389 |
protected Example(int x) { this(); called("protected <init>", this, x); } |
390 |
@Override public String toString() { return name; } |
|
391 |
||
392 |
public void v0() { called("v0", this); } |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
393 |
protected void pro_v0() { called("pro_v0", this); } |
4535 | 394 |
void pkg_v0() { called("pkg_v0", this); } |
395 |
private void pri_v0() { called("pri_v0", this); } |
|
396 |
public static void s0() { called("s0"); } |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
397 |
protected static void pro_s0() { called("pro_s0"); } |
4535 | 398 |
static void pkg_s0() { called("pkg_s0"); } |
399 |
private static void pri_s0() { called("pri_s0"); } |
|
400 |
||
401 |
public Object v1(Object x) { return called("v1", this, x); } |
|
402 |
public Object v2(Object x, Object y) { return called("v2", this, x, y); } |
|
403 |
public Object v2(Object x, int y) { return called("v2", this, x, y); } |
|
404 |
public Object v2(int x, Object y) { return called("v2", this, x, y); } |
|
405 |
public Object v2(int x, int y) { return called("v2", this, x, y); } |
|
406 |
public static Object s1(Object x) { return called("s1", x); } |
|
407 |
public static Object s2(int x) { return called("s2", x); } |
|
408 |
public static Object s3(long x) { return called("s3", x); } |
|
409 |
public static Object s4(int x, int y) { return called("s4", x, y); } |
|
410 |
public static Object s5(long x, int y) { return called("s5", x, y); } |
|
411 |
public static Object s6(int x, long y) { return called("s6", x, y); } |
|
412 |
public static Object s7(float x, double y) { return called("s7", x, y); } |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
413 |
|
10081 | 414 |
// for testing findConstructor: |
415 |
public Example(String x, int y) { this.name = x+y; called("Example.<init>", x, y); } |
|
416 |
public Example(int x, String y) { this.name = x+y; called("Example.<init>", x, y); } |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
417 |
public Example(int x, int y) { this.name = x+""+y; called("Example.<init>", x, y); } |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
418 |
public Example(int x, long y) { this.name = x+""+y; called("Example.<init>", x, y); } |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
419 |
public Example(int x, float y) { this.name = x+""+y; called("Example.<init>", x, y); } |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
420 |
public Example(int x, double y) { this.name = x+""+y; called("Example.<init>", x, y); } |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
421 |
public Example(int x, int y, int z) { this.name = x+""+y+""+z; called("Example.<init>", x, y, z); } |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
422 |
public Example(int x, int y, int z, int a) { this.name = x+""+y+""+z+""+a; called("Example.<init>", x, y, z, a); } |
10081 | 423 |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
424 |
static final Lookup EXAMPLE = MethodHandles.lookup(); // for testing findSpecial |
4535 | 425 |
} |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
426 |
static final Lookup EXAMPLE = Example.EXAMPLE; |
4535 | 427 |
public static class PubExample extends Example { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
428 |
public PubExample() { this("PubExample"); } |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
429 |
protected PubExample(String prefix) { super(prefix+"#"+nextArg()); } |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
430 |
protected void pro_v0() { called("Pub/pro_v0", this); } |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
431 |
protected static void pro_s0() { called("Pub/pro_s0"); } |
4535 | 432 |
} |
433 |
static class SubExample extends Example { |
|
434 |
@Override public void v0() { called("Sub/v0", this); } |
|
435 |
@Override void pkg_v0() { called("Sub/pkg_v0", this); } |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
436 |
@SuppressWarnings("LeakingThisInConstructor") |
4535 | 437 |
private SubExample(int x) { called("<init>", this, x); } |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
438 |
public SubExample() { super("SubExample#"+nextArg()); } |
4535 | 439 |
} |
440 |
public static interface IntExample { |
|
441 |
public void v0(); |
|
7053 | 442 |
public static class Impl implements IntExample { |
4535 | 443 |
public void v0() { called("Int/v0", this); } |
444 |
final String name; |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
445 |
public Impl() { name = "Impl#"+nextArg(); } |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
446 |
@Override public String toString() { return name; } |
4535 | 447 |
} |
448 |
} |
|
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
449 |
static interface SubIntExample extends IntExample { } |
4535 | 450 |
|
451 |
static final Object[][][] ACCESS_CASES = { |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
452 |
{ { false, PUBLIC }, { false, SUBCLASS }, { false, PACKAGE }, { false, PRIVATE }, { false, EXAMPLE } }, //[0]: all false |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
453 |
{ { false, PUBLIC }, { false, SUBCLASS }, { false, PACKAGE }, { true, PRIVATE }, { true, EXAMPLE } }, //[1]: only PRIVATE |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
454 |
{ { false, PUBLIC }, { false, SUBCLASS }, { true, PACKAGE }, { true, PRIVATE }, { true, EXAMPLE } }, //[2]: PUBLIC false |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
455 |
{ { false, PUBLIC }, { true, SUBCLASS }, { true, PACKAGE }, { true, PRIVATE }, { true, EXAMPLE } }, //[3]: subclass OK |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
456 |
{ { true, PUBLIC }, { true, SUBCLASS }, { true, PACKAGE }, { true, PRIVATE }, { true, EXAMPLE } }, //[4]: all true |
4535 | 457 |
}; |
458 |
||
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
459 |
static Object[][] accessCases(Class<?> defc, String name, boolean isSpecial) { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
460 |
Object[][] cases; |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
461 |
if (name.contains("pri_") || isSpecial) { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
462 |
cases = ACCESS_CASES[1]; // PRIVATE only |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
463 |
} else if (name.contains("pkg_") || !Modifier.isPublic(defc.getModifiers())) { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
464 |
cases = ACCESS_CASES[2]; // not PUBLIC |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
465 |
} else if (name.contains("pro_")) { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
466 |
cases = ACCESS_CASES[3]; // PUBLIC class, protected member |
4537 | 467 |
} else { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
468 |
assertTrue(name.indexOf('_') < 0 || name.contains("fin_")); |
4537 | 469 |
boolean pubc = Modifier.isPublic(defc.getModifiers()); |
470 |
if (pubc) |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
471 |
cases = ACCESS_CASES[4]; // all access levels |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
472 |
else |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
473 |
cases = ACCESS_CASES[2]; // PACKAGE but not PUBLIC |
4537 | 474 |
} |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
475 |
if (defc != Example.class && cases[cases.length-1][1] == EXAMPLE) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
476 |
cases = Arrays.copyOfRange(cases, 0, cases.length-1); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
477 |
return cases; |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
478 |
} |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
479 |
static Object[][] accessCases(Class<?> defc, String name) { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
480 |
return accessCases(defc, name, false); |
4535 | 481 |
} |
482 |
||
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
483 |
static Lookup maybeMoveIn(Lookup lookup, Class<?> defc) { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
484 |
if (lookup == PUBLIC || lookup == SUBCLASS || lookup == PACKAGE) |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
485 |
// external views stay external |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
486 |
return lookup; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
487 |
return lookup.in(defc); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
488 |
} |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
489 |
|
4535 | 490 |
@Test |
491 |
public void testFindStatic() throws Throwable { |
|
492 |
if (CAN_SKIP_WORKING) return; |
|
493 |
startTest("findStatic"); |
|
494 |
testFindStatic(PubExample.class, void.class, "s0"); |
|
495 |
testFindStatic(Example.class, void.class, "s0"); |
|
496 |
testFindStatic(Example.class, void.class, "pkg_s0"); |
|
497 |
testFindStatic(Example.class, void.class, "pri_s0"); |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
498 |
testFindStatic(Example.class, void.class, "pro_s0"); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
499 |
testFindStatic(PubExample.class, void.class, "Pub/pro_s0"); |
4535 | 500 |
|
501 |
testFindStatic(Example.class, Object.class, "s1", Object.class); |
|
502 |
testFindStatic(Example.class, Object.class, "s2", int.class); |
|
503 |
testFindStatic(Example.class, Object.class, "s3", long.class); |
|
504 |
testFindStatic(Example.class, Object.class, "s4", int.class, int.class); |
|
505 |
testFindStatic(Example.class, Object.class, "s5", long.class, int.class); |
|
506 |
testFindStatic(Example.class, Object.class, "s6", int.class, long.class); |
|
507 |
testFindStatic(Example.class, Object.class, "s7", float.class, double.class); |
|
508 |
||
509 |
testFindStatic(false, PRIVATE, Example.class, void.class, "bogus"); |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
510 |
testFindStatic(false, PRIVATE, Example.class, void.class, "v0"); |
4535 | 511 |
} |
512 |
||
513 |
void testFindStatic(Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
|
514 |
for (Object[] ac : accessCases(defc, name)) { |
|
515 |
testFindStatic((Boolean)ac[0], (Lookup)ac[1], defc, ret, name, params); |
|
516 |
} |
|
517 |
} |
|
518 |
void testFindStatic(Lookup lookup, Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
|
519 |
testFindStatic(true, lookup, defc, ret, name, params); |
|
520 |
} |
|
521 |
void testFindStatic(boolean positive, Lookup lookup, Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
|
522 |
countTest(positive); |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
523 |
String methodName = name.substring(1 + name.indexOf('/')); // foo/bar => foo |
4537 | 524 |
MethodType type = MethodType.methodType(ret, params); |
4535 | 525 |
MethodHandle target = null; |
7052
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
526 |
Exception noAccess = null; |
4535 | 527 |
try { |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
528 |
if (verbosity >= 4) System.out.println("lookup via "+lookup+" of "+defc+" "+name+type); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
529 |
target = maybeMoveIn(lookup, defc).findStatic(defc, methodName, type); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
530 |
} catch (ReflectiveOperationException ex) { |
4535 | 531 |
noAccess = ex; |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
532 |
if (verbosity >= 5) ex.printStackTrace(System.out); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
533 |
if (name.contains("bogus")) |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
534 |
assertTrue(noAccess instanceof NoSuchMethodException); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
535 |
else |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
536 |
assertTrue(noAccess instanceof IllegalAccessException); |
4535 | 537 |
} |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
538 |
if (verbosity >= 3) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
539 |
System.out.println("findStatic "+lookup+": "+defc.getName()+"."+name+"/"+type+" => "+target |
4535 | 540 |
+(noAccess == null ? "" : " !! "+noAccess)); |
541 |
if (positive && noAccess != null) throw noAccess; |
|
542 |
assertEquals(positive ? "positive test" : "negative test erroneously passed", positive, target != null); |
|
543 |
if (!positive) return; // negative test failed as expected |
|
544 |
assertEquals(type, target.type()); |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
545 |
assertNameStringContains(target, methodName); |
4535 | 546 |
Object[] args = randomArgs(params); |
547 |
printCalled(target, name, args); |
|
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
548 |
target.invokeWithArguments(args); |
4535 | 549 |
assertCalled(name, args); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
550 |
if (verbosity >= 1) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
551 |
System.out.print(':'); |
4535 | 552 |
} |
553 |
||
9731
d0f7a3e441c4
7044892: JSR 292: API entry points sometimes throw the wrong exceptions or doesn't throw the expected one
jrose
parents:
9646
diff
changeset
|
554 |
static final boolean DEBUG_METHOD_HANDLE_NAMES = Boolean.getBoolean("java.lang.invoke.MethodHandle.DEBUG_NAMES"); |
d0f7a3e441c4
7044892: JSR 292: API entry points sometimes throw the wrong exceptions or doesn't throw the expected one
jrose
parents:
9646
diff
changeset
|
555 |
|
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
556 |
// rough check of name string |
9731
d0f7a3e441c4
7044892: JSR 292: API entry points sometimes throw the wrong exceptions or doesn't throw the expected one
jrose
parents:
9646
diff
changeset
|
557 |
static void assertNameStringContains(MethodHandle x, String s) { |
d0f7a3e441c4
7044892: JSR 292: API entry points sometimes throw the wrong exceptions or doesn't throw the expected one
jrose
parents:
9646
diff
changeset
|
558 |
if (!DEBUG_METHOD_HANDLE_NAMES) { |
d0f7a3e441c4
7044892: JSR 292: API entry points sometimes throw the wrong exceptions or doesn't throw the expected one
jrose
parents:
9646
diff
changeset
|
559 |
// ignore s |
d0f7a3e441c4
7044892: JSR 292: API entry points sometimes throw the wrong exceptions or doesn't throw the expected one
jrose
parents:
9646
diff
changeset
|
560 |
assertEquals("MethodHandle"+x.type(), x.toString()); |
d0f7a3e441c4
7044892: JSR 292: API entry points sometimes throw the wrong exceptions or doesn't throw the expected one
jrose
parents:
9646
diff
changeset
|
561 |
return; |
d0f7a3e441c4
7044892: JSR 292: API entry points sometimes throw the wrong exceptions or doesn't throw the expected one
jrose
parents:
9646
diff
changeset
|
562 |
} |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
563 |
if (x.toString().contains(s)) return; |
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
564 |
assertEquals(s, x); |
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
565 |
} |
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
566 |
|
4535 | 567 |
@Test |
568 |
public void testFindVirtual() throws Throwable { |
|
569 |
if (CAN_SKIP_WORKING) return; |
|
570 |
startTest("findVirtual"); |
|
571 |
testFindVirtual(Example.class, void.class, "v0"); |
|
572 |
testFindVirtual(Example.class, void.class, "pkg_v0"); |
|
573 |
testFindVirtual(Example.class, void.class, "pri_v0"); |
|
574 |
testFindVirtual(Example.class, Object.class, "v1", Object.class); |
|
575 |
testFindVirtual(Example.class, Object.class, "v2", Object.class, Object.class); |
|
576 |
testFindVirtual(Example.class, Object.class, "v2", Object.class, int.class); |
|
577 |
testFindVirtual(Example.class, Object.class, "v2", int.class, Object.class); |
|
578 |
testFindVirtual(Example.class, Object.class, "v2", int.class, int.class); |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
579 |
testFindVirtual(Example.class, void.class, "pro_v0"); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
580 |
testFindVirtual(PubExample.class, void.class, "Pub/pro_v0"); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
581 |
|
4535 | 582 |
testFindVirtual(false, PRIVATE, Example.class, Example.class, void.class, "bogus"); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
583 |
testFindVirtual(false, PRIVATE, Example.class, Example.class, void.class, "s0"); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
584 |
|
4535 | 585 |
// test dispatch |
586 |
testFindVirtual(SubExample.class, SubExample.class, void.class, "Sub/v0"); |
|
587 |
testFindVirtual(SubExample.class, Example.class, void.class, "Sub/v0"); |
|
588 |
testFindVirtual(SubExample.class, IntExample.class, void.class, "Sub/v0"); |
|
589 |
testFindVirtual(SubExample.class, SubExample.class, void.class, "Sub/pkg_v0"); |
|
590 |
testFindVirtual(SubExample.class, Example.class, void.class, "Sub/pkg_v0"); |
|
591 |
testFindVirtual(Example.class, IntExample.class, void.class, "v0"); |
|
592 |
testFindVirtual(IntExample.Impl.class, IntExample.class, void.class, "Int/v0"); |
|
593 |
} |
|
594 |
||
20528
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
595 |
@Test |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
596 |
public void testFindVirtualClone() throws Throwable { |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
597 |
// test some ad hoc system methods |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
598 |
testFindVirtual(false, PUBLIC, Object.class, Object.class, "clone"); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
599 |
testFindVirtual(true, PUBLIC, Object[].class, Object.class, "clone"); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
600 |
testFindVirtual(true, PUBLIC, int[].class, Object.class, "clone"); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
601 |
for (Class<?> cls : new Class<?>[]{ boolean[].class, long[].class, float[].class, char[].class }) |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
602 |
testFindVirtual(true, PUBLIC, cls, Object.class, "clone"); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
603 |
} |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
604 |
|
4535 | 605 |
void testFindVirtual(Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
606 |
Class<?> rcvc = defc; |
|
607 |
testFindVirtual(rcvc, defc, ret, name, params); |
|
608 |
} |
|
609 |
void testFindVirtual(Class<?> rcvc, Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
|
610 |
for (Object[] ac : accessCases(defc, name)) { |
|
611 |
testFindVirtual((Boolean)ac[0], (Lookup)ac[1], rcvc, defc, ret, name, params); |
|
612 |
} |
|
613 |
} |
|
614 |
void testFindVirtual(Lookup lookup, Class<?> rcvc, Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
|
615 |
testFindVirtual(true, lookup, rcvc, defc, ret, name, params); |
|
616 |
} |
|
20528
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
617 |
void testFindVirtual(boolean positive, Lookup lookup, Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
618 |
testFindVirtual(positive, lookup, defc, defc, ret, name, params); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
619 |
} |
4535 | 620 |
void testFindVirtual(boolean positive, Lookup lookup, Class<?> rcvc, Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
621 |
countTest(positive); |
|
622 |
String methodName = name.substring(1 + name.indexOf('/')); // foo/bar => foo |
|
4537 | 623 |
MethodType type = MethodType.methodType(ret, params); |
4535 | 624 |
MethodHandle target = null; |
7052
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
625 |
Exception noAccess = null; |
4535 | 626 |
try { |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
627 |
if (verbosity >= 4) System.out.println("lookup via "+lookup+" of "+defc+" "+name+type); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
628 |
target = maybeMoveIn(lookup, defc).findVirtual(defc, methodName, type); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
629 |
} catch (ReflectiveOperationException ex) { |
4535 | 630 |
noAccess = ex; |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
631 |
if (verbosity >= 5) ex.printStackTrace(System.out); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
632 |
if (name.contains("bogus")) |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
633 |
assertTrue(noAccess instanceof NoSuchMethodException); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
634 |
else |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
635 |
assertTrue(noAccess instanceof IllegalAccessException); |
4535 | 636 |
} |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
637 |
if (verbosity >= 3) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
638 |
System.out.println("findVirtual "+lookup+": "+defc.getName()+"."+name+"/"+type+" => "+target |
4535 | 639 |
+(noAccess == null ? "" : " !! "+noAccess)); |
640 |
if (positive && noAccess != null) throw noAccess; |
|
641 |
assertEquals(positive ? "positive test" : "negative test erroneously passed", positive, target != null); |
|
642 |
if (!positive) return; // negative test failed as expected |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
643 |
Class<?> selfc = defc; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
644 |
// predict receiver type narrowing: |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
645 |
if (lookup == SUBCLASS && |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
646 |
name.contains("pro_") && |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
647 |
selfc.isAssignableFrom(lookup.lookupClass())) { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
648 |
selfc = lookup.lookupClass(); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
649 |
if (name.startsWith("Pub/")) name = "Rem/"+name.substring(4); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
650 |
} |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
651 |
Class<?>[] paramsWithSelf = cat(array(Class[].class, (Class)selfc), params); |
4537 | 652 |
MethodType typeWithSelf = MethodType.methodType(ret, paramsWithSelf); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
653 |
assertEquals(typeWithSelf, target.type()); |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
654 |
assertNameStringContains(target, methodName); |
4535 | 655 |
Object[] argsWithSelf = randomArgs(paramsWithSelf); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
656 |
if (selfc.isAssignableFrom(rcvc) && rcvc != selfc) argsWithSelf[0] = randomArg(rcvc); |
4535 | 657 |
printCalled(target, name, argsWithSelf); |
20528
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
658 |
Object res = target.invokeWithArguments(argsWithSelf); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
659 |
if (Example.class.isAssignableFrom(defc) || IntExample.class.isAssignableFrom(defc)) { |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
660 |
assertCalled(name, argsWithSelf); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
661 |
} else if (name.equals("clone")) { |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
662 |
// Ad hoc method call outside Example. For Object[].clone. |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
663 |
printCalled(target, name, argsWithSelf); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
664 |
assertEquals(MethodType.methodType(Object.class, rcvc), target.type()); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
665 |
Object orig = argsWithSelf[0]; |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
666 |
assertEquals(orig.getClass(), res.getClass()); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
667 |
if (res instanceof Object[]) |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
668 |
assertArrayEquals((Object[])res, (Object[])argsWithSelf[0]); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
669 |
assert(Arrays.deepEquals(new Object[]{res}, new Object[]{argsWithSelf[0]})); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
670 |
} else { |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
671 |
assert(false) : Arrays.asList(positive, lookup, rcvc, defc, ret, name, deepToString(params)); |
0b1e2130d3f7
8001105: findVirtual of Object[].clone produces internal error
jrose
parents:
14408
diff
changeset
|
672 |
} |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
673 |
if (verbosity >= 1) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
674 |
System.out.print(':'); |
4535 | 675 |
} |
676 |
||
677 |
@Test |
|
678 |
public void testFindSpecial() throws Throwable { |
|
679 |
if (CAN_SKIP_WORKING) return; |
|
680 |
startTest("findSpecial"); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
681 |
testFindSpecial(SubExample.class, Example.class, void.class, "v0"); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
682 |
testFindSpecial(SubExample.class, Example.class, void.class, "pkg_v0"); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
683 |
testFindSpecial(RemoteExample.class, PubExample.class, void.class, "Pub/pro_v0"); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
684 |
// Do some negative testing: |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
685 |
testFindSpecial(false, EXAMPLE, SubExample.class, Example.class, void.class, "bogus"); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
686 |
testFindSpecial(false, PRIVATE, SubExample.class, Example.class, void.class, "bogus"); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
687 |
for (Lookup lookup : new Lookup[]{ PRIVATE, EXAMPLE, PACKAGE, PUBLIC }) { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
688 |
testFindSpecial(false, lookup, Object.class, Example.class, void.class, "v0"); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
689 |
testFindSpecial(false, lookup, SubExample.class, Example.class, void.class, "<init>", int.class); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
690 |
testFindSpecial(false, lookup, SubExample.class, Example.class, void.class, "s0"); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
691 |
} |
4535 | 692 |
} |
693 |
||
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
694 |
void testFindSpecial(Class<?> specialCaller, |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
695 |
Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
696 |
if (specialCaller == RemoteExample.class) { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
697 |
testFindSpecial(false, EXAMPLE, specialCaller, defc, ret, name, params); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
698 |
testFindSpecial(false, PRIVATE, specialCaller, defc, ret, name, params); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
699 |
testFindSpecial(false, PACKAGE, specialCaller, defc, ret, name, params); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
700 |
testFindSpecial(true, SUBCLASS, specialCaller, defc, ret, name, params); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
701 |
testFindSpecial(false, PUBLIC, specialCaller, defc, ret, name, params); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
702 |
return; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
703 |
} |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
704 |
testFindSpecial(true, EXAMPLE, specialCaller, defc, ret, name, params); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
705 |
testFindSpecial(true, PRIVATE, specialCaller, defc, ret, name, params); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
706 |
testFindSpecial(false, PACKAGE, specialCaller, defc, ret, name, params); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
707 |
testFindSpecial(false, SUBCLASS, specialCaller, defc, ret, name, params); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
708 |
testFindSpecial(false, PUBLIC, specialCaller, defc, ret, name, params); |
4535 | 709 |
} |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
710 |
void testFindSpecial(boolean positive, Lookup lookup, Class<?> specialCaller, |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
711 |
Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
4535 | 712 |
countTest(positive); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
713 |
String methodName = name.substring(1 + name.indexOf('/')); // foo/bar => foo |
4537 | 714 |
MethodType type = MethodType.methodType(ret, params); |
4535 | 715 |
MethodHandle target = null; |
7052
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
716 |
Exception noAccess = null; |
4535 | 717 |
try { |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
718 |
if (verbosity >= 4) System.out.println("lookup via "+lookup+" of "+defc+" "+name+type); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
719 |
if (verbosity >= 5) System.out.println(" lookup => "+maybeMoveIn(lookup, specialCaller)); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
720 |
target = maybeMoveIn(lookup, specialCaller).findSpecial(defc, methodName, type, specialCaller); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
721 |
} catch (ReflectiveOperationException ex) { |
4535 | 722 |
noAccess = ex; |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
723 |
if (verbosity >= 5) ex.printStackTrace(System.out); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
724 |
if (name.contains("bogus")) |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
725 |
assertTrue(noAccess instanceof NoSuchMethodException); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
726 |
else |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
727 |
assertTrue(noAccess instanceof IllegalAccessException); |
4535 | 728 |
} |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
729 |
if (verbosity >= 3) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
730 |
System.out.println("findSpecial from "+specialCaller.getName()+" to "+defc.getName()+"."+name+"/"+type+" => "+target |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
731 |
+(target == null ? "" : target.type()) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
732 |
+(noAccess == null ? "" : " !! "+noAccess)); |
4535 | 733 |
if (positive && noAccess != null) throw noAccess; |
734 |
assertEquals(positive ? "positive test" : "negative test erroneously passed", positive, target != null); |
|
735 |
if (!positive) return; // negative test failed as expected |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
736 |
assertEquals(specialCaller, target.type().parameterType(0)); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
737 |
assertEquals(type, target.type().dropParameterTypes(0,1)); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
738 |
Class<?>[] paramsWithSelf = cat(array(Class[].class, (Class)specialCaller), params); |
4537 | 739 |
MethodType typeWithSelf = MethodType.methodType(ret, paramsWithSelf); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
740 |
assertNameStringContains(target, methodName); |
4535 | 741 |
Object[] args = randomArgs(paramsWithSelf); |
742 |
printCalled(target, name, args); |
|
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
743 |
target.invokeWithArguments(args); |
4535 | 744 |
assertCalled(name, args); |
745 |
} |
|
746 |
||
747 |
@Test |
|
10081 | 748 |
public void testFindConstructor() throws Throwable { |
749 |
if (CAN_SKIP_WORKING) return; |
|
750 |
startTest("findConstructor"); |
|
751 |
testFindConstructor(true, EXAMPLE, Example.class); |
|
752 |
testFindConstructor(true, EXAMPLE, Example.class, int.class); |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
753 |
testFindConstructor(true, EXAMPLE, Example.class, int.class, int.class); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
754 |
testFindConstructor(true, EXAMPLE, Example.class, int.class, long.class); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
755 |
testFindConstructor(true, EXAMPLE, Example.class, int.class, float.class); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
756 |
testFindConstructor(true, EXAMPLE, Example.class, int.class, double.class); |
10081 | 757 |
testFindConstructor(true, EXAMPLE, Example.class, String.class); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
758 |
testFindConstructor(true, EXAMPLE, Example.class, int.class, int.class, int.class); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
759 |
testFindConstructor(true, EXAMPLE, Example.class, int.class, int.class, int.class, int.class); |
10081 | 760 |
} |
761 |
void testFindConstructor(boolean positive, Lookup lookup, |
|
762 |
Class<?> defc, Class<?>... params) throws Throwable { |
|
763 |
countTest(positive); |
|
764 |
MethodType type = MethodType.methodType(void.class, params); |
|
765 |
MethodHandle target = null; |
|
766 |
Exception noAccess = null; |
|
767 |
try { |
|
768 |
if (verbosity >= 4) System.out.println("lookup via "+lookup+" of "+defc+" <init>"+type); |
|
769 |
target = lookup.findConstructor(defc, type); |
|
770 |
} catch (ReflectiveOperationException ex) { |
|
771 |
noAccess = ex; |
|
772 |
assertTrue(noAccess instanceof IllegalAccessException); |
|
773 |
} |
|
774 |
if (verbosity >= 3) |
|
775 |
System.out.println("findConstructor "+defc.getName()+".<init>/"+type+" => "+target |
|
776 |
+(target == null ? "" : target.type()) |
|
777 |
+(noAccess == null ? "" : " !! "+noAccess)); |
|
778 |
if (positive && noAccess != null) throw noAccess; |
|
779 |
assertEquals(positive ? "positive test" : "negative test erroneously passed", positive, target != null); |
|
780 |
if (!positive) return; // negative test failed as expected |
|
781 |
assertEquals(type.changeReturnType(defc), target.type()); |
|
782 |
Object[] args = randomArgs(params); |
|
783 |
printCalled(target, defc.getSimpleName(), args); |
|
784 |
Object obj = target.invokeWithArguments(args); |
|
785 |
if (!(defc == Example.class && params.length < 2)) |
|
786 |
assertCalled(defc.getSimpleName()+".<init>", args); |
|
787 |
assertTrue("instance of "+defc.getName(), defc.isInstance(obj)); |
|
788 |
} |
|
789 |
||
790 |
@Test |
|
4535 | 791 |
public void testBind() throws Throwable { |
792 |
if (CAN_SKIP_WORKING) return; |
|
793 |
startTest("bind"); |
|
794 |
testBind(Example.class, void.class, "v0"); |
|
795 |
testBind(Example.class, void.class, "pkg_v0"); |
|
796 |
testBind(Example.class, void.class, "pri_v0"); |
|
797 |
testBind(Example.class, Object.class, "v1", Object.class); |
|
798 |
testBind(Example.class, Object.class, "v2", Object.class, Object.class); |
|
799 |
testBind(Example.class, Object.class, "v2", Object.class, int.class); |
|
800 |
testBind(Example.class, Object.class, "v2", int.class, Object.class); |
|
801 |
testBind(Example.class, Object.class, "v2", int.class, int.class); |
|
802 |
testBind(false, PRIVATE, Example.class, void.class, "bogus"); |
|
803 |
testBind(SubExample.class, void.class, "Sub/v0"); |
|
804 |
testBind(SubExample.class, void.class, "Sub/pkg_v0"); |
|
805 |
testBind(IntExample.Impl.class, void.class, "Int/v0"); |
|
806 |
} |
|
807 |
||
808 |
void testBind(Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
|
809 |
for (Object[] ac : accessCases(defc, name)) { |
|
810 |
testBind((Boolean)ac[0], (Lookup)ac[1], defc, ret, name, params); |
|
811 |
} |
|
812 |
} |
|
813 |
||
814 |
void testBind(boolean positive, Lookup lookup, Class<?> defc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
|
815 |
countTest(positive); |
|
816 |
String methodName = name.substring(1 + name.indexOf('/')); // foo/bar => foo |
|
4537 | 817 |
MethodType type = MethodType.methodType(ret, params); |
4535 | 818 |
Object receiver = randomArg(defc); |
819 |
MethodHandle target = null; |
|
7052
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
820 |
Exception noAccess = null; |
4535 | 821 |
try { |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
822 |
if (verbosity >= 4) System.out.println("lookup via "+lookup+" of "+defc+" "+name+type); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
823 |
target = maybeMoveIn(lookup, defc).bind(receiver, methodName, type); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
824 |
} catch (ReflectiveOperationException ex) { |
4535 | 825 |
noAccess = ex; |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
826 |
if (verbosity >= 5) ex.printStackTrace(System.out); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
827 |
if (name.contains("bogus")) |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
828 |
assertTrue(noAccess instanceof NoSuchMethodException); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
829 |
else |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
830 |
assertTrue(noAccess instanceof IllegalAccessException); |
4535 | 831 |
} |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
832 |
if (verbosity >= 3) |
4535 | 833 |
System.out.println("bind "+receiver+"."+name+"/"+type+" => "+target |
834 |
+(noAccess == null ? "" : " !! "+noAccess)); |
|
835 |
if (positive && noAccess != null) throw noAccess; |
|
836 |
assertEquals(positive ? "positive test" : "negative test erroneously passed", positive, target != null); |
|
837 |
if (!positive) return; // negative test failed as expected |
|
838 |
assertEquals(type, target.type()); |
|
839 |
Object[] args = randomArgs(params); |
|
840 |
printCalled(target, name, args); |
|
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
841 |
target.invokeWithArguments(args); |
4535 | 842 |
Object[] argsWithReceiver = cat(array(Object[].class, receiver), args); |
843 |
assertCalled(name, argsWithReceiver); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
844 |
if (verbosity >= 1) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
845 |
System.out.print(':'); |
4535 | 846 |
} |
847 |
||
848 |
@Test |
|
849 |
public void testUnreflect() throws Throwable { |
|
850 |
if (CAN_SKIP_WORKING) return; |
|
851 |
startTest("unreflect"); |
|
852 |
testUnreflect(Example.class, true, void.class, "s0"); |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
853 |
testUnreflect(Example.class, true, void.class, "pro_s0"); |
4535 | 854 |
testUnreflect(Example.class, true, void.class, "pkg_s0"); |
855 |
testUnreflect(Example.class, true, void.class, "pri_s0"); |
|
856 |
||
857 |
testUnreflect(Example.class, true, Object.class, "s1", Object.class); |
|
858 |
testUnreflect(Example.class, true, Object.class, "s2", int.class); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
859 |
testUnreflect(Example.class, true, Object.class, "s3", long.class); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
860 |
testUnreflect(Example.class, true, Object.class, "s4", int.class, int.class); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
861 |
testUnreflect(Example.class, true, Object.class, "s5", long.class, int.class); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
862 |
testUnreflect(Example.class, true, Object.class, "s6", int.class, long.class); |
4535 | 863 |
|
864 |
testUnreflect(Example.class, false, void.class, "v0"); |
|
865 |
testUnreflect(Example.class, false, void.class, "pkg_v0"); |
|
866 |
testUnreflect(Example.class, false, void.class, "pri_v0"); |
|
867 |
testUnreflect(Example.class, false, Object.class, "v1", Object.class); |
|
868 |
testUnreflect(Example.class, false, Object.class, "v2", Object.class, Object.class); |
|
869 |
testUnreflect(Example.class, false, Object.class, "v2", Object.class, int.class); |
|
870 |
testUnreflect(Example.class, false, Object.class, "v2", int.class, Object.class); |
|
871 |
testUnreflect(Example.class, false, Object.class, "v2", int.class, int.class); |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
872 |
|
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
873 |
// Test a public final member in another package: |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
874 |
testUnreflect(RemoteExample.class, false, void.class, "Rem/fin_v0"); |
4535 | 875 |
} |
876 |
||
877 |
void testUnreflect(Class<?> defc, boolean isStatic, Class<?> ret, String name, Class<?>... params) throws Throwable { |
|
878 |
for (Object[] ac : accessCases(defc, name)) { |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
879 |
testUnreflectMaybeSpecial(null, (Boolean)ac[0], (Lookup)ac[1], defc, (isStatic ? null : defc), ret, name, params); |
4535 | 880 |
} |
881 |
} |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
882 |
void testUnreflect(Class<?> defc, Class<?> rcvc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
883 |
for (Object[] ac : accessCases(defc, name)) { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
884 |
testUnreflectMaybeSpecial(null, (Boolean)ac[0], (Lookup)ac[1], defc, rcvc, ret, name, params); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
885 |
} |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
886 |
} |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
887 |
void testUnreflectMaybeSpecial(Class<?> specialCaller, |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
888 |
boolean positive, Lookup lookup, |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
889 |
Class<?> defc, Class<?> rcvc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
4535 | 890 |
countTest(positive); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
891 |
String methodName = name.substring(1 + name.indexOf('/')); // foo/bar => foo |
4537 | 892 |
MethodType type = MethodType.methodType(ret, params); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
893 |
Method rmethod = defc.getDeclaredMethod(methodName, params); |
4535 | 894 |
MethodHandle target = null; |
7052
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
895 |
Exception noAccess = null; |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
896 |
boolean isStatic = (rcvc == null); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
897 |
boolean isSpecial = (specialCaller != null); |
4535 | 898 |
try { |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
899 |
if (verbosity >= 4) System.out.println("lookup via "+lookup+" of "+defc+" "+name+type); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
900 |
if (isSpecial) |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
901 |
target = maybeMoveIn(lookup, specialCaller).unreflectSpecial(rmethod, specialCaller); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
902 |
else |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
903 |
target = maybeMoveIn(lookup, defc).unreflect(rmethod); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
904 |
} catch (ReflectiveOperationException ex) { |
4535 | 905 |
noAccess = ex; |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
906 |
if (verbosity >= 5) ex.printStackTrace(System.out); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
907 |
if (name.contains("bogus")) |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
908 |
assertTrue(noAccess instanceof NoSuchMethodException); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
909 |
else |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
910 |
assertTrue(noAccess instanceof IllegalAccessException); |
4535 | 911 |
} |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
912 |
if (verbosity >= 3) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
913 |
System.out.println("unreflect"+(isSpecial?"Special":"")+" "+defc.getName()+"."+name+"/"+type |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
914 |
+(!isSpecial ? "" : " specialCaller="+specialCaller) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
915 |
+( isStatic ? "" : " receiver="+rcvc) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
916 |
+" => "+target |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
917 |
+(noAccess == null ? "" : " !! "+noAccess)); |
4535 | 918 |
if (positive && noAccess != null) throw noAccess; |
919 |
assertEquals(positive ? "positive test" : "negative test erroneously passed", positive, target != null); |
|
920 |
if (!positive) return; // negative test failed as expected |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
921 |
assertEquals(isStatic, Modifier.isStatic(rmethod.getModifiers())); |
4535 | 922 |
Class<?>[] paramsMaybeWithSelf = params; |
923 |
if (!isStatic) { |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
924 |
paramsMaybeWithSelf = cat(array(Class[].class, (Class)rcvc), params); |
4535 | 925 |
} |
4537 | 926 |
MethodType typeMaybeWithSelf = MethodType.methodType(ret, paramsMaybeWithSelf); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
927 |
if (isStatic) { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
928 |
assertEquals(typeMaybeWithSelf, target.type()); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
929 |
} else { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
930 |
if (isSpecial) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
931 |
assertEquals(specialCaller, target.type().parameterType(0)); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
932 |
else |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
933 |
assertEquals(defc, target.type().parameterType(0)); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
934 |
assertEquals(typeMaybeWithSelf, target.type().changeParameterType(0, rcvc)); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
935 |
} |
4535 | 936 |
Object[] argsMaybeWithSelf = randomArgs(paramsMaybeWithSelf); |
937 |
printCalled(target, name, argsMaybeWithSelf); |
|
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
938 |
target.invokeWithArguments(argsMaybeWithSelf); |
4535 | 939 |
assertCalled(name, argsMaybeWithSelf); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
940 |
if (verbosity >= 1) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
941 |
System.out.print(':'); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
942 |
} |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
943 |
|
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
944 |
void testUnreflectSpecial(Class<?> defc, Class<?> rcvc, Class<?> ret, String name, Class<?>... params) throws Throwable { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
945 |
for (Object[] ac : accessCases(defc, name, true)) { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
946 |
Class<?> specialCaller = rcvc; |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
947 |
testUnreflectMaybeSpecial(specialCaller, (Boolean)ac[0], (Lookup)ac[1], defc, rcvc, ret, name, params); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
948 |
} |
4535 | 949 |
} |
950 |
||
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
951 |
@Test |
4535 | 952 |
public void testUnreflectSpecial() throws Throwable { |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
953 |
if (CAN_SKIP_WORKING) return; |
4535 | 954 |
startTest("unreflectSpecial"); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
955 |
testUnreflectSpecial(Example.class, Example.class, void.class, "v0"); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
956 |
testUnreflectSpecial(Example.class, SubExample.class, void.class, "v0"); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
957 |
testUnreflectSpecial(Example.class, Example.class, void.class, "pkg_v0"); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
958 |
testUnreflectSpecial(Example.class, SubExample.class, void.class, "pkg_v0"); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
959 |
testUnreflectSpecial(Example.class, Example.class, Object.class, "v2", int.class, int.class); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
960 |
testUnreflectSpecial(Example.class, SubExample.class, Object.class, "v2", int.class, int.class); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
961 |
testUnreflectMaybeSpecial(Example.class, false, PRIVATE, Example.class, Example.class, void.class, "s0"); |
4535 | 962 |
} |
963 |
||
4537 | 964 |
public static class HasFields { |
965 |
boolean fZ = false; |
|
966 |
byte fB = (byte)'B'; |
|
967 |
short fS = (short)'S'; |
|
968 |
char fC = 'C'; |
|
969 |
int fI = 'I'; |
|
970 |
long fJ = 'J'; |
|
971 |
float fF = 'F'; |
|
972 |
double fD = 'D'; |
|
973 |
static boolean sZ = true; |
|
974 |
static byte sB = 1+(byte)'B'; |
|
975 |
static short sS = 1+(short)'S'; |
|
976 |
static char sC = 1+'C'; |
|
977 |
static int sI = 1+'I'; |
|
978 |
static long sJ = 1+'J'; |
|
979 |
static float sF = 1+'F'; |
|
980 |
static double sD = 1+'D'; |
|
981 |
||
982 |
Object fL = 'L'; |
|
983 |
String fR = "R"; |
|
984 |
static Object sL = 'M'; |
|
985 |
static String sR = "S"; |
|
986 |
||
987 |
static final Object[][] CASES; |
|
988 |
static { |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
989 |
ArrayList<Object[]> cases = new ArrayList<>(); |
4537 | 990 |
Object types[][] = { |
991 |
{'L',Object.class}, {'R',String.class}, |
|
992 |
{'I',int.class}, {'J',long.class}, |
|
993 |
{'F',float.class}, {'D',double.class}, |
|
994 |
{'Z',boolean.class}, {'B',byte.class}, |
|
995 |
{'S',short.class}, {'C',char.class}, |
|
996 |
}; |
|
997 |
HasFields fields = new HasFields(); |
|
998 |
for (Object[] t : types) { |
|
999 |
for (int kind = 0; kind <= 1; kind++) { |
|
1000 |
boolean isStatic = (kind != 0); |
|
1001 |
char btc = (Character)t[0]; |
|
1002 |
String name = (isStatic ? "s" : "f") + btc; |
|
1003 |
Class<?> type = (Class<?>) t[1]; |
|
1004 |
Object value; |
|
1005 |
Field field; |
|
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1006 |
try { |
4537 | 1007 |
field = HasFields.class.getDeclaredField(name); |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
1008 |
} catch (NoSuchFieldException | SecurityException ex) { |
4537 | 1009 |
throw new InternalError("no field HasFields."+name); |
1010 |
} |
|
1011 |
try { |
|
1012 |
value = field.get(fields); |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
1013 |
} catch (IllegalArgumentException | IllegalAccessException ex) { |
4537 | 1014 |
throw new InternalError("cannot fetch field HasFields."+name); |
1015 |
} |
|
1016 |
if (type == float.class) { |
|
1017 |
float v = 'F'; |
|
1018 |
if (isStatic) v++; |
|
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1019 |
assertTrue(value.equals(v)); |
4537 | 1020 |
} |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1021 |
assertTrue(name.equals(field.getName())); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1022 |
assertTrue(type.equals(field.getType())); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1023 |
assertTrue(isStatic == (Modifier.isStatic(field.getModifiers()))); |
4537 | 1024 |
cases.add(new Object[]{ field, value }); |
1025 |
} |
|
1026 |
} |
|
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1027 |
cases.add(new Object[]{ new Object[]{ false, HasFields.class, "bogus_fD", double.class }, Error.class }); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1028 |
cases.add(new Object[]{ new Object[]{ true, HasFields.class, "bogus_sL", Object.class }, Error.class }); |
4537 | 1029 |
CASES = cases.toArray(new Object[0][]); |
1030 |
} |
|
1031 |
} |
|
1032 |
||
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1033 |
static final int TEST_UNREFLECT = 1, TEST_FIND_FIELD = 2, TEST_FIND_STATIC = 3, TEST_SETTER = 0x10, TEST_BOUND = 0x20, TEST_NPE = 0x40; |
5726 | 1034 |
static boolean testModeMatches(int testMode, boolean isStatic) { |
1035 |
switch (testMode) { |
|
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1036 |
case TEST_FIND_STATIC: return isStatic; |
5726 | 1037 |
case TEST_FIND_FIELD: return !isStatic; |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1038 |
case TEST_UNREFLECT: return true; // unreflect matches both |
5726 | 1039 |
} |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1040 |
throw new InternalError("testMode="+testMode); |
5726 | 1041 |
} |
1042 |
||
4537 | 1043 |
@Test |
4535 | 1044 |
public void testUnreflectGetter() throws Throwable { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1045 |
if (CAN_SKIP_WORKING) return; |
5726 | 1046 |
startTest("unreflectGetter"); |
1047 |
testGetter(TEST_UNREFLECT); |
|
1048 |
} |
|
1049 |
@Test |
|
1050 |
public void testFindGetter() throws Throwable { |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1051 |
if (CAN_SKIP_WORKING) return; |
5726 | 1052 |
startTest("findGetter"); |
1053 |
testGetter(TEST_FIND_FIELD); |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1054 |
testGetter(TEST_FIND_FIELD | TEST_BOUND); |
5726 | 1055 |
} |
1056 |
@Test |
|
1057 |
public void testFindStaticGetter() throws Throwable { |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1058 |
if (CAN_SKIP_WORKING) return; |
5726 | 1059 |
startTest("findStaticGetter"); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1060 |
testGetter(TEST_FIND_STATIC); |
5726 | 1061 |
} |
1062 |
public void testGetter(int testMode) throws Throwable { |
|
4535 | 1063 |
Lookup lookup = PRIVATE; // FIXME: test more lookups than this one |
4537 | 1064 |
for (Object[] c : HasFields.CASES) { |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1065 |
boolean positive = (c[1] != Error.class); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1066 |
testGetter(positive, lookup, c[0], c[1], testMode); |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1067 |
if (positive) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1068 |
testGetter(positive, lookup, c[0], c[1], testMode | TEST_NPE); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1069 |
} |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1070 |
testGetter(true, lookup, |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1071 |
new Object[]{ true, System.class, "out", java.io.PrintStream.class }, |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1072 |
System.out, testMode); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1073 |
for (int isStaticN = 0; isStaticN <= 1; isStaticN++) { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1074 |
testGetter(false, lookup, |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1075 |
new Object[]{ (isStaticN != 0), System.class, "bogus", char.class }, |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1076 |
null, testMode); |
4537 | 1077 |
} |
1078 |
} |
|
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1079 |
public void testGetter(boolean positive, MethodHandles.Lookup lookup, |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1080 |
Object fieldRef, Object value, int testMode) throws Throwable { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1081 |
testAccessor(positive, lookup, fieldRef, value, testMode); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1082 |
} |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1083 |
|
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1084 |
public void testAccessor(boolean positive0, MethodHandles.Lookup lookup, |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1085 |
Object fieldRef, Object value, int testMode0) throws Throwable { |
10081 | 1086 |
if (verbosity >= 4) |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1087 |
System.out.println("testAccessor"+Arrays.deepToString(new Object[]{positive0, lookup, fieldRef, value, testMode0})); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1088 |
boolean isGetter = ((testMode0 & TEST_SETTER) == 0); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1089 |
boolean doBound = ((testMode0 & TEST_BOUND) != 0); |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1090 |
boolean testNPE = ((testMode0 & TEST_NPE) != 0); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1091 |
int testMode = testMode0 & ~(TEST_SETTER | TEST_BOUND | TEST_NPE); |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1092 |
boolean positive = positive0 && !testNPE; |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1093 |
boolean isStatic; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1094 |
Class<?> fclass; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1095 |
String fname; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1096 |
Class<?> ftype; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1097 |
Field f = (fieldRef instanceof Field ? (Field)fieldRef : null); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1098 |
if (f != null) { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1099 |
isStatic = Modifier.isStatic(f.getModifiers()); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1100 |
fclass = f.getDeclaringClass(); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1101 |
fname = f.getName(); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1102 |
ftype = f.getType(); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1103 |
} else { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1104 |
Object[] scnt = (Object[]) fieldRef; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1105 |
isStatic = (Boolean) scnt[0]; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1106 |
fclass = (Class<?>) scnt[1]; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1107 |
fname = (String) scnt[2]; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1108 |
ftype = (Class<?>) scnt[3]; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1109 |
try { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1110 |
f = fclass.getDeclaredField(fname); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1111 |
} catch (ReflectiveOperationException ex) { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1112 |
f = null; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1113 |
} |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1114 |
} |
5726 | 1115 |
if (!testModeMatches(testMode, isStatic)) return; |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1116 |
if (f == null && testMode == TEST_UNREFLECT) return; |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1117 |
if (testNPE && isStatic) return; |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1118 |
countTest(positive); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1119 |
MethodType expType; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1120 |
if (isGetter) |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1121 |
expType = MethodType.methodType(ftype, HasFields.class); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1122 |
else |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1123 |
expType = MethodType.methodType(void.class, HasFields.class, ftype); |
4537 | 1124 |
if (isStatic) expType = expType.dropParameterTypes(0, 1); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1125 |
Exception noAccess = null; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1126 |
MethodHandle mh; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1127 |
try { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1128 |
switch (testMode0 & ~(TEST_BOUND | TEST_NPE)) { |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1129 |
case TEST_UNREFLECT: mh = lookup.unreflectGetter(f); break; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1130 |
case TEST_FIND_FIELD: mh = lookup.findGetter(fclass, fname, ftype); break; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1131 |
case TEST_FIND_STATIC: mh = lookup.findStaticGetter(fclass, fname, ftype); break; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1132 |
case TEST_SETTER| |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1133 |
TEST_UNREFLECT: mh = lookup.unreflectSetter(f); break; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1134 |
case TEST_SETTER| |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1135 |
TEST_FIND_FIELD: mh = lookup.findSetter(fclass, fname, ftype); break; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1136 |
case TEST_SETTER| |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1137 |
TEST_FIND_STATIC: mh = lookup.findStaticSetter(fclass, fname, ftype); break; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1138 |
default: |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1139 |
throw new InternalError("testMode="+testMode); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1140 |
} |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1141 |
} catch (ReflectiveOperationException ex) { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1142 |
mh = null; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1143 |
noAccess = ex; |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1144 |
if (verbosity >= 5) ex.printStackTrace(System.out); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1145 |
if (fname.contains("bogus")) |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1146 |
assertTrue(noAccess instanceof NoSuchFieldException); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1147 |
else |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1148 |
assertTrue(noAccess instanceof IllegalAccessException); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1149 |
} |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1150 |
if (verbosity >= 3) |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1151 |
System.out.println("find"+(isStatic?"Static":"")+(isGetter?"Getter":"Setter")+" "+fclass.getName()+"."+fname+"/"+ftype |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1152 |
+" => "+mh |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1153 |
+(noAccess == null ? "" : " !! "+noAccess)); |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1154 |
if (positive && !testNPE && noAccess != null) throw new RuntimeException(noAccess); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1155 |
assertEquals(positive0 ? "positive test" : "negative test erroneously passed", positive0, mh != null); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1156 |
if (!positive && !testNPE) return; // negative access test failed as expected |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1157 |
assertEquals((isStatic ? 0 : 1)+(isGetter ? 0 : 1), mh.type().parameterCount()); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1158 |
|
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1159 |
|
4537 | 1160 |
assertSame(mh.type(), expType); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1161 |
//assertNameStringContains(mh, fname); // This does not hold anymore with LFs |
4537 | 1162 |
HasFields fields = new HasFields(); |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1163 |
HasFields fieldsForMH = fields; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1164 |
if (testNPE) fieldsForMH = null; // perturb MH argument to elicit expected error |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1165 |
if (doBound) |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1166 |
mh = mh.bindTo(fieldsForMH); |
4537 | 1167 |
Object sawValue; |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1168 |
Class<?> vtype = ftype; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1169 |
if (ftype != int.class) vtype = Object.class; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1170 |
if (isGetter) { |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1171 |
mh = mh.asType(mh.type().generic() |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1172 |
.changeReturnType(vtype)); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1173 |
} else { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1174 |
int last = mh.type().parameterCount() - 1; |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1175 |
mh = mh.asType(mh.type().generic() |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1176 |
.changeReturnType(void.class) |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1177 |
.changeParameterType(last, vtype)); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1178 |
} |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1179 |
if (f != null && f.getDeclaringClass() == HasFields.class) { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1180 |
assertEquals(f.get(fields), value); // clean to start with |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1181 |
} |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1182 |
Throwable caughtEx = null; |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1183 |
if (isGetter) { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1184 |
Object expValue = value; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1185 |
for (int i = 0; i <= 1; i++) { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1186 |
sawValue = null; // make DA rules happy under try/catch |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1187 |
try { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1188 |
if (isStatic || doBound) { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1189 |
if (ftype == int.class) |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1190 |
sawValue = (int) mh.invokeExact(); // do these exactly |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1191 |
else |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1192 |
sawValue = mh.invokeExact(); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1193 |
} else { |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1194 |
if (ftype == int.class) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1195 |
sawValue = (int) mh.invokeExact((Object) fieldsForMH); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1196 |
else |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1197 |
sawValue = mh.invokeExact((Object) fieldsForMH); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1198 |
} |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1199 |
} catch (RuntimeException ex) { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1200 |
if (ex instanceof NullPointerException && testNPE) { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1201 |
caughtEx = ex; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1202 |
break; |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1203 |
} |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1204 |
} |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1205 |
assertEquals(sawValue, expValue); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1206 |
if (f != null && f.getDeclaringClass() == HasFields.class |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1207 |
&& !Modifier.isFinal(f.getModifiers())) { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1208 |
Object random = randomArg(ftype); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1209 |
f.set(fields, random); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1210 |
expValue = random; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1211 |
} else { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1212 |
break; |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1213 |
} |
4537 | 1214 |
} |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1215 |
} else { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1216 |
for (int i = 0; i <= 1; i++) { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1217 |
Object putValue = randomArg(ftype); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1218 |
try { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1219 |
if (isStatic || doBound) { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1220 |
if (ftype == int.class) |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1221 |
mh.invokeExact((int)putValue); // do these exactly |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1222 |
else |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1223 |
mh.invokeExact(putValue); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1224 |
} else { |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1225 |
if (ftype == int.class) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1226 |
mh.invokeExact((Object) fieldsForMH, (int)putValue); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1227 |
else |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1228 |
mh.invokeExact((Object) fieldsForMH, putValue); |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1229 |
} |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1230 |
} catch (RuntimeException ex) { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1231 |
if (ex instanceof NullPointerException && testNPE) { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1232 |
caughtEx = ex; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1233 |
break; |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1234 |
} |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1235 |
} |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1236 |
if (f != null && f.getDeclaringClass() == HasFields.class) { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1237 |
assertEquals(f.get(fields), putValue); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1238 |
} |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1239 |
} |
4537 | 1240 |
} |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1241 |
if (f != null && f.getDeclaringClass() == HasFields.class) { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1242 |
f.set(fields, value); // put it back |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1243 |
} |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1244 |
if (testNPE) { |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1245 |
if (caughtEx == null || !(caughtEx instanceof NullPointerException)) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1246 |
throw new RuntimeException("failed to catch NPE exception"+(caughtEx == null ? " (caughtEx=null)" : ""), caughtEx); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1247 |
caughtEx = null; // nullify expected exception |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1248 |
} |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1249 |
if (caughtEx != null) { |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1250 |
throw new RuntimeException("unexpected exception", caughtEx); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1251 |
} |
4535 | 1252 |
} |
1253 |
||
4537 | 1254 |
|
1255 |
@Test |
|
4535 | 1256 |
public void testUnreflectSetter() throws Throwable { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1257 |
if (CAN_SKIP_WORKING) return; |
5726 | 1258 |
startTest("unreflectSetter"); |
1259 |
testSetter(TEST_UNREFLECT); |
|
1260 |
} |
|
1261 |
@Test |
|
1262 |
public void testFindSetter() throws Throwable { |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1263 |
if (CAN_SKIP_WORKING) return; |
5726 | 1264 |
startTest("findSetter"); |
1265 |
testSetter(TEST_FIND_FIELD); |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1266 |
testSetter(TEST_FIND_FIELD | TEST_BOUND); |
5726 | 1267 |
} |
1268 |
@Test |
|
1269 |
public void testFindStaticSetter() throws Throwable { |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1270 |
if (CAN_SKIP_WORKING) return; |
5726 | 1271 |
startTest("findStaticSetter"); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1272 |
testSetter(TEST_FIND_STATIC); |
5726 | 1273 |
} |
1274 |
public void testSetter(int testMode) throws Throwable { |
|
4535 | 1275 |
Lookup lookup = PRIVATE; // FIXME: test more lookups than this one |
1276 |
startTest("unreflectSetter"); |
|
4537 | 1277 |
for (Object[] c : HasFields.CASES) { |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1278 |
boolean positive = (c[1] != Error.class); |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1279 |
testSetter(positive, lookup, c[0], c[1], testMode); |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1280 |
if (positive) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1281 |
testSetter(positive, lookup, c[0], c[1], testMode | TEST_NPE); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1282 |
} |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1283 |
for (int isStaticN = 0; isStaticN <= 1; isStaticN++) { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1284 |
testSetter(false, lookup, |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1285 |
new Object[]{ (isStaticN != 0), System.class, "bogus", char.class }, |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1286 |
null, testMode); |
4537 | 1287 |
} |
1288 |
} |
|
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1289 |
public void testSetter(boolean positive, MethodHandles.Lookup lookup, |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1290 |
Object fieldRef, Object value, int testMode) throws Throwable { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1291 |
testAccessor(positive, lookup, fieldRef, value, testMode | TEST_SETTER); |
4535 | 1292 |
} |
1293 |
||
4537 | 1294 |
@Test |
4535 | 1295 |
public void testArrayElementGetter() throws Throwable { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1296 |
if (CAN_SKIP_WORKING) return; |
4535 | 1297 |
startTest("arrayElementGetter"); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1298 |
testArrayElementGetterSetter(false); |
4537 | 1299 |
} |
1300 |
||
1301 |
@Test |
|
1302 |
public void testArrayElementSetter() throws Throwable { |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1303 |
if (CAN_SKIP_WORKING) return; |
4537 | 1304 |
startTest("arrayElementSetter"); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1305 |
testArrayElementGetterSetter(true); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1306 |
} |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1307 |
|
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1308 |
private static final int TEST_ARRAY_NONE = 0, TEST_ARRAY_NPE = 1, TEST_ARRAY_OOB = 2, TEST_ARRAY_ASE = 3; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1309 |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1310 |
public void testArrayElementGetterSetter(boolean testSetter) throws Throwable { |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1311 |
testArrayElementGetterSetter(testSetter, TEST_ARRAY_NONE); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1312 |
} |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1313 |
|
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1314 |
@Test |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1315 |
public void testArrayElementErrors() throws Throwable { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1316 |
if (CAN_SKIP_WORKING) return; |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1317 |
startTest("arrayElementErrors"); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1318 |
testArrayElementGetterSetter(false, TEST_ARRAY_NPE); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1319 |
testArrayElementGetterSetter(true, TEST_ARRAY_NPE); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1320 |
testArrayElementGetterSetter(false, TEST_ARRAY_OOB); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1321 |
testArrayElementGetterSetter(true, TEST_ARRAY_OOB); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1322 |
testArrayElementGetterSetter(new Object[10], true, TEST_ARRAY_ASE); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1323 |
testArrayElementGetterSetter(new Example[10], true, TEST_ARRAY_ASE); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1324 |
testArrayElementGetterSetter(new IntExample[10], true, TEST_ARRAY_ASE); |
4535 | 1325 |
} |
1326 |
||
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1327 |
public void testArrayElementGetterSetter(boolean testSetter, int negTest) throws Throwable { |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1328 |
testArrayElementGetterSetter(new String[10], testSetter, negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1329 |
testArrayElementGetterSetter(new Iterable<?>[10], testSetter, negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1330 |
testArrayElementGetterSetter(new Example[10], testSetter, negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1331 |
testArrayElementGetterSetter(new IntExample[10], testSetter, negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1332 |
testArrayElementGetterSetter(new Object[10], testSetter, negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1333 |
testArrayElementGetterSetter(new boolean[10], testSetter, negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1334 |
testArrayElementGetterSetter(new byte[10], testSetter, negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1335 |
testArrayElementGetterSetter(new char[10], testSetter, negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1336 |
testArrayElementGetterSetter(new short[10], testSetter, negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1337 |
testArrayElementGetterSetter(new int[10], testSetter, negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1338 |
testArrayElementGetterSetter(new float[10], testSetter, negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1339 |
testArrayElementGetterSetter(new long[10], testSetter, negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1340 |
testArrayElementGetterSetter(new double[10], testSetter, negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1341 |
} |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1342 |
|
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1343 |
public void testArrayElementGetterSetter(Object array, boolean testSetter, int negTest) throws Throwable { |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1344 |
boolean positive = (negTest == TEST_ARRAY_NONE); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1345 |
int length = java.lang.reflect.Array.getLength(array); |
4537 | 1346 |
Class<?> arrayType = array.getClass(); |
1347 |
Class<?> elemType = arrayType.getComponentType(); |
|
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1348 |
Object arrayToMH = array; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1349 |
// this stanza allows negative tests to make argument perturbations: |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1350 |
switch (negTest) { |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1351 |
case TEST_ARRAY_NPE: |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1352 |
arrayToMH = null; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1353 |
break; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1354 |
case TEST_ARRAY_OOB: |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1355 |
assert(length > 0); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1356 |
arrayToMH = java.lang.reflect.Array.newInstance(elemType, 0); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1357 |
break; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1358 |
case TEST_ARRAY_ASE: |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1359 |
assert(testSetter && !elemType.isPrimitive()); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1360 |
if (elemType == Object.class) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1361 |
arrayToMH = new StringBuffer[length]; // very random subclass of Object! |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1362 |
else if (elemType == Example.class) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1363 |
arrayToMH = new SubExample[length]; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1364 |
else if (elemType == IntExample.class) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1365 |
arrayToMH = new SubIntExample[length]; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1366 |
else |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1367 |
return; // can't make an ArrayStoreException test |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1368 |
assert(arrayType.isInstance(arrayToMH)) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1369 |
: Arrays.asList(arrayType, arrayToMH.getClass(), testSetter, negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1370 |
break; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1371 |
} |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1372 |
countTest(positive); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1373 |
if (verbosity > 2) System.out.println("array type = "+array.getClass().getComponentType().getName()+"["+length+"]"+(positive ? "" : " negative test #"+negTest+" using "+Arrays.deepToString(new Object[]{arrayToMH}))); |
4537 | 1374 |
MethodType expType = !testSetter |
1375 |
? MethodType.methodType(elemType, arrayType, int.class) |
|
1376 |
: MethodType.methodType(void.class, arrayType, int.class, elemType); |
|
1377 |
MethodHandle mh = !testSetter |
|
1378 |
? MethodHandles.arrayElementGetter(arrayType) |
|
1379 |
: MethodHandles.arrayElementSetter(arrayType); |
|
1380 |
assertSame(mh.type(), expType); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1381 |
if (elemType != int.class && elemType != boolean.class) { |
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1382 |
MethodType gtype = mh.type().generic().changeParameterType(1, int.class); |
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1383 |
if (testSetter) gtype = gtype.changeReturnType(void.class); |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1384 |
mh = mh.asType(gtype); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1385 |
} |
4537 | 1386 |
Object sawValue, expValue; |
1387 |
List<Object> model = array2list(array); |
|
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1388 |
Throwable caughtEx = null; |
4537 | 1389 |
for (int i = 0; i < length; i++) { |
1390 |
// update array element |
|
1391 |
Object random = randomArg(elemType); |
|
1392 |
model.set(i, random); |
|
1393 |
if (testSetter) { |
|
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1394 |
try { |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1395 |
if (elemType == int.class) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1396 |
mh.invokeExact((int[]) arrayToMH, i, (int)random); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1397 |
else if (elemType == boolean.class) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1398 |
mh.invokeExact((boolean[]) arrayToMH, i, (boolean)random); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1399 |
else |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1400 |
mh.invokeExact(arrayToMH, i, random); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1401 |
} catch (RuntimeException ex) { |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1402 |
caughtEx = ex; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1403 |
break; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1404 |
} |
4537 | 1405 |
assertEquals(model, array2list(array)); |
1406 |
} else { |
|
1407 |
Array.set(array, i, random); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1408 |
} |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1409 |
if (verbosity >= 5) { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1410 |
List<Object> array2list = array2list(array); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1411 |
System.out.println("a["+i+"]="+random+" => "+array2list); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1412 |
if (!array2list.equals(model)) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1413 |
System.out.println("*** != "+model); |
4537 | 1414 |
} |
1415 |
// observe array element |
|
1416 |
sawValue = Array.get(array, i); |
|
1417 |
if (!testSetter) { |
|
1418 |
expValue = sawValue; |
|
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1419 |
try { |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1420 |
if (elemType == int.class) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1421 |
sawValue = (int) mh.invokeExact((int[]) arrayToMH, i); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1422 |
else if (elemType == boolean.class) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1423 |
sawValue = (boolean) mh.invokeExact((boolean[]) arrayToMH, i); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1424 |
else |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1425 |
sawValue = mh.invokeExact(arrayToMH, i); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1426 |
} catch (RuntimeException ex) { |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1427 |
caughtEx = ex; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1428 |
break; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1429 |
} |
4537 | 1430 |
assertEquals(sawValue, expValue); |
1431 |
assertEquals(model, array2list(array)); |
|
1432 |
} |
|
1433 |
} |
|
13420
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1434 |
if (!positive) { |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1435 |
if (caughtEx == null) |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1436 |
throw new RuntimeException("failed to catch exception for negTest="+negTest); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1437 |
// test the kind of exception |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1438 |
Class<?> reqType = null; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1439 |
switch (negTest) { |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1440 |
case TEST_ARRAY_ASE: reqType = ArrayStoreException.class; break; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1441 |
case TEST_ARRAY_OOB: reqType = ArrayIndexOutOfBoundsException.class; break; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1442 |
case TEST_ARRAY_NPE: reqType = NullPointerException.class; break; |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1443 |
default: assert(false); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1444 |
} |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1445 |
if (reqType.isInstance(caughtEx)) { |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1446 |
caughtEx = null; // nullify expected exception |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1447 |
} |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1448 |
} |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1449 |
if (caughtEx != null) { |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1450 |
throw new RuntimeException("unexpected exception", caughtEx); |
62cedce8afa6
7129034: VM crash with a field setter method with a filterArguments
jrose
parents:
11534
diff
changeset
|
1451 |
} |
4537 | 1452 |
} |
1453 |
||
1454 |
List<Object> array2list(Object array) { |
|
1455 |
int length = Array.getLength(array); |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
1456 |
ArrayList<Object> model = new ArrayList<>(length); |
4537 | 1457 |
for (int i = 0; i < length; i++) |
1458 |
model.add(Array.get(array, i)); |
|
1459 |
return model; |
|
4535 | 1460 |
} |
1461 |
||
1462 |
static class Callee { |
|
1463 |
static Object id() { return called("id"); } |
|
1464 |
static Object id(Object x) { return called("id", x); } |
|
1465 |
static Object id(Object x, Object y) { return called("id", x, y); } |
|
1466 |
static Object id(Object x, Object y, Object z) { return called("id", x, y, z); } |
|
1467 |
static Object id(Object... vx) { return called("id", vx); } |
|
1468 |
static MethodHandle ofType(int n) { |
|
1469 |
return ofType(Object.class, n); |
|
1470 |
} |
|
1471 |
static MethodHandle ofType(Class<?> rtype, int n) { |
|
1472 |
if (n == -1) |
|
4537 | 1473 |
return ofType(MethodType.methodType(rtype, Object[].class)); |
1474 |
return ofType(MethodType.genericMethodType(n).changeReturnType(rtype)); |
|
4535 | 1475 |
} |
1476 |
static MethodHandle ofType(Class<?> rtype, Class<?>... ptypes) { |
|
4537 | 1477 |
return ofType(MethodType.methodType(rtype, ptypes)); |
4535 | 1478 |
} |
1479 |
static MethodHandle ofType(MethodType type) { |
|
1480 |
Class<?> rtype = type.returnType(); |
|
1481 |
String pfx = ""; |
|
1482 |
if (rtype != Object.class) |
|
1483 |
pfx = rtype.getSimpleName().substring(0, 1).toLowerCase(); |
|
1484 |
String name = pfx+"id"; |
|
7052
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
1485 |
try { |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
1486 |
return PRIVATE.findStatic(Callee.class, name, type); |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
1487 |
} catch (NoSuchMethodException | IllegalAccessException ex) { |
7052
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
1488 |
throw new RuntimeException(ex); |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
1489 |
} |
4535 | 1490 |
} |
1491 |
} |
|
1492 |
||
1493 |
@Test |
|
1494 |
public void testConvertArguments() throws Throwable { |
|
1495 |
if (CAN_SKIP_WORKING) return; |
|
1496 |
startTest("convertArguments"); |
|
1497 |
testConvert(Callee.ofType(1), null, "id", int.class); |
|
1498 |
testConvert(Callee.ofType(1), null, "id", String.class); |
|
1499 |
testConvert(Callee.ofType(1), null, "id", Integer.class); |
|
1500 |
testConvert(Callee.ofType(1), null, "id", short.class); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1501 |
testConvert(Callee.ofType(1), null, "id", char.class); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1502 |
testConvert(Callee.ofType(1), null, "id", byte.class); |
4535 | 1503 |
} |
1504 |
||
1505 |
void testConvert(MethodHandle id, Class<?> rtype, String name, Class<?>... params) throws Throwable { |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1506 |
testConvert(true, id, rtype, name, params); |
4535 | 1507 |
} |
1508 |
||
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1509 |
void testConvert(boolean positive, |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
1510 |
MethodHandle id, Class<?> rtype, String name, Class<?>... params) throws Throwable { |
4535 | 1511 |
countTest(positive); |
1512 |
MethodType idType = id.type(); |
|
1513 |
if (rtype == null) rtype = idType.returnType(); |
|
1514 |
for (int i = 0; i < params.length; i++) { |
|
1515 |
if (params[i] == null) params[i] = idType.parameterType(i); |
|
1516 |
} |
|
1517 |
// simulate the pairwise conversion |
|
4537 | 1518 |
MethodType newType = MethodType.methodType(rtype, params); |
4535 | 1519 |
Object[] args = randomArgs(newType.parameterArray()); |
1520 |
Object[] convArgs = args.clone(); |
|
1521 |
for (int i = 0; i < args.length; i++) { |
|
1522 |
Class<?> src = newType.parameterType(i); |
|
1523 |
Class<?> dst = idType.parameterType(i); |
|
1524 |
if (src != dst) |
|
1525 |
convArgs[i] = castToWrapper(convArgs[i], dst); |
|
1526 |
} |
|
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
1527 |
Object convResult = id.invokeWithArguments(convArgs); |
4535 | 1528 |
{ |
1529 |
Class<?> dst = newType.returnType(); |
|
1530 |
Class<?> src = idType.returnType(); |
|
1531 |
if (src != dst) |
|
1532 |
convResult = castToWrapper(convResult, dst); |
|
1533 |
} |
|
1534 |
MethodHandle target = null; |
|
1535 |
RuntimeException error = null; |
|
1536 |
try { |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1537 |
target = id.asType(newType); |
13610
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
1538 |
} catch (WrongMethodTypeException ex) { |
4535 | 1539 |
error = ex; |
1540 |
} |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1541 |
if (verbosity >= 3) |
4535 | 1542 |
System.out.println("convert "+id+ " to "+newType+" => "+target |
1543 |
+(error == null ? "" : " !! "+error)); |
|
1544 |
if (positive && error != null) throw error; |
|
1545 |
assertEquals(positive ? "positive test" : "negative test erroneously passed", positive, target != null); |
|
1546 |
if (!positive) return; // negative test failed as expected |
|
1547 |
assertEquals(newType, target.type()); |
|
1548 |
printCalled(target, id.toString(), args); |
|
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
1549 |
Object result = target.invokeWithArguments(args); |
4535 | 1550 |
assertCalled(name, convArgs); |
1551 |
assertEquals(convResult, result); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1552 |
if (verbosity >= 1) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1553 |
System.out.print(':'); |
4535 | 1554 |
} |
1555 |
||
1556 |
@Test |
|
8345
9e2483e6cfab
7013417: JSR 292 needs to support variadic method handle calls
jrose
parents:
7562
diff
changeset
|
1557 |
public void testVarargsCollector() throws Throwable { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1558 |
if (CAN_SKIP_WORKING) return; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1559 |
startTest("varargsCollector"); |
8345
9e2483e6cfab
7013417: JSR 292 needs to support variadic method handle calls
jrose
parents:
7562
diff
changeset
|
1560 |
MethodHandle vac0 = PRIVATE.findStatic(MethodHandlesTest.class, "called", |
9e2483e6cfab
7013417: JSR 292 needs to support variadic method handle calls
jrose
parents:
7562
diff
changeset
|
1561 |
MethodType.methodType(Object.class, String.class, Object[].class)); |
9e2483e6cfab
7013417: JSR 292 needs to support variadic method handle calls
jrose
parents:
7562
diff
changeset
|
1562 |
vac0 = vac0.bindTo("vac"); |
9e2483e6cfab
7013417: JSR 292 needs to support variadic method handle calls
jrose
parents:
7562
diff
changeset
|
1563 |
MethodHandle vac = vac0.asVarargsCollector(Object[].class); |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1564 |
testConvert(true, vac.asType(MethodType.genericMethodType(0)), null, "vac"); |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1565 |
testConvert(true, vac.asType(MethodType.genericMethodType(0)), null, "vac"); |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
1566 |
for (Class<?> at : new Class<?>[] { Object.class, String.class, Integer.class }) { |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1567 |
testConvert(true, vac.asType(MethodType.genericMethodType(1)), null, "vac", at); |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1568 |
testConvert(true, vac.asType(MethodType.genericMethodType(2)), null, "vac", at, at); |
8345
9e2483e6cfab
7013417: JSR 292 needs to support variadic method handle calls
jrose
parents:
7562
diff
changeset
|
1569 |
} |
9e2483e6cfab
7013417: JSR 292 needs to support variadic method handle calls
jrose
parents:
7562
diff
changeset
|
1570 |
} |
9e2483e6cfab
7013417: JSR 292 needs to support variadic method handle calls
jrose
parents:
7562
diff
changeset
|
1571 |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1572 |
@Test // SLOW |
4537 | 1573 |
public void testPermuteArguments() throws Throwable { |
1574 |
if (CAN_SKIP_WORKING) return; |
|
1575 |
startTest("permuteArguments"); |
|
10081 | 1576 |
testPermuteArguments(4, Integer.class, 2, long.class, 6); |
1577 |
if (CAN_TEST_LIGHTLY) return; |
|
4537 | 1578 |
testPermuteArguments(4, Integer.class, 2, String.class, 0); |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1579 |
testPermuteArguments(6, Integer.class, 0, null, 30); |
4537 | 1580 |
} |
1581 |
public void testPermuteArguments(int max, Class<?> type1, int t2c, Class<?> type2, int dilution) throws Throwable { |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1582 |
if (verbosity >= 2) |
4537 | 1583 |
System.out.println("permuteArguments "+max+"*"+type1.getName() |
1584 |
+(t2c==0?"":"/"+t2c+"*"+type2.getName()) |
|
1585 |
+(dilution > 0 ? " with dilution "+dilution : "")); |
|
1586 |
int t2pos = t2c == 0 ? 0 : 1; |
|
1587 |
for (int inargs = t2pos+1; inargs <= max; inargs++) { |
|
1588 |
Class<?>[] types = new Class<?>[inargs]; |
|
1589 |
Arrays.fill(types, type1); |
|
1590 |
if (t2c != 0) { |
|
1591 |
// Fill in a middle range with type2: |
|
1592 |
Arrays.fill(types, t2pos, Math.min(t2pos+t2c, inargs), type2); |
|
1593 |
} |
|
1594 |
Object[] args = randomArgs(types); |
|
1595 |
int numcases = 1; |
|
1596 |
for (int outargs = 0; outargs <= max; outargs++) { |
|
1597 |
if (outargs - inargs >= MAX_ARG_INCREASE) continue; |
|
1598 |
int casStep = dilution + 1; |
|
1599 |
// Avoid some common factors: |
|
1600 |
while ((casStep > 2 && casStep % 2 == 0 && inargs % 2 == 0) || |
|
1601 |
(casStep > 3 && casStep % 3 == 0 && inargs % 3 == 0)) |
|
1602 |
casStep++; |
|
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1603 |
testPermuteArguments(args, types, outargs, numcases, casStep); |
4537 | 1604 |
numcases *= inargs; |
10081 | 1605 |
if (CAN_TEST_LIGHTLY && outargs < max-2) continue; |
4537 | 1606 |
if (dilution > 10 && outargs >= 4) { |
10081 | 1607 |
if (CAN_TEST_LIGHTLY) continue; |
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1608 |
int[] reorder = new int[outargs]; |
4537 | 1609 |
// Do some special patterns, which we probably missed. |
1610 |
// Replication of a single argument or argument pair. |
|
1611 |
for (int i = 0; i < inargs; i++) { |
|
1612 |
Arrays.fill(reorder, i); |
|
1613 |
testPermuteArguments(args, types, reorder); |
|
1614 |
for (int d = 1; d <= 2; d++) { |
|
1615 |
if (i + d >= inargs) continue; |
|
1616 |
for (int j = 1; j < outargs; j += 2) |
|
1617 |
reorder[j] += 1; |
|
1618 |
testPermuteArguments(args, types, reorder); |
|
1619 |
testPermuteArguments(args, types, reverse(reorder)); |
|
1620 |
} |
|
1621 |
} |
|
1622 |
// Repetition of a sequence of 3 or more arguments. |
|
1623 |
for (int i = 1; i < inargs; i++) { |
|
1624 |
for (int len = 3; len <= inargs; len++) { |
|
1625 |
for (int j = 0; j < outargs; j++) |
|
1626 |
reorder[j] = (i + (j % len)) % inargs; |
|
1627 |
testPermuteArguments(args, types, reorder); |
|
1628 |
testPermuteArguments(args, types, reverse(reorder)); |
|
1629 |
} |
|
1630 |
} |
|
1631 |
} |
|
1632 |
} |
|
1633 |
} |
|
1634 |
} |
|
1635 |
||
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1636 |
public void testPermuteArguments(Object[] args, Class<?>[] types, |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1637 |
int outargs, int numcases, int casStep) throws Throwable { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1638 |
int inargs = args.length; |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1639 |
int[] reorder = new int[outargs]; |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1640 |
for (int cas = 0; cas < numcases; cas += casStep) { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1641 |
for (int i = 0, c = cas; i < outargs; i++) { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1642 |
reorder[i] = c % inargs; |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1643 |
c /= inargs; |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1644 |
} |
10081 | 1645 |
if (CAN_TEST_LIGHTLY && outargs >= 3 && (reorder[0] == reorder[1] || reorder[1] == reorder[2])) continue; |
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1646 |
testPermuteArguments(args, types, reorder); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1647 |
} |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1648 |
} |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1649 |
|
4537 | 1650 |
static int[] reverse(int[] reorder) { |
1651 |
reorder = reorder.clone(); |
|
1652 |
for (int i = 0, imax = reorder.length / 2; i < imax; i++) { |
|
1653 |
int j = reorder.length - 1 - i; |
|
1654 |
int tem = reorder[i]; |
|
1655 |
reorder[i] = reorder[j]; |
|
1656 |
reorder[j] = tem; |
|
1657 |
} |
|
1658 |
return reorder; |
|
1659 |
} |
|
1660 |
||
1661 |
void testPermuteArguments(Object[] args, Class<?>[] types, int[] reorder) throws Throwable { |
|
1662 |
countTest(); |
|
1663 |
if (args == null && types == null) { |
|
1664 |
int max = 0; |
|
1665 |
for (int j : reorder) { |
|
1666 |
if (max < j) max = j; |
|
1667 |
} |
|
1668 |
args = randomArgs(max+1, Integer.class); |
|
1669 |
} |
|
1670 |
if (args == null) { |
|
1671 |
args = randomArgs(types); |
|
1672 |
} |
|
1673 |
if (types == null) { |
|
1674 |
types = new Class<?>[args.length]; |
|
1675 |
for (int i = 0; i < args.length; i++) |
|
1676 |
types[i] = args[i].getClass(); |
|
1677 |
} |
|
1678 |
int inargs = args.length, outargs = reorder.length; |
|
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
1679 |
assertTrue(inargs == types.length); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1680 |
if (verbosity >= 3) |
4537 | 1681 |
System.out.println("permuteArguments "+Arrays.toString(reorder)); |
1682 |
Object[] permArgs = new Object[outargs]; |
|
1683 |
Class<?>[] permTypes = new Class<?>[outargs]; |
|
1684 |
for (int i = 0; i < outargs; i++) { |
|
1685 |
permArgs[i] = args[reorder[i]]; |
|
1686 |
permTypes[i] = types[reorder[i]]; |
|
1687 |
} |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1688 |
if (verbosity >= 4) { |
4537 | 1689 |
System.out.println("in args: "+Arrays.asList(args)); |
1690 |
System.out.println("out args: "+Arrays.asList(permArgs)); |
|
1691 |
System.out.println("in types: "+Arrays.asList(types)); |
|
1692 |
System.out.println("out types: "+Arrays.asList(permTypes)); |
|
1693 |
} |
|
1694 |
MethodType inType = MethodType.methodType(Object.class, types); |
|
1695 |
MethodType outType = MethodType.methodType(Object.class, permTypes); |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1696 |
MethodHandle target = varargsList(outargs).asType(outType); |
4537 | 1697 |
MethodHandle newTarget = MethodHandles.permuteArguments(target, inType, reorder); |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1698 |
if (verbosity >= 5) System.out.println("newTarget = "+newTarget); |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
1699 |
Object result = newTarget.invokeWithArguments(args); |
4537 | 1700 |
Object expected = Arrays.asList(permArgs); |
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1701 |
if (!expected.equals(result)) { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1702 |
System.out.println("*** failed permuteArguments "+Arrays.toString(reorder)+" types="+Arrays.asList(types)); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1703 |
System.out.println("in args: "+Arrays.asList(args)); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1704 |
System.out.println("out args: "+expected); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1705 |
System.out.println("bad args: "+result); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1706 |
} |
4537 | 1707 |
assertEquals(expected, result); |
1708 |
} |
|
1709 |
||
1710 |
||
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1711 |
@Test // SLOW |
4537 | 1712 |
public void testSpreadArguments() throws Throwable { |
1713 |
if (CAN_SKIP_WORKING) return; |
|
1714 |
startTest("spreadArguments"); |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
1715 |
for (Class<?> argType : new Class<?>[]{Object.class, Integer.class, int.class}) { |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1716 |
if (verbosity >= 3) |
4537 | 1717 |
System.out.println("spreadArguments "+argType); |
10081 | 1718 |
for (int nargs = 0; nargs < 50; nargs++) { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1719 |
if (CAN_TEST_LIGHTLY && nargs > 11) break; |
10081 | 1720 |
for (int pos = 0; pos <= nargs; pos++) { |
1721 |
if (CAN_TEST_LIGHTLY && pos > 2 && pos < nargs-2) continue; |
|
1722 |
if (nargs > 10 && pos > 4 && pos < nargs-4 && pos % 10 != 3) |
|
1723 |
continue; |
|
1724 |
testSpreadArguments(argType, pos, nargs); |
|
4537 | 1725 |
} |
1726 |
} |
|
1727 |
} |
|
1728 |
} |
|
1729 |
public void testSpreadArguments(Class<?> argType, int pos, int nargs) throws Throwable { |
|
1730 |
countTest(); |
|
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1731 |
Class<?> arrayType = java.lang.reflect.Array.newInstance(argType, 0).getClass(); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1732 |
MethodHandle target2 = varargsArray(arrayType, nargs); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1733 |
MethodHandle target = target2.asType(target2.type().generic()); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1734 |
if (verbosity >= 3) |
4537 | 1735 |
System.out.println("spread into "+target2+" ["+pos+".."+nargs+"]"); |
1736 |
Object[] args = randomArgs(target2.type().parameterArray()); |
|
1737 |
// make sure the target does what we think it does: |
|
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1738 |
if (pos == 0 && nargs < 5 && !argType.isPrimitive()) { |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
1739 |
Object[] check = (Object[]) target.invokeWithArguments(args); |
4537 | 1740 |
assertArrayEquals(args, check); |
1741 |
switch (nargs) { |
|
1742 |
case 0: |
|
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1743 |
check = (Object[]) (Object) target.invokeExact(); |
4537 | 1744 |
assertArrayEquals(args, check); |
1745 |
break; |
|
1746 |
case 1: |
|
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1747 |
check = (Object[]) (Object) target.invokeExact(args[0]); |
4537 | 1748 |
assertArrayEquals(args, check); |
1749 |
break; |
|
1750 |
case 2: |
|
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1751 |
check = (Object[]) (Object) target.invokeExact(args[0], args[1]); |
4537 | 1752 |
assertArrayEquals(args, check); |
1753 |
break; |
|
1754 |
} |
|
1755 |
} |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
1756 |
List<Class<?>> newParams = new ArrayList<>(target2.type().parameterList()); |
4537 | 1757 |
{ // modify newParams in place |
1758 |
List<Class<?>> spreadParams = newParams.subList(pos, nargs); |
|
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1759 |
spreadParams.clear(); spreadParams.add(arrayType); |
4537 | 1760 |
} |
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1761 |
MethodType newType = MethodType.methodType(arrayType, newParams); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1762 |
MethodHandle result = target2.asSpreader(arrayType, nargs-pos); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1763 |
assert(result.type() == newType) : Arrays.asList(result, newType); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1764 |
result = result.asType(newType.generic()); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1765 |
Object returnValue; |
4537 | 1766 |
if (pos == 0) { |
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1767 |
Object args2 = ValueConversions.changeArrayType(arrayType, Arrays.copyOfRange(args, pos, args.length)); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1768 |
returnValue = result.invokeExact(args2); |
4537 | 1769 |
} else { |
1770 |
Object[] args1 = Arrays.copyOfRange(args, 0, pos+1); |
|
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1771 |
args1[pos] = ValueConversions.changeArrayType(arrayType, Arrays.copyOfRange(args, pos, args.length)); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1772 |
returnValue = result.invokeWithArguments(args1); |
4537 | 1773 |
} |
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1774 |
String argstr = Arrays.toString(args); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1775 |
if (!argType.isPrimitive()) { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1776 |
Object[] rv = (Object[]) returnValue; |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1777 |
String rvs = Arrays.toString(rv); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1778 |
if (!Arrays.equals(args, rv)) { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1779 |
System.out.println("method: "+result); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1780 |
System.out.println("expected: "+argstr); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1781 |
System.out.println("returned: "+rvs); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1782 |
assertArrayEquals(args, rv); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1783 |
} |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1784 |
} else if (argType == int.class) { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1785 |
String rvs = Arrays.toString((int[]) returnValue); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1786 |
if (!argstr.equals(rvs)) { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1787 |
System.out.println("method: "+result); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1788 |
System.out.println("expected: "+argstr); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1789 |
System.out.println("returned: "+rvs); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1790 |
assertEquals(argstr, rvs); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1791 |
} |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1792 |
} else if (argType == long.class) { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1793 |
String rvs = Arrays.toString((long[]) returnValue); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1794 |
if (!argstr.equals(rvs)) { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1795 |
System.out.println("method: "+result); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1796 |
System.out.println("expected: "+argstr); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1797 |
System.out.println("returned: "+rvs); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1798 |
assertEquals(argstr, rvs); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1799 |
} |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1800 |
} else { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1801 |
// cannot test... |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
1802 |
} |
4537 | 1803 |
} |
1804 |
||
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1805 |
@Test // SLOW |
4537 | 1806 |
public void testCollectArguments() throws Throwable { |
1807 |
if (CAN_SKIP_WORKING) return; |
|
1808 |
startTest("collectArguments"); |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
1809 |
for (Class<?> argType : new Class<?>[]{Object.class, Integer.class, int.class}) { |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1810 |
if (verbosity >= 3) |
4537 | 1811 |
System.out.println("collectArguments "+argType); |
10081 | 1812 |
for (int nargs = 0; nargs < 50; nargs++) { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1813 |
if (CAN_TEST_LIGHTLY && nargs > 11) break; |
10081 | 1814 |
for (int pos = 0; pos <= nargs; pos++) { |
1815 |
if (CAN_TEST_LIGHTLY && pos > 2 && pos < nargs-2) continue; |
|
1816 |
if (nargs > 10 && pos > 4 && pos < nargs-4 && pos % 10 != 3) |
|
1817 |
continue; |
|
4537 | 1818 |
testCollectArguments(argType, pos, nargs); |
1819 |
} |
|
1820 |
} |
|
1821 |
} |
|
1822 |
} |
|
1823 |
public void testCollectArguments(Class<?> argType, int pos, int nargs) throws Throwable { |
|
1824 |
countTest(); |
|
1825 |
// fake up a MH with the same type as the desired adapter: |
|
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1826 |
MethodHandle fake = varargsArray(nargs); |
4537 | 1827 |
fake = changeArgTypes(fake, argType); |
1828 |
MethodType newType = fake.type(); |
|
1829 |
Object[] args = randomArgs(newType.parameterArray()); |
|
1830 |
// here is what should happen: |
|
1831 |
Object[] collectedArgs = Arrays.copyOfRange(args, 0, pos+1); |
|
1832 |
collectedArgs[pos] = Arrays.copyOfRange(args, pos, args.length); |
|
1833 |
// here is the MH which will witness the collected argument tail: |
|
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1834 |
MethodHandle target = varargsArray(pos+1); |
4537 | 1835 |
target = changeArgTypes(target, 0, pos, argType); |
1836 |
target = changeArgTypes(target, pos, pos+1, Object[].class); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1837 |
if (verbosity >= 3) |
4537 | 1838 |
System.out.println("collect from "+Arrays.asList(args)+" ["+pos+".."+nargs+"]"); |
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1839 |
MethodHandle result = target.asCollector(Object[].class, nargs-pos).asType(newType); |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
1840 |
Object[] returnValue = (Object[]) result.invokeWithArguments(args); |
4537 | 1841 |
// assertTrue(returnValue.length == pos+1 && returnValue[pos] instanceof Object[]); |
1842 |
// returnValue[pos] = Arrays.asList((Object[]) returnValue[pos]); |
|
1843 |
// collectedArgs[pos] = Arrays.asList((Object[]) collectedArgs[pos]); |
|
1844 |
assertArrayEquals(collectedArgs, returnValue); |
|
1845 |
} |
|
1846 |
||
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1847 |
@Test // SLOW |
4535 | 1848 |
public void testInsertArguments() throws Throwable { |
1849 |
if (CAN_SKIP_WORKING) return; |
|
1850 |
startTest("insertArguments"); |
|
10081 | 1851 |
for (int nargs = 0; nargs < 50; nargs++) { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1852 |
if (CAN_TEST_LIGHTLY && nargs > 11) break; |
10081 | 1853 |
for (int ins = 0; ins <= nargs; ins++) { |
1854 |
if (nargs > 10 && ins > 4 && ins < nargs-4 && ins % 10 != 3) |
|
1855 |
continue; |
|
4535 | 1856 |
for (int pos = 0; pos <= nargs; pos++) { |
10081 | 1857 |
if (nargs > 10 && pos > 4 && pos < nargs-4 && pos % 10 != 3) |
1858 |
continue; |
|
1859 |
if (CAN_TEST_LIGHTLY && pos > 2 && pos < nargs-2) continue; |
|
4535 | 1860 |
testInsertArguments(nargs, pos, ins); |
1861 |
} |
|
1862 |
} |
|
1863 |
} |
|
1864 |
} |
|
1865 |
||
1866 |
void testInsertArguments(int nargs, int pos, int ins) throws Throwable { |
|
1867 |
countTest(); |
|
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1868 |
MethodHandle target = varargsArray(nargs + ins); |
4535 | 1869 |
Object[] args = randomArgs(target.type().parameterArray()); |
1870 |
List<Object> resList = Arrays.asList(args); |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
1871 |
List<Object> argsToPass = new ArrayList<>(resList); |
4535 | 1872 |
List<Object> argsToInsert = argsToPass.subList(pos, pos + ins); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1873 |
if (verbosity >= 3) |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
1874 |
System.out.println("insert: "+argsToInsert+" @"+pos+" into "+target); |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
1875 |
@SuppressWarnings("cast") // cast to spread Object... is helpful |
4537 | 1876 |
MethodHandle target2 = MethodHandles.insertArguments(target, pos, |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
1877 |
(Object[]/*...*/) argsToInsert.toArray()); |
4535 | 1878 |
argsToInsert.clear(); // remove from argsToInsert |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
1879 |
Object res2 = target2.invokeWithArguments(argsToPass); |
4535 | 1880 |
Object res2List = Arrays.asList((Object[])res2); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1881 |
if (verbosity >= 3) |
4535 | 1882 |
System.out.println("result: "+res2List); |
1883 |
//if (!resList.equals(res2List)) |
|
1884 |
// System.out.println("*** fail at n/p/i = "+nargs+"/"+pos+"/"+ins+": "+resList+" => "+res2List); |
|
1885 |
assertEquals(resList, res2List); |
|
1886 |
} |
|
1887 |
||
4537 | 1888 |
@Test |
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1889 |
public void testFilterReturnValue() throws Throwable { |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1890 |
if (CAN_SKIP_WORKING) return; |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1891 |
startTest("filterReturnValue"); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1892 |
Class<?> classOfVCList = varargsList(1).invokeWithArguments(0).getClass(); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1893 |
assertTrue(List.class.isAssignableFrom(classOfVCList)); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1894 |
for (int nargs = 0; nargs <= 3; nargs++) { |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
1895 |
for (Class<?> rtype : new Class<?>[] { Object.class, |
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1896 |
List.class, |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1897 |
int.class, |
10081 | 1898 |
byte.class, |
1899 |
long.class, |
|
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1900 |
CharSequence.class, |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1901 |
String.class }) { |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1902 |
testFilterReturnValue(nargs, rtype); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1903 |
} |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1904 |
} |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1905 |
} |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1906 |
|
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1907 |
void testFilterReturnValue(int nargs, Class<?> rtype) throws Throwable { |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1908 |
countTest(); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1909 |
MethodHandle target = varargsList(nargs, rtype); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1910 |
MethodHandle filter; |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1911 |
if (List.class.isAssignableFrom(rtype) || rtype.isAssignableFrom(List.class)) |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1912 |
filter = varargsList(1); // add another layer of list-ness |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1913 |
else |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1914 |
filter = MethodHandles.identity(rtype); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1915 |
filter = filter.asType(MethodType.methodType(target.type().returnType(), rtype)); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1916 |
Object[] argsToPass = randomArgs(nargs, Object.class); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1917 |
if (verbosity >= 3) |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1918 |
System.out.println("filter "+target+" to "+rtype.getSimpleName()+" with "+filter); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1919 |
MethodHandle target2 = MethodHandles.filterReturnValue(target, filter); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1920 |
if (verbosity >= 4) |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1921 |
System.out.println("filtered target: "+target2); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1922 |
// Simulate expected effect of filter on return value: |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1923 |
Object unfiltered = target.invokeWithArguments(argsToPass); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1924 |
Object expected = filter.invokeWithArguments(unfiltered); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1925 |
if (verbosity >= 4) |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1926 |
System.out.println("unfiltered: "+unfiltered+" : "+unfiltered.getClass().getSimpleName()); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1927 |
if (verbosity >= 4) |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1928 |
System.out.println("expected: "+expected+" : "+expected.getClass().getSimpleName()); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1929 |
Object result = target2.invokeWithArguments(argsToPass); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1930 |
if (verbosity >= 3) |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1931 |
System.out.println("result: "+result+" : "+result.getClass().getSimpleName()); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1932 |
if (!expected.equals(result)) |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1933 |
System.out.println("*** fail at n/rt = "+nargs+"/"+rtype.getSimpleName()+": "+Arrays.asList(argsToPass)+" => "+result+" != "+expected); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1934 |
assertEquals(expected, result); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1935 |
} |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1936 |
|
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1937 |
@Test |
4537 | 1938 |
public void testFilterArguments() throws Throwable { |
1939 |
if (CAN_SKIP_WORKING) return; |
|
1940 |
startTest("filterArguments"); |
|
1941 |
for (int nargs = 1; nargs <= 6; nargs++) { |
|
1942 |
for (int pos = 0; pos < nargs; pos++) { |
|
1943 |
testFilterArguments(nargs, pos); |
|
1944 |
} |
|
1945 |
} |
|
1946 |
} |
|
1947 |
||
1948 |
void testFilterArguments(int nargs, int pos) throws Throwable { |
|
1949 |
countTest(); |
|
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1950 |
MethodHandle target = varargsList(nargs); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1951 |
MethodHandle filter = varargsList(1); |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
1952 |
filter = filter.asType(filter.type().generic()); |
4537 | 1953 |
Object[] argsToPass = randomArgs(nargs, Object.class); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1954 |
if (verbosity >= 3) |
4537 | 1955 |
System.out.println("filter "+target+" at "+pos+" with "+filter); |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
1956 |
MethodHandle target2 = MethodHandles.filterArguments(target, pos, filter); |
4537 | 1957 |
// Simulate expected effect of filter on arglist: |
1958 |
Object[] filteredArgs = argsToPass.clone(); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1959 |
filteredArgs[pos] = filter.invokeExact(filteredArgs[pos]); |
4537 | 1960 |
List<Object> expected = Arrays.asList(filteredArgs); |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
1961 |
Object result = target2.invokeWithArguments(argsToPass); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1962 |
if (verbosity >= 3) |
4537 | 1963 |
System.out.println("result: "+result); |
1964 |
if (!expected.equals(result)) |
|
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1965 |
System.out.println("*** fail at n/p = "+nargs+"/"+pos+": "+Arrays.asList(argsToPass)+" => "+result+" != "+expected); |
4537 | 1966 |
assertEquals(expected, result); |
1967 |
} |
|
1968 |
||
1969 |
@Test |
|
1970 |
public void testFoldArguments() throws Throwable { |
|
1971 |
if (CAN_SKIP_WORKING) return; |
|
1972 |
startTest("foldArguments"); |
|
1973 |
for (int nargs = 0; nargs <= 4; nargs++) { |
|
1974 |
for (int fold = 0; fold <= nargs; fold++) { |
|
1975 |
for (int pos = 0; pos <= nargs; pos++) { |
|
1976 |
testFoldArguments(nargs, pos, fold); |
|
1977 |
} |
|
1978 |
} |
|
1979 |
} |
|
1980 |
} |
|
1981 |
||
1982 |
void testFoldArguments(int nargs, int pos, int fold) throws Throwable { |
|
1983 |
if (pos != 0) return; // can fold only at pos=0 for now |
|
1984 |
countTest(); |
|
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1985 |
MethodHandle target = varargsList(1 + nargs); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
1986 |
MethodHandle combine = varargsList(fold).asType(MethodType.genericMethodType(fold)); |
4537 | 1987 |
List<Object> argsToPass = Arrays.asList(randomArgs(nargs, Object.class)); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1988 |
if (verbosity >= 3) |
4537 | 1989 |
System.out.println("fold "+target+" with "+combine); |
1990 |
MethodHandle target2 = MethodHandles.foldArguments(target, combine); |
|
1991 |
// Simulate expected effect of combiner on arglist: |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
1992 |
List<Object> expected = new ArrayList<>(argsToPass); |
4537 | 1993 |
List<Object> argsToFold = expected.subList(pos, pos + fold); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1994 |
if (verbosity >= 3) |
4537 | 1995 |
System.out.println("fold: "+argsToFold+" into "+target2); |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
1996 |
Object foldedArgs = combine.invokeWithArguments(argsToFold); |
4537 | 1997 |
argsToFold.add(0, foldedArgs); |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
1998 |
Object result = target2.invokeWithArguments(argsToPass); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
1999 |
if (verbosity >= 3) |
4537 | 2000 |
System.out.println("result: "+result); |
2001 |
if (!expected.equals(result)) |
|
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
2002 |
System.out.println("*** fail at n/p/f = "+nargs+"/"+pos+"/"+fold+": "+argsToPass+" => "+result+" != "+expected); |
4537 | 2003 |
assertEquals(expected, result); |
2004 |
} |
|
2005 |
||
2006 |
@Test |
|
2007 |
public void testDropArguments() throws Throwable { |
|
2008 |
if (CAN_SKIP_WORKING) return; |
|
2009 |
startTest("dropArguments"); |
|
2010 |
for (int nargs = 0; nargs <= 4; nargs++) { |
|
2011 |
for (int drop = 1; drop <= 4; drop++) { |
|
2012 |
for (int pos = 0; pos <= nargs; pos++) { |
|
2013 |
testDropArguments(nargs, pos, drop); |
|
2014 |
} |
|
2015 |
} |
|
2016 |
} |
|
2017 |
} |
|
2018 |
||
2019 |
void testDropArguments(int nargs, int pos, int drop) throws Throwable { |
|
2020 |
countTest(); |
|
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
2021 |
MethodHandle target = varargsArray(nargs); |
4537 | 2022 |
Object[] args = randomArgs(target.type().parameterArray()); |
2023 |
MethodHandle target2 = MethodHandles.dropArguments(target, pos, |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2024 |
Collections.nCopies(drop, Object.class).toArray(new Class<?>[0])); |
4537 | 2025 |
List<Object> resList = Arrays.asList(args); |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2026 |
List<Object> argsToDrop = new ArrayList<>(resList); |
4537 | 2027 |
for (int i = drop; i > 0; i--) { |
2028 |
argsToDrop.add(pos, "blort#"+i); |
|
2029 |
} |
|
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2030 |
Object res2 = target2.invokeWithArguments(argsToDrop); |
4537 | 2031 |
Object res2List = Arrays.asList((Object[])res2); |
2032 |
//if (!resList.equals(res2List)) |
|
2033 |
// System.out.println("*** fail at n/p/d = "+nargs+"/"+pos+"/"+drop+": "+argsToDrop+" => "+res2List); |
|
2034 |
assertEquals(resList, res2List); |
|
2035 |
} |
|
2036 |
||
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
2037 |
@Test // SLOW |
4537 | 2038 |
public void testInvokers() throws Throwable { |
2039 |
if (CAN_SKIP_WORKING) return; |
|
2040 |
startTest("exactInvoker, genericInvoker, varargsInvoker, dynamicInvoker"); |
|
2041 |
// exactInvoker, genericInvoker, varargsInvoker[0..N], dynamicInvoker |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2042 |
Set<MethodType> done = new HashSet<>(); |
4537 | 2043 |
for (int i = 0; i <= 6; i++) { |
10081 | 2044 |
if (CAN_TEST_LIGHTLY && i > 3) break; |
4537 | 2045 |
MethodType gtype = MethodType.genericMethodType(i); |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2046 |
for (Class<?> argType : new Class<?>[]{Object.class, Integer.class, int.class}) { |
4537 | 2047 |
for (int j = -1; j < i; j++) { |
2048 |
MethodType type = gtype; |
|
2049 |
if (j < 0) |
|
2050 |
type = type.changeReturnType(argType); |
|
2051 |
else if (argType == void.class) |
|
2052 |
continue; |
|
2053 |
else |
|
2054 |
type = type.changeParameterType(j, argType); |
|
2055 |
if (done.add(type)) |
|
2056 |
testInvokers(type); |
|
2057 |
MethodType vtype = type.changeReturnType(void.class); |
|
2058 |
if (done.add(vtype)) |
|
2059 |
testInvokers(vtype); |
|
2060 |
} |
|
2061 |
} |
|
2062 |
} |
|
2063 |
} |
|
2064 |
||
2065 |
public void testInvokers(MethodType type) throws Throwable { |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2066 |
if (verbosity >= 3) |
4537 | 2067 |
System.out.println("test invokers for "+type); |
2068 |
int nargs = type.parameterCount(); |
|
2069 |
boolean testRetCode = type.returnType() != void.class; |
|
2070 |
MethodHandle target = PRIVATE.findStatic(MethodHandlesTest.class, "invokee", |
|
2071 |
MethodType.genericMethodType(0, true)); |
|
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
2072 |
assertTrue(target.isVarargsCollector()); |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
2073 |
target = target.asType(type); |
4537 | 2074 |
Object[] args = randomArgs(type.parameterArray()); |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2075 |
List<Object> targetPlusArgs = new ArrayList<>(Arrays.asList(args)); |
4537 | 2076 |
targetPlusArgs.add(0, target); |
2077 |
int code = (Integer) invokee(args); |
|
2078 |
Object log = logEntry("invokee", args); |
|
2079 |
assertEquals(log.hashCode(), code); |
|
2080 |
assertCalled("invokee", args); |
|
2081 |
MethodHandle inv; |
|
2082 |
Object result; |
|
2083 |
// exact invoker |
|
2084 |
countTest(); |
|
2085 |
calledLog.clear(); |
|
2086 |
inv = MethodHandles.exactInvoker(type); |
|
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2087 |
result = inv.invokeWithArguments(targetPlusArgs); |
4537 | 2088 |
if (testRetCode) assertEquals(code, result); |
2089 |
assertCalled("invokee", args); |
|
2090 |
// generic invoker |
|
2091 |
countTest(); |
|
9645
dabb5e4edc4c
7034977: JSR 292 MethodHandle.invokeGeneric should be renamed MethodHandle.invoke
jrose
parents:
9033
diff
changeset
|
2092 |
inv = MethodHandles.invoker(type); |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2093 |
if (nargs <= 3 && type == type.generic()) { |
4537 | 2094 |
calledLog.clear(); |
2095 |
switch (nargs) { |
|
2096 |
case 0: |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2097 |
result = inv.invokeExact(target); |
4537 | 2098 |
break; |
2099 |
case 1: |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2100 |
result = inv.invokeExact(target, args[0]); |
4537 | 2101 |
break; |
2102 |
case 2: |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2103 |
result = inv.invokeExact(target, args[0], args[1]); |
4537 | 2104 |
break; |
2105 |
case 3: |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2106 |
result = inv.invokeExact(target, args[0], args[1], args[2]); |
4537 | 2107 |
break; |
2108 |
} |
|
2109 |
if (testRetCode) assertEquals(code, result); |
|
2110 |
assertCalled("invokee", args); |
|
2111 |
} |
|
2112 |
calledLog.clear(); |
|
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2113 |
result = inv.invokeWithArguments(targetPlusArgs); |
4537 | 2114 |
if (testRetCode) assertEquals(code, result); |
2115 |
assertCalled("invokee", args); |
|
2116 |
// varargs invoker #0 |
|
2117 |
calledLog.clear(); |
|
8345
9e2483e6cfab
7013417: JSR 292 needs to support variadic method handle calls
jrose
parents:
7562
diff
changeset
|
2118 |
inv = MethodHandles.spreadInvoker(type, 0); |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2119 |
if (type.returnType() == Object.class) { |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2120 |
result = inv.invokeExact(target, args); |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2121 |
} else if (type.returnType() == void.class) { |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2122 |
result = null; inv.invokeExact(target, args); |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2123 |
} else { |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2124 |
result = inv.invokeWithArguments(target, (Object) args); |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2125 |
} |
4537 | 2126 |
if (testRetCode) assertEquals(code, result); |
2127 |
assertCalled("invokee", args); |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2128 |
if (nargs >= 1 && type == type.generic()) { |
4537 | 2129 |
// varargs invoker #1 |
2130 |
calledLog.clear(); |
|
8345
9e2483e6cfab
7013417: JSR 292 needs to support variadic method handle calls
jrose
parents:
7562
diff
changeset
|
2131 |
inv = MethodHandles.spreadInvoker(type, 1); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2132 |
result = inv.invokeExact(target, args[0], Arrays.copyOfRange(args, 1, nargs)); |
4537 | 2133 |
if (testRetCode) assertEquals(code, result); |
2134 |
assertCalled("invokee", args); |
|
2135 |
} |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2136 |
if (nargs >= 2 && type == type.generic()) { |
4537 | 2137 |
// varargs invoker #2 |
2138 |
calledLog.clear(); |
|
8345
9e2483e6cfab
7013417: JSR 292 needs to support variadic method handle calls
jrose
parents:
7562
diff
changeset
|
2139 |
inv = MethodHandles.spreadInvoker(type, 2); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2140 |
result = inv.invokeExact(target, args[0], args[1], Arrays.copyOfRange(args, 2, nargs)); |
4537 | 2141 |
if (testRetCode) assertEquals(code, result); |
2142 |
assertCalled("invokee", args); |
|
2143 |
} |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2144 |
if (nargs >= 3 && type == type.generic()) { |
4537 | 2145 |
// varargs invoker #3 |
2146 |
calledLog.clear(); |
|
8345
9e2483e6cfab
7013417: JSR 292 needs to support variadic method handle calls
jrose
parents:
7562
diff
changeset
|
2147 |
inv = MethodHandles.spreadInvoker(type, 3); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2148 |
result = inv.invokeExact(target, args[0], args[1], args[2], Arrays.copyOfRange(args, 3, nargs)); |
4537 | 2149 |
if (testRetCode) assertEquals(code, result); |
2150 |
assertCalled("invokee", args); |
|
2151 |
} |
|
2152 |
for (int k = 0; k <= nargs; k++) { |
|
2153 |
// varargs invoker #0..N |
|
10081 | 2154 |
if (CAN_TEST_LIGHTLY && (k > 1 || k < nargs - 1)) continue; |
4537 | 2155 |
countTest(); |
2156 |
calledLog.clear(); |
|
8345
9e2483e6cfab
7013417: JSR 292 needs to support variadic method handle calls
jrose
parents:
7562
diff
changeset
|
2157 |
inv = MethodHandles.spreadInvoker(type, k); |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2158 |
MethodType expType = (type.dropParameterTypes(k, nargs) |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2159 |
.appendParameterTypes(Object[].class) |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2160 |
.insertParameterTypes(0, MethodHandle.class)); |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2161 |
assertEquals(expType, inv.type()); |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2162 |
List<Object> targetPlusVarArgs = new ArrayList<>(targetPlusArgs); |
4537 | 2163 |
List<Object> tailList = targetPlusVarArgs.subList(1+k, 1+nargs); |
2164 |
Object[] tail = tailList.toArray(); |
|
2165 |
tailList.clear(); tailList.add(tail); |
|
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2166 |
result = inv.invokeWithArguments(targetPlusVarArgs); |
4537 | 2167 |
if (testRetCode) assertEquals(code, result); |
2168 |
assertCalled("invokee", args); |
|
2169 |
} |
|
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2170 |
|
4537 | 2171 |
// dynamic invoker |
2172 |
countTest(); |
|
7562
a0ad195efe2c
7001424: implement JSR 292 EG adjustments, November 2010
jrose
parents:
7556
diff
changeset
|
2173 |
CallSite site = new MutableCallSite(type); |
a0ad195efe2c
7001424: implement JSR 292 EG adjustments, November 2010
jrose
parents:
7556
diff
changeset
|
2174 |
inv = site.dynamicInvoker(); |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2175 |
|
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2176 |
// see if we get the result of the original target: |
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2177 |
try { |
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2178 |
result = inv.invokeWithArguments(args); |
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2179 |
assertTrue("should not reach here", false); |
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2180 |
} catch (IllegalStateException ex) { |
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2181 |
String msg = ex.getMessage(); |
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2182 |
assertTrue(msg, msg.contains("site")); |
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2183 |
} |
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2184 |
|
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2185 |
// set new target after invoker is created, to make sure we track target |
4537 | 2186 |
site.setTarget(target); |
2187 |
calledLog.clear(); |
|
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2188 |
result = inv.invokeWithArguments(args); |
4537 | 2189 |
if (testRetCode) assertEquals(code, result); |
2190 |
assertCalled("invokee", args); |
|
2191 |
} |
|
2192 |
||
2193 |
static Object invokee(Object... args) { |
|
2194 |
return called("invokee", args).hashCode(); |
|
2195 |
} |
|
2196 |
||
4535 | 2197 |
private static final String MISSING_ARG = "missingArg"; |
10081 | 2198 |
private static final String MISSING_ARG_2 = "missingArg#2"; |
4535 | 2199 |
static Object targetIfEquals() { |
2200 |
return called("targetIfEquals"); |
|
2201 |
} |
|
2202 |
static Object fallbackIfNotEquals() { |
|
2203 |
return called("fallbackIfNotEquals"); |
|
2204 |
} |
|
2205 |
static Object targetIfEquals(Object x) { |
|
2206 |
assertEquals(x, MISSING_ARG); |
|
2207 |
return called("targetIfEquals", x); |
|
2208 |
} |
|
2209 |
static Object fallbackIfNotEquals(Object x) { |
|
2210 |
assertFalse(x.toString(), x.equals(MISSING_ARG)); |
|
2211 |
return called("fallbackIfNotEquals", x); |
|
2212 |
} |
|
2213 |
static Object targetIfEquals(Object x, Object y) { |
|
2214 |
assertEquals(x, y); |
|
2215 |
return called("targetIfEquals", x, y); |
|
2216 |
} |
|
2217 |
static Object fallbackIfNotEquals(Object x, Object y) { |
|
2218 |
assertFalse(x.toString(), x.equals(y)); |
|
2219 |
return called("fallbackIfNotEquals", x, y); |
|
2220 |
} |
|
2221 |
static Object targetIfEquals(Object x, Object y, Object z) { |
|
2222 |
assertEquals(x, y); |
|
2223 |
return called("targetIfEquals", x, y, z); |
|
2224 |
} |
|
2225 |
static Object fallbackIfNotEquals(Object x, Object y, Object z) { |
|
2226 |
assertFalse(x.toString(), x.equals(y)); |
|
2227 |
return called("fallbackIfNotEquals", x, y, z); |
|
2228 |
} |
|
2229 |
||
4537 | 2230 |
@Test |
2231 |
public void testGuardWithTest() throws Throwable { |
|
2232 |
if (CAN_SKIP_WORKING) return; |
|
2233 |
startTest("guardWithTest"); |
|
10081 | 2234 |
for (int nargs = 0; nargs <= 50; nargs++) { |
2235 |
if (CAN_TEST_LIGHTLY && nargs > 7) break; |
|
4537 | 2236 |
testGuardWithTest(nargs, Object.class); |
2237 |
testGuardWithTest(nargs, String.class); |
|
2238 |
} |
|
2239 |
} |
|
2240 |
void testGuardWithTest(int nargs, Class<?> argClass) throws Throwable { |
|
10081 | 2241 |
testGuardWithTest(nargs, 0, argClass); |
2242 |
if (nargs <= 5 || nargs % 10 == 3) { |
|
2243 |
for (int testDrops = 1; testDrops <= nargs; testDrops++) |
|
2244 |
testGuardWithTest(nargs, testDrops, argClass); |
|
2245 |
} |
|
2246 |
} |
|
2247 |
void testGuardWithTest(int nargs, int testDrops, Class<?> argClass) throws Throwable { |
|
4537 | 2248 |
countTest(); |
10081 | 2249 |
int nargs1 = Math.min(3, nargs); |
4537 | 2250 |
MethodHandle test = PRIVATE.findVirtual(Object.class, "equals", MethodType.methodType(boolean.class, Object.class)); |
10081 | 2251 |
MethodHandle target = PRIVATE.findStatic(MethodHandlesTest.class, "targetIfEquals", MethodType.genericMethodType(nargs1)); |
2252 |
MethodHandle fallback = PRIVATE.findStatic(MethodHandlesTest.class, "fallbackIfNotEquals", MethodType.genericMethodType(nargs1)); |
|
4537 | 2253 |
while (test.type().parameterCount() > nargs) |
10081 | 2254 |
// 0: test = constant(MISSING_ARG.equals(MISSING_ARG)) |
2255 |
// 1: test = lambda (_) MISSING_ARG.equals(_) |
|
4537 | 2256 |
test = MethodHandles.insertArguments(test, 0, MISSING_ARG); |
2257 |
if (argClass != Object.class) { |
|
2258 |
test = changeArgTypes(test, argClass); |
|
2259 |
target = changeArgTypes(target, argClass); |
|
2260 |
fallback = changeArgTypes(fallback, argClass); |
|
2261 |
} |
|
10081 | 2262 |
int testArgs = nargs - testDrops; |
2263 |
assert(testArgs >= 0); |
|
2264 |
test = addTrailingArgs(test, Math.min(testArgs, nargs), argClass); |
|
2265 |
target = addTrailingArgs(target, nargs, argClass); |
|
2266 |
fallback = addTrailingArgs(fallback, nargs, argClass); |
|
4537 | 2267 |
Object[][] argLists = { |
2268 |
{ }, |
|
2269 |
{ "foo" }, { MISSING_ARG }, |
|
2270 |
{ "foo", "foo" }, { "foo", "bar" }, |
|
2271 |
{ "foo", "foo", "baz" }, { "foo", "bar", "baz" } |
|
2272 |
}; |
|
2273 |
for (Object[] argList : argLists) { |
|
10081 | 2274 |
Object[] argList1 = argList; |
2275 |
if (argList.length != nargs) { |
|
2276 |
if (argList.length != nargs1) continue; |
|
2277 |
argList1 = Arrays.copyOf(argList, nargs); |
|
2278 |
Arrays.fill(argList1, nargs1, nargs, MISSING_ARG_2); |
|
2279 |
} |
|
2280 |
MethodHandle test1 = test; |
|
2281 |
if (test1.type().parameterCount() > testArgs) { |
|
2282 |
int pc = test1.type().parameterCount(); |
|
2283 |
test1 = MethodHandles.insertArguments(test, testArgs, Arrays.copyOfRange(argList1, testArgs, pc)); |
|
2284 |
} |
|
2285 |
MethodHandle mh = MethodHandles.guardWithTest(test1, target, fallback); |
|
2286 |
assertEquals(target.type(), mh.type()); |
|
4537 | 2287 |
boolean equals; |
2288 |
switch (nargs) { |
|
2289 |
case 0: equals = true; break; |
|
2290 |
case 1: equals = MISSING_ARG.equals(argList[0]); break; |
|
2291 |
default: equals = argList[0].equals(argList[1]); break; |
|
2292 |
} |
|
2293 |
String willCall = (equals ? "targetIfEquals" : "fallbackIfNotEquals"); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2294 |
if (verbosity >= 3) |
4537 | 2295 |
System.out.println(logEntry(willCall, argList)); |
10081 | 2296 |
Object result = mh.invokeWithArguments(argList1); |
4537 | 2297 |
assertCalled(willCall, argList); |
2298 |
} |
|
2299 |
} |
|
2300 |
||
2301 |
@Test |
|
2302 |
public void testCatchException() throws Throwable { |
|
2303 |
if (CAN_SKIP_WORKING) return; |
|
2304 |
startTest("catchException"); |
|
10081 | 2305 |
for (int nargs = 0; nargs < 40; nargs++) { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
2306 |
if (CAN_TEST_LIGHTLY && nargs > 11) break; |
10081 | 2307 |
for (int throwMode = 0; throwMode < THROW_MODE_LIMIT; throwMode++) { |
2308 |
testCatchException(int.class, new ClassCastException("testing"), throwMode, nargs); |
|
2309 |
if (CAN_TEST_LIGHTLY && nargs > 3) continue; |
|
2310 |
testCatchException(void.class, new java.io.IOException("testing"), throwMode, nargs); |
|
2311 |
testCatchException(String.class, new LinkageError("testing"), throwMode, nargs); |
|
4537 | 2312 |
} |
2313 |
} |
|
2314 |
} |
|
2315 |
||
10081 | 2316 |
static final int THROW_NOTHING = 0, THROW_CAUGHT = 1, THROW_UNCAUGHT = 2, THROW_THROUGH_ADAPTER = 3, THROW_MODE_LIMIT = 4; |
2317 |
||
2318 |
void testCatchException(Class<?> returnType, Throwable thrown, int throwMode, int nargs) throws Throwable { |
|
2319 |
testCatchException(returnType, thrown, throwMode, nargs, 0); |
|
2320 |
if (nargs <= 5 || nargs % 10 == 3) { |
|
2321 |
for (int catchDrops = 1; catchDrops <= nargs; catchDrops++) |
|
2322 |
testCatchException(returnType, thrown, throwMode, nargs, catchDrops); |
|
2323 |
} |
|
2324 |
} |
|
2325 |
||
4537 | 2326 |
private static <T extends Throwable> |
2327 |
Object throwOrReturn(Object normal, T exception) throws T { |
|
10081 | 2328 |
if (exception != null) { |
2329 |
called("throwOrReturn/throw", normal, exception); |
|
2330 |
throw exception; |
|
2331 |
} |
|
2332 |
called("throwOrReturn/normal", normal, exception); |
|
4537 | 2333 |
return normal; |
2334 |
} |
|
10081 | 2335 |
private int fakeIdentityCount; |
2336 |
private Object fakeIdentity(Object x) { |
|
2337 |
System.out.println("should throw through this!"); |
|
2338 |
fakeIdentityCount++; |
|
2339 |
return x; |
|
2340 |
} |
|
4537 | 2341 |
|
10081 | 2342 |
void testCatchException(Class<?> returnType, Throwable thrown, int throwMode, int nargs, int catchDrops) throws Throwable { |
4537 | 2343 |
countTest(); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2344 |
if (verbosity >= 3) |
10081 | 2345 |
System.out.println("catchException rt="+returnType+" throw="+throwMode+" nargs="+nargs+" drops="+catchDrops); |
4537 | 2346 |
Class<? extends Throwable> exType = thrown.getClass(); |
10081 | 2347 |
if (throwMode > THROW_CAUGHT) thrown = new UnsupportedOperationException("do not catch this"); |
4537 | 2348 |
MethodHandle throwOrReturn |
2349 |
= PRIVATE.findStatic(MethodHandlesTest.class, "throwOrReturn", |
|
2350 |
MethodType.methodType(Object.class, Object.class, Throwable.class)); |
|
10081 | 2351 |
if (throwMode == THROW_THROUGH_ADAPTER) { |
2352 |
MethodHandle fakeIdentity |
|
2353 |
= PRIVATE.findVirtual(MethodHandlesTest.class, "fakeIdentity", |
|
2354 |
MethodType.methodType(Object.class, Object.class)).bindTo(this); |
|
2355 |
for (int i = 0; i < 10; i++) |
|
2356 |
throwOrReturn = MethodHandles.filterReturnValue(throwOrReturn, fakeIdentity); |
|
2357 |
} |
|
2358 |
int nargs1 = Math.max(2, nargs); |
|
7562
a0ad195efe2c
7001424: implement JSR 292 EG adjustments, November 2010
jrose
parents:
7556
diff
changeset
|
2359 |
MethodHandle thrower = throwOrReturn.asType(MethodType.genericMethodType(2)); |
10081 | 2360 |
thrower = addTrailingArgs(thrower, nargs, Object.class); |
2361 |
int catchArgc = 1 + nargs - catchDrops; |
|
2362 |
MethodHandle catcher = varargsList(catchArgc).asType(MethodType.genericMethodType(catchArgc)); |
|
2363 |
Object[] args = randomArgs(nargs, Object.class); |
|
2364 |
Object arg0 = MISSING_ARG; |
|
2365 |
Object arg1 = (throwMode == THROW_NOTHING) ? (Throwable) null : thrown; |
|
2366 |
if (nargs > 0) arg0 = args[0]; |
|
2367 |
if (nargs > 1) args[1] = arg1; |
|
2368 |
assertEquals(nargs1, thrower.type().parameterCount()); |
|
2369 |
if (nargs < nargs1) { |
|
2370 |
Object[] appendArgs = { arg0, arg1 }; |
|
2371 |
appendArgs = Arrays.copyOfRange(appendArgs, nargs, nargs1); |
|
2372 |
thrower = MethodHandles.insertArguments(thrower, nargs, appendArgs); |
|
2373 |
} |
|
2374 |
assertEquals(nargs, thrower.type().parameterCount()); |
|
2375 |
MethodHandle target = MethodHandles.catchException(thrower, exType, catcher); |
|
4537 | 2376 |
assertEquals(thrower.type(), target.type()); |
10081 | 2377 |
assertEquals(nargs, target.type().parameterCount()); |
4537 | 2378 |
//System.out.println("catching with "+target+" : "+throwOrReturn); |
10081 | 2379 |
Object returned; |
2380 |
try { |
|
2381 |
returned = target.invokeWithArguments(args); |
|
2382 |
} catch (Throwable ex) { |
|
2383 |
assertSame("must get the out-of-band exception", thrown, ex); |
|
2384 |
if (throwMode <= THROW_CAUGHT) |
|
2385 |
assertEquals(THROW_UNCAUGHT, throwMode); |
|
2386 |
returned = ex; |
|
2387 |
} |
|
2388 |
assertCalled("throwOrReturn/"+(throwMode == THROW_NOTHING ? "normal" : "throw"), arg0, arg1); |
|
4537 | 2389 |
//System.out.println("return from "+target+" : "+returned); |
10081 | 2390 |
if (throwMode == THROW_NOTHING) { |
2391 |
assertSame(arg0, returned); |
|
2392 |
} else if (throwMode == THROW_CAUGHT) { |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2393 |
List<Object> catchArgs = new ArrayList<>(Arrays.asList(args)); |
10081 | 2394 |
// catcher receives an initial subsequence of target arguments: |
2395 |
catchArgs.subList(nargs - catchDrops, nargs).clear(); |
|
2396 |
// catcher also receives the exception, prepended: |
|
4537 | 2397 |
catchArgs.add(0, thrown); |
2398 |
assertEquals(catchArgs, returned); |
|
2399 |
} |
|
10081 | 2400 |
assertEquals(0, fakeIdentityCount); |
4537 | 2401 |
} |
2402 |
||
2403 |
@Test |
|
2404 |
public void testThrowException() throws Throwable { |
|
2405 |
if (CAN_SKIP_WORKING) return; |
|
2406 |
startTest("throwException"); |
|
2407 |
testThrowException(int.class, new ClassCastException("testing")); |
|
2408 |
testThrowException(void.class, new java.io.IOException("testing")); |
|
2409 |
testThrowException(String.class, new LinkageError("testing")); |
|
2410 |
} |
|
2411 |
||
2412 |
void testThrowException(Class<?> returnType, Throwable thrown) throws Throwable { |
|
2413 |
countTest(); |
|
2414 |
Class<? extends Throwable> exType = thrown.getClass(); |
|
2415 |
MethodHandle target = MethodHandles.throwException(returnType, exType); |
|
2416 |
//System.out.println("throwing with "+target+" : "+thrown); |
|
2417 |
MethodType expectedType = MethodType.methodType(returnType, exType); |
|
2418 |
assertEquals(expectedType, target.type()); |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2419 |
target = target.asType(target.type().generic()); |
4537 | 2420 |
Throwable caught = null; |
2421 |
try { |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2422 |
Object res = target.invokeExact((Object) thrown); |
4537 | 2423 |
fail("got "+res+" instead of throwing "+thrown); |
2424 |
} catch (Throwable ex) { |
|
2425 |
if (ex != thrown) { |
|
2426 |
if (ex instanceof Error) throw (Error)ex; |
|
2427 |
if (ex instanceof RuntimeException) throw (RuntimeException)ex; |
|
2428 |
} |
|
2429 |
caught = ex; |
|
2430 |
} |
|
2431 |
assertSame(thrown, caught); |
|
2432 |
} |
|
2433 |
||
13610
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2434 |
@Test |
10081 | 2435 |
public void testInterfaceCast() throws Throwable { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
2436 |
//if (CAN_SKIP_WORKING) return; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
2437 |
startTest("interfaceCast"); |
13610
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2438 |
assert( (((Object)"foo") instanceof CharSequence)); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2439 |
assert(!(((Object)"foo") instanceof Iterable)); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2440 |
for (MethodHandle mh : new MethodHandle[]{ |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2441 |
MethodHandles.identity(String.class), |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2442 |
MethodHandles.identity(CharSequence.class), |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2443 |
MethodHandles.identity(Iterable.class) |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2444 |
}) { |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2445 |
if (verbosity > 0) System.out.println("-- mh = "+mh); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2446 |
for (Class<?> ctype : new Class<?>[]{ |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2447 |
Object.class, String.class, CharSequence.class, |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2448 |
Number.class, Iterable.class |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2449 |
}) { |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2450 |
if (verbosity > 0) System.out.println("---- ctype = "+ctype.getName()); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2451 |
// doret docast |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2452 |
testInterfaceCast(mh, ctype, false, false); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2453 |
testInterfaceCast(mh, ctype, true, false); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2454 |
testInterfaceCast(mh, ctype, false, true); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2455 |
testInterfaceCast(mh, ctype, true, true); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2456 |
} |
10081 | 2457 |
} |
2458 |
} |
|
13610
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2459 |
private static Class<?> i2o(Class<?> c) { |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2460 |
return (c.isInterface() ? Object.class : c); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2461 |
} |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2462 |
public void testInterfaceCast(MethodHandle mh, Class<?> ctype, |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2463 |
boolean doret, boolean docast) throws Throwable { |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2464 |
MethodHandle mh0 = mh; |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2465 |
if (verbosity > 1) |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2466 |
System.out.println("mh="+mh+", ctype="+ctype.getName()+", doret="+doret+", docast="+docast); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2467 |
String normalRetVal = "normal return value"; |
10081 | 2468 |
MethodType mt = mh.type(); |
13610
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2469 |
MethodType mt0 = mt; |
10081 | 2470 |
if (doret) mt = mt.changeReturnType(ctype); |
2471 |
else mt = mt.changeParameterType(0, ctype); |
|
2472 |
if (docast) mh = MethodHandles.explicitCastArguments(mh, mt); |
|
2473 |
else mh = mh.asType(mt); |
|
13610
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2474 |
assertEquals(mt, mh.type()); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2475 |
MethodType mt1 = mt; |
10081 | 2476 |
// this bit is needed to make the interface types disappear for invokeWithArguments: |
2477 |
mh = MethodHandles.explicitCastArguments(mh, mt.generic()); |
|
13610
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2478 |
Class<?>[] step = { |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2479 |
mt1.parameterType(0), // param as passed to mh at first |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2480 |
mt0.parameterType(0), // param after incoming cast |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2481 |
mt0.returnType(), // return value before cast |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2482 |
mt1.returnType(), // return value after outgoing cast |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2483 |
}; |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2484 |
// where might a checkCast occur? |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2485 |
boolean[] checkCast = new boolean[step.length]; |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2486 |
// the string value must pass each step without causing an exception |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2487 |
if (!docast) { |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2488 |
if (!doret) { |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2489 |
if (step[0] != step[1]) |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2490 |
checkCast[1] = true; // incoming value is cast |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2491 |
} else { |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2492 |
if (step[2] != step[3]) |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2493 |
checkCast[3] = true; // outgoing value is cast |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2494 |
} |
10081 | 2495 |
} |
13610
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2496 |
boolean expectFail = false; |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2497 |
for (int i = 0; i < step.length; i++) { |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2498 |
Class<?> c = step[i]; |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2499 |
if (!checkCast[i]) c = i2o(c); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2500 |
if (!c.isInstance(normalRetVal)) { |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2501 |
if (verbosity > 3) |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2502 |
System.out.println("expect failure at step "+i+" in "+Arrays.toString(step)+Arrays.toString(checkCast)); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2503 |
expectFail = true; |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2504 |
break; |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2505 |
} |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2506 |
} |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2507 |
countTest(!expectFail); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2508 |
if (verbosity > 2) |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2509 |
System.out.println("expectFail="+expectFail+", mt="+mt); |
10081 | 2510 |
Object res; |
2511 |
try { |
|
13610
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2512 |
res = mh.invokeWithArguments(normalRetVal); |
10081 | 2513 |
} catch (Exception ex) { |
2514 |
res = ex; |
|
2515 |
} |
|
2516 |
boolean sawFail = !(res instanceof String); |
|
2517 |
if (sawFail != expectFail) { |
|
13610
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2518 |
System.out.println("*** testInterfaceCast: mh0 = "+mh0); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2519 |
System.out.println(" retype using "+(docast ? "explicitCastArguments" : "asType")+" to "+mt+" => "+mh); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2520 |
System.out.println(" call returned "+res); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2521 |
System.out.println(" expected "+(expectFail ? "an exception" : normalRetVal)); |
10081 | 2522 |
} |
13610
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2523 |
if (!expectFail) { |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2524 |
assertFalse(res.toString(), sawFail); |
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2525 |
assertEquals(normalRetVal, res); |
10081 | 2526 |
} else { |
13610
28122b96858e
7191102: nightly failures after JSR 292 lazy method handle update (round 3)
jrose
parents:
13423
diff
changeset
|
2527 |
assertTrue(res.toString(), sawFail); |
10081 | 2528 |
} |
2529 |
} |
|
2530 |
||
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
2531 |
@Test // SLOW |
4537 | 2532 |
public void testCastFailure() throws Throwable { |
2533 |
if (CAN_SKIP_WORKING) return; |
|
2534 |
startTest("testCastFailure"); |
|
2535 |
testCastFailure("cast/argument", 11000); |
|
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
2536 |
if (CAN_TEST_LIGHTLY) return; |
4537 | 2537 |
testCastFailure("unbox/argument", 11000); |
2538 |
testCastFailure("cast/return", 11000); |
|
2539 |
testCastFailure("unbox/return", 11000); |
|
2540 |
} |
|
2541 |
||
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2542 |
static class Surprise { |
7052
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2543 |
public MethodHandle asMethodHandle() { |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2544 |
return VALUE.bindTo(this); |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2545 |
} |
4537 | 2546 |
Object value(Object x) { |
2547 |
trace("value", x); |
|
2548 |
if (boo != null) return boo; |
|
2549 |
return x; |
|
2550 |
} |
|
2551 |
Object boo; |
|
2552 |
void boo(Object x) { boo = x; } |
|
2553 |
||
2554 |
static void trace(String x, Object y) { |
|
2555 |
if (verbosity > 8) System.out.println(x+"="+y); |
|
2556 |
} |
|
2557 |
static Object refIdentity(Object x) { trace("ref.x", x); return x; } |
|
2558 |
static Integer boxIdentity(Integer x) { trace("box.x", x); return x; } |
|
2559 |
static int intIdentity(int x) { trace("int.x", x); return x; } |
|
7052
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2560 |
static MethodHandle VALUE, REF_IDENTITY, BOX_IDENTITY, INT_IDENTITY; |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2561 |
static { |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2562 |
try { |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2563 |
VALUE = PRIVATE.findVirtual( |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2564 |
Surprise.class, "value", |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2565 |
MethodType.methodType(Object.class, Object.class)); |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2566 |
REF_IDENTITY = PRIVATE.findStatic( |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2567 |
Surprise.class, "refIdentity", |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2568 |
MethodType.methodType(Object.class, Object.class)); |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2569 |
BOX_IDENTITY = PRIVATE.findStatic( |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2570 |
Surprise.class, "boxIdentity", |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2571 |
MethodType.methodType(Integer.class, Integer.class)); |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2572 |
INT_IDENTITY = PRIVATE.findStatic( |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2573 |
Surprise.class, "intIdentity", |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2574 |
MethodType.methodType(int.class, int.class)); |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2575 |
} catch (NoSuchMethodException | IllegalAccessException ex) { |
7052
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2576 |
throw new RuntimeException(ex); |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2577 |
} |
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2578 |
} |
4537 | 2579 |
} |
2580 |
||
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2581 |
@SuppressWarnings("ConvertToStringSwitch") |
4537 | 2582 |
void testCastFailure(String mode, int okCount) throws Throwable { |
2583 |
countTest(false); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2584 |
if (verbosity > 2) System.out.println("mode="+mode); |
4537 | 2585 |
Surprise boo = new Surprise(); |
7052
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2586 |
MethodHandle identity = Surprise.REF_IDENTITY, surprise0 = boo.asMethodHandle(), surprise = surprise0; |
4537 | 2587 |
if (mode.endsWith("/return")) { |
2588 |
if (mode.equals("unbox/return")) { |
|
2589 |
// fail on return to ((Integer)surprise).intValue |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2590 |
surprise = surprise.asType(MethodType.methodType(int.class, Object.class)); |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2591 |
identity = identity.asType(MethodType.methodType(int.class, Object.class)); |
4537 | 2592 |
} else if (mode.equals("cast/return")) { |
2593 |
// fail on return to (Integer)surprise |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2594 |
surprise = surprise.asType(MethodType.methodType(Integer.class, Object.class)); |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2595 |
identity = identity.asType(MethodType.methodType(Integer.class, Object.class)); |
4537 | 2596 |
} |
2597 |
} else if (mode.endsWith("/argument")) { |
|
2598 |
MethodHandle callee = null; |
|
2599 |
if (mode.equals("unbox/argument")) { |
|
2600 |
// fail on handing surprise to int argument |
|
2601 |
callee = Surprise.INT_IDENTITY; |
|
2602 |
} else if (mode.equals("cast/argument")) { |
|
2603 |
// fail on handing surprise to Integer argument |
|
2604 |
callee = Surprise.BOX_IDENTITY; |
|
2605 |
} |
|
2606 |
if (callee != null) { |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2607 |
callee = callee.asType(MethodType.genericMethodType(1)); |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2608 |
surprise = MethodHandles.filterArguments(callee, 0, surprise); |
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2609 |
identity = MethodHandles.filterArguments(callee, 0, identity); |
4537 | 2610 |
} |
2611 |
} |
|
7052
963a5baf2ba3
6980096: JSR 292 reflective lookup should throw checked exceptions
jrose
parents:
7051
diff
changeset
|
2612 |
assertNotSame(mode, surprise, surprise0); |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2613 |
identity = identity.asType(MethodType.genericMethodType(1)); |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2614 |
surprise = surprise.asType(MethodType.genericMethodType(1)); |
4537 | 2615 |
Object x = 42; |
2616 |
for (int i = 0; i < okCount; i++) { |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2617 |
Object y = identity.invokeExact(x); |
4537 | 2618 |
assertEquals(x, y); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2619 |
Object z = surprise.invokeExact(x); |
4537 | 2620 |
assertEquals(x, z); |
2621 |
} |
|
2622 |
boo.boo("Boo!"); |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2623 |
Object y = identity.invokeExact(x); |
4537 | 2624 |
assertEquals(x, y); |
2625 |
try { |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2626 |
Object z = surprise.invokeExact(x); |
4537 | 2627 |
System.out.println("Failed to throw; got z="+z); |
2628 |
assertTrue(false); |
|
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2629 |
} catch (ClassCastException ex) { |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2630 |
if (verbosity > 2) |
4537 | 2631 |
System.out.println("caught "+ex); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
2632 |
if (verbosity > 3) |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
2633 |
ex.printStackTrace(System.out); |
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2634 |
assertTrue(true); // all is well |
4537 | 2635 |
} |
2636 |
} |
|
2637 |
||
5723
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2638 |
static Example userMethod(Object o, String s, int i) { |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2639 |
called("userMethod", o, s, i); |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2640 |
return null; |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2641 |
} |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2642 |
|
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2643 |
@Test |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2644 |
public void testUserClassInSignature() throws Throwable { |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2645 |
if (CAN_SKIP_WORKING) return; |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2646 |
startTest("testUserClassInSignature"); |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2647 |
Lookup lookup = MethodHandles.lookup(); |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2648 |
String name; MethodType mt; MethodHandle mh; |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2649 |
Object[] args; |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2650 |
|
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2651 |
// Try a static method. |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2652 |
name = "userMethod"; |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2653 |
mt = MethodType.methodType(Example.class, Object.class, String.class, int.class); |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2654 |
mh = lookup.findStatic(lookup.lookupClass(), name, mt); |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2655 |
assertEquals(mt, mh.type()); |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2656 |
assertEquals(Example.class, mh.type().returnType()); |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2657 |
args = randomArgs(mh.type().parameterArray()); |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2658 |
mh.invokeWithArguments(args); |
5723
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2659 |
assertCalled(name, args); |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2660 |
|
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2661 |
// Try a virtual method. |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2662 |
name = "v2"; |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2663 |
mt = MethodType.methodType(Object.class, Object.class, int.class); |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2664 |
mh = lookup.findVirtual(Example.class, name, mt); |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2665 |
assertEquals(mt, mh.type().dropParameterTypes(0,1)); |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2666 |
assertTrue(mh.type().parameterList().contains(Example.class)); |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2667 |
args = randomArgs(mh.type().parameterArray()); |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
7554
diff
changeset
|
2668 |
mh.invokeWithArguments(args); |
5723
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2669 |
assertCalled(name, args); |
a58a0eed34b0
6939196: method handle signatures off the boot class path get linkage errors
jrose
parents:
5722
diff
changeset
|
2670 |
} |
7053 | 2671 |
|
2672 |
static void runForRunnable() { |
|
2673 |
called("runForRunnable"); |
|
2674 |
} |
|
10078
944d876457df
7054590: (JSR-292) MethodHandleProxies.asInterfaceInstance() accepts private/protected nested interfaces
jrose
parents:
9752
diff
changeset
|
2675 |
public interface Fooable { |
10081 | 2676 |
// overloads: |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2677 |
Object foo(Object x, String y); |
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2678 |
List<?> foo(String x, int y); |
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2679 |
Object foo(String x); |
7053 | 2680 |
} |
10081 | 2681 |
static Object fooForFooable(String x, Object... y) { |
2682 |
return called("fooForFooable/"+x, y); |
|
7053 | 2683 |
} |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2684 |
@SuppressWarnings("serial") // not really a public API, just a test case |
10078
944d876457df
7054590: (JSR-292) MethodHandleProxies.asInterfaceInstance() accepts private/protected nested interfaces
jrose
parents:
9752
diff
changeset
|
2685 |
public static class MyCheckedException extends Exception { |
7053 | 2686 |
} |
10078
944d876457df
7054590: (JSR-292) MethodHandleProxies.asInterfaceInstance() accepts private/protected nested interfaces
jrose
parents:
9752
diff
changeset
|
2687 |
public interface WillThrow { |
7053 | 2688 |
void willThrow() throws MyCheckedException; |
2689 |
} |
|
10081 | 2690 |
/*non-public*/ interface PrivateRunnable { |
2691 |
public void run(); |
|
2692 |
} |
|
7053 | 2693 |
|
2694 |
@Test |
|
10081 | 2695 |
public void testAsInterfaceInstance() throws Throwable { |
7053 | 2696 |
if (CAN_SKIP_WORKING) return; |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
2697 |
startTest("asInterfaceInstance"); |
7053 | 2698 |
Lookup lookup = MethodHandles.lookup(); |
10081 | 2699 |
// test typical case: Runnable.run |
7053 | 2700 |
{ |
10081 | 2701 |
countTest(); |
2702 |
if (verbosity >= 2) System.out.println("Runnable"); |
|
7053 | 2703 |
MethodType mt = MethodType.methodType(void.class); |
2704 |
MethodHandle mh = lookup.findStatic(MethodHandlesTest.class, "runForRunnable", mt); |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2705 |
Runnable proxy = MethodHandleProxies.asInterfaceInstance(Runnable.class, mh); |
7053 | 2706 |
proxy.run(); |
2707 |
assertCalled("runForRunnable"); |
|
2708 |
} |
|
10081 | 2709 |
// well known single-name overloaded interface: Appendable.append |
7053 | 2710 |
{ |
10081 | 2711 |
countTest(); |
2712 |
if (verbosity >= 2) System.out.println("Appendable"); |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2713 |
ArrayList<List<?>> appendResults = new ArrayList<>(); |
10081 | 2714 |
MethodHandle append = lookup.bind(appendResults, "add", MethodType.methodType(boolean.class, Object.class)); |
2715 |
append = append.asType(MethodType.methodType(void.class, List.class)); // specialize the type |
|
2716 |
MethodHandle asList = lookup.findStatic(Arrays.class, "asList", MethodType.methodType(List.class, Object[].class)); |
|
2717 |
MethodHandle mh = MethodHandles.filterReturnValue(asList, append).asVarargsCollector(Object[].class); |
|
2718 |
Appendable proxy = MethodHandleProxies.asInterfaceInstance(Appendable.class, mh); |
|
2719 |
proxy.append("one"); |
|
2720 |
proxy.append("two", 3, 4); |
|
2721 |
proxy.append('5'); |
|
2722 |
assertEquals(Arrays.asList(Arrays.asList("one"), |
|
2723 |
Arrays.asList("two", 3, 4), |
|
2724 |
Arrays.asList('5')), |
|
2725 |
appendResults); |
|
2726 |
if (verbosity >= 3) System.out.println("appendResults="+appendResults); |
|
2727 |
appendResults.clear(); |
|
2728 |
Formatter formatter = new Formatter(proxy); |
|
2729 |
String fmt = "foo str=%s char='%c' num=%d"; |
|
2730 |
Object[] fmtArgs = { "str!", 'C', 42 }; |
|
2731 |
String expect = String.format(fmt, fmtArgs); |
|
2732 |
formatter.format(fmt, fmtArgs); |
|
2733 |
String actual = ""; |
|
2734 |
if (verbosity >= 3) System.out.println("appendResults="+appendResults); |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2735 |
for (List<?> l : appendResults) { |
10081 | 2736 |
Object x = l.get(0); |
2737 |
switch (l.size()) { |
|
2738 |
case 1: actual += x; continue; |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2739 |
case 3: actual += ((String)x).substring((int)(Object)l.get(1), (int)(Object)l.get(2)); continue; |
10081 | 2740 |
} |
2741 |
actual += l; |
|
2742 |
} |
|
2743 |
if (verbosity >= 3) System.out.println("expect="+expect); |
|
2744 |
if (verbosity >= 3) System.out.println("actual="+actual); |
|
2745 |
assertEquals(expect, actual); |
|
2746 |
} |
|
2747 |
// test case of an single name which is overloaded: Fooable.foo(...) |
|
2748 |
{ |
|
2749 |
if (verbosity >= 2) System.out.println("Fooable"); |
|
2750 |
MethodHandle mh = lookup.findStatic(MethodHandlesTest.class, "fooForFooable", |
|
2751 |
MethodType.methodType(Object.class, String.class, Object[].class)); |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2752 |
Fooable proxy = MethodHandleProxies.asInterfaceInstance(Fooable.class, mh); |
10081 | 2753 |
for (Method m : Fooable.class.getDeclaredMethods()) { |
2754 |
countTest(); |
|
2755 |
assertSame("foo", m.getName()); |
|
2756 |
if (verbosity > 3) |
|
2757 |
System.out.println("calling "+m); |
|
2758 |
MethodHandle invoker = lookup.unreflect(m); |
|
2759 |
MethodType mt = invoker.type(); |
|
2760 |
Class<?>[] types = mt.parameterArray(); |
|
2761 |
types[0] = int.class; // placeholder |
|
2762 |
Object[] args = randomArgs(types); |
|
2763 |
args[0] = proxy; |
|
2764 |
if (verbosity > 3) |
|
2765 |
System.out.println("calling "+m+" on "+Arrays.asList(args)); |
|
2766 |
Object result = invoker.invokeWithArguments(args); |
|
2767 |
if (verbosity > 4) |
|
2768 |
System.out.println("result = "+result); |
|
2769 |
String name = "fooForFooable/"+args[1]; |
|
2770 |
Object[] argTail = Arrays.copyOfRange(args, 2, args.length); |
|
2771 |
assertCalled(name, argTail); |
|
2772 |
assertEquals(result, logEntry(name, argTail)); |
|
2773 |
} |
|
7053 | 2774 |
} |
10081 | 2775 |
// test processing of thrown exceptions: |
7053 | 2776 |
for (Throwable ex : new Throwable[] { new NullPointerException("ok"), |
2777 |
new InternalError("ok"), |
|
2778 |
new Throwable("fail"), |
|
2779 |
new Exception("fail"), |
|
2780 |
new MyCheckedException() |
|
2781 |
}) { |
|
2782 |
MethodHandle mh = MethodHandles.throwException(void.class, Throwable.class); |
|
2783 |
mh = MethodHandles.insertArguments(mh, 0, ex); |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
9731
diff
changeset
|
2784 |
WillThrow proxy = MethodHandleProxies.asInterfaceInstance(WillThrow.class, mh); |
7053 | 2785 |
try { |
10081 | 2786 |
countTest(); |
7053 | 2787 |
proxy.willThrow(); |
2788 |
System.out.println("Failed to throw: "+ex); |
|
2789 |
assertTrue(false); |
|
2790 |
} catch (Throwable ex1) { |
|
10081 | 2791 |
if (verbosity > 3) { |
7053 | 2792 |
System.out.println("throw "+ex); |
2793 |
System.out.println("catch "+(ex == ex1 ? "UNWRAPPED" : ex1)); |
|
2794 |
} |
|
2795 |
if (ex instanceof RuntimeException || |
|
2796 |
ex instanceof Error) { |
|
2797 |
assertSame("must pass unchecked exception out without wrapping", ex, ex1); |
|
2798 |
} else if (ex instanceof MyCheckedException) { |
|
2799 |
assertSame("must pass declared exception out without wrapping", ex, ex1); |
|
2800 |
} else { |
|
2801 |
assertNotSame("must pass undeclared checked exception with wrapping", ex, ex1); |
|
10078
944d876457df
7054590: (JSR-292) MethodHandleProxies.asInterfaceInstance() accepts private/protected nested interfaces
jrose
parents:
9752
diff
changeset
|
2802 |
if (!(ex1 instanceof UndeclaredThrowableException) || ex1.getCause() != ex) { |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
2803 |
ex1.printStackTrace(System.out); |
10078
944d876457df
7054590: (JSR-292) MethodHandleProxies.asInterfaceInstance() accepts private/protected nested interfaces
jrose
parents:
9752
diff
changeset
|
2804 |
} |
944d876457df
7054590: (JSR-292) MethodHandleProxies.asInterfaceInstance() accepts private/protected nested interfaces
jrose
parents:
9752
diff
changeset
|
2805 |
assertSame(ex, ex1.getCause()); |
7053 | 2806 |
UndeclaredThrowableException utex = (UndeclaredThrowableException) ex1; |
2807 |
} |
|
2808 |
} |
|
2809 |
} |
|
10081 | 2810 |
// Test error checking on bad interfaces: |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2811 |
for (Class<?> nonSMI : new Class<?>[] { Object.class, |
7053 | 2812 |
String.class, |
2813 |
CharSequence.class, |
|
10081 | 2814 |
java.io.Serializable.class, |
2815 |
PrivateRunnable.class, |
|
7053 | 2816 |
Example.class }) { |
10081 | 2817 |
if (verbosity > 2) System.out.println(nonSMI.getName()); |
7053 | 2818 |
try { |
10081 | 2819 |
countTest(false); |
2820 |
MethodHandleProxies.asInterfaceInstance(nonSMI, varargsArray(0)); |
|
2821 |
assertTrue("Failed to throw on "+nonSMI.getName(), false); |
|
7053 | 2822 |
} catch (IllegalArgumentException ex) { |
10081 | 2823 |
if (verbosity > 2) System.out.println(nonSMI.getSimpleName()+": "+ex); |
2824 |
// Object: java.lang.IllegalArgumentException: |
|
2825 |
// not a public interface: java.lang.Object |
|
2826 |
// String: java.lang.IllegalArgumentException: |
|
2827 |
// not a public interface: java.lang.String |
|
2828 |
// CharSequence: java.lang.IllegalArgumentException: |
|
2829 |
// not a single-method interface: java.lang.CharSequence |
|
2830 |
// Serializable: java.lang.IllegalArgumentException: |
|
2831 |
// not a single-method interface: java.io.Serializable |
|
2832 |
// PrivateRunnable: java.lang.IllegalArgumentException: |
|
2833 |
// not a public interface: test.java.lang.invoke.MethodHandlesTest$PrivateRunnable |
|
2834 |
// Example: java.lang.IllegalArgumentException: |
|
2835 |
// not a public interface: test.java.lang.invoke.MethodHandlesTest$Example |
|
2836 |
} |
|
2837 |
} |
|
2838 |
// Test error checking on interfaces with the wrong method type: |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2839 |
for (Class<?> intfc : new Class<?>[] { Runnable.class /*arity 0*/, |
10081 | 2840 |
Fooable.class /*arity 1 & 2*/ }) { |
2841 |
int badArity = 1; // known to be incompatible |
|
2842 |
if (verbosity > 2) System.out.println(intfc.getName()); |
|
2843 |
try { |
|
2844 |
countTest(false); |
|
2845 |
MethodHandleProxies.asInterfaceInstance(intfc, varargsArray(badArity)); |
|
2846 |
assertTrue("Failed to throw on "+intfc.getName(), false); |
|
2847 |
} catch (WrongMethodTypeException ex) { |
|
2848 |
if (verbosity > 2) System.out.println(intfc.getSimpleName()+": "+ex); |
|
2849 |
// Runnable: java.lang.invoke.WrongMethodTypeException: |
|
2850 |
// cannot convert MethodHandle(Object)Object[] to ()void |
|
2851 |
// Fooable: java.lang.invoke.WrongMethodTypeException: |
|
2852 |
// cannot convert MethodHandle(Object)Object[] to (Object,String)Object |
|
7053 | 2853 |
} |
2854 |
} |
|
2855 |
} |
|
10080
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2856 |
|
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2857 |
@Test |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2858 |
public void testRunnableProxy() throws Throwable { |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2859 |
if (CAN_SKIP_WORKING) return; |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2860 |
startTest("testRunnableProxy"); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2861 |
MethodHandles.Lookup lookup = MethodHandles.lookup(); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2862 |
MethodHandle run = lookup.findStatic(lookup.lookupClass(), "runForRunnable", MethodType.methodType(void.class)); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2863 |
Runnable r = MethodHandleProxies.asInterfaceInstance(Runnable.class, run); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2864 |
testRunnableProxy(r); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2865 |
assertCalled("runForRunnable"); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2866 |
} |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2867 |
private static void testRunnableProxy(Runnable r) { |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2868 |
//7058630: JSR 292 method handle proxy violates contract for Object methods |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2869 |
r.run(); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2870 |
Object o = r; |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2871 |
r = null; |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2872 |
boolean eq = (o == o); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2873 |
int hc = System.identityHashCode(o); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2874 |
String st = o.getClass().getName() + "@" + Integer.toHexString(hc); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2875 |
Object expect = Arrays.asList(st, eq, hc); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2876 |
if (verbosity >= 2) System.out.println("expect st/eq/hc = "+expect); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2877 |
Object actual = Arrays.asList(o.toString(), o.equals(o), o.hashCode()); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2878 |
if (verbosity >= 2) System.out.println("actual st/eq/hc = "+actual); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2879 |
assertEquals(expect, actual); |
eb387b9bb282
7058630: JSR 292 method handle proxy violates contract for Object methods
jrose
parents:
10078
diff
changeset
|
2880 |
} |
4535 | 2881 |
} |
8822
8145ab9f5f86
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
8347
diff
changeset
|
2882 |
// Local abbreviated copy of sun.invoke.util.ValueConversions |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
2883 |
// This guy tests access from outside the same package member, but inside |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13420
diff
changeset
|
2884 |
// the package itself. |
4535 | 2885 |
class ValueConversions { |
2886 |
private static final Lookup IMPL_LOOKUP = MethodHandles.lookup(); |
|
2887 |
private static final Object[] NO_ARGS_ARRAY = {}; |
|
2888 |
private static Object[] makeArray(Object... args) { return args; } |
|
2889 |
private static Object[] array() { return NO_ARGS_ARRAY; } |
|
2890 |
private static Object[] array(Object a0) |
|
2891 |
{ return makeArray(a0); } |
|
2892 |
private static Object[] array(Object a0, Object a1) |
|
2893 |
{ return makeArray(a0, a1); } |
|
2894 |
private static Object[] array(Object a0, Object a1, Object a2) |
|
2895 |
{ return makeArray(a0, a1, a2); } |
|
2896 |
private static Object[] array(Object a0, Object a1, Object a2, Object a3) |
|
2897 |
{ return makeArray(a0, a1, a2, a3); } |
|
2898 |
private static Object[] array(Object a0, Object a1, Object a2, Object a3, |
|
2899 |
Object a4) |
|
2900 |
{ return makeArray(a0, a1, a2, a3, a4); } |
|
2901 |
private static Object[] array(Object a0, Object a1, Object a2, Object a3, |
|
2902 |
Object a4, Object a5) |
|
2903 |
{ return makeArray(a0, a1, a2, a3, a4, a5); } |
|
2904 |
private static Object[] array(Object a0, Object a1, Object a2, Object a3, |
|
2905 |
Object a4, Object a5, Object a6) |
|
2906 |
{ return makeArray(a0, a1, a2, a3, a4, a5, a6); } |
|
2907 |
private static Object[] array(Object a0, Object a1, Object a2, Object a3, |
|
2908 |
Object a4, Object a5, Object a6, Object a7) |
|
2909 |
{ return makeArray(a0, a1, a2, a3, a4, a5, a6, a7); } |
|
2910 |
private static Object[] array(Object a0, Object a1, Object a2, Object a3, |
|
2911 |
Object a4, Object a5, Object a6, Object a7, |
|
2912 |
Object a8) |
|
2913 |
{ return makeArray(a0, a1, a2, a3, a4, a5, a6, a7, a8); } |
|
2914 |
private static Object[] array(Object a0, Object a1, Object a2, Object a3, |
|
2915 |
Object a4, Object a5, Object a6, Object a7, |
|
2916 |
Object a8, Object a9) |
|
2917 |
{ return makeArray(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } |
|
2918 |
static MethodHandle[] makeArrays() { |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
2919 |
ArrayList<MethodHandle> arrays = new ArrayList<>(); |
4535 | 2920 |
MethodHandles.Lookup lookup = IMPL_LOOKUP; |
2921 |
for (;;) { |
|
2922 |
int nargs = arrays.size(); |
|
4537 | 2923 |
MethodType type = MethodType.genericMethodType(nargs).changeReturnType(Object[].class); |
4535 | 2924 |
String name = "array"; |
2925 |
MethodHandle array = null; |
|
2926 |
try { |
|
2927 |
array = lookup.findStatic(ValueConversions.class, name, type); |
|
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
2928 |
} catch (ReflectiveOperationException ex) { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
2929 |
// break from loop! |
4535 | 2930 |
} |
2931 |
if (array == null) break; |
|
2932 |
arrays.add(array); |
|
2933 |
} |
|
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
2934 |
assertTrue(arrays.size() == 11); // current number of methods |
4535 | 2935 |
return arrays.toArray(new MethodHandle[0]); |
2936 |
} |
|
2937 |
static final MethodHandle[] ARRAYS = makeArrays(); |
|
2938 |
||
2939 |
/** Return a method handle that takes the indicated number of Object |
|
2940 |
* arguments and returns an Object array of them, as if for varargs. |
|
2941 |
*/ |
|
2942 |
public static MethodHandle varargsArray(int nargs) { |
|
2943 |
if (nargs < ARRAYS.length) |
|
2944 |
return ARRAYS[nargs]; |
|
10078
944d876457df
7054590: (JSR-292) MethodHandleProxies.asInterfaceInstance() accepts private/protected nested interfaces
jrose
parents:
9752
diff
changeset
|
2945 |
return MethodHandles.identity(Object[].class).asCollector(Object[].class, nargs); |
4535 | 2946 |
} |
9646
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2947 |
public static MethodHandle varargsArray(Class<?> arrayType, int nargs) { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2948 |
Class<?> elemType = arrayType.getComponentType(); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2949 |
MethodType vaType = MethodType.methodType(arrayType, Collections.<Class<?>>nCopies(nargs, elemType)); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2950 |
MethodHandle mh = varargsArray(nargs); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2951 |
if (arrayType != Object[].class) |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2952 |
mh = MethodHandles.filterReturnValue(mh, CHANGE_ARRAY_TYPE.bindTo(arrayType)); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2953 |
return mh.asType(vaType); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2954 |
} |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2955 |
static Object changeArrayType(Class<?> arrayType, Object[] a) { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2956 |
Class<?> elemType = arrayType.getComponentType(); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2957 |
if (!elemType.isPrimitive()) |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2958 |
return Arrays.copyOf(a, a.length, arrayType.asSubclass(Object[].class)); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2959 |
Object b = java.lang.reflect.Array.newInstance(elemType, a.length); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2960 |
for (int i = 0; i < a.length; i++) |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2961 |
java.lang.reflect.Array.set(b, i, a[i]); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2962 |
return b; |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2963 |
} |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2964 |
private static final MethodHandle CHANGE_ARRAY_TYPE; |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2965 |
static { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2966 |
try { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2967 |
CHANGE_ARRAY_TYPE = IMPL_LOOKUP.findStatic(ValueConversions.class, "changeArrayType", |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2968 |
MethodType.methodType(Object.class, Class.class, Object[].class)); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2969 |
} catch (NoSuchMethodException | IllegalAccessException ex) { |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2970 |
Error err = new InternalError("uncaught exception"); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2971 |
err.initCause(ex); |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2972 |
throw err; |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2973 |
} |
5ebbe5ab084f
6939861: JVM should handle more conversion operations
jrose
parents:
9645
diff
changeset
|
2974 |
} |
4537 | 2975 |
|
2976 |
private static final List<Object> NO_ARGS_LIST = Arrays.asList(NO_ARGS_ARRAY); |
|
2977 |
private static List<Object> makeList(Object... args) { return Arrays.asList(args); } |
|
2978 |
private static List<Object> list() { return NO_ARGS_LIST; } |
|
2979 |
private static List<Object> list(Object a0) |
|
2980 |
{ return makeList(a0); } |
|
2981 |
private static List<Object> list(Object a0, Object a1) |
|
2982 |
{ return makeList(a0, a1); } |
|
2983 |
private static List<Object> list(Object a0, Object a1, Object a2) |
|
2984 |
{ return makeList(a0, a1, a2); } |
|
2985 |
private static List<Object> list(Object a0, Object a1, Object a2, Object a3) |
|
2986 |
{ return makeList(a0, a1, a2, a3); } |
|
2987 |
private static List<Object> list(Object a0, Object a1, Object a2, Object a3, |
|
2988 |
Object a4) |
|
2989 |
{ return makeList(a0, a1, a2, a3, a4); } |
|
2990 |
private static List<Object> list(Object a0, Object a1, Object a2, Object a3, |
|
2991 |
Object a4, Object a5) |
|
2992 |
{ return makeList(a0, a1, a2, a3, a4, a5); } |
|
2993 |
private static List<Object> list(Object a0, Object a1, Object a2, Object a3, |
|
2994 |
Object a4, Object a5, Object a6) |
|
2995 |
{ return makeList(a0, a1, a2, a3, a4, a5, a6); } |
|
2996 |
private static List<Object> list(Object a0, Object a1, Object a2, Object a3, |
|
2997 |
Object a4, Object a5, Object a6, Object a7) |
|
2998 |
{ return makeList(a0, a1, a2, a3, a4, a5, a6, a7); } |
|
2999 |
private static List<Object> list(Object a0, Object a1, Object a2, Object a3, |
|
3000 |
Object a4, Object a5, Object a6, Object a7, |
|
3001 |
Object a8) |
|
3002 |
{ return makeList(a0, a1, a2, a3, a4, a5, a6, a7, a8); } |
|
3003 |
private static List<Object> list(Object a0, Object a1, Object a2, Object a3, |
|
3004 |
Object a4, Object a5, Object a6, Object a7, |
|
3005 |
Object a8, Object a9) |
|
3006 |
{ return makeList(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } |
|
3007 |
static MethodHandle[] makeLists() { |
|
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
3008 |
ArrayList<MethodHandle> lists = new ArrayList<>(); |
4537 | 3009 |
MethodHandles.Lookup lookup = IMPL_LOOKUP; |
3010 |
for (;;) { |
|
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
3011 |
int nargs = lists.size(); |
4537 | 3012 |
MethodType type = MethodType.genericMethodType(nargs).changeReturnType(List.class); |
3013 |
String name = "list"; |
|
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
3014 |
MethodHandle list = null; |
4537 | 3015 |
try { |
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
3016 |
list = lookup.findStatic(ValueConversions.class, name, type); |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
3017 |
} catch (ReflectiveOperationException ex) { |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
3018 |
// break from loop! |
4537 | 3019 |
} |
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
3020 |
if (list == null) break; |
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
3021 |
lists.add(list); |
4537 | 3022 |
} |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
8346
diff
changeset
|
3023 |
assertTrue(lists.size() == 11); // current number of methods |
8346
3b891698c4ec
7012650: implement JSR 292 EG adjustments through January 2010
jrose
parents:
8345
diff
changeset
|
3024 |
return lists.toArray(new MethodHandle[0]); |
4537 | 3025 |
} |
3026 |
static final MethodHandle[] LISTS = makeLists(); |
|
10078
944d876457df
7054590: (JSR-292) MethodHandleProxies.asInterfaceInstance() accepts private/protected nested interfaces
jrose
parents:
9752
diff
changeset
|
3027 |
static final MethodHandle AS_LIST; |
944d876457df
7054590: (JSR-292) MethodHandleProxies.asInterfaceInstance() accepts private/protected nested interfaces
jrose
parents:
9752
diff
changeset
|
3028 |
static { |
944d876457df
7054590: (JSR-292) MethodHandleProxies.asInterfaceInstance() accepts private/protected nested interfaces
jrose
parents:
9752
diff
changeset
|
3029 |
try { |
944d876457df
7054590: (JSR-292) MethodHandleProxies.asInterfaceInstance() accepts private/protected nested interfaces
jrose
parents:
9752
diff
changeset
|
3030 |
AS_LIST = IMPL_LOOKUP.findStatic(Arrays.class, "asList", MethodType.methodType(List.class, Object[].class)); |
11534
9949ffb8eb3a
7117167: Misc warnings in java.lang.invoke and sun.invoke.*
jrose
parents:
10081
diff
changeset
|
3031 |
} catch (NoSuchMethodException | IllegalAccessException ex) { throw new RuntimeException(ex); } |
10078
944d876457df
7054590: (JSR-292) MethodHandleProxies.asInterfaceInstance() accepts private/protected nested interfaces
jrose
parents:
9752
diff
changeset
|
3032 |
} |
4537 | 3033 |
|
3034 |
/** Return a method handle that takes the indicated number of Object |
|
3035 |
* arguments and returns List. |
|
3036 |
*/ |
|
3037 |
public static MethodHandle varargsList(int nargs) { |
|
3038 |
if (nargs < LISTS.length) |
|
3039 |
return LISTS[nargs]; |
|
10078
944d876457df
7054590: (JSR-292) MethodHandleProxies.asInterfaceInstance() accepts private/protected nested interfaces
jrose
parents:
9752
diff
changeset
|
3040 |
return AS_LIST.asCollector(Object[].class, nargs); |
4537 | 3041 |
} |
4535 | 3042 |
} |
3043 |
// This guy tests access from outside the same package member, but inside |
|
3044 |
// the package itself. |
|
3045 |
class PackageSibling { |
|
3046 |
static Lookup lookup() { |
|
3047 |
return MethodHandles.lookup(); |
|
3048 |
} |
|
3049 |
} |