jdk/test/java/lang/invoke/6998541/Test6998541.java
author jlahoda
Tue, 02 Dec 2014 15:12:40 +0100
changeset 27785 29d4cb4a8f5e
parent 9752 88ab34b6da6d
child 32649 2ee9017c7597
permissions -rw-r--r--
8065998: Avoid use of _ as a one-character identifier Reviewed-by: alanb, chegar, darcy
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9646
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
     1
/*
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
     2
 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
     4
 *
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
     7
 * published by the Free Software Foundation.
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
     8
 *
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    13
 * accompanied this code).
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    14
 *
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    18
 *
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    21
 * questions.
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    22
 *
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    23
 */
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    24
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    25
/**
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    26
 * @test
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    27
 * @bug 6998541
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    28
 * @summary JSR 292 implement missing return-type conversion for OP_RETYPE_RAW
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    29
 *
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    30
 * @run main/othervm -Xbatch
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    31
 *    -XX:+UnlockDiagnosticVMOptions -XX:ScavengeRootsInCode=2
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    32
 *       -DTest6998541.N=100000 -DTest6998541.KIND=cast Test6998541
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    33
 * @run main/othervm -Xbatch
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    34
 *    -XX:+UnlockDiagnosticVMOptions -XX:ScavengeRootsInCode=2
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    35
 *       -DTest6998541.N=100000 -DTest6998541.KIND=normal Test6998541
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    36
 */
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    37
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    38
import java.util.*;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    39
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    40
import java.lang.invoke.*;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    41
import static java.lang.invoke.MethodHandles.*;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    42
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    43
public class Test6998541 {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    44
    private static final Class  CLASS = Test6998541.class;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    45
    private static final String NAME  = "identity";
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    46
    private static final int    N     = Math.max(2, Integer.getInteger(CLASS.getSimpleName()+".N", 10000));
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    47
    private static final String KIND  = System.getProperty(CLASS.getSimpleName()+".KIND", "cast");
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    48
    private static final int    BITS  = 0x00000201;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    49
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    50
    private static final boolean DO_CASTS = !KIND.equals("normal");
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    51
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    52
    public static void main(String[] args) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    53
        System.out.println("KIND="+KIND+" DO_CASTS="+DO_CASTS+" N="+N);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    54
        doboolean();
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    55
        dobyte();
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    56
        dochar();
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    57
        doshort();
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    58
        doint();
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    59
        dolong();
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    60
        dofloat();
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    61
        dodouble();
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    62
        dovoid();
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    63
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    64
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    65
    private static void doboolean() throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    66
        for (int i = 0; i < N; i++) {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    67
            boolean2prim(false);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    68
            boolean2prim(true);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    69
        }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    70
        boolean2prim_invalid(true);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    71
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    72
    private static void dobyte() throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    73
        byte x = Byte.MIN_VALUE;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    74
        for (int i = 0; i < N; i++, x++)
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    75
            byte2prim(x);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    76
        byte2prim_invalid(x);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    77
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    78
    private static void dochar() throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    79
        char x = Character.MIN_VALUE;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    80
        for (int i = 0; i < N; i++, x++)
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    81
            char2prim(x);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    82
        char2prim_invalid(x);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    83
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    84
    private static void doshort() throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    85
        short x = Short.MIN_VALUE;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    86
        for (int i = 0; i < N; i++, x++)
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    87
            short2prim(x);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    88
        short2prim_invalid(x);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    89
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    90
    private static void doint() throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    91
        int x = Integer.MIN_VALUE;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    92
        int D = Integer.MAX_VALUE / (N / 2) | BITS;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    93
        for (int i = 0; i < N; i++, x += D) {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    94
            int2prim(x);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    95
        }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    96
        int2prim_invalid(x);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    97
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    98
    private static void dolong() throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
    99
        long x = Long.MIN_VALUE;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   100
        long D = Long.MAX_VALUE / ((long) (N / 2)) | BITS;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   101
        for (int i = 0; i < N; i++, x += D)
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   102
            long2prim(x);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   103
        long2prim_invalid(x);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   104
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   105
    private static void dofloat() throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   106
        float x = Float.MIN_VALUE;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   107
        float D = Float.MAX_VALUE / ((float) (N / 2));
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   108
        for (int i = 0; i < N; i++, x += D)
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   109
            float2prim(x);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   110
        float2prim_invalid(x);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   111
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   112
    private static void dodouble() throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   113
        double x = Double.MIN_VALUE;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   114
        double D = Double.MAX_VALUE / ((double) (N / 2));
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   115
        for (int i = 0; i < N; i++, x += D)
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   116
            double2prim(x);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   117
        double2prim_invalid(x);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   118
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   119
    private static void dovoid() throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   120
        for (int i = 0; i < N; i++) {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   121
            void2prim(i);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   122
        }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   123
        void2prim_invalid(0);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   124
        // do the other direction here also:
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   125
        for (int i = 0; i < N; i++) {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   126
            prim2void(i);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   127
        }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   128
        prim2void_invalid(0);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   129
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   130
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   131
    private static void assertEquals(Object o, Object o2) {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   132
        if (!o.equals(o2))
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   133
            throw new AssertionError("expected: " + o + ", found: " + o2);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   134
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   135
    private static void fail() {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   136
        throw new AssertionError();
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   137
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   138
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   139
    private final static MethodHandles.Lookup lookup = MethodHandles.lookup();
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   140
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   141
    private static MethodHandle mh(Class ret, Class... args) {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   142
        try {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   143
            MethodType mt  = MethodType.methodType(ret, args);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   144
            Class lookupRet = (args.length == 0 ? void.class : args[0]);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   145
            MethodHandle mh = lookup.findStatic(CLASS, NAME, mt.changeReturnType(lookupRet));
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   146
            if (DO_CASTS)
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   147
                return MethodHandles.explicitCastArguments(mh, mt);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   148
            if (canDoAsType(mh.type(), mt))
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   149
                return mh.asType(mt);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   150
            try {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   151
                mh.asType(mt);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   152
                throw new AssertionError("asType should not succeed: "+mh+" => "+mt);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   153
            } catch (WrongMethodTypeException ex) {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   154
                // this was a required WMTE
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   155
                return mh.asType(mt.generic()).asType(mt);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   156
            }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   157
        } catch (ReflectiveOperationException e) {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   158
            throw new RuntimeException(e);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   159
        }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   160
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   161
    private static final Class<?>[] NUMERIC_TYPE_WIDENING_ORDER = {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   162
        byte.class, short.class, int.class, long.class, float.class, double.class
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   163
    };
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   164
    private static boolean canDoAsType(Class<?> src, Class<?> dst) {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   165
        if (src == dst)  return true;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   166
        if (dst == void.class)  return true;
9752
88ab34b6da6d 7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents: 9646
diff changeset
   167
        if (src == void.class)  return true;  // allow void->zero
9646
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   168
        if (!src.isPrimitive() || !dst.isPrimitive())  return true;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   169
        // primitive conversion works for asType only when it's widening
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   170
        if (src == boolean.class || dst == boolean.class)  return false;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   171
        if (dst == char.class)  return false;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   172
        if (src == char.class)  src = int.class;  // can widen char to int
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   173
        for (Class<?> ntype : NUMERIC_TYPE_WIDENING_ORDER) {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   174
            if (src == ntype)  return true;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   175
            if (dst == ntype)  return false;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   176
        }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   177
        throw new AssertionError("should not reach here: "+src+", "+dst);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   178
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   179
    private static boolean canDoAsType(MethodType mt0, MethodType mt1) {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   180
        Class<?> rt0 = mt0.returnType();
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   181
        Class<?> rt1 = mt1.returnType();
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   182
        if (!canDoAsType(rt0, rt1))  return false;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   183
        int argc = mt0.parameterCount();
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   184
        if (argc != mt1.parameterCount())  return false;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   185
        for (int i = 0; i < argc; i++) {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   186
            if (!canDoAsType(mt1.parameterType(i), mt0.parameterType(i)))
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   187
                return false;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   188
        }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   189
        return true;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   190
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   191
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   192
    private static MethodHandle mh_z(Class ret) { return mh(ret, boolean.class); }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   193
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   194
    private final static MethodHandle mh_zz = mh_z(boolean.class);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   195
    private final static MethodHandle mh_bz = mh_z(byte.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   196
    private final static MethodHandle mh_cz = mh_z(char.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   197
    private final static MethodHandle mh_sz = mh_z(short.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   198
    private final static MethodHandle mh_iz = mh_z(int.class    );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   199
    private final static MethodHandle mh_jz = mh_z(long.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   200
    private final static MethodHandle mh_fz = mh_z(float.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   201
    private final static MethodHandle mh_dz = mh_z(double.class );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   202
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   203
    private static void boolean2prim(boolean x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   204
        int i = x ? 1 : 0;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   205
        assertEquals(          x, (boolean) mh_zz.invokeExact(x));  // boolean -> boolean
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   206
        if (!DO_CASTS)  return;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   207
        assertEquals((byte)    i, (byte)    mh_bz.invokeExact(x));  // boolean -> byte
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   208
        assertEquals((char)    i, (char)    mh_cz.invokeExact(x));  // boolean -> char
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   209
        assertEquals((short)   i, (short)   mh_sz.invokeExact(x));  // boolean -> short
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   210
        assertEquals((int)     i, (int)     mh_iz.invokeExact(x));  // boolean -> int
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   211
        assertEquals((long)    i, (long)    mh_jz.invokeExact(x));  // boolean -> long
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   212
        assertEquals((float)   i, (float)   mh_fz.invokeExact(x));  // boolean -> float
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   213
        assertEquals((double)  i, (double)  mh_dz.invokeExact(x));  // boolean -> double
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   214
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   215
    private static void boolean2prim_invalid(boolean x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   216
        if (DO_CASTS)  return;
27785
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   217
        try { byte    y = (byte)    mh_bz.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // boolean -> byte
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   218
        try { char    y = (char)    mh_cz.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // boolean -> char
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   219
        try { short   y = (short)   mh_sz.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // boolean -> short
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   220
        try { int     y = (int)     mh_iz.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // boolean -> int
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   221
        try { long    y = (long)    mh_jz.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // boolean -> long
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   222
        try { float   y = (float)   mh_fz.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // boolean -> float
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   223
        try { double  y = (double)  mh_dz.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // boolean -> double
9646
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   224
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   225
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   226
    private static MethodHandle mh_b(Class ret) { return mh(ret, byte.class); }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   227
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   228
    private final static MethodHandle mh_zb = mh_b(boolean.class);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   229
    private final static MethodHandle mh_bb = mh_b(byte.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   230
    private final static MethodHandle mh_cb = mh_b(char.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   231
    private final static MethodHandle mh_sb = mh_b(short.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   232
    private final static MethodHandle mh_ib = mh_b(int.class    );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   233
    private final static MethodHandle mh_jb = mh_b(long.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   234
    private final static MethodHandle mh_fb = mh_b(float.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   235
    private final static MethodHandle mh_db = mh_b(double.class );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   236
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   237
    private static void byte2prim(byte x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   238
        assertEquals((byte)    x, (byte)    mh_bb.invokeExact(x));  // byte -> byte
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   239
        assertEquals((short)   x, (short)   mh_sb.invokeExact(x));  // byte -> short
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   240
        assertEquals((int)     x, (int)     mh_ib.invokeExact(x));  // byte -> int
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   241
        assertEquals((long)    x, (long)    mh_jb.invokeExact(x));  // byte -> long
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   242
        assertEquals((float)   x, (float)   mh_fb.invokeExact(x));  // byte -> float
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   243
        assertEquals((double)  x, (double)  mh_db.invokeExact(x));  // byte -> double
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   244
        if (!DO_CASTS)  return;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   245
        boolean z = ((x & 1) != 0);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   246
        assertEquals((char)    x, (char)    mh_cb.invokeExact(x));  // byte -> char
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   247
        assertEquals((boolean) z, (boolean) mh_zb.invokeExact(x));  // byte -> boolean
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   248
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   249
    private static void byte2prim_invalid(byte x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   250
        if (DO_CASTS)  return;
27785
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   251
        try { char    y = (char)    mh_cb.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // byte -> char
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   252
        try { boolean y = (boolean) mh_zb.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // byte -> boolean
9646
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   253
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   254
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   255
    private static MethodHandle mh_c(Class ret) { return mh(ret, char.class); }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   256
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   257
    private final static MethodHandle mh_zc = mh_c(boolean.class);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   258
    private final static MethodHandle mh_bc = mh_c(byte.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   259
    private final static MethodHandle mh_cc = mh_c(char.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   260
    private final static MethodHandle mh_sc = mh_c(short.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   261
    private final static MethodHandle mh_ic = mh_c(int.class    );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   262
    private final static MethodHandle mh_jc = mh_c(long.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   263
    private final static MethodHandle mh_fc = mh_c(float.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   264
    private final static MethodHandle mh_dc = mh_c(double.class );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   265
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   266
    private static void char2prim(char x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   267
        assertEquals((char)    x, (char)    mh_cc.invokeExact(x));  // char -> char
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   268
        assertEquals((int)     x, (int)     mh_ic.invokeExact(x));  // char -> int
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   269
        assertEquals((long)    x, (long)    mh_jc.invokeExact(x));  // char -> long
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   270
        assertEquals((float)   x, (float)   mh_fc.invokeExact(x));  // char -> float
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   271
        assertEquals((double)  x, (double)  mh_dc.invokeExact(x));  // char -> double
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   272
        if (!DO_CASTS)  return;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   273
        boolean z = ((x & 1) != 0);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   274
        assertEquals((boolean) z, (boolean) mh_zc.invokeExact(x));  // char -> boolean
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   275
        assertEquals((byte)    x, (byte)    mh_bc.invokeExact(x));  // char -> byte
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   276
        assertEquals((short)   x, (short)   mh_sc.invokeExact(x));  // char -> short
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   277
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   278
    private static void char2prim_invalid(char x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   279
        if (DO_CASTS)  return;
27785
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   280
        try { boolean y = (boolean) mh_zc.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // char -> boolean
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   281
        try { byte    y = (byte)    mh_bc.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // char -> byte
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   282
        try { short   y = (short)   mh_sc.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // char -> short
9646
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   283
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   284
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   285
    private static MethodHandle mh_s(Class ret) { return mh(ret, short.class); }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   286
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   287
    private final static MethodHandle mh_zs = mh_s(boolean.class);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   288
    private final static MethodHandle mh_bs = mh_s(byte.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   289
    private final static MethodHandle mh_cs = mh_s(char.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   290
    private final static MethodHandle mh_ss = mh_s(short.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   291
    private final static MethodHandle mh_is = mh_s(int.class    );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   292
    private final static MethodHandle mh_js = mh_s(long.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   293
    private final static MethodHandle mh_fs = mh_s(float.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   294
    private final static MethodHandle mh_ds = mh_s(double.class );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   295
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   296
    private static void short2prim(short x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   297
        assertEquals((short)   x, (short)   mh_ss.invokeExact(x));  // short -> short
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   298
        assertEquals((int)     x, (int)     mh_is.invokeExact(x));  // short -> int
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   299
        assertEquals((long)    x, (long)    mh_js.invokeExact(x));  // short -> long
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   300
        assertEquals((float)   x, (float)   mh_fs.invokeExact(x));  // short -> float
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   301
        assertEquals((double)  x, (double)  mh_ds.invokeExact(x));  // short -> double
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   302
        if (!DO_CASTS)  return;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   303
        boolean z = ((x & 1) != 0);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   304
        assertEquals((boolean) z, (boolean) mh_zs.invokeExact(x));  // short -> boolean
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   305
        assertEquals((byte)    x, (byte)    mh_bs.invokeExact(x));  // short -> byte
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   306
        assertEquals((char)    x, (char)    mh_cs.invokeExact(x));  // short -> char
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   307
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   308
    private static void short2prim_invalid(short x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   309
        if (DO_CASTS)  return;
27785
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   310
        try { boolean y = (boolean) mh_zs.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // short -> boolean
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   311
        try { byte    y = (byte)    mh_bs.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // short -> byte
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   312
        try { char    y = (char)    mh_cs.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // short -> char
9646
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   313
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   314
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   315
    private static MethodHandle mh_i(Class ret) { return mh(ret, int.class); }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   316
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   317
    private final static MethodHandle mh_zi = mh_i(boolean.class);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   318
    private final static MethodHandle mh_bi = mh_i(byte.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   319
    private final static MethodHandle mh_ci = mh_i(char.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   320
    private final static MethodHandle mh_si = mh_i(short.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   321
    private final static MethodHandle mh_ii = mh_i(int.class    );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   322
    private final static MethodHandle mh_ji = mh_i(long.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   323
    private final static MethodHandle mh_fi = mh_i(float.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   324
    private final static MethodHandle mh_di = mh_i(double.class );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   325
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   326
    private static void int2prim(int x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   327
        assertEquals((int)     x, (int)     mh_ii.invokeExact(x));  // int -> int
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   328
        assertEquals((long)    x, (long)    mh_ji.invokeExact(x));  // int -> long
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   329
        assertEquals((float)   x, (float)   mh_fi.invokeExact(x));  // int -> float
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   330
        assertEquals((double)  x, (double)  mh_di.invokeExact(x));  // int -> double
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   331
        if (!DO_CASTS)  return;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   332
        boolean z = ((x & 1) != 0);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   333
        assertEquals((boolean) z, (boolean) mh_zi.invokeExact(x));  // int -> boolean
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   334
        assertEquals((byte)    x, (byte)    mh_bi.invokeExact(x));  // int -> byte
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   335
        assertEquals((char)    x, (char)    mh_ci.invokeExact(x));  // int -> char
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   336
        assertEquals((short)   x, (short)   mh_si.invokeExact(x));  // int -> short
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   337
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   338
    private static void int2prim_invalid(int x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   339
        if (DO_CASTS)  return;
27785
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   340
        try { boolean y = (boolean) mh_zi.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // int -> boolean
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   341
        try { byte    y = (byte)    mh_bi.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // int -> byte
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   342
        try { char    y = (char)    mh_ci.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // int -> char
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   343
        try { short   y = (short)   mh_si.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // int -> short
9646
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   344
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   345
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   346
    private static MethodHandle mh_j(Class ret) { return mh(ret, long.class); }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   347
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   348
    private final static MethodHandle mh_zj = mh_j(boolean.class);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   349
    private final static MethodHandle mh_bj = mh_j(byte.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   350
    private final static MethodHandle mh_cj = mh_j(char.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   351
    private final static MethodHandle mh_sj = mh_j(short.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   352
    private final static MethodHandle mh_ij = mh_j(int.class    );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   353
    private final static MethodHandle mh_jj = mh_j(long.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   354
    private final static MethodHandle mh_fj = mh_j(float.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   355
    private final static MethodHandle mh_dj = mh_j(double.class );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   356
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   357
    private static void long2prim(long x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   358
        assertEquals((long)   x, (long)    mh_jj.invokeExact(x));  // long -> long
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   359
        assertEquals((float)  x, (float)   mh_fj.invokeExact(x));  // long -> float
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   360
        assertEquals((double) x, (double)  mh_dj.invokeExact(x));  // long -> double
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   361
        if (!DO_CASTS)  return;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   362
        boolean z = ((x & 1) != 0);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   363
        assertEquals((boolean)z, (boolean) mh_zj.invokeExact(x));  // long -> boolean
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   364
        assertEquals((byte)   x, (byte)    mh_bj.invokeExact(x));  // long -> byte
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   365
        assertEquals((char)   x, (char)    mh_cj.invokeExact(x));  // long -> char
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   366
        assertEquals((short)  x, (short)   mh_sj.invokeExact(x));  // long -> short
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   367
        assertEquals((int)    x, (int)     mh_ij.invokeExact(x));  // long -> int
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   368
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   369
    private static void long2prim_invalid(long x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   370
        if (DO_CASTS)  return;
27785
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   371
        try { boolean y = (boolean) mh_zj.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // long -> boolean
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   372
        try { byte    y = (byte)    mh_bj.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // long -> byte
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   373
        try { char    y = (char)    mh_cj.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // long -> char
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   374
        try { short   y = (short)   mh_sj.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // long -> short
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   375
        try { int     y = (int)     mh_ij.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // long -> int
9646
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   376
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   377
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   378
    private static MethodHandle mh_f(Class ret) { return mh(ret, float.class); }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   379
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   380
    private final static MethodHandle mh_zf = mh_f(boolean.class);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   381
    private final static MethodHandle mh_bf = mh_f(byte.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   382
    private final static MethodHandle mh_cf = mh_f(char.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   383
    private final static MethodHandle mh_sf = mh_f(short.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   384
    private final static MethodHandle mh_if = mh_f(int.class    );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   385
    private final static MethodHandle mh_jf = mh_f(long.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   386
    private final static MethodHandle mh_ff = mh_f(float.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   387
    private final static MethodHandle mh_df = mh_f(double.class );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   388
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   389
    private static void float2prim(float x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   390
        assertEquals((float)   x, (float)   mh_ff.invokeExact(x));  // float -> float
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   391
        assertEquals((double)  x, (double)  mh_df.invokeExact(x));  // float -> double
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   392
        if (!DO_CASTS)  return;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   393
        boolean z = (((byte) x & 1) != 0);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   394
        assertEquals((boolean) z, (boolean) mh_zf.invokeExact(x));  // float -> boolean
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   395
        assertEquals((byte)    x, (byte)    mh_bf.invokeExact(x));  // float -> byte
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   396
        assertEquals((char)    x, (char)    mh_cf.invokeExact(x));  // float -> char
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   397
        assertEquals((short)   x, (short)   mh_sf.invokeExact(x));  // float -> short
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   398
        assertEquals((int)     x, (int)     mh_if.invokeExact(x));  // float -> int
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   399
        assertEquals((long)    x, (long)    mh_jf.invokeExact(x));  // float -> long
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   400
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   401
    private static void float2prim_invalid(float x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   402
        if (DO_CASTS)  return;
27785
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   403
        try { boolean y = (boolean) mh_zf.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // float -> boolean
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   404
        try { byte    y = (byte)    mh_bf.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // float -> byte
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   405
        try { char    y = (char)    mh_cf.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // float -> char
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   406
        try { short   y = (short)   mh_sf.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // float -> short
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   407
        try { int     y = (int)     mh_if.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // float -> int
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   408
        try { long    y = (long)    mh_jf.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // float -> long
9646
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   409
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   410
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   411
    private static MethodHandle mh_d(Class ret) { return mh(ret, double.class); }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   412
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   413
    private final static MethodHandle mh_zd = mh_d(boolean.class);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   414
    private final static MethodHandle mh_bd = mh_d(byte.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   415
    private final static MethodHandle mh_cd = mh_d(char.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   416
    private final static MethodHandle mh_sd = mh_d(short.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   417
    private final static MethodHandle mh_id = mh_d(int.class    );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   418
    private final static MethodHandle mh_jd = mh_d(long.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   419
    private final static MethodHandle mh_fd = mh_d(float.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   420
    private final static MethodHandle mh_dd = mh_d(double.class );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   421
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   422
    private static void double2prim(double x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   423
        assertEquals((double) x, (double)  mh_dd.invokeExact(x));  // double -> double
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   424
        if (!DO_CASTS)  return;
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   425
        boolean z = (((byte) x & 1) != 0);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   426
        assertEquals((boolean) z, (boolean) mh_zd.invokeExact(x));  // double -> boolean
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   427
        assertEquals((byte)    x, (byte)    mh_bd.invokeExact(x));  // double -> byte
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   428
        assertEquals((char)    x, (char)    mh_cd.invokeExact(x));  // double -> char
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   429
        assertEquals((short)   x, (short)   mh_sd.invokeExact(x));  // double -> short
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   430
        assertEquals((int)     x, (int)     mh_id.invokeExact(x));  // double -> int
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   431
        assertEquals((long)    x, (long)    mh_jd.invokeExact(x));  // double -> long
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   432
        assertEquals((float)   x, (float)   mh_fd.invokeExact(x));  // double -> float
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   433
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   434
    private static void double2prim_invalid(double x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   435
        if (DO_CASTS)  return;
27785
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   436
        try { boolean y = (boolean) mh_zd.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // double -> boolean
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   437
        try { byte    y = (byte)    mh_bd.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // double -> byte
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   438
        try { char    y = (char)    mh_cd.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // double -> char
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   439
        try { short   y = (short)   mh_sd.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // double -> short
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   440
        try { int     y = (int)     mh_id.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // double -> int
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   441
        try { long    y = (long)    mh_jd.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // double -> long
29d4cb4a8f5e 8065998: Avoid use of _ as a one-character identifier
jlahoda
parents: 9752
diff changeset
   442
        try { float   y = (float)   mh_fd.invokeExact(x); fail(); } catch (ClassCastException expected) {}  // double -> float
9646
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   443
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   444
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   445
    private final static MethodHandle mh_zv = mh(boolean.class);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   446
    private final static MethodHandle mh_bv = mh(byte.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   447
    private final static MethodHandle mh_cv = mh(char.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   448
    private final static MethodHandle mh_sv = mh(short.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   449
    private final static MethodHandle mh_iv = mh(int.class    );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   450
    private final static MethodHandle mh_jv = mh(long.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   451
    private final static MethodHandle mh_fv = mh(float.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   452
    private final static MethodHandle mh_dv = mh(double.class );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   453
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   454
    private static void void2prim(int i) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   455
        assertEquals(        false, (boolean) mh_zv.invokeExact());  // void -> boolean
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   456
        assertEquals((byte)  0,     (byte)    mh_bv.invokeExact());  // void -> byte
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   457
        assertEquals((char)  0,     (char)    mh_cv.invokeExact());  // void -> char
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   458
        assertEquals((short) 0,     (short)   mh_sv.invokeExact());  // void -> short
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   459
        assertEquals(        0,     (int)     mh_iv.invokeExact());  // void -> int
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   460
        assertEquals(        0L,    (long)    mh_jv.invokeExact());  // void -> long
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   461
        assertEquals(        0.0f,  (float)   mh_fv.invokeExact());  // void -> float
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   462
        assertEquals(        0.0d,  (double)  mh_dv.invokeExact());  // void -> double
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   463
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   464
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   465
    private static void void2prim_invalid(double x) throws Throwable {
9752
88ab34b6da6d 7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents: 9646
diff changeset
   466
        // no cases
9646
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   467
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   468
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   469
    private static MethodHandle mh_v(Class arg) { return mh(void.class, arg); }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   470
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   471
    private final static MethodHandle mh_vz = mh_v(boolean.class);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   472
    private final static MethodHandle mh_vb = mh_v(byte.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   473
    private final static MethodHandle mh_vc = mh_v(char.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   474
    private final static MethodHandle mh_vs = mh_v(short.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   475
    private final static MethodHandle mh_vi = mh_v(int.class    );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   476
    private final static MethodHandle mh_vj = mh_v(long.class   );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   477
    private final static MethodHandle mh_vf = mh_v(float.class  );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   478
    private final static MethodHandle mh_vd = mh_v(double.class );
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   479
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   480
    private static void prim2void(int x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   481
        boolean z = ((x & 1) != 0);
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   482
        mh_vz.invokeExact(         z);  // boolean -> void
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   483
        mh_vb.invokeExact((byte)   x);  // byte    -> void
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   484
        mh_vc.invokeExact((char)   x);  // char    -> void
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   485
        mh_vs.invokeExact((short)  x);  // short   -> void
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   486
        mh_vi.invokeExact((int)    x);  // int     -> void
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   487
        mh_vj.invokeExact((long)   x);  // long    -> void
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   488
        mh_vf.invokeExact((float)  x);  // float   -> void
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   489
        mh_vd.invokeExact((double) x);  // double  -> void
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   490
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   491
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   492
    private static void prim2void_invalid(int x) throws Throwable {
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   493
        // no cases
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   494
    }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   495
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   496
    private static boolean identity(boolean v) { return v; }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   497
    private static byte    identity(byte    v) { return v; }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   498
    private static char    identity(char    v) { return v; }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   499
    private static short   identity(short   v) { return v; }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   500
    private static int     identity(int     v) { return v; }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   501
    private static long    identity(long    v) { return v; }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   502
    private static float   identity(float   v) { return v; }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   503
    private static double  identity(double  v) { return v; }
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   504
    private static void    identity() {}
5ebbe5ab084f 6939861: JVM should handle more conversion operations
jrose
parents:
diff changeset
   505
}