jdk/test/java/lang/invoke/6998541/Test6998541.java
changeset 32649 2ee9017c7597
parent 27785 29d4cb4a8f5e
child 40684 2e37c119dc2a
equal deleted inserted replaced
32648:1fa861caf840 32649:2ee9017c7597
   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