Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/java/lang/invoke/6998541/Test6998541.java
47311 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*22*/2324/**25* @test26* @bug 699854127* @summary JSR 292 implement missing return-type conversion for OP_RETYPE_RAW28*29* @run main/othervm -Xbatch30* -XX:+UnlockDiagnosticVMOptions -XX:ScavengeRootsInCode=231* -DTest6998541.N=100000 -DTest6998541.KIND=cast Test699854132* @run main/othervm -Xbatch33* -XX:+UnlockDiagnosticVMOptions -XX:ScavengeRootsInCode=234* -DTest6998541.N=100000 -DTest6998541.KIND=normal Test699854135*/3637import java.util.*;3839import java.lang.invoke.*;40import static java.lang.invoke.MethodHandles.*;4142public class Test6998541 {43private static final Class CLASS = Test6998541.class;44private static final String NAME = "identity";45private static final int N = Math.max(2, Integer.getInteger(CLASS.getSimpleName()+".N", 10000));46private static final String KIND = System.getProperty(CLASS.getSimpleName()+".KIND", "cast");47private static final int BITS = 0x00000201;4849private static final boolean DO_CASTS = !KIND.equals("normal");5051public static void main(String[] args) throws Throwable {52System.out.println("KIND="+KIND+" DO_CASTS="+DO_CASTS+" N="+N);53doboolean();54dobyte();55dochar();56doshort();57doint();58dolong();59dofloat();60dodouble();61dovoid();62}6364private static void doboolean() throws Throwable {65for (int i = 0; i < N; i++) {66boolean2prim(false);67boolean2prim(true);68}69boolean2prim_invalid(true);70}71private static void dobyte() throws Throwable {72byte x = Byte.MIN_VALUE;73for (int i = 0; i < N; i++, x++)74byte2prim(x);75byte2prim_invalid(x);76}77private static void dochar() throws Throwable {78char x = Character.MIN_VALUE;79for (int i = 0; i < N; i++, x++)80char2prim(x);81char2prim_invalid(x);82}83private static void doshort() throws Throwable {84short x = Short.MIN_VALUE;85for (int i = 0; i < N; i++, x++)86short2prim(x);87short2prim_invalid(x);88}89private static void doint() throws Throwable {90int x = Integer.MIN_VALUE;91int D = Integer.MAX_VALUE / (N / 2) | BITS;92for (int i = 0; i < N; i++, x += D) {93int2prim(x);94}95int2prim_invalid(x);96}97private static void dolong() throws Throwable {98long x = Long.MIN_VALUE;99long D = Long.MAX_VALUE / ((long) (N / 2)) | BITS;100for (int i = 0; i < N; i++, x += D)101long2prim(x);102long2prim_invalid(x);103}104private static void dofloat() throws Throwable {105float x = Float.MIN_VALUE;106float D = Float.MAX_VALUE / ((float) (N / 2));107for (int i = 0; i < N; i++, x += D)108float2prim(x);109float2prim_invalid(x);110}111private static void dodouble() throws Throwable {112double x = Double.MIN_VALUE;113double D = Double.MAX_VALUE / ((double) (N / 2));114for (int i = 0; i < N; i++, x += D)115double2prim(x);116double2prim_invalid(x);117}118private static void dovoid() throws Throwable {119for (int i = 0; i < N; i++) {120void2prim(i);121}122void2prim_invalid(0);123// do the other direction here also:124for (int i = 0; i < N; i++) {125prim2void(i);126}127prim2void_invalid(0);128}129130private static void assertEquals(Object o, Object o2) {131if (!o.equals(o2))132throw new AssertionError("expected: " + o + ", found: " + o2);133}134private static void fail() {135throw new AssertionError();136}137138private final static MethodHandles.Lookup lookup = MethodHandles.lookup();139140private static MethodHandle mh(Class ret, Class... args) {141try {142MethodType mt = MethodType.methodType(ret, args);143Class lookupRet = (args.length == 0 ? void.class : args[0]);144MethodHandle mh = lookup.findStatic(CLASS, NAME, mt.changeReturnType(lookupRet));145if (DO_CASTS)146return MethodHandles.explicitCastArguments(mh, mt);147if (canDoAsType(mh.type(), mt))148return mh.asType(mt);149try {150mh.asType(mt);151throw new AssertionError("asType should not succeed: "+mh+" => "+mt);152} catch (WrongMethodTypeException ex) {153// this was a required WMTE154return mh.asType(mt.generic()).asType(mt);155}156} catch (ReflectiveOperationException e) {157throw new RuntimeException(e);158}159}160private static final Class<?>[] NUMERIC_TYPE_WIDENING_ORDER = {161byte.class, short.class, int.class, long.class, float.class, double.class162};163private static boolean canDoAsType(Class<?> src, Class<?> dst) {164if (src == dst) return true;165if (dst == void.class) return true;166if (src == void.class) return true; // allow void->zero167if (!src.isPrimitive() || !dst.isPrimitive()) return true;168// primitive conversion works for asType only when it's widening169if (src == boolean.class || dst == boolean.class) return false;170if (dst == char.class) return false;171if (src == char.class) src = int.class; // can widen char to int172for (Class<?> ntype : NUMERIC_TYPE_WIDENING_ORDER) {173if (src == ntype) return true;174if (dst == ntype) return false;175}176throw new AssertionError("should not reach here: "+src+", "+dst);177}178private static boolean canDoAsType(MethodType mt0, MethodType mt1) {179Class<?> rt0 = mt0.returnType();180Class<?> rt1 = mt1.returnType();181if (!canDoAsType(rt0, rt1)) return false;182int argc = mt0.parameterCount();183if (argc != mt1.parameterCount()) return false;184for (int i = 0; i < argc; i++) {185if (!canDoAsType(mt1.parameterType(i), mt0.parameterType(i)))186return false;187}188return true;189}190191private static MethodHandle mh_z(Class ret) { return mh(ret, boolean.class); }192193private final static MethodHandle mh_zz = mh_z(boolean.class);194private final static MethodHandle mh_bz = mh_z(byte.class );195private final static MethodHandle mh_cz = mh_z(char.class );196private final static MethodHandle mh_sz = mh_z(short.class );197private final static MethodHandle mh_iz = mh_z(int.class );198private final static MethodHandle mh_jz = mh_z(long.class );199private final static MethodHandle mh_fz = mh_z(float.class );200private final static MethodHandle mh_dz = mh_z(double.class );201202private static void boolean2prim(boolean x) throws Throwable {203int i = x ? 1 : 0;204assertEquals( x, (boolean) mh_zz.invokeExact(x)); // boolean -> boolean205if (!DO_CASTS) return;206assertEquals((byte) i, (byte) mh_bz.invokeExact(x)); // boolean -> byte207assertEquals((char) i, (char) mh_cz.invokeExact(x)); // boolean -> char208assertEquals((short) i, (short) mh_sz.invokeExact(x)); // boolean -> short209assertEquals((int) i, (int) mh_iz.invokeExact(x)); // boolean -> int210assertEquals((long) i, (long) mh_jz.invokeExact(x)); // boolean -> long211assertEquals((float) i, (float) mh_fz.invokeExact(x)); // boolean -> float212assertEquals((double) i, (double) mh_dz.invokeExact(x)); // boolean -> double213}214private static void boolean2prim_invalid(boolean x) throws Throwable {215if (DO_CASTS) return;216try { byte y = (byte) mh_bz.invokeExact(x); fail(); } catch (ClassCastException _) {} // boolean -> byte217try { char y = (char) mh_cz.invokeExact(x); fail(); } catch (ClassCastException _) {} // boolean -> char218try { short y = (short) mh_sz.invokeExact(x); fail(); } catch (ClassCastException _) {} // boolean -> short219try { int y = (int) mh_iz.invokeExact(x); fail(); } catch (ClassCastException _) {} // boolean -> int220try { long y = (long) mh_jz.invokeExact(x); fail(); } catch (ClassCastException _) {} // boolean -> long221try { float y = (float) mh_fz.invokeExact(x); fail(); } catch (ClassCastException _) {} // boolean -> float222try { double y = (double) mh_dz.invokeExact(x); fail(); } catch (ClassCastException _) {} // boolean -> double223}224225private static MethodHandle mh_b(Class ret) { return mh(ret, byte.class); }226227private final static MethodHandle mh_zb = mh_b(boolean.class);228private final static MethodHandle mh_bb = mh_b(byte.class );229private final static MethodHandle mh_cb = mh_b(char.class );230private final static MethodHandle mh_sb = mh_b(short.class );231private final static MethodHandle mh_ib = mh_b(int.class );232private final static MethodHandle mh_jb = mh_b(long.class );233private final static MethodHandle mh_fb = mh_b(float.class );234private final static MethodHandle mh_db = mh_b(double.class );235236private static void byte2prim(byte x) throws Throwable {237assertEquals((byte) x, (byte) mh_bb.invokeExact(x)); // byte -> byte238assertEquals((short) x, (short) mh_sb.invokeExact(x)); // byte -> short239assertEquals((int) x, (int) mh_ib.invokeExact(x)); // byte -> int240assertEquals((long) x, (long) mh_jb.invokeExact(x)); // byte -> long241assertEquals((float) x, (float) mh_fb.invokeExact(x)); // byte -> float242assertEquals((double) x, (double) mh_db.invokeExact(x)); // byte -> double243if (!DO_CASTS) return;244boolean z = ((x & 1) != 0);245assertEquals((char) x, (char) mh_cb.invokeExact(x)); // byte -> char246assertEquals((boolean) z, (boolean) mh_zb.invokeExact(x)); // byte -> boolean247}248private static void byte2prim_invalid(byte x) throws Throwable {249if (DO_CASTS) return;250try { char y = (char) mh_cb.invokeExact(x); fail(); } catch (ClassCastException _) {} // byte -> char251try { boolean y = (boolean) mh_zb.invokeExact(x); fail(); } catch (ClassCastException _) {} // byte -> boolean252}253254private static MethodHandle mh_c(Class ret) { return mh(ret, char.class); }255256private final static MethodHandle mh_zc = mh_c(boolean.class);257private final static MethodHandle mh_bc = mh_c(byte.class );258private final static MethodHandle mh_cc = mh_c(char.class );259private final static MethodHandle mh_sc = mh_c(short.class );260private final static MethodHandle mh_ic = mh_c(int.class );261private final static MethodHandle mh_jc = mh_c(long.class );262private final static MethodHandle mh_fc = mh_c(float.class );263private final static MethodHandle mh_dc = mh_c(double.class );264265private static void char2prim(char x) throws Throwable {266assertEquals((char) x, (char) mh_cc.invokeExact(x)); // char -> char267assertEquals((int) x, (int) mh_ic.invokeExact(x)); // char -> int268assertEquals((long) x, (long) mh_jc.invokeExact(x)); // char -> long269assertEquals((float) x, (float) mh_fc.invokeExact(x)); // char -> float270assertEquals((double) x, (double) mh_dc.invokeExact(x)); // char -> double271if (!DO_CASTS) return;272boolean z = ((x & 1) != 0);273assertEquals((boolean) z, (boolean) mh_zc.invokeExact(x)); // char -> boolean274assertEquals((byte) x, (byte) mh_bc.invokeExact(x)); // char -> byte275assertEquals((short) x, (short) mh_sc.invokeExact(x)); // char -> short276}277private static void char2prim_invalid(char x) throws Throwable {278if (DO_CASTS) return;279try { boolean y = (boolean) mh_zc.invokeExact(x); fail(); } catch (ClassCastException _) {} // char -> boolean280try { byte y = (byte) mh_bc.invokeExact(x); fail(); } catch (ClassCastException _) {} // char -> byte281try { short y = (short) mh_sc.invokeExact(x); fail(); } catch (ClassCastException _) {} // char -> short282}283284private static MethodHandle mh_s(Class ret) { return mh(ret, short.class); }285286private final static MethodHandle mh_zs = mh_s(boolean.class);287private final static MethodHandle mh_bs = mh_s(byte.class );288private final static MethodHandle mh_cs = mh_s(char.class );289private final static MethodHandle mh_ss = mh_s(short.class );290private final static MethodHandle mh_is = mh_s(int.class );291private final static MethodHandle mh_js = mh_s(long.class );292private final static MethodHandle mh_fs = mh_s(float.class );293private final static MethodHandle mh_ds = mh_s(double.class );294295private static void short2prim(short x) throws Throwable {296assertEquals((short) x, (short) mh_ss.invokeExact(x)); // short -> short297assertEquals((int) x, (int) mh_is.invokeExact(x)); // short -> int298assertEquals((long) x, (long) mh_js.invokeExact(x)); // short -> long299assertEquals((float) x, (float) mh_fs.invokeExact(x)); // short -> float300assertEquals((double) x, (double) mh_ds.invokeExact(x)); // short -> double301if (!DO_CASTS) return;302boolean z = ((x & 1) != 0);303assertEquals((boolean) z, (boolean) mh_zs.invokeExact(x)); // short -> boolean304assertEquals((byte) x, (byte) mh_bs.invokeExact(x)); // short -> byte305assertEquals((char) x, (char) mh_cs.invokeExact(x)); // short -> char306}307private static void short2prim_invalid(short x) throws Throwable {308if (DO_CASTS) return;309try { boolean y = (boolean) mh_zs.invokeExact(x); fail(); } catch (ClassCastException _) {} // short -> boolean310try { byte y = (byte) mh_bs.invokeExact(x); fail(); } catch (ClassCastException _) {} // short -> byte311try { char y = (char) mh_cs.invokeExact(x); fail(); } catch (ClassCastException _) {} // short -> char312}313314private static MethodHandle mh_i(Class ret) { return mh(ret, int.class); }315316private final static MethodHandle mh_zi = mh_i(boolean.class);317private final static MethodHandle mh_bi = mh_i(byte.class );318private final static MethodHandle mh_ci = mh_i(char.class );319private final static MethodHandle mh_si = mh_i(short.class );320private final static MethodHandle mh_ii = mh_i(int.class );321private final static MethodHandle mh_ji = mh_i(long.class );322private final static MethodHandle mh_fi = mh_i(float.class );323private final static MethodHandle mh_di = mh_i(double.class );324325private static void int2prim(int x) throws Throwable {326assertEquals((int) x, (int) mh_ii.invokeExact(x)); // int -> int327assertEquals((long) x, (long) mh_ji.invokeExact(x)); // int -> long328assertEquals((float) x, (float) mh_fi.invokeExact(x)); // int -> float329assertEquals((double) x, (double) mh_di.invokeExact(x)); // int -> double330if (!DO_CASTS) return;331boolean z = ((x & 1) != 0);332assertEquals((boolean) z, (boolean) mh_zi.invokeExact(x)); // int -> boolean333assertEquals((byte) x, (byte) mh_bi.invokeExact(x)); // int -> byte334assertEquals((char) x, (char) mh_ci.invokeExact(x)); // int -> char335assertEquals((short) x, (short) mh_si.invokeExact(x)); // int -> short336}337private static void int2prim_invalid(int x) throws Throwable {338if (DO_CASTS) return;339try { boolean y = (boolean) mh_zi.invokeExact(x); fail(); } catch (ClassCastException _) {} // int -> boolean340try { byte y = (byte) mh_bi.invokeExact(x); fail(); } catch (ClassCastException _) {} // int -> byte341try { char y = (char) mh_ci.invokeExact(x); fail(); } catch (ClassCastException _) {} // int -> char342try { short y = (short) mh_si.invokeExact(x); fail(); } catch (ClassCastException _) {} // int -> short343}344345private static MethodHandle mh_j(Class ret) { return mh(ret, long.class); }346347private final static MethodHandle mh_zj = mh_j(boolean.class);348private final static MethodHandle mh_bj = mh_j(byte.class );349private final static MethodHandle mh_cj = mh_j(char.class );350private final static MethodHandle mh_sj = mh_j(short.class );351private final static MethodHandle mh_ij = mh_j(int.class );352private final static MethodHandle mh_jj = mh_j(long.class );353private final static MethodHandle mh_fj = mh_j(float.class );354private final static MethodHandle mh_dj = mh_j(double.class );355356private static void long2prim(long x) throws Throwable {357assertEquals((long) x, (long) mh_jj.invokeExact(x)); // long -> long358assertEquals((float) x, (float) mh_fj.invokeExact(x)); // long -> float359assertEquals((double) x, (double) mh_dj.invokeExact(x)); // long -> double360if (!DO_CASTS) return;361boolean z = ((x & 1) != 0);362assertEquals((boolean)z, (boolean) mh_zj.invokeExact(x)); // long -> boolean363assertEquals((byte) x, (byte) mh_bj.invokeExact(x)); // long -> byte364assertEquals((char) x, (char) mh_cj.invokeExact(x)); // long -> char365assertEquals((short) x, (short) mh_sj.invokeExact(x)); // long -> short366assertEquals((int) x, (int) mh_ij.invokeExact(x)); // long -> int367}368private static void long2prim_invalid(long x) throws Throwable {369if (DO_CASTS) return;370try { boolean y = (boolean) mh_zj.invokeExact(x); fail(); } catch (ClassCastException _) {} // long -> boolean371try { byte y = (byte) mh_bj.invokeExact(x); fail(); } catch (ClassCastException _) {} // long -> byte372try { char y = (char) mh_cj.invokeExact(x); fail(); } catch (ClassCastException _) {} // long -> char373try { short y = (short) mh_sj.invokeExact(x); fail(); } catch (ClassCastException _) {} // long -> short374try { int y = (int) mh_ij.invokeExact(x); fail(); } catch (ClassCastException _) {} // long -> int375}376377private static MethodHandle mh_f(Class ret) { return mh(ret, float.class); }378379private final static MethodHandle mh_zf = mh_f(boolean.class);380private final static MethodHandle mh_bf = mh_f(byte.class );381private final static MethodHandle mh_cf = mh_f(char.class );382private final static MethodHandle mh_sf = mh_f(short.class );383private final static MethodHandle mh_if = mh_f(int.class );384private final static MethodHandle mh_jf = mh_f(long.class );385private final static MethodHandle mh_ff = mh_f(float.class );386private final static MethodHandle mh_df = mh_f(double.class );387388private static void float2prim(float x) throws Throwable {389assertEquals((float) x, (float) mh_ff.invokeExact(x)); // float -> float390assertEquals((double) x, (double) mh_df.invokeExact(x)); // float -> double391if (!DO_CASTS) return;392boolean z = (((byte) x & 1) != 0);393assertEquals((boolean) z, (boolean) mh_zf.invokeExact(x)); // float -> boolean394assertEquals((byte) x, (byte) mh_bf.invokeExact(x)); // float -> byte395assertEquals((char) x, (char) mh_cf.invokeExact(x)); // float -> char396assertEquals((short) x, (short) mh_sf.invokeExact(x)); // float -> short397assertEquals((int) x, (int) mh_if.invokeExact(x)); // float -> int398assertEquals((long) x, (long) mh_jf.invokeExact(x)); // float -> long399}400private static void float2prim_invalid(float x) throws Throwable {401if (DO_CASTS) return;402try { boolean y = (boolean) mh_zf.invokeExact(x); fail(); } catch (ClassCastException _) {} // float -> boolean403try { byte y = (byte) mh_bf.invokeExact(x); fail(); } catch (ClassCastException _) {} // float -> byte404try { char y = (char) mh_cf.invokeExact(x); fail(); } catch (ClassCastException _) {} // float -> char405try { short y = (short) mh_sf.invokeExact(x); fail(); } catch (ClassCastException _) {} // float -> short406try { int y = (int) mh_if.invokeExact(x); fail(); } catch (ClassCastException _) {} // float -> int407try { long y = (long) mh_jf.invokeExact(x); fail(); } catch (ClassCastException _) {} // float -> long408}409410private static MethodHandle mh_d(Class ret) { return mh(ret, double.class); }411412private final static MethodHandle mh_zd = mh_d(boolean.class);413private final static MethodHandle mh_bd = mh_d(byte.class );414private final static MethodHandle mh_cd = mh_d(char.class );415private final static MethodHandle mh_sd = mh_d(short.class );416private final static MethodHandle mh_id = mh_d(int.class );417private final static MethodHandle mh_jd = mh_d(long.class );418private final static MethodHandle mh_fd = mh_d(float.class );419private final static MethodHandle mh_dd = mh_d(double.class );420421private static void double2prim(double x) throws Throwable {422assertEquals((double) x, (double) mh_dd.invokeExact(x)); // double -> double423if (!DO_CASTS) return;424boolean z = (((byte) x & 1) != 0);425assertEquals((boolean) z, (boolean) mh_zd.invokeExact(x)); // double -> boolean426assertEquals((byte) x, (byte) mh_bd.invokeExact(x)); // double -> byte427assertEquals((char) x, (char) mh_cd.invokeExact(x)); // double -> char428assertEquals((short) x, (short) mh_sd.invokeExact(x)); // double -> short429assertEquals((int) x, (int) mh_id.invokeExact(x)); // double -> int430assertEquals((long) x, (long) mh_jd.invokeExact(x)); // double -> long431assertEquals((float) x, (float) mh_fd.invokeExact(x)); // double -> float432}433private static void double2prim_invalid(double x) throws Throwable {434if (DO_CASTS) return;435try { boolean y = (boolean) mh_zd.invokeExact(x); fail(); } catch (ClassCastException _) {} // double -> boolean436try { byte y = (byte) mh_bd.invokeExact(x); fail(); } catch (ClassCastException _) {} // double -> byte437try { char y = (char) mh_cd.invokeExact(x); fail(); } catch (ClassCastException _) {} // double -> char438try { short y = (short) mh_sd.invokeExact(x); fail(); } catch (ClassCastException _) {} // double -> short439try { int y = (int) mh_id.invokeExact(x); fail(); } catch (ClassCastException _) {} // double -> int440try { long y = (long) mh_jd.invokeExact(x); fail(); } catch (ClassCastException _) {} // double -> long441try { float y = (float) mh_fd.invokeExact(x); fail(); } catch (ClassCastException _) {} // double -> float442}443444private final static MethodHandle mh_zv = mh(boolean.class);445private final static MethodHandle mh_bv = mh(byte.class );446private final static MethodHandle mh_cv = mh(char.class );447private final static MethodHandle mh_sv = mh(short.class );448private final static MethodHandle mh_iv = mh(int.class );449private final static MethodHandle mh_jv = mh(long.class );450private final static MethodHandle mh_fv = mh(float.class );451private final static MethodHandle mh_dv = mh(double.class );452453private static void void2prim(int i) throws Throwable {454assertEquals( false, (boolean) mh_zv.invokeExact()); // void -> boolean455assertEquals((byte) 0, (byte) mh_bv.invokeExact()); // void -> byte456assertEquals((char) 0, (char) mh_cv.invokeExact()); // void -> char457assertEquals((short) 0, (short) mh_sv.invokeExact()); // void -> short458assertEquals( 0, (int) mh_iv.invokeExact()); // void -> int459assertEquals( 0L, (long) mh_jv.invokeExact()); // void -> long460assertEquals( 0.0f, (float) mh_fv.invokeExact()); // void -> float461assertEquals( 0.0d, (double) mh_dv.invokeExact()); // void -> double462}463464private static void void2prim_invalid(double x) throws Throwable {465// no cases466}467468private static MethodHandle mh_v(Class arg) { return mh(void.class, arg); }469470private final static MethodHandle mh_vz = mh_v(boolean.class);471private final static MethodHandle mh_vb = mh_v(byte.class );472private final static MethodHandle mh_vc = mh_v(char.class );473private final static MethodHandle mh_vs = mh_v(short.class );474private final static MethodHandle mh_vi = mh_v(int.class );475private final static MethodHandle mh_vj = mh_v(long.class );476private final static MethodHandle mh_vf = mh_v(float.class );477private final static MethodHandle mh_vd = mh_v(double.class );478479private static void prim2void(int x) throws Throwable {480boolean z = ((x & 1) != 0);481mh_vz.invokeExact( z); // boolean -> void482mh_vb.invokeExact((byte) x); // byte -> void483mh_vc.invokeExact((char) x); // char -> void484mh_vs.invokeExact((short) x); // short -> void485mh_vi.invokeExact((int) x); // int -> void486mh_vj.invokeExact((long) x); // long -> void487mh_vf.invokeExact((float) x); // float -> void488mh_vd.invokeExact((double) x); // double -> void489}490491private static void prim2void_invalid(int x) throws Throwable {492// no cases493}494495private static boolean identity(boolean v) { return v; }496private static byte identity(byte v) { return v; }497private static char identity(char v) { return v; }498private static short identity(short v) { return v; }499private static int identity(int v) { return v; }500private static long identity(long v) { return v; }501private static float identity(float v) { return v; }502private static double identity(double v) { return v; }503private static void identity() {}504}505506507