< prev index next >

test/java/lang/invoke/6998541/Test6998541.java

Print this page
rev 10985 : [mq]: 8061549


 197     private final static MethodHandle mh_sz = mh_z(short.class  );
 198     private final static MethodHandle mh_iz = mh_z(int.class    );
 199     private final static MethodHandle mh_jz = mh_z(long.class   );
 200     private final static MethodHandle mh_fz = mh_z(float.class  );
 201     private final static MethodHandle mh_dz = mh_z(double.class );
 202 
 203     private static void boolean2prim(boolean x) throws Throwable {
 204         int i = x ? 1 : 0;
 205         assertEquals(          x, (boolean) mh_zz.invokeExact(x));  // boolean -> boolean
 206         if (!DO_CASTS)  return;
 207         assertEquals((byte)    i, (byte)    mh_bz.invokeExact(x));  // boolean -> byte
 208         assertEquals((char)    i, (char)    mh_cz.invokeExact(x));  // boolean -> char
 209         assertEquals((short)   i, (short)   mh_sz.invokeExact(x));  // boolean -> short
 210         assertEquals((int)     i, (int)     mh_iz.invokeExact(x));  // boolean -> int
 211         assertEquals((long)    i, (long)    mh_jz.invokeExact(x));  // boolean -> long
 212         assertEquals((float)   i, (float)   mh_fz.invokeExact(x));  // boolean -> float
 213         assertEquals((double)  i, (double)  mh_dz.invokeExact(x));  // boolean -> double
 214     }
 215     private static void boolean2prim_invalid(boolean x) throws Throwable {
 216         if (DO_CASTS)  return;
 217         try { byte    y = (byte)    mh_bz.invokeExact(x); fail(); } catch (ClassCastException _) {}  // boolean -> byte
 218         try { char    y = (char)    mh_cz.invokeExact(x); fail(); } catch (ClassCastException _) {}  // boolean -> char
 219         try { short   y = (short)   mh_sz.invokeExact(x); fail(); } catch (ClassCastException _) {}  // boolean -> short
 220         try { int     y = (int)     mh_iz.invokeExact(x); fail(); } catch (ClassCastException _) {}  // boolean -> int
 221         try { long    y = (long)    mh_jz.invokeExact(x); fail(); } catch (ClassCastException _) {}  // boolean -> long
 222         try { float   y = (float)   mh_fz.invokeExact(x); fail(); } catch (ClassCastException _) {}  // boolean -> float
 223         try { double  y = (double)  mh_dz.invokeExact(x); fail(); } catch (ClassCastException _) {}  // boolean -> double
 224     }
 225 
 226     private static MethodHandle mh_b(Class ret) { return mh(ret, byte.class); }
 227 
 228     private final static MethodHandle mh_zb = mh_b(boolean.class);
 229     private final static MethodHandle mh_bb = mh_b(byte.class   );
 230     private final static MethodHandle mh_cb = mh_b(char.class   );
 231     private final static MethodHandle mh_sb = mh_b(short.class  );
 232     private final static MethodHandle mh_ib = mh_b(int.class    );
 233     private final static MethodHandle mh_jb = mh_b(long.class   );
 234     private final static MethodHandle mh_fb = mh_b(float.class  );
 235     private final static MethodHandle mh_db = mh_b(double.class );
 236 
 237     private static void byte2prim(byte x) throws Throwable {
 238         assertEquals((byte)    x, (byte)    mh_bb.invokeExact(x));  // byte -> byte
 239         assertEquals((short)   x, (short)   mh_sb.invokeExact(x));  // byte -> short
 240         assertEquals((int)     x, (int)     mh_ib.invokeExact(x));  // byte -> int
 241         assertEquals((long)    x, (long)    mh_jb.invokeExact(x));  // byte -> long
 242         assertEquals((float)   x, (float)   mh_fb.invokeExact(x));  // byte -> float
 243         assertEquals((double)  x, (double)  mh_db.invokeExact(x));  // byte -> double
 244         if (!DO_CASTS)  return;
 245         boolean z = ((x & 1) != 0);
 246         assertEquals((char)    x, (char)    mh_cb.invokeExact(x));  // byte -> char
 247         assertEquals((boolean) z, (boolean) mh_zb.invokeExact(x));  // byte -> boolean
 248     }
 249     private static void byte2prim_invalid(byte x) throws Throwable {
 250         if (DO_CASTS)  return;
 251         try { char    y = (char)    mh_cb.invokeExact(x); fail(); } catch (ClassCastException _) {}  // byte -> char
 252         try { boolean y = (boolean) mh_zb.invokeExact(x); fail(); } catch (ClassCastException _) {}  // byte -> boolean
 253     }
 254 
 255     private static MethodHandle mh_c(Class ret) { return mh(ret, char.class); }
 256 
 257     private final static MethodHandle mh_zc = mh_c(boolean.class);
 258     private final static MethodHandle mh_bc = mh_c(byte.class   );
 259     private final static MethodHandle mh_cc = mh_c(char.class   );
 260     private final static MethodHandle mh_sc = mh_c(short.class  );
 261     private final static MethodHandle mh_ic = mh_c(int.class    );
 262     private final static MethodHandle mh_jc = mh_c(long.class   );
 263     private final static MethodHandle mh_fc = mh_c(float.class  );
 264     private final static MethodHandle mh_dc = mh_c(double.class );
 265 
 266     private static void char2prim(char x) throws Throwable {
 267         assertEquals((char)    x, (char)    mh_cc.invokeExact(x));  // char -> char
 268         assertEquals((int)     x, (int)     mh_ic.invokeExact(x));  // char -> int
 269         assertEquals((long)    x, (long)    mh_jc.invokeExact(x));  // char -> long
 270         assertEquals((float)   x, (float)   mh_fc.invokeExact(x));  // char -> float
 271         assertEquals((double)  x, (double)  mh_dc.invokeExact(x));  // char -> double
 272         if (!DO_CASTS)  return;
 273         boolean z = ((x & 1) != 0);
 274         assertEquals((boolean) z, (boolean) mh_zc.invokeExact(x));  // char -> boolean
 275         assertEquals((byte)    x, (byte)    mh_bc.invokeExact(x));  // char -> byte
 276         assertEquals((short)   x, (short)   mh_sc.invokeExact(x));  // char -> short
 277     }
 278     private static void char2prim_invalid(char x) throws Throwable {
 279         if (DO_CASTS)  return;
 280         try { boolean y = (boolean) mh_zc.invokeExact(x); fail(); } catch (ClassCastException _) {}  // char -> boolean
 281         try { byte    y = (byte)    mh_bc.invokeExact(x); fail(); } catch (ClassCastException _) {}  // char -> byte
 282         try { short   y = (short)   mh_sc.invokeExact(x); fail(); } catch (ClassCastException _) {}  // char -> short
 283     }
 284 
 285     private static MethodHandle mh_s(Class ret) { return mh(ret, short.class); }
 286 
 287     private final static MethodHandle mh_zs = mh_s(boolean.class);
 288     private final static MethodHandle mh_bs = mh_s(byte.class   );
 289     private final static MethodHandle mh_cs = mh_s(char.class   );
 290     private final static MethodHandle mh_ss = mh_s(short.class  );
 291     private final static MethodHandle mh_is = mh_s(int.class    );
 292     private final static MethodHandle mh_js = mh_s(long.class   );
 293     private final static MethodHandle mh_fs = mh_s(float.class  );
 294     private final static MethodHandle mh_ds = mh_s(double.class );
 295 
 296     private static void short2prim(short x) throws Throwable {
 297         assertEquals((short)   x, (short)   mh_ss.invokeExact(x));  // short -> short
 298         assertEquals((int)     x, (int)     mh_is.invokeExact(x));  // short -> int
 299         assertEquals((long)    x, (long)    mh_js.invokeExact(x));  // short -> long
 300         assertEquals((float)   x, (float)   mh_fs.invokeExact(x));  // short -> float
 301         assertEquals((double)  x, (double)  mh_ds.invokeExact(x));  // short -> double
 302         if (!DO_CASTS)  return;
 303         boolean z = ((x & 1) != 0);
 304         assertEquals((boolean) z, (boolean) mh_zs.invokeExact(x));  // short -> boolean
 305         assertEquals((byte)    x, (byte)    mh_bs.invokeExact(x));  // short -> byte
 306         assertEquals((char)    x, (char)    mh_cs.invokeExact(x));  // short -> char
 307     }
 308     private static void short2prim_invalid(short x) throws Throwable {
 309         if (DO_CASTS)  return;
 310         try { boolean y = (boolean) mh_zs.invokeExact(x); fail(); } catch (ClassCastException _) {}  // short -> boolean
 311         try { byte    y = (byte)    mh_bs.invokeExact(x); fail(); } catch (ClassCastException _) {}  // short -> byte
 312         try { char    y = (char)    mh_cs.invokeExact(x); fail(); } catch (ClassCastException _) {}  // short -> char
 313     }
 314 
 315     private static MethodHandle mh_i(Class ret) { return mh(ret, int.class); }
 316 
 317     private final static MethodHandle mh_zi = mh_i(boolean.class);
 318     private final static MethodHandle mh_bi = mh_i(byte.class   );
 319     private final static MethodHandle mh_ci = mh_i(char.class   );
 320     private final static MethodHandle mh_si = mh_i(short.class  );
 321     private final static MethodHandle mh_ii = mh_i(int.class    );
 322     private final static MethodHandle mh_ji = mh_i(long.class   );
 323     private final static MethodHandle mh_fi = mh_i(float.class  );
 324     private final static MethodHandle mh_di = mh_i(double.class );
 325 
 326     private static void int2prim(int x) throws Throwable {
 327         assertEquals((int)     x, (int)     mh_ii.invokeExact(x));  // int -> int
 328         assertEquals((long)    x, (long)    mh_ji.invokeExact(x));  // int -> long
 329         assertEquals((float)   x, (float)   mh_fi.invokeExact(x));  // int -> float
 330         assertEquals((double)  x, (double)  mh_di.invokeExact(x));  // int -> double
 331         if (!DO_CASTS)  return;
 332         boolean z = ((x & 1) != 0);
 333         assertEquals((boolean) z, (boolean) mh_zi.invokeExact(x));  // int -> boolean
 334         assertEquals((byte)    x, (byte)    mh_bi.invokeExact(x));  // int -> byte
 335         assertEquals((char)    x, (char)    mh_ci.invokeExact(x));  // int -> char
 336         assertEquals((short)   x, (short)   mh_si.invokeExact(x));  // int -> short
 337     }
 338     private static void int2prim_invalid(int x) throws Throwable {
 339         if (DO_CASTS)  return;
 340         try { boolean y = (boolean) mh_zi.invokeExact(x); fail(); } catch (ClassCastException _) {}  // int -> boolean
 341         try { byte    y = (byte)    mh_bi.invokeExact(x); fail(); } catch (ClassCastException _) {}  // int -> byte
 342         try { char    y = (char)    mh_ci.invokeExact(x); fail(); } catch (ClassCastException _) {}  // int -> char
 343         try { short   y = (short)   mh_si.invokeExact(x); fail(); } catch (ClassCastException _) {}  // int -> short
 344     }
 345 
 346     private static MethodHandle mh_j(Class ret) { return mh(ret, long.class); }
 347 
 348     private final static MethodHandle mh_zj = mh_j(boolean.class);
 349     private final static MethodHandle mh_bj = mh_j(byte.class   );
 350     private final static MethodHandle mh_cj = mh_j(char.class   );
 351     private final static MethodHandle mh_sj = mh_j(short.class  );
 352     private final static MethodHandle mh_ij = mh_j(int.class    );
 353     private final static MethodHandle mh_jj = mh_j(long.class   );
 354     private final static MethodHandle mh_fj = mh_j(float.class  );
 355     private final static MethodHandle mh_dj = mh_j(double.class );
 356 
 357     private static void long2prim(long x) throws Throwable {
 358         assertEquals((long)   x, (long)    mh_jj.invokeExact(x));  // long -> long
 359         assertEquals((float)  x, (float)   mh_fj.invokeExact(x));  // long -> float
 360         assertEquals((double) x, (double)  mh_dj.invokeExact(x));  // long -> double
 361         if (!DO_CASTS)  return;
 362         boolean z = ((x & 1) != 0);
 363         assertEquals((boolean)z, (boolean) mh_zj.invokeExact(x));  // long -> boolean
 364         assertEquals((byte)   x, (byte)    mh_bj.invokeExact(x));  // long -> byte
 365         assertEquals((char)   x, (char)    mh_cj.invokeExact(x));  // long -> char
 366         assertEquals((short)  x, (short)   mh_sj.invokeExact(x));  // long -> short
 367         assertEquals((int)    x, (int)     mh_ij.invokeExact(x));  // long -> int
 368     }
 369     private static void long2prim_invalid(long x) throws Throwable {
 370         if (DO_CASTS)  return;
 371         try { boolean y = (boolean) mh_zj.invokeExact(x); fail(); } catch (ClassCastException _) {}  // long -> boolean
 372         try { byte    y = (byte)    mh_bj.invokeExact(x); fail(); } catch (ClassCastException _) {}  // long -> byte
 373         try { char    y = (char)    mh_cj.invokeExact(x); fail(); } catch (ClassCastException _) {}  // long -> char
 374         try { short   y = (short)   mh_sj.invokeExact(x); fail(); } catch (ClassCastException _) {}  // long -> short
 375         try { int     y = (int)     mh_ij.invokeExact(x); fail(); } catch (ClassCastException _) {}  // long -> int
 376     }
 377 
 378     private static MethodHandle mh_f(Class ret) { return mh(ret, float.class); }
 379 
 380     private final static MethodHandle mh_zf = mh_f(boolean.class);
 381     private final static MethodHandle mh_bf = mh_f(byte.class   );
 382     private final static MethodHandle mh_cf = mh_f(char.class   );
 383     private final static MethodHandle mh_sf = mh_f(short.class  );
 384     private final static MethodHandle mh_if = mh_f(int.class    );
 385     private final static MethodHandle mh_jf = mh_f(long.class   );
 386     private final static MethodHandle mh_ff = mh_f(float.class  );
 387     private final static MethodHandle mh_df = mh_f(double.class );
 388 
 389     private static void float2prim(float x) throws Throwable {
 390         assertEquals((float)   x, (float)   mh_ff.invokeExact(x));  // float -> float
 391         assertEquals((double)  x, (double)  mh_df.invokeExact(x));  // float -> double
 392         if (!DO_CASTS)  return;
 393         boolean z = (((byte) x & 1) != 0);
 394         assertEquals((boolean) z, (boolean) mh_zf.invokeExact(x));  // float -> boolean
 395         assertEquals((byte)    x, (byte)    mh_bf.invokeExact(x));  // float -> byte
 396         assertEquals((char)    x, (char)    mh_cf.invokeExact(x));  // float -> char
 397         assertEquals((short)   x, (short)   mh_sf.invokeExact(x));  // float -> short
 398         assertEquals((int)     x, (int)     mh_if.invokeExact(x));  // float -> int
 399         assertEquals((long)    x, (long)    mh_jf.invokeExact(x));  // float -> long
 400     }
 401     private static void float2prim_invalid(float x) throws Throwable {
 402         if (DO_CASTS)  return;
 403         try { boolean y = (boolean) mh_zf.invokeExact(x); fail(); } catch (ClassCastException _) {}  // float -> boolean
 404         try { byte    y = (byte)    mh_bf.invokeExact(x); fail(); } catch (ClassCastException _) {}  // float -> byte
 405         try { char    y = (char)    mh_cf.invokeExact(x); fail(); } catch (ClassCastException _) {}  // float -> char
 406         try { short   y = (short)   mh_sf.invokeExact(x); fail(); } catch (ClassCastException _) {}  // float -> short
 407         try { int     y = (int)     mh_if.invokeExact(x); fail(); } catch (ClassCastException _) {}  // float -> int
 408         try { long    y = (long)    mh_jf.invokeExact(x); fail(); } catch (ClassCastException _) {}  // float -> long
 409     }
 410 
 411     private static MethodHandle mh_d(Class ret) { return mh(ret, double.class); }
 412 
 413     private final static MethodHandle mh_zd = mh_d(boolean.class);
 414     private final static MethodHandle mh_bd = mh_d(byte.class   );
 415     private final static MethodHandle mh_cd = mh_d(char.class   );
 416     private final static MethodHandle mh_sd = mh_d(short.class  );
 417     private final static MethodHandle mh_id = mh_d(int.class    );
 418     private final static MethodHandle mh_jd = mh_d(long.class   );
 419     private final static MethodHandle mh_fd = mh_d(float.class  );
 420     private final static MethodHandle mh_dd = mh_d(double.class );
 421 
 422     private static void double2prim(double x) throws Throwable {
 423         assertEquals((double) x, (double)  mh_dd.invokeExact(x));  // double -> double
 424         if (!DO_CASTS)  return;
 425         boolean z = (((byte) x & 1) != 0);
 426         assertEquals((boolean) z, (boolean) mh_zd.invokeExact(x));  // double -> boolean
 427         assertEquals((byte)    x, (byte)    mh_bd.invokeExact(x));  // double -> byte
 428         assertEquals((char)    x, (char)    mh_cd.invokeExact(x));  // double -> char
 429         assertEquals((short)   x, (short)   mh_sd.invokeExact(x));  // double -> short
 430         assertEquals((int)     x, (int)     mh_id.invokeExact(x));  // double -> int
 431         assertEquals((long)    x, (long)    mh_jd.invokeExact(x));  // double -> long
 432         assertEquals((float)   x, (float)   mh_fd.invokeExact(x));  // double -> float
 433     }
 434     private static void double2prim_invalid(double x) throws Throwable {
 435         if (DO_CASTS)  return;
 436         try { boolean y = (boolean) mh_zd.invokeExact(x); fail(); } catch (ClassCastException _) {}  // double -> boolean
 437         try { byte    y = (byte)    mh_bd.invokeExact(x); fail(); } catch (ClassCastException _) {}  // double -> byte
 438         try { char    y = (char)    mh_cd.invokeExact(x); fail(); } catch (ClassCastException _) {}  // double -> char
 439         try { short   y = (short)   mh_sd.invokeExact(x); fail(); } catch (ClassCastException _) {}  // double -> short
 440         try { int     y = (int)     mh_id.invokeExact(x); fail(); } catch (ClassCastException _) {}  // double -> int
 441         try { long    y = (long)    mh_jd.invokeExact(x); fail(); } catch (ClassCastException _) {}  // double -> long
 442         try { float   y = (float)   mh_fd.invokeExact(x); fail(); } catch (ClassCastException _) {}  // double -> float
 443     }
 444 
 445     private final static MethodHandle mh_zv = mh(boolean.class);
 446     private final static MethodHandle mh_bv = mh(byte.class   );
 447     private final static MethodHandle mh_cv = mh(char.class   );
 448     private final static MethodHandle mh_sv = mh(short.class  );
 449     private final static MethodHandle mh_iv = mh(int.class    );
 450     private final static MethodHandle mh_jv = mh(long.class   );
 451     private final static MethodHandle mh_fv = mh(float.class  );
 452     private final static MethodHandle mh_dv = mh(double.class );
 453 
 454     private static void void2prim(int i) throws Throwable {
 455         assertEquals(        false, (boolean) mh_zv.invokeExact());  // void -> boolean
 456         assertEquals((byte)  0,     (byte)    mh_bv.invokeExact());  // void -> byte
 457         assertEquals((char)  0,     (char)    mh_cv.invokeExact());  // void -> char
 458         assertEquals((short) 0,     (short)   mh_sv.invokeExact());  // void -> short
 459         assertEquals(        0,     (int)     mh_iv.invokeExact());  // void -> int
 460         assertEquals(        0L,    (long)    mh_jv.invokeExact());  // void -> long
 461         assertEquals(        0.0f,  (float)   mh_fv.invokeExact());  // void -> float
 462         assertEquals(        0.0d,  (double)  mh_dv.invokeExact());  // void -> double




 197     private final static MethodHandle mh_sz = mh_z(short.class  );
 198     private final static MethodHandle mh_iz = mh_z(int.class    );
 199     private final static MethodHandle mh_jz = mh_z(long.class   );
 200     private final static MethodHandle mh_fz = mh_z(float.class  );
 201     private final static MethodHandle mh_dz = mh_z(double.class );
 202 
 203     private static void boolean2prim(boolean x) throws Throwable {
 204         int i = x ? 1 : 0;
 205         assertEquals(          x, (boolean) mh_zz.invokeExact(x));  // boolean -> boolean
 206         if (!DO_CASTS)  return;
 207         assertEquals((byte)    i, (byte)    mh_bz.invokeExact(x));  // boolean -> byte
 208         assertEquals((char)    i, (char)    mh_cz.invokeExact(x));  // boolean -> char
 209         assertEquals((short)   i, (short)   mh_sz.invokeExact(x));  // boolean -> short
 210         assertEquals((int)     i, (int)     mh_iz.invokeExact(x));  // boolean -> int
 211         assertEquals((long)    i, (long)    mh_jz.invokeExact(x));  // boolean -> long
 212         assertEquals((float)   i, (float)   mh_fz.invokeExact(x));  // boolean -> float
 213         assertEquals((double)  i, (double)  mh_dz.invokeExact(x));  // boolean -> double
 214     }
 215     private static void boolean2prim_invalid(boolean x) throws Throwable {
 216         if (DO_CASTS)  return;
 217         try { byte    y = (byte)    mh_bz.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // boolean -> byte
 218         try { char    y = (char)    mh_cz.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // boolean -> char
 219         try { short   y = (short)   mh_sz.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // boolean -> short
 220         try { int     y = (int)     mh_iz.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // boolean -> int
 221         try { long    y = (long)    mh_jz.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // boolean -> long
 222         try { float   y = (float)   mh_fz.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // boolean -> float
 223         try { double  y = (double)  mh_dz.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // boolean -> double
 224     }
 225 
 226     private static MethodHandle mh_b(Class ret) { return mh(ret, byte.class); }
 227 
 228     private final static MethodHandle mh_zb = mh_b(boolean.class);
 229     private final static MethodHandle mh_bb = mh_b(byte.class   );
 230     private final static MethodHandle mh_cb = mh_b(char.class   );
 231     private final static MethodHandle mh_sb = mh_b(short.class  );
 232     private final static MethodHandle mh_ib = mh_b(int.class    );
 233     private final static MethodHandle mh_jb = mh_b(long.class   );
 234     private final static MethodHandle mh_fb = mh_b(float.class  );
 235     private final static MethodHandle mh_db = mh_b(double.class );
 236 
 237     private static void byte2prim(byte x) throws Throwable {
 238         assertEquals((byte)    x, (byte)    mh_bb.invokeExact(x));  // byte -> byte
 239         assertEquals((short)   x, (short)   mh_sb.invokeExact(x));  // byte -> short
 240         assertEquals((int)     x, (int)     mh_ib.invokeExact(x));  // byte -> int
 241         assertEquals((long)    x, (long)    mh_jb.invokeExact(x));  // byte -> long
 242         assertEquals((float)   x, (float)   mh_fb.invokeExact(x));  // byte -> float
 243         assertEquals((double)  x, (double)  mh_db.invokeExact(x));  // byte -> double
 244         if (!DO_CASTS)  return;
 245         boolean z = ((x & 1) != 0);
 246         assertEquals((char)    x, (char)    mh_cb.invokeExact(x));  // byte -> char
 247         assertEquals((boolean) z, (boolean) mh_zb.invokeExact(x));  // byte -> boolean
 248     }
 249     private static void byte2prim_invalid(byte x) throws Throwable {
 250         if (DO_CASTS)  return;
 251         try { char    y = (char)    mh_cb.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // byte -> char
 252         try { boolean y = (boolean) mh_zb.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // byte -> boolean
 253     }
 254 
 255     private static MethodHandle mh_c(Class ret) { return mh(ret, char.class); }
 256 
 257     private final static MethodHandle mh_zc = mh_c(boolean.class);
 258     private final static MethodHandle mh_bc = mh_c(byte.class   );
 259     private final static MethodHandle mh_cc = mh_c(char.class   );
 260     private final static MethodHandle mh_sc = mh_c(short.class  );
 261     private final static MethodHandle mh_ic = mh_c(int.class    );
 262     private final static MethodHandle mh_jc = mh_c(long.class   );
 263     private final static MethodHandle mh_fc = mh_c(float.class  );
 264     private final static MethodHandle mh_dc = mh_c(double.class );
 265 
 266     private static void char2prim(char x) throws Throwable {
 267         assertEquals((char)    x, (char)    mh_cc.invokeExact(x));  // char -> char
 268         assertEquals((int)     x, (int)     mh_ic.invokeExact(x));  // char -> int
 269         assertEquals((long)    x, (long)    mh_jc.invokeExact(x));  // char -> long
 270         assertEquals((float)   x, (float)   mh_fc.invokeExact(x));  // char -> float
 271         assertEquals((double)  x, (double)  mh_dc.invokeExact(x));  // char -> double
 272         if (!DO_CASTS)  return;
 273         boolean z = ((x & 1) != 0);
 274         assertEquals((boolean) z, (boolean) mh_zc.invokeExact(x));  // char -> boolean
 275         assertEquals((byte)    x, (byte)    mh_bc.invokeExact(x));  // char -> byte
 276         assertEquals((short)   x, (short)   mh_sc.invokeExact(x));  // char -> short
 277     }
 278     private static void char2prim_invalid(char x) throws Throwable {
 279         if (DO_CASTS)  return;
 280         try { boolean y = (boolean) mh_zc.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // char -> boolean
 281         try { byte    y = (byte)    mh_bc.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // char -> byte
 282         try { short   y = (short)   mh_sc.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // char -> short
 283     }
 284 
 285     private static MethodHandle mh_s(Class ret) { return mh(ret, short.class); }
 286 
 287     private final static MethodHandle mh_zs = mh_s(boolean.class);
 288     private final static MethodHandle mh_bs = mh_s(byte.class   );
 289     private final static MethodHandle mh_cs = mh_s(char.class   );
 290     private final static MethodHandle mh_ss = mh_s(short.class  );
 291     private final static MethodHandle mh_is = mh_s(int.class    );
 292     private final static MethodHandle mh_js = mh_s(long.class   );
 293     private final static MethodHandle mh_fs = mh_s(float.class  );
 294     private final static MethodHandle mh_ds = mh_s(double.class );
 295 
 296     private static void short2prim(short x) throws Throwable {
 297         assertEquals((short)   x, (short)   mh_ss.invokeExact(x));  // short -> short
 298         assertEquals((int)     x, (int)     mh_is.invokeExact(x));  // short -> int
 299         assertEquals((long)    x, (long)    mh_js.invokeExact(x));  // short -> long
 300         assertEquals((float)   x, (float)   mh_fs.invokeExact(x));  // short -> float
 301         assertEquals((double)  x, (double)  mh_ds.invokeExact(x));  // short -> double
 302         if (!DO_CASTS)  return;
 303         boolean z = ((x & 1) != 0);
 304         assertEquals((boolean) z, (boolean) mh_zs.invokeExact(x));  // short -> boolean
 305         assertEquals((byte)    x, (byte)    mh_bs.invokeExact(x));  // short -> byte
 306         assertEquals((char)    x, (char)    mh_cs.invokeExact(x));  // short -> char
 307     }
 308     private static void short2prim_invalid(short x) throws Throwable {
 309         if (DO_CASTS)  return;
 310         try { boolean y = (boolean) mh_zs.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // short -> boolean
 311         try { byte    y = (byte)    mh_bs.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // short -> byte
 312         try { char    y = (char)    mh_cs.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // short -> char
 313     }
 314 
 315     private static MethodHandle mh_i(Class ret) { return mh(ret, int.class); }
 316 
 317     private final static MethodHandle mh_zi = mh_i(boolean.class);
 318     private final static MethodHandle mh_bi = mh_i(byte.class   );
 319     private final static MethodHandle mh_ci = mh_i(char.class   );
 320     private final static MethodHandle mh_si = mh_i(short.class  );
 321     private final static MethodHandle mh_ii = mh_i(int.class    );
 322     private final static MethodHandle mh_ji = mh_i(long.class   );
 323     private final static MethodHandle mh_fi = mh_i(float.class  );
 324     private final static MethodHandle mh_di = mh_i(double.class );
 325 
 326     private static void int2prim(int x) throws Throwable {
 327         assertEquals((int)     x, (int)     mh_ii.invokeExact(x));  // int -> int
 328         assertEquals((long)    x, (long)    mh_ji.invokeExact(x));  // int -> long
 329         assertEquals((float)   x, (float)   mh_fi.invokeExact(x));  // int -> float
 330         assertEquals((double)  x, (double)  mh_di.invokeExact(x));  // int -> double
 331         if (!DO_CASTS)  return;
 332         boolean z = ((x & 1) != 0);
 333         assertEquals((boolean) z, (boolean) mh_zi.invokeExact(x));  // int -> boolean
 334         assertEquals((byte)    x, (byte)    mh_bi.invokeExact(x));  // int -> byte
 335         assertEquals((char)    x, (char)    mh_ci.invokeExact(x));  // int -> char
 336         assertEquals((short)   x, (short)   mh_si.invokeExact(x));  // int -> short
 337     }
 338     private static void int2prim_invalid(int x) throws Throwable {
 339         if (DO_CASTS)  return;
 340         try { boolean y = (boolean) mh_zi.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // int -> boolean
 341         try { byte    y = (byte)    mh_bi.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // int -> byte
 342         try { char    y = (char)    mh_ci.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // int -> char
 343         try { short   y = (short)   mh_si.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // int -> short
 344     }
 345 
 346     private static MethodHandle mh_j(Class ret) { return mh(ret, long.class); }
 347 
 348     private final static MethodHandle mh_zj = mh_j(boolean.class);
 349     private final static MethodHandle mh_bj = mh_j(byte.class   );
 350     private final static MethodHandle mh_cj = mh_j(char.class   );
 351     private final static MethodHandle mh_sj = mh_j(short.class  );
 352     private final static MethodHandle mh_ij = mh_j(int.class    );
 353     private final static MethodHandle mh_jj = mh_j(long.class   );
 354     private final static MethodHandle mh_fj = mh_j(float.class  );
 355     private final static MethodHandle mh_dj = mh_j(double.class );
 356 
 357     private static void long2prim(long x) throws Throwable {
 358         assertEquals((long)   x, (long)    mh_jj.invokeExact(x));  // long -> long
 359         assertEquals((float)  x, (float)   mh_fj.invokeExact(x));  // long -> float
 360         assertEquals((double) x, (double)  mh_dj.invokeExact(x));  // long -> double
 361         if (!DO_CASTS)  return;
 362         boolean z = ((x & 1) != 0);
 363         assertEquals((boolean)z, (boolean) mh_zj.invokeExact(x));  // long -> boolean
 364         assertEquals((byte)   x, (byte)    mh_bj.invokeExact(x));  // long -> byte
 365         assertEquals((char)   x, (char)    mh_cj.invokeExact(x));  // long -> char
 366         assertEquals((short)  x, (short)   mh_sj.invokeExact(x));  // long -> short
 367         assertEquals((int)    x, (int)     mh_ij.invokeExact(x));  // long -> int
 368     }
 369     private static void long2prim_invalid(long x) throws Throwable {
 370         if (DO_CASTS)  return;
 371         try { boolean y = (boolean) mh_zj.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // long -> boolean
 372         try { byte    y = (byte)    mh_bj.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // long -> byte
 373         try { char    y = (char)    mh_cj.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // long -> char
 374         try { short   y = (short)   mh_sj.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // long -> short
 375         try { int     y = (int)     mh_ij.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // long -> int
 376     }
 377 
 378     private static MethodHandle mh_f(Class ret) { return mh(ret, float.class); }
 379 
 380     private final static MethodHandle mh_zf = mh_f(boolean.class);
 381     private final static MethodHandle mh_bf = mh_f(byte.class   );
 382     private final static MethodHandle mh_cf = mh_f(char.class   );
 383     private final static MethodHandle mh_sf = mh_f(short.class  );
 384     private final static MethodHandle mh_if = mh_f(int.class    );
 385     private final static MethodHandle mh_jf = mh_f(long.class   );
 386     private final static MethodHandle mh_ff = mh_f(float.class  );
 387     private final static MethodHandle mh_df = mh_f(double.class );
 388 
 389     private static void float2prim(float x) throws Throwable {
 390         assertEquals((float)   x, (float)   mh_ff.invokeExact(x));  // float -> float
 391         assertEquals((double)  x, (double)  mh_df.invokeExact(x));  // float -> double
 392         if (!DO_CASTS)  return;
 393         boolean z = (((byte) x & 1) != 0);
 394         assertEquals((boolean) z, (boolean) mh_zf.invokeExact(x));  // float -> boolean
 395         assertEquals((byte)    x, (byte)    mh_bf.invokeExact(x));  // float -> byte
 396         assertEquals((char)    x, (char)    mh_cf.invokeExact(x));  // float -> char
 397         assertEquals((short)   x, (short)   mh_sf.invokeExact(x));  // float -> short
 398         assertEquals((int)     x, (int)     mh_if.invokeExact(x));  // float -> int
 399         assertEquals((long)    x, (long)    mh_jf.invokeExact(x));  // float -> long
 400     }
 401     private static void float2prim_invalid(float x) throws Throwable {
 402         if (DO_CASTS)  return;
 403         try { boolean y = (boolean) mh_zf.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // float -> boolean
 404         try { byte    y = (byte)    mh_bf.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // float -> byte
 405         try { char    y = (char)    mh_cf.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // float -> char
 406         try { short   y = (short)   mh_sf.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // float -> short
 407         try { int     y = (int)     mh_if.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // float -> int
 408         try { long    y = (long)    mh_jf.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // float -> long
 409     }
 410 
 411     private static MethodHandle mh_d(Class ret) { return mh(ret, double.class); }
 412 
 413     private final static MethodHandle mh_zd = mh_d(boolean.class);
 414     private final static MethodHandle mh_bd = mh_d(byte.class   );
 415     private final static MethodHandle mh_cd = mh_d(char.class   );
 416     private final static MethodHandle mh_sd = mh_d(short.class  );
 417     private final static MethodHandle mh_id = mh_d(int.class    );
 418     private final static MethodHandle mh_jd = mh_d(long.class   );
 419     private final static MethodHandle mh_fd = mh_d(float.class  );
 420     private final static MethodHandle mh_dd = mh_d(double.class );
 421 
 422     private static void double2prim(double x) throws Throwable {
 423         assertEquals((double) x, (double)  mh_dd.invokeExact(x));  // double -> double
 424         if (!DO_CASTS)  return;
 425         boolean z = (((byte) x & 1) != 0);
 426         assertEquals((boolean) z, (boolean) mh_zd.invokeExact(x));  // double -> boolean
 427         assertEquals((byte)    x, (byte)    mh_bd.invokeExact(x));  // double -> byte
 428         assertEquals((char)    x, (char)    mh_cd.invokeExact(x));  // double -> char
 429         assertEquals((short)   x, (short)   mh_sd.invokeExact(x));  // double -> short
 430         assertEquals((int)     x, (int)     mh_id.invokeExact(x));  // double -> int
 431         assertEquals((long)    x, (long)    mh_jd.invokeExact(x));  // double -> long
 432         assertEquals((float)   x, (float)   mh_fd.invokeExact(x));  // double -> float
 433     }
 434     private static void double2prim_invalid(double x) throws Throwable {
 435         if (DO_CASTS)  return;
 436         try { boolean y = (boolean) mh_zd.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // double -> boolean
 437         try { byte    y = (byte)    mh_bd.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // double -> byte
 438         try { char    y = (char)    mh_cd.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // double -> char
 439         try { short   y = (short)   mh_sd.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // double -> short
 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
 442         try { float   y = (float)   mh_fd.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // double -> float
 443     }
 444 
 445     private final static MethodHandle mh_zv = mh(boolean.class);
 446     private final static MethodHandle mh_bv = mh(byte.class   );
 447     private final static MethodHandle mh_cv = mh(char.class   );
 448     private final static MethodHandle mh_sv = mh(short.class  );
 449     private final static MethodHandle mh_iv = mh(int.class    );
 450     private final static MethodHandle mh_jv = mh(long.class   );
 451     private final static MethodHandle mh_fv = mh(float.class  );
 452     private final static MethodHandle mh_dv = mh(double.class );
 453 
 454     private static void void2prim(int i) throws Throwable {
 455         assertEquals(        false, (boolean) mh_zv.invokeExact());  // void -> boolean
 456         assertEquals((byte)  0,     (byte)    mh_bv.invokeExact());  // void -> byte
 457         assertEquals((char)  0,     (char)    mh_cv.invokeExact());  // void -> char
 458         assertEquals((short) 0,     (short)   mh_sv.invokeExact());  // void -> short
 459         assertEquals(        0,     (int)     mh_iv.invokeExact());  // void -> int
 460         assertEquals(        0L,    (long)    mh_jv.invokeExact());  // void -> long
 461         assertEquals(        0.0f,  (float)   mh_fv.invokeExact());  // void -> float
 462         assertEquals(        0.0d,  (double)  mh_dv.invokeExact());  // void -> double


< prev index next >