134 } |
134 } |
135 private static void fail() { |
135 private static void fail() { |
136 throw new AssertionError(); |
136 throw new AssertionError(); |
137 } |
137 } |
138 |
138 |
139 private final static MethodHandles.Lookup lookup = MethodHandles.lookup(); |
139 private static final MethodHandles.Lookup lookup = MethodHandles.lookup(); |
140 |
140 |
141 private static MethodHandle mh(Class ret, Class... args) { |
141 private static MethodHandle mh(Class ret, Class... args) { |
142 try { |
142 try { |
143 MethodType mt = MethodType.methodType(ret, args); |
143 MethodType mt = MethodType.methodType(ret, args); |
144 Class lookupRet = (args.length == 0 ? void.class : args[0]); |
144 Class lookupRet = (args.length == 0 ? void.class : args[0]); |
189 return true; |
189 return true; |
190 } |
190 } |
191 |
191 |
192 private static MethodHandle mh_z(Class ret) { return mh(ret, boolean.class); } |
192 private static MethodHandle mh_z(Class ret) { return mh(ret, boolean.class); } |
193 |
193 |
194 private final static MethodHandle mh_zz = mh_z(boolean.class); |
194 private static final MethodHandle mh_zz = mh_z(boolean.class); |
195 private final static MethodHandle mh_bz = mh_z(byte.class ); |
195 private static final MethodHandle mh_bz = mh_z(byte.class ); |
196 private final static MethodHandle mh_cz = mh_z(char.class ); |
196 private static final MethodHandle mh_cz = mh_z(char.class ); |
197 private final static MethodHandle mh_sz = mh_z(short.class ); |
197 private static final MethodHandle mh_sz = mh_z(short.class ); |
198 private final static MethodHandle mh_iz = mh_z(int.class ); |
198 private static final MethodHandle mh_iz = mh_z(int.class ); |
199 private final static MethodHandle mh_jz = mh_z(long.class ); |
199 private static final MethodHandle mh_jz = mh_z(long.class ); |
200 private final static MethodHandle mh_fz = mh_z(float.class ); |
200 private static final MethodHandle mh_fz = mh_z(float.class ); |
201 private final static MethodHandle mh_dz = mh_z(double.class ); |
201 private static final MethodHandle mh_dz = mh_z(double.class ); |
202 |
202 |
203 private static void boolean2prim(boolean x) throws Throwable { |
203 private static void boolean2prim(boolean x) throws Throwable { |
204 int i = x ? 1 : 0; |
204 int i = x ? 1 : 0; |
205 assertEquals( x, (boolean) mh_zz.invokeExact(x)); // boolean -> boolean |
205 assertEquals( x, (boolean) mh_zz.invokeExact(x)); // boolean -> boolean |
206 if (!DO_CASTS) return; |
206 if (!DO_CASTS) return; |
223 try { double y = (double) mh_dz.invokeExact(x); fail(); } catch (ClassCastException expected) {} // boolean -> double |
223 try { double y = (double) mh_dz.invokeExact(x); fail(); } catch (ClassCastException expected) {} // boolean -> double |
224 } |
224 } |
225 |
225 |
226 private static MethodHandle mh_b(Class ret) { return mh(ret, byte.class); } |
226 private static MethodHandle mh_b(Class ret) { return mh(ret, byte.class); } |
227 |
227 |
228 private final static MethodHandle mh_zb = mh_b(boolean.class); |
228 private static final MethodHandle mh_zb = mh_b(boolean.class); |
229 private final static MethodHandle mh_bb = mh_b(byte.class ); |
229 private static final MethodHandle mh_bb = mh_b(byte.class ); |
230 private final static MethodHandle mh_cb = mh_b(char.class ); |
230 private static final MethodHandle mh_cb = mh_b(char.class ); |
231 private final static MethodHandle mh_sb = mh_b(short.class ); |
231 private static final MethodHandle mh_sb = mh_b(short.class ); |
232 private final static MethodHandle mh_ib = mh_b(int.class ); |
232 private static final MethodHandle mh_ib = mh_b(int.class ); |
233 private final static MethodHandle mh_jb = mh_b(long.class ); |
233 private static final MethodHandle mh_jb = mh_b(long.class ); |
234 private final static MethodHandle mh_fb = mh_b(float.class ); |
234 private static final MethodHandle mh_fb = mh_b(float.class ); |
235 private final static MethodHandle mh_db = mh_b(double.class ); |
235 private static final MethodHandle mh_db = mh_b(double.class ); |
236 |
236 |
237 private static void byte2prim(byte x) throws Throwable { |
237 private static void byte2prim(byte x) throws Throwable { |
238 assertEquals((byte) x, (byte) mh_bb.invokeExact(x)); // byte -> byte |
238 assertEquals((byte) x, (byte) mh_bb.invokeExact(x)); // byte -> byte |
239 assertEquals((short) x, (short) mh_sb.invokeExact(x)); // byte -> short |
239 assertEquals((short) x, (short) mh_sb.invokeExact(x)); // byte -> short |
240 assertEquals((int) x, (int) mh_ib.invokeExact(x)); // byte -> int |
240 assertEquals((int) x, (int) mh_ib.invokeExact(x)); // byte -> int |
252 try { boolean y = (boolean) mh_zb.invokeExact(x); fail(); } catch (ClassCastException expected) {} // byte -> boolean |
252 try { boolean y = (boolean) mh_zb.invokeExact(x); fail(); } catch (ClassCastException expected) {} // byte -> boolean |
253 } |
253 } |
254 |
254 |
255 private static MethodHandle mh_c(Class ret) { return mh(ret, char.class); } |
255 private static MethodHandle mh_c(Class ret) { return mh(ret, char.class); } |
256 |
256 |
257 private final static MethodHandle mh_zc = mh_c(boolean.class); |
257 private static final MethodHandle mh_zc = mh_c(boolean.class); |
258 private final static MethodHandle mh_bc = mh_c(byte.class ); |
258 private static final MethodHandle mh_bc = mh_c(byte.class ); |
259 private final static MethodHandle mh_cc = mh_c(char.class ); |
259 private static final MethodHandle mh_cc = mh_c(char.class ); |
260 private final static MethodHandle mh_sc = mh_c(short.class ); |
260 private static final MethodHandle mh_sc = mh_c(short.class ); |
261 private final static MethodHandle mh_ic = mh_c(int.class ); |
261 private static final MethodHandle mh_ic = mh_c(int.class ); |
262 private final static MethodHandle mh_jc = mh_c(long.class ); |
262 private static final MethodHandle mh_jc = mh_c(long.class ); |
263 private final static MethodHandle mh_fc = mh_c(float.class ); |
263 private static final MethodHandle mh_fc = mh_c(float.class ); |
264 private final static MethodHandle mh_dc = mh_c(double.class ); |
264 private static final MethodHandle mh_dc = mh_c(double.class ); |
265 |
265 |
266 private static void char2prim(char x) throws Throwable { |
266 private static void char2prim(char x) throws Throwable { |
267 assertEquals((char) x, (char) mh_cc.invokeExact(x)); // char -> char |
267 assertEquals((char) x, (char) mh_cc.invokeExact(x)); // char -> char |
268 assertEquals((int) x, (int) mh_ic.invokeExact(x)); // char -> int |
268 assertEquals((int) x, (int) mh_ic.invokeExact(x)); // char -> int |
269 assertEquals((long) x, (long) mh_jc.invokeExact(x)); // char -> long |
269 assertEquals((long) x, (long) mh_jc.invokeExact(x)); // char -> long |
282 try { short y = (short) mh_sc.invokeExact(x); fail(); } catch (ClassCastException expected) {} // char -> short |
282 try { short y = (short) mh_sc.invokeExact(x); fail(); } catch (ClassCastException expected) {} // char -> short |
283 } |
283 } |
284 |
284 |
285 private static MethodHandle mh_s(Class ret) { return mh(ret, short.class); } |
285 private static MethodHandle mh_s(Class ret) { return mh(ret, short.class); } |
286 |
286 |
287 private final static MethodHandle mh_zs = mh_s(boolean.class); |
287 private static final MethodHandle mh_zs = mh_s(boolean.class); |
288 private final static MethodHandle mh_bs = mh_s(byte.class ); |
288 private static final MethodHandle mh_bs = mh_s(byte.class ); |
289 private final static MethodHandle mh_cs = mh_s(char.class ); |
289 private static final MethodHandle mh_cs = mh_s(char.class ); |
290 private final static MethodHandle mh_ss = mh_s(short.class ); |
290 private static final MethodHandle mh_ss = mh_s(short.class ); |
291 private final static MethodHandle mh_is = mh_s(int.class ); |
291 private static final MethodHandle mh_is = mh_s(int.class ); |
292 private final static MethodHandle mh_js = mh_s(long.class ); |
292 private static final MethodHandle mh_js = mh_s(long.class ); |
293 private final static MethodHandle mh_fs = mh_s(float.class ); |
293 private static final MethodHandle mh_fs = mh_s(float.class ); |
294 private final static MethodHandle mh_ds = mh_s(double.class ); |
294 private static final MethodHandle mh_ds = mh_s(double.class ); |
295 |
295 |
296 private static void short2prim(short x) throws Throwable { |
296 private static void short2prim(short x) throws Throwable { |
297 assertEquals((short) x, (short) mh_ss.invokeExact(x)); // short -> short |
297 assertEquals((short) x, (short) mh_ss.invokeExact(x)); // short -> short |
298 assertEquals((int) x, (int) mh_is.invokeExact(x)); // short -> int |
298 assertEquals((int) x, (int) mh_is.invokeExact(x)); // short -> int |
299 assertEquals((long) x, (long) mh_js.invokeExact(x)); // short -> long |
299 assertEquals((long) x, (long) mh_js.invokeExact(x)); // short -> long |
312 try { char y = (char) mh_cs.invokeExact(x); fail(); } catch (ClassCastException expected) {} // short -> char |
312 try { char y = (char) mh_cs.invokeExact(x); fail(); } catch (ClassCastException expected) {} // short -> char |
313 } |
313 } |
314 |
314 |
315 private static MethodHandle mh_i(Class ret) { return mh(ret, int.class); } |
315 private static MethodHandle mh_i(Class ret) { return mh(ret, int.class); } |
316 |
316 |
317 private final static MethodHandle mh_zi = mh_i(boolean.class); |
317 private static final MethodHandle mh_zi = mh_i(boolean.class); |
318 private final static MethodHandle mh_bi = mh_i(byte.class ); |
318 private static final MethodHandle mh_bi = mh_i(byte.class ); |
319 private final static MethodHandle mh_ci = mh_i(char.class ); |
319 private static final MethodHandle mh_ci = mh_i(char.class ); |
320 private final static MethodHandle mh_si = mh_i(short.class ); |
320 private static final MethodHandle mh_si = mh_i(short.class ); |
321 private final static MethodHandle mh_ii = mh_i(int.class ); |
321 private static final MethodHandle mh_ii = mh_i(int.class ); |
322 private final static MethodHandle mh_ji = mh_i(long.class ); |
322 private static final MethodHandle mh_ji = mh_i(long.class ); |
323 private final static MethodHandle mh_fi = mh_i(float.class ); |
323 private static final MethodHandle mh_fi = mh_i(float.class ); |
324 private final static MethodHandle mh_di = mh_i(double.class ); |
324 private static final MethodHandle mh_di = mh_i(double.class ); |
325 |
325 |
326 private static void int2prim(int x) throws Throwable { |
326 private static void int2prim(int x) throws Throwable { |
327 assertEquals((int) x, (int) mh_ii.invokeExact(x)); // int -> int |
327 assertEquals((int) x, (int) mh_ii.invokeExact(x)); // int -> int |
328 assertEquals((long) x, (long) mh_ji.invokeExact(x)); // int -> long |
328 assertEquals((long) x, (long) mh_ji.invokeExact(x)); // int -> long |
329 assertEquals((float) x, (float) mh_fi.invokeExact(x)); // int -> float |
329 assertEquals((float) x, (float) mh_fi.invokeExact(x)); // int -> float |
343 try { short y = (short) mh_si.invokeExact(x); fail(); } catch (ClassCastException expected) {} // int -> short |
343 try { short y = (short) mh_si.invokeExact(x); fail(); } catch (ClassCastException expected) {} // int -> short |
344 } |
344 } |
345 |
345 |
346 private static MethodHandle mh_j(Class ret) { return mh(ret, long.class); } |
346 private static MethodHandle mh_j(Class ret) { return mh(ret, long.class); } |
347 |
347 |
348 private final static MethodHandle mh_zj = mh_j(boolean.class); |
348 private static final MethodHandle mh_zj = mh_j(boolean.class); |
349 private final static MethodHandle mh_bj = mh_j(byte.class ); |
349 private static final MethodHandle mh_bj = mh_j(byte.class ); |
350 private final static MethodHandle mh_cj = mh_j(char.class ); |
350 private static final MethodHandle mh_cj = mh_j(char.class ); |
351 private final static MethodHandle mh_sj = mh_j(short.class ); |
351 private static final MethodHandle mh_sj = mh_j(short.class ); |
352 private final static MethodHandle mh_ij = mh_j(int.class ); |
352 private static final MethodHandle mh_ij = mh_j(int.class ); |
353 private final static MethodHandle mh_jj = mh_j(long.class ); |
353 private static final MethodHandle mh_jj = mh_j(long.class ); |
354 private final static MethodHandle mh_fj = mh_j(float.class ); |
354 private static final MethodHandle mh_fj = mh_j(float.class ); |
355 private final static MethodHandle mh_dj = mh_j(double.class ); |
355 private static final MethodHandle mh_dj = mh_j(double.class ); |
356 |
356 |
357 private static void long2prim(long x) throws Throwable { |
357 private static void long2prim(long x) throws Throwable { |
358 assertEquals((long) x, (long) mh_jj.invokeExact(x)); // long -> long |
358 assertEquals((long) x, (long) mh_jj.invokeExact(x)); // long -> long |
359 assertEquals((float) x, (float) mh_fj.invokeExact(x)); // long -> float |
359 assertEquals((float) x, (float) mh_fj.invokeExact(x)); // long -> float |
360 assertEquals((double) x, (double) mh_dj.invokeExact(x)); // long -> double |
360 assertEquals((double) x, (double) mh_dj.invokeExact(x)); // long -> double |
375 try { int y = (int) mh_ij.invokeExact(x); fail(); } catch (ClassCastException expected) {} // long -> int |
375 try { int y = (int) mh_ij.invokeExact(x); fail(); } catch (ClassCastException expected) {} // long -> int |
376 } |
376 } |
377 |
377 |
378 private static MethodHandle mh_f(Class ret) { return mh(ret, float.class); } |
378 private static MethodHandle mh_f(Class ret) { return mh(ret, float.class); } |
379 |
379 |
380 private final static MethodHandle mh_zf = mh_f(boolean.class); |
380 private static final MethodHandle mh_zf = mh_f(boolean.class); |
381 private final static MethodHandle mh_bf = mh_f(byte.class ); |
381 private static final MethodHandle mh_bf = mh_f(byte.class ); |
382 private final static MethodHandle mh_cf = mh_f(char.class ); |
382 private static final MethodHandle mh_cf = mh_f(char.class ); |
383 private final static MethodHandle mh_sf = mh_f(short.class ); |
383 private static final MethodHandle mh_sf = mh_f(short.class ); |
384 private final static MethodHandle mh_if = mh_f(int.class ); |
384 private static final MethodHandle mh_if = mh_f(int.class ); |
385 private final static MethodHandle mh_jf = mh_f(long.class ); |
385 private static final MethodHandle mh_jf = mh_f(long.class ); |
386 private final static MethodHandle mh_ff = mh_f(float.class ); |
386 private static final MethodHandle mh_ff = mh_f(float.class ); |
387 private final static MethodHandle mh_df = mh_f(double.class ); |
387 private static final MethodHandle mh_df = mh_f(double.class ); |
388 |
388 |
389 private static void float2prim(float x) throws Throwable { |
389 private static void float2prim(float x) throws Throwable { |
390 assertEquals((float) x, (float) mh_ff.invokeExact(x)); // float -> float |
390 assertEquals((float) x, (float) mh_ff.invokeExact(x)); // float -> float |
391 assertEquals((double) x, (double) mh_df.invokeExact(x)); // float -> double |
391 assertEquals((double) x, (double) mh_df.invokeExact(x)); // float -> double |
392 if (!DO_CASTS) return; |
392 if (!DO_CASTS) return; |
408 try { long y = (long) mh_jf.invokeExact(x); fail(); } catch (ClassCastException expected) {} // float -> long |
408 try { long y = (long) mh_jf.invokeExact(x); fail(); } catch (ClassCastException expected) {} // float -> long |
409 } |
409 } |
410 |
410 |
411 private static MethodHandle mh_d(Class ret) { return mh(ret, double.class); } |
411 private static MethodHandle mh_d(Class ret) { return mh(ret, double.class); } |
412 |
412 |
413 private final static MethodHandle mh_zd = mh_d(boolean.class); |
413 private static final MethodHandle mh_zd = mh_d(boolean.class); |
414 private final static MethodHandle mh_bd = mh_d(byte.class ); |
414 private static final MethodHandle mh_bd = mh_d(byte.class ); |
415 private final static MethodHandle mh_cd = mh_d(char.class ); |
415 private static final MethodHandle mh_cd = mh_d(char.class ); |
416 private final static MethodHandle mh_sd = mh_d(short.class ); |
416 private static final MethodHandle mh_sd = mh_d(short.class ); |
417 private final static MethodHandle mh_id = mh_d(int.class ); |
417 private static final MethodHandle mh_id = mh_d(int.class ); |
418 private final static MethodHandle mh_jd = mh_d(long.class ); |
418 private static final MethodHandle mh_jd = mh_d(long.class ); |
419 private final static MethodHandle mh_fd = mh_d(float.class ); |
419 private static final MethodHandle mh_fd = mh_d(float.class ); |
420 private final static MethodHandle mh_dd = mh_d(double.class ); |
420 private static final MethodHandle mh_dd = mh_d(double.class ); |
421 |
421 |
422 private static void double2prim(double x) throws Throwable { |
422 private static void double2prim(double x) throws Throwable { |
423 assertEquals((double) x, (double) mh_dd.invokeExact(x)); // double -> double |
423 assertEquals((double) x, (double) mh_dd.invokeExact(x)); // double -> double |
424 if (!DO_CASTS) return; |
424 if (!DO_CASTS) return; |
425 boolean z = (((byte) x & 1) != 0); |
425 boolean z = (((byte) x & 1) != 0); |
440 try { int y = (int) mh_id.invokeExact(x); fail(); } catch (ClassCastException expected) {} // double -> int |
440 try { int y = (int) mh_id.invokeExact(x); fail(); } catch (ClassCastException expected) {} // double -> int |
441 try { long y = (long) mh_jd.invokeExact(x); fail(); } catch (ClassCastException expected) {} // double -> long |
441 try { long y = (long) mh_jd.invokeExact(x); fail(); } catch (ClassCastException expected) {} // double -> long |
442 try { float y = (float) mh_fd.invokeExact(x); fail(); } catch (ClassCastException expected) {} // double -> float |
442 try { float y = (float) mh_fd.invokeExact(x); fail(); } catch (ClassCastException expected) {} // double -> float |
443 } |
443 } |
444 |
444 |
445 private final static MethodHandle mh_zv = mh(boolean.class); |
445 private static final MethodHandle mh_zv = mh(boolean.class); |
446 private final static MethodHandle mh_bv = mh(byte.class ); |
446 private static final MethodHandle mh_bv = mh(byte.class ); |
447 private final static MethodHandle mh_cv = mh(char.class ); |
447 private static final MethodHandle mh_cv = mh(char.class ); |
448 private final static MethodHandle mh_sv = mh(short.class ); |
448 private static final MethodHandle mh_sv = mh(short.class ); |
449 private final static MethodHandle mh_iv = mh(int.class ); |
449 private static final MethodHandle mh_iv = mh(int.class ); |
450 private final static MethodHandle mh_jv = mh(long.class ); |
450 private static final MethodHandle mh_jv = mh(long.class ); |
451 private final static MethodHandle mh_fv = mh(float.class ); |
451 private static final MethodHandle mh_fv = mh(float.class ); |
452 private final static MethodHandle mh_dv = mh(double.class ); |
452 private static final MethodHandle mh_dv = mh(double.class ); |
453 |
453 |
454 private static void void2prim(int i) throws Throwable { |
454 private static void void2prim(int i) throws Throwable { |
455 assertEquals( false, (boolean) mh_zv.invokeExact()); // void -> boolean |
455 assertEquals( false, (boolean) mh_zv.invokeExact()); // void -> boolean |
456 assertEquals((byte) 0, (byte) mh_bv.invokeExact()); // void -> byte |
456 assertEquals((byte) 0, (byte) mh_bv.invokeExact()); // void -> byte |
457 assertEquals((char) 0, (char) mh_cv.invokeExact()); // void -> char |
457 assertEquals((char) 0, (char) mh_cv.invokeExact()); // void -> char |
466 // no cases |
466 // no cases |
467 } |
467 } |
468 |
468 |
469 private static MethodHandle mh_v(Class arg) { return mh(void.class, arg); } |
469 private static MethodHandle mh_v(Class arg) { return mh(void.class, arg); } |
470 |
470 |
471 private final static MethodHandle mh_vz = mh_v(boolean.class); |
471 private static final MethodHandle mh_vz = mh_v(boolean.class); |
472 private final static MethodHandle mh_vb = mh_v(byte.class ); |
472 private static final MethodHandle mh_vb = mh_v(byte.class ); |
473 private final static MethodHandle mh_vc = mh_v(char.class ); |
473 private static final MethodHandle mh_vc = mh_v(char.class ); |
474 private final static MethodHandle mh_vs = mh_v(short.class ); |
474 private static final MethodHandle mh_vs = mh_v(short.class ); |
475 private final static MethodHandle mh_vi = mh_v(int.class ); |
475 private static final MethodHandle mh_vi = mh_v(int.class ); |
476 private final static MethodHandle mh_vj = mh_v(long.class ); |
476 private static final MethodHandle mh_vj = mh_v(long.class ); |
477 private final static MethodHandle mh_vf = mh_v(float.class ); |
477 private static final MethodHandle mh_vf = mh_v(float.class ); |
478 private final static MethodHandle mh_vd = mh_v(double.class ); |
478 private static final MethodHandle mh_vd = mh_v(double.class ); |
479 |
479 |
480 private static void prim2void(int x) throws Throwable { |
480 private static void prim2void(int x) throws Throwable { |
481 boolean z = ((x & 1) != 0); |
481 boolean z = ((x & 1) != 0); |
482 mh_vz.invokeExact( z); // boolean -> void |
482 mh_vz.invokeExact( z); // boolean -> void |
483 mh_vb.invokeExact((byte) x); // byte -> void |
483 mh_vb.invokeExact((byte) x); // byte -> void |