Path: blob/master/test/jdk/java/lang/invoke/6998541/Test6998541.java
41153 views
/*1* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/**24* @test25* @bug 699854126* @summary JSR 292 implement missing return-type conversion for OP_RETYPE_RAW27*28* @run main/othervm -Xbatch29* -XX:+UnlockDiagnosticVMOptions -XX:ScavengeRootsInCode=230* -DTest6998541.N=100000 -DTest6998541.KIND=cast Test699854131* @run main/othervm -Xbatch32* -XX:+UnlockDiagnosticVMOptions -XX:ScavengeRootsInCode=233* -DTest6998541.N=100000 -DTest6998541.KIND=normal Test699854134*/3536import java.util.*;3738import java.lang.invoke.*;39import static java.lang.invoke.MethodHandles.*;4041public class Test6998541 {42private static final Class CLASS = Test6998541.class;43private static final String NAME = "identity";44private static final int N = Math.max(2, Integer.getInteger(CLASS.getSimpleName()+".N", 10000));45private static final String KIND = System.getProperty(CLASS.getSimpleName()+".KIND", "cast");46private static final int BITS = 0x00000201;4748private static final boolean DO_CASTS = !KIND.equals("normal");4950public static void main(String[] args) throws Throwable {51System.out.println("KIND="+KIND+" DO_CASTS="+DO_CASTS+" N="+N);52doboolean();53dobyte();54dochar();55doshort();56doint();57dolong();58dofloat();59dodouble();60dovoid();61}6263private static void doboolean() throws Throwable {64for (int i = 0; i < N; i++) {65boolean2prim(false);66boolean2prim(true);67}68boolean2prim_invalid(true);69}70private static void dobyte() throws Throwable {71byte x = Byte.MIN_VALUE;72for (int i = 0; i < N; i++, x++)73byte2prim(x);74byte2prim_invalid(x);75}76private static void dochar() throws Throwable {77char x = Character.MIN_VALUE;78for (int i = 0; i < N; i++, x++)79char2prim(x);80char2prim_invalid(x);81}82private static void doshort() throws Throwable {83short x = Short.MIN_VALUE;84for (int i = 0; i < N; i++, x++)85short2prim(x);86short2prim_invalid(x);87}88private static void doint() throws Throwable {89int x = Integer.MIN_VALUE;90int D = Integer.MAX_VALUE / (N / 2) | BITS;91for (int i = 0; i < N; i++, x += D) {92int2prim(x);93}94int2prim_invalid(x);95}96private static void dolong() throws Throwable {97long x = Long.MIN_VALUE;98long D = Long.MAX_VALUE / ((long) (N / 2)) | BITS;99for (int i = 0; i < N; i++, x += D)100long2prim(x);101long2prim_invalid(x);102}103private static void dofloat() throws Throwable {104float x = Float.MIN_VALUE;105float D = Float.MAX_VALUE / ((float) (N / 2));106for (int i = 0; i < N; i++, x += D)107float2prim(x);108float2prim_invalid(x);109}110private static void dodouble() throws Throwable {111double x = Double.MIN_VALUE;112double D = Double.MAX_VALUE / ((double) (N / 2));113for (int i = 0; i < N; i++, x += D)114double2prim(x);115double2prim_invalid(x);116}117private static void dovoid() throws Throwable {118for (int i = 0; i < N; i++) {119void2prim(i);120}121void2prim_invalid(0);122// do the other direction here also:123for (int i = 0; i < N; i++) {124prim2void(i);125}126prim2void_invalid(0);127}128129private static void assertEquals(Object o, Object o2) {130if (!o.equals(o2))131throw new AssertionError("expected: " + o + ", found: " + o2);132}133private static void fail() {134throw new AssertionError();135}136137private static final MethodHandles.Lookup lookup = MethodHandles.lookup();138139private static MethodHandle mh(Class ret, Class... args) {140try {141MethodType mt = MethodType.methodType(ret, args);142Class lookupRet = (args.length == 0 ? void.class : args[0]);143MethodHandle mh = lookup.findStatic(CLASS, NAME, mt.changeReturnType(lookupRet));144if (DO_CASTS)145return MethodHandles.explicitCastArguments(mh, mt);146if (canDoAsType(mh.type(), mt))147return mh.asType(mt);148try {149mh.asType(mt);150throw new AssertionError("asType should not succeed: "+mh+" => "+mt);151} catch (WrongMethodTypeException ex) {152// this was a required WMTE153return mh.asType(mt.generic()).asType(mt);154}155} catch (ReflectiveOperationException e) {156throw new RuntimeException(e);157}158}159private static final Class<?>[] NUMERIC_TYPE_WIDENING_ORDER = {160byte.class, short.class, int.class, long.class, float.class, double.class161};162private static boolean canDoAsType(Class<?> src, Class<?> dst) {163if (src == dst) return true;164if (dst == void.class) return true;165if (src == void.class) return true; // allow void->zero166if (!src.isPrimitive() || !dst.isPrimitive()) return true;167// primitive conversion works for asType only when it's widening168if (src == boolean.class || dst == boolean.class) return false;169if (dst == char.class) return false;170if (src == char.class) src = int.class; // can widen char to int171for (Class<?> ntype : NUMERIC_TYPE_WIDENING_ORDER) {172if (src == ntype) return true;173if (dst == ntype) return false;174}175throw new AssertionError("should not reach here: "+src+", "+dst);176}177private static boolean canDoAsType(MethodType mt0, MethodType mt1) {178Class<?> rt0 = mt0.returnType();179Class<?> rt1 = mt1.returnType();180if (!canDoAsType(rt0, rt1)) return false;181int argc = mt0.parameterCount();182if (argc != mt1.parameterCount()) return false;183for (int i = 0; i < argc; i++) {184if (!canDoAsType(mt1.parameterType(i), mt0.parameterType(i)))185return false;186}187return true;188}189190private static MethodHandle mh_z(Class ret) { return mh(ret, boolean.class); }191192private static final MethodHandle mh_zz = mh_z(boolean.class);193private static final MethodHandle mh_bz = mh_z(byte.class );194private static final MethodHandle mh_cz = mh_z(char.class );195private static final MethodHandle mh_sz = mh_z(short.class );196private static final MethodHandle mh_iz = mh_z(int.class );197private static final MethodHandle mh_jz = mh_z(long.class );198private static final MethodHandle mh_fz = mh_z(float.class );199private static final MethodHandle mh_dz = mh_z(double.class );200201private static void boolean2prim(boolean x) throws Throwable {202int i = x ? 1 : 0;203assertEquals( x, (boolean) mh_zz.invokeExact(x)); // boolean -> boolean204if (!DO_CASTS) return;205assertEquals((byte) i, (byte) mh_bz.invokeExact(x)); // boolean -> byte206assertEquals((char) i, (char) mh_cz.invokeExact(x)); // boolean -> char207assertEquals((short) i, (short) mh_sz.invokeExact(x)); // boolean -> short208assertEquals((int) i, (int) mh_iz.invokeExact(x)); // boolean -> int209assertEquals((long) i, (long) mh_jz.invokeExact(x)); // boolean -> long210assertEquals((float) i, (float) mh_fz.invokeExact(x)); // boolean -> float211assertEquals((double) i, (double) mh_dz.invokeExact(x)); // boolean -> double212}213private static void boolean2prim_invalid(boolean x) throws Throwable {214if (DO_CASTS) return;215try { byte y = (byte) mh_bz.invokeExact(x); fail(); } catch (ClassCastException expected) {} // boolean -> byte216try { char y = (char) mh_cz.invokeExact(x); fail(); } catch (ClassCastException expected) {} // boolean -> char217try { short y = (short) mh_sz.invokeExact(x); fail(); } catch (ClassCastException expected) {} // boolean -> short218try { int y = (int) mh_iz.invokeExact(x); fail(); } catch (ClassCastException expected) {} // boolean -> int219try { long y = (long) mh_jz.invokeExact(x); fail(); } catch (ClassCastException expected) {} // boolean -> long220try { float y = (float) mh_fz.invokeExact(x); fail(); } catch (ClassCastException expected) {} // boolean -> float221try { double y = (double) mh_dz.invokeExact(x); fail(); } catch (ClassCastException expected) {} // boolean -> double222}223224private static MethodHandle mh_b(Class ret) { return mh(ret, byte.class); }225226private static final MethodHandle mh_zb = mh_b(boolean.class);227private static final MethodHandle mh_bb = mh_b(byte.class );228private static final MethodHandle mh_cb = mh_b(char.class );229private static final MethodHandle mh_sb = mh_b(short.class );230private static final MethodHandle mh_ib = mh_b(int.class );231private static final MethodHandle mh_jb = mh_b(long.class );232private static final MethodHandle mh_fb = mh_b(float.class );233private static final MethodHandle mh_db = mh_b(double.class );234235private static void byte2prim(byte x) throws Throwable {236assertEquals((byte) x, (byte) mh_bb.invokeExact(x)); // byte -> byte237assertEquals((short) x, (short) mh_sb.invokeExact(x)); // byte -> short238assertEquals((int) x, (int) mh_ib.invokeExact(x)); // byte -> int239assertEquals((long) x, (long) mh_jb.invokeExact(x)); // byte -> long240assertEquals((float) x, (float) mh_fb.invokeExact(x)); // byte -> float241assertEquals((double) x, (double) mh_db.invokeExact(x)); // byte -> double242if (!DO_CASTS) return;243boolean z = ((x & 1) != 0);244assertEquals((char) x, (char) mh_cb.invokeExact(x)); // byte -> char245assertEquals((boolean) z, (boolean) mh_zb.invokeExact(x)); // byte -> boolean246}247private static void byte2prim_invalid(byte x) throws Throwable {248if (DO_CASTS) return;249try { char y = (char) mh_cb.invokeExact(x); fail(); } catch (ClassCastException expected) {} // byte -> char250try { boolean y = (boolean) mh_zb.invokeExact(x); fail(); } catch (ClassCastException expected) {} // byte -> boolean251}252253private static MethodHandle mh_c(Class ret) { return mh(ret, char.class); }254255private static final MethodHandle mh_zc = mh_c(boolean.class);256private static final MethodHandle mh_bc = mh_c(byte.class );257private static final MethodHandle mh_cc = mh_c(char.class );258private static final MethodHandle mh_sc = mh_c(short.class );259private static final MethodHandle mh_ic = mh_c(int.class );260private static final MethodHandle mh_jc = mh_c(long.class );261private static final MethodHandle mh_fc = mh_c(float.class );262private static final MethodHandle mh_dc = mh_c(double.class );263264private static void char2prim(char x) throws Throwable {265assertEquals((char) x, (char) mh_cc.invokeExact(x)); // char -> char266assertEquals((int) x, (int) mh_ic.invokeExact(x)); // char -> int267assertEquals((long) x, (long) mh_jc.invokeExact(x)); // char -> long268assertEquals((float) x, (float) mh_fc.invokeExact(x)); // char -> float269assertEquals((double) x, (double) mh_dc.invokeExact(x)); // char -> double270if (!DO_CASTS) return;271boolean z = ((x & 1) != 0);272assertEquals((boolean) z, (boolean) mh_zc.invokeExact(x)); // char -> boolean273assertEquals((byte) x, (byte) mh_bc.invokeExact(x)); // char -> byte274assertEquals((short) x, (short) mh_sc.invokeExact(x)); // char -> short275}276private static void char2prim_invalid(char x) throws Throwable {277if (DO_CASTS) return;278try { boolean y = (boolean) mh_zc.invokeExact(x); fail(); } catch (ClassCastException expected) {} // char -> boolean279try { byte y = (byte) mh_bc.invokeExact(x); fail(); } catch (ClassCastException expected) {} // char -> byte280try { short y = (short) mh_sc.invokeExact(x); fail(); } catch (ClassCastException expected) {} // char -> short281}282283private static MethodHandle mh_s(Class ret) { return mh(ret, short.class); }284285private static final MethodHandle mh_zs = mh_s(boolean.class);286private static final MethodHandle mh_bs = mh_s(byte.class );287private static final MethodHandle mh_cs = mh_s(char.class );288private static final MethodHandle mh_ss = mh_s(short.class );289private static final MethodHandle mh_is = mh_s(int.class );290private static final MethodHandle mh_js = mh_s(long.class );291private static final MethodHandle mh_fs = mh_s(float.class );292private static final MethodHandle mh_ds = mh_s(double.class );293294private static void short2prim(short x) throws Throwable {295assertEquals((short) x, (short) mh_ss.invokeExact(x)); // short -> short296assertEquals((int) x, (int) mh_is.invokeExact(x)); // short -> int297assertEquals((long) x, (long) mh_js.invokeExact(x)); // short -> long298assertEquals((float) x, (float) mh_fs.invokeExact(x)); // short -> float299assertEquals((double) x, (double) mh_ds.invokeExact(x)); // short -> double300if (!DO_CASTS) return;301boolean z = ((x & 1) != 0);302assertEquals((boolean) z, (boolean) mh_zs.invokeExact(x)); // short -> boolean303assertEquals((byte) x, (byte) mh_bs.invokeExact(x)); // short -> byte304assertEquals((char) x, (char) mh_cs.invokeExact(x)); // short -> char305}306private static void short2prim_invalid(short x) throws Throwable {307if (DO_CASTS) return;308try { boolean y = (boolean) mh_zs.invokeExact(x); fail(); } catch (ClassCastException expected) {} // short -> boolean309try { byte y = (byte) mh_bs.invokeExact(x); fail(); } catch (ClassCastException expected) {} // short -> byte310try { char y = (char) mh_cs.invokeExact(x); fail(); } catch (ClassCastException expected) {} // short -> char311}312313private static MethodHandle mh_i(Class ret) { return mh(ret, int.class); }314315private static final MethodHandle mh_zi = mh_i(boolean.class);316private static final MethodHandle mh_bi = mh_i(byte.class );317private static final MethodHandle mh_ci = mh_i(char.class );318private static final MethodHandle mh_si = mh_i(short.class );319private static final MethodHandle mh_ii = mh_i(int.class );320private static final MethodHandle mh_ji = mh_i(long.class );321private static final MethodHandle mh_fi = mh_i(float.class );322private static final MethodHandle mh_di = mh_i(double.class );323324private static void int2prim(int x) throws Throwable {325assertEquals((int) x, (int) mh_ii.invokeExact(x)); // int -> int326assertEquals((long) x, (long) mh_ji.invokeExact(x)); // int -> long327assertEquals((float) x, (float) mh_fi.invokeExact(x)); // int -> float328assertEquals((double) x, (double) mh_di.invokeExact(x)); // int -> double329if (!DO_CASTS) return;330boolean z = ((x & 1) != 0);331assertEquals((boolean) z, (boolean) mh_zi.invokeExact(x)); // int -> boolean332assertEquals((byte) x, (byte) mh_bi.invokeExact(x)); // int -> byte333assertEquals((char) x, (char) mh_ci.invokeExact(x)); // int -> char334assertEquals((short) x, (short) mh_si.invokeExact(x)); // int -> short335}336private static void int2prim_invalid(int x) throws Throwable {337if (DO_CASTS) return;338try { boolean y = (boolean) mh_zi.invokeExact(x); fail(); } catch (ClassCastException expected) {} // int -> boolean339try { byte y = (byte) mh_bi.invokeExact(x); fail(); } catch (ClassCastException expected) {} // int -> byte340try { char y = (char) mh_ci.invokeExact(x); fail(); } catch (ClassCastException expected) {} // int -> char341try { short y = (short) mh_si.invokeExact(x); fail(); } catch (ClassCastException expected) {} // int -> short342}343344private static MethodHandle mh_j(Class ret) { return mh(ret, long.class); }345346private static final MethodHandle mh_zj = mh_j(boolean.class);347private static final MethodHandle mh_bj = mh_j(byte.class );348private static final MethodHandle mh_cj = mh_j(char.class );349private static final MethodHandle mh_sj = mh_j(short.class );350private static final MethodHandle mh_ij = mh_j(int.class );351private static final MethodHandle mh_jj = mh_j(long.class );352private static final MethodHandle mh_fj = mh_j(float.class );353private static final MethodHandle mh_dj = mh_j(double.class );354355private static void long2prim(long x) throws Throwable {356assertEquals((long) x, (long) mh_jj.invokeExact(x)); // long -> long357assertEquals((float) x, (float) mh_fj.invokeExact(x)); // long -> float358assertEquals((double) x, (double) mh_dj.invokeExact(x)); // long -> double359if (!DO_CASTS) return;360boolean z = ((x & 1) != 0);361assertEquals((boolean)z, (boolean) mh_zj.invokeExact(x)); // long -> boolean362assertEquals((byte) x, (byte) mh_bj.invokeExact(x)); // long -> byte363assertEquals((char) x, (char) mh_cj.invokeExact(x)); // long -> char364assertEquals((short) x, (short) mh_sj.invokeExact(x)); // long -> short365assertEquals((int) x, (int) mh_ij.invokeExact(x)); // long -> int366}367private static void long2prim_invalid(long x) throws Throwable {368if (DO_CASTS) return;369try { boolean y = (boolean) mh_zj.invokeExact(x); fail(); } catch (ClassCastException expected) {} // long -> boolean370try { byte y = (byte) mh_bj.invokeExact(x); fail(); } catch (ClassCastException expected) {} // long -> byte371try { char y = (char) mh_cj.invokeExact(x); fail(); } catch (ClassCastException expected) {} // long -> char372try { short y = (short) mh_sj.invokeExact(x); fail(); } catch (ClassCastException expected) {} // long -> short373try { int y = (int) mh_ij.invokeExact(x); fail(); } catch (ClassCastException expected) {} // long -> int374}375376private static MethodHandle mh_f(Class ret) { return mh(ret, float.class); }377378private static final MethodHandle mh_zf = mh_f(boolean.class);379private static final MethodHandle mh_bf = mh_f(byte.class );380private static final MethodHandle mh_cf = mh_f(char.class );381private static final MethodHandle mh_sf = mh_f(short.class );382private static final MethodHandle mh_if = mh_f(int.class );383private static final MethodHandle mh_jf = mh_f(long.class );384private static final MethodHandle mh_ff = mh_f(float.class );385private static final MethodHandle mh_df = mh_f(double.class );386387private static void float2prim(float x) throws Throwable {388assertEquals((float) x, (float) mh_ff.invokeExact(x)); // float -> float389assertEquals((double) x, (double) mh_df.invokeExact(x)); // float -> double390if (!DO_CASTS) return;391boolean z = (((byte) x & 1) != 0);392assertEquals((boolean) z, (boolean) mh_zf.invokeExact(x)); // float -> boolean393assertEquals((byte) x, (byte) mh_bf.invokeExact(x)); // float -> byte394assertEquals((char) x, (char) mh_cf.invokeExact(x)); // float -> char395assertEquals((short) x, (short) mh_sf.invokeExact(x)); // float -> short396assertEquals((int) x, (int) mh_if.invokeExact(x)); // float -> int397assertEquals((long) x, (long) mh_jf.invokeExact(x)); // float -> long398}399private static void float2prim_invalid(float x) throws Throwable {400if (DO_CASTS) return;401try { boolean y = (boolean) mh_zf.invokeExact(x); fail(); } catch (ClassCastException expected) {} // float -> boolean402try { byte y = (byte) mh_bf.invokeExact(x); fail(); } catch (ClassCastException expected) {} // float -> byte403try { char y = (char) mh_cf.invokeExact(x); fail(); } catch (ClassCastException expected) {} // float -> char404try { short y = (short) mh_sf.invokeExact(x); fail(); } catch (ClassCastException expected) {} // float -> short405try { int y = (int) mh_if.invokeExact(x); fail(); } catch (ClassCastException expected) {} // float -> int406try { long y = (long) mh_jf.invokeExact(x); fail(); } catch (ClassCastException expected) {} // float -> long407}408409private static MethodHandle mh_d(Class ret) { return mh(ret, double.class); }410411private static final MethodHandle mh_zd = mh_d(boolean.class);412private static final MethodHandle mh_bd = mh_d(byte.class );413private static final MethodHandle mh_cd = mh_d(char.class );414private static final MethodHandle mh_sd = mh_d(short.class );415private static final MethodHandle mh_id = mh_d(int.class );416private static final MethodHandle mh_jd = mh_d(long.class );417private static final MethodHandle mh_fd = mh_d(float.class );418private static final MethodHandle mh_dd = mh_d(double.class );419420private static void double2prim(double x) throws Throwable {421assertEquals((double) x, (double) mh_dd.invokeExact(x)); // double -> double422if (!DO_CASTS) return;423boolean z = (((byte) x & 1) != 0);424assertEquals((boolean) z, (boolean) mh_zd.invokeExact(x)); // double -> boolean425assertEquals((byte) x, (byte) mh_bd.invokeExact(x)); // double -> byte426assertEquals((char) x, (char) mh_cd.invokeExact(x)); // double -> char427assertEquals((short) x, (short) mh_sd.invokeExact(x)); // double -> short428assertEquals((int) x, (int) mh_id.invokeExact(x)); // double -> int429assertEquals((long) x, (long) mh_jd.invokeExact(x)); // double -> long430assertEquals((float) x, (float) mh_fd.invokeExact(x)); // double -> float431}432private static void double2prim_invalid(double x) throws Throwable {433if (DO_CASTS) return;434try { boolean y = (boolean) mh_zd.invokeExact(x); fail(); } catch (ClassCastException expected) {} // double -> boolean435try { byte y = (byte) mh_bd.invokeExact(x); fail(); } catch (ClassCastException expected) {} // double -> byte436try { char y = (char) mh_cd.invokeExact(x); fail(); } catch (ClassCastException expected) {} // double -> char437try { short y = (short) mh_sd.invokeExact(x); fail(); } catch (ClassCastException expected) {} // double -> short438try { int y = (int) mh_id.invokeExact(x); fail(); } catch (ClassCastException expected) {} // double -> int439try { long y = (long) mh_jd.invokeExact(x); fail(); } catch (ClassCastException expected) {} // double -> long440try { float y = (float) mh_fd.invokeExact(x); fail(); } catch (ClassCastException expected) {} // double -> float441}442443private static final MethodHandle mh_zv = mh(boolean.class);444private static final MethodHandle mh_bv = mh(byte.class );445private static final MethodHandle mh_cv = mh(char.class );446private static final MethodHandle mh_sv = mh(short.class );447private static final MethodHandle mh_iv = mh(int.class );448private static final MethodHandle mh_jv = mh(long.class );449private static final MethodHandle mh_fv = mh(float.class );450private static final MethodHandle mh_dv = mh(double.class );451452private static void void2prim(int i) throws Throwable {453assertEquals( false, (boolean) mh_zv.invokeExact()); // void -> boolean454assertEquals((byte) 0, (byte) mh_bv.invokeExact()); // void -> byte455assertEquals((char) 0, (char) mh_cv.invokeExact()); // void -> char456assertEquals((short) 0, (short) mh_sv.invokeExact()); // void -> short457assertEquals( 0, (int) mh_iv.invokeExact()); // void -> int458assertEquals( 0L, (long) mh_jv.invokeExact()); // void -> long459assertEquals( 0.0f, (float) mh_fv.invokeExact()); // void -> float460assertEquals( 0.0d, (double) mh_dv.invokeExact()); // void -> double461}462463private static void void2prim_invalid(double x) throws Throwable {464// no cases465}466467private static MethodHandle mh_v(Class arg) { return mh(void.class, arg); }468469private static final MethodHandle mh_vz = mh_v(boolean.class);470private static final MethodHandle mh_vb = mh_v(byte.class );471private static final MethodHandle mh_vc = mh_v(char.class );472private static final MethodHandle mh_vs = mh_v(short.class );473private static final MethodHandle mh_vi = mh_v(int.class );474private static final MethodHandle mh_vj = mh_v(long.class );475private static final MethodHandle mh_vf = mh_v(float.class );476private static final MethodHandle mh_vd = mh_v(double.class );477478private static void prim2void(int x) throws Throwable {479boolean z = ((x & 1) != 0);480mh_vz.invokeExact( z); // boolean -> void481mh_vb.invokeExact((byte) x); // byte -> void482mh_vc.invokeExact((char) x); // char -> void483mh_vs.invokeExact((short) x); // short -> void484mh_vi.invokeExact((int) x); // int -> void485mh_vj.invokeExact((long) x); // long -> void486mh_vf.invokeExact((float) x); // float -> void487mh_vd.invokeExact((double) x); // double -> void488}489490private static void prim2void_invalid(int x) throws Throwable {491// no cases492}493494private static boolean identity(boolean v) { return v; }495private static byte identity(byte v) { return v; }496private static char identity(char v) { return v; }497private static short identity(short v) { return v; }498private static int identity(int v) { return v; }499private static long identity(long v) { return v; }500private static float identity(float v) { return v; }501private static double identity(double v) { return v; }502private static void identity() {}503}504505506