jdk/test/java/lang/invoke/ExplicitCastArgumentsTest.java
author iignatyev
Fri, 26 May 2017 22:53:26 -0700
changeset 45283 fcb2af038805
parent 35315 67dcc46f8241
permissions -rw-r--r--
8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory Reviewed-by: rriggs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     1
/*
45283
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
     2
 * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     4
 *
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     7
 * published by the Free Software Foundation.
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     8
 *
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    13
 * accompanied this code).
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    14
 *
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    18
 *
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    21
 * questions.
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    22
 */
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    23
45283
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
    24
import sun.invoke.util.Wrapper;
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
    25
import test.java.lang.invoke.lib.Helper;
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
    26
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    27
import java.io.File;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    28
import java.io.Serializable;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    29
import java.lang.invoke.MethodHandle;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    30
import java.lang.invoke.MethodHandles;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    31
import java.lang.invoke.MethodType;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    32
import java.lang.invoke.WrongMethodTypeException;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    33
import java.util.HashMap;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    34
import java.util.Map;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    35
import java.util.Random;
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    36
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    37
/*
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    38
 * @test
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    39
 * @bug 8060483 8066746
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    40
 * @key randomness
45283
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
    41
 * @library /lib/testlibrary /java/lang/invoke/common
35315
67dcc46f8241 8148147: Sync up @modules from jigsaw/jake
alanb
parents: 32214
diff changeset
    42
 * @modules java.base/sun.invoke.util
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    43
 * @summary unit tests for MethodHandles.explicitCastArguments()
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    44
 * @run main ExplicitCastArgumentsTest
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    45
 */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    46
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    47
/**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    48
 * Tests for MethodHandles.explicitCastArguments().
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    49
 */
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    50
public class ExplicitCastArgumentsTest {
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    51
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    52
    private static final boolean VERBOSE = Helper.IS_VERBOSE;
27947
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
    53
    private static final Class<?> THIS_CLASS = ExplicitCastArgumentsTest.class;
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    54
    private static final Random RNG = Helper.RNG;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    55
    private static final Map<Wrapper, Object> RANDOM_VALUES = new HashMap<>(9);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    56
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    57
    static {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    58
        RANDOM_VALUES.put(Wrapper.BOOLEAN, RNG.nextBoolean());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    59
        RANDOM_VALUES.put(Wrapper.BYTE, (byte) RNG.nextInt());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    60
        RANDOM_VALUES.put(Wrapper.SHORT, (short) RNG.nextInt());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    61
        RANDOM_VALUES.put(Wrapper.CHAR, (char) RNG.nextInt());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    62
        RANDOM_VALUES.put(Wrapper.INT, RNG.nextInt());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    63
        RANDOM_VALUES.put(Wrapper.LONG, RNG.nextLong());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    64
        RANDOM_VALUES.put(Wrapper.FLOAT, RNG.nextFloat());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    65
        RANDOM_VALUES.put(Wrapper.DOUBLE, RNG.nextDouble());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    66
        RANDOM_VALUES.put(Wrapper.OBJECT, new Object());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    67
    }
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    68
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    69
    public static void main(String[] args) throws Throwable {
27947
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
    70
        testVarargsCollector();
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    71
        testNullRef2Prim();
27947
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
    72
        testRef2Prim();
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    73
        testPrim2Ref();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    74
        testPrim2Prim();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    75
        testNonBCPRef2NonBCPRef();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    76
        testBCPRef2BCPRef();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    77
        testNonBCPRef2BCPRef();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    78
        testReturnAny2Void();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    79
        testReturnVoid2Any();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    80
        testMultipleArgs();
27947
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
    81
        System.out.println("TEST PASSED");
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
    82
    }
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
    83
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    84
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    85
     * Dummy method used in {@link #testVarargsCollector} test to form a method
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    86
     * handle.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    87
     *
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    88
     * @param args - any args
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    89
     * @return - returns args
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    90
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    91
    public static String[] f(String... args) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    92
        return args;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    93
    }
27947
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
    94
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    95
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    96
     * Tests that MHs.explicitCastArguments does incorrect type checks for
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    97
     * VarargsCollector. Bug 8066746.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    98
     *
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    99
     * @throws java.lang.Throwable
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   100
     */
27947
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
   101
    public static void testVarargsCollector() throws Throwable {
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
   102
        MethodType mt = MethodType.methodType(String[].class, String[].class);
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   103
        MethodHandle mh = MethodHandles.publicLookup()
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   104
                .findStatic(THIS_CLASS, "f", mt);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   105
        mh = MethodHandles.explicitCastArguments(mh,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   106
                MethodType.methodType(Object.class, Object.class));
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   107
        mh.invokeWithArguments((Object) (new String[]{"str1", "str2"}));
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   108
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   109
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   110
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   111
     * Tests that null wrapper reference is successfully converted to primitive
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   112
     * types. Converted result should be zero for a primitive. Bug 8060483.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   113
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   114
    public static void testNullRef2Prim() {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   115
        for (Wrapper from : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   116
            for (Wrapper to : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   117
                if (from == Wrapper.VOID || to == Wrapper.VOID) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   118
                    continue;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   119
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   120
                // MHs.eCA javadoc:
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   121
                //    If T0 is a reference and T1 a primitive, and if the reference
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   122
                //    is null at runtime, a zero value is introduced.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   123
                for (TestConversionMode mode : TestConversionMode.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   124
                    testConversion(mode, from.wrapperType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   125
                            to.primitiveType(), null, to.zero(), false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   126
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   127
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   128
        }
27947
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
   129
    }
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
   130
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   131
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   132
     * Tests that non-null wrapper reference is successfully converted to
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   133
     * primitive types.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   134
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   135
    public static void testRef2Prim() {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   136
        for (Wrapper from : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   137
            for (Wrapper to : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   138
                if (from == Wrapper.VOID || to == Wrapper.VOID
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   139
                        || to == Wrapper.OBJECT) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   140
                    continue;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   141
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   142
                Object value = RANDOM_VALUES.get(from);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   143
                for (TestConversionMode mode : TestConversionMode.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   144
                    if (from != Wrapper.OBJECT) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   145
                        Object convValue = to.wrap(value);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   146
                        testConversion(mode, from.wrapperType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   147
                                to.primitiveType(), value, convValue, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   148
                    } else {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   149
                        testConversion(mode, from.wrapperType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   150
                                to.primitiveType(), value, null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   151
                                true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   152
                    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   153
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   154
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   155
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   156
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   157
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   158
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   159
     * Tests that primitive is successfully converted to wrapper reference
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   160
     * types, to the Number type (if possible) and to the Object type.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   161
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   162
    public static void testPrim2Ref() {
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   163
        for (Wrapper from : Wrapper.values()) {
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   164
            for (Wrapper to : Wrapper.values()) {
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   165
                if (from == Wrapper.VOID || from == Wrapper.OBJECT
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   166
                        || to == Wrapper.VOID || to == Wrapper.OBJECT) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   167
                    continue;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   168
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   169
                Object value = RANDOM_VALUES.get(from);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   170
                for (TestConversionMode mode : TestConversionMode.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   171
                    if (from == to) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   172
                        testConversion(mode, from.primitiveType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   173
                                to.wrapperType(), value, value, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   174
                    } else {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   175
                        testConversion(mode, from.primitiveType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   176
                                to.wrapperType(), value, null, true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   177
                    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   178
                    if (from != Wrapper.BOOLEAN && from != Wrapper.CHAR) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   179
                        testConversion(mode, from.primitiveType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   180
                                Number.class, value, value, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   181
                    } else {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   182
                        testConversion(mode, from.primitiveType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   183
                                Number.class, value, null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   184
                                true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   185
                    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   186
                    testConversion(mode, from.primitiveType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   187
                            Object.class, value, value, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   188
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   189
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   190
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   191
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   192
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   193
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   194
     * Tests that primitive is successfully converted to other primitive type.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   195
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   196
    public static void testPrim2Prim() {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   197
        for (Wrapper from : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   198
            for (Wrapper to : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   199
                if (from == Wrapper.VOID || to == Wrapper.VOID
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   200
                        || from == Wrapper.OBJECT || to == Wrapper.OBJECT) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   201
                    continue;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   202
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   203
                Object value = RANDOM_VALUES.get(from);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   204
                Object convValue = to.wrap(value);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   205
                for (TestConversionMode mode : TestConversionMode.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   206
                    testConversion(mode, from.primitiveType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   207
                            to.primitiveType(), value, convValue, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   208
                }
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   209
            }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   210
        }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   211
    }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   212
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   213
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   214
     * Dummy interface for {@link #testNonBCPRef2Ref} test.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   215
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   216
    public static interface TestInterface {}
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   217
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   218
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   219
     * Dummy class for {@link #testNonBCPRef2Ref} test.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   220
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   221
    public static class TestSuperClass implements TestInterface {}
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   222
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   223
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   224
     * Dummy class for {@link #testNonBCPRef2Ref} test.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   225
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   226
    public static class TestSubClass1 extends TestSuperClass {}
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   227
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   228
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   229
     * Dummy class for {@link #testNonBCPRef2Ref} test.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   230
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   231
    public static class TestSubClass2 extends TestSuperClass {}
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   232
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   233
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   234
     * Tests non-bootclasspath reference to reference conversions.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   235
     *
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   236
     * @throws java.lang.Throwable
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   237
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   238
    public static void testNonBCPRef2NonBCPRef() throws Throwable {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   239
        Class testInterface = TestInterface.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   240
        Class testSuperClass = TestSuperClass.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   241
        Class testSubClass1 = TestSubClass1.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   242
        Class testSubClass2 = TestSubClass2.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   243
        Object testSuperObj = new TestSuperClass();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   244
        Object testObj01 = new TestSubClass1();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   245
        Object testObj02 = new TestSubClass2();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   246
        Class[] parents = {testInterface, testSuperClass};
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   247
        Class[] children = {testSubClass1, testSubClass2};
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   248
        Object[] childInst = {testObj01, testObj02};
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   249
        for (TestConversionMode mode : TestConversionMode.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   250
            for (Class parent : parents) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   251
                for (int j = 0; j < children.length; j++) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   252
                    // Child type to parent type non-null conversion, shoud succeed
45283
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
   253
                    testConversion(mode, children[j], parent, childInst[j],
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
   254
                            childInst[j], false, null);
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   255
                    // Child type to parent type null conversion, shoud succeed
45283
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
   256
                    testConversion(mode, children[j], parent, null,
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
   257
                            null, false, null);
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   258
                    // Parent type to child type non-null conversion with parent
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   259
                    // type instance, should fail
45283
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
   260
                    testConversion(mode, parent, children[j], testSuperObj,
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
   261
                            null, true, ClassCastException.class);
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   262
                    // Parent type to child type non-null conversion with child
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   263
                    // type instance, should succeed
45283
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
   264
                    testConversion(mode, parent, children[j], childInst[j],
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
   265
                            childInst[j], false, null);
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   266
                    // Parent type to child type null conversion, should succeed
45283
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
   267
                    testConversion(mode, parent, children[j], null,
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
   268
                            null, false, null);
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   269
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   270
                // Parent type to child type non-null conversion with sibling
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   271
                // type instance, should fail
45283
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
   272
                testConversion(mode, parent, testSubClass1, testObj02,
fcb2af038805 8180890: move c.o.testlibrary.jsr292 classes to jdk/test/java/lang/invoke directory
iignatyev
parents: 35315
diff changeset
   273
                        null, true, ClassCastException.class);
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   274
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   275
            // Sibling type non-null conversion, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   276
            testConversion(mode, testSubClass1,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   277
                    testSubClass2, testObj01, null, true,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   278
                    ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   279
            // Sibling type null conversion, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   280
            testConversion(mode, testSubClass1,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   281
                    testSubClass2, null, null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   282
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   283
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   284
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   285
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   286
     * Dummy interface for {@link #testNonBCPRef2BCPRef} test.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   287
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   288
    public static interface TestSerializableInterface extends Serializable {}
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   289
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   290
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   291
     * Dummy class for {@link #testNonBCPRef2BCPRef} test.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   292
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   293
    public static class TestSerializableClass
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   294
            implements TestSerializableInterface {}
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   295
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   296
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   297
     * Dummy class for {@link #testNonBCPRef2BCPRef} test.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   298
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   299
    public static class TestFileChildClass extends File
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   300
            implements TestSerializableInterface {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   301
        public TestFileChildClass(String pathname) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   302
            super(pathname);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   303
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   304
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   305
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   306
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   307
     * Tests non-bootclasspath reference to bootclasspath reference conversions
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   308
     * and vice-versa.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   309
     *
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   310
     * @throws java.lang.Throwable
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   311
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   312
    public static void testNonBCPRef2BCPRef() throws Throwable {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   313
        Class bcpInterface = Serializable.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   314
        Class bcpSuperClass = File.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   315
        Class nonBcpInterface = TestSerializableInterface.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   316
        Class nonBcpSuperSiblingClass = TestSerializableClass.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   317
        Class nonBcpSubClass = TestFileChildClass.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   318
        Object bcpSuperObj = new File(".");
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   319
        Object testSuperSiblingObj = new TestSerializableClass();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   320
        Object testSubObj = new TestFileChildClass(".");
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   321
        Class[] parents = {bcpInterface, bcpSuperClass};
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   322
        for (TestConversionMode mode : TestConversionMode.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   323
            for (Class parent : parents) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   324
                // Child type to parent type non-null conversion, shoud succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   325
                testConversion(mode, nonBcpSubClass, parent, testSubObj,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   326
                        testSubObj, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   327
                // Child type to parent type null conversion, shoud succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   328
                testConversion(mode, nonBcpSubClass, parent, null, null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   329
                        false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   330
                // Parent type to child type non-null conversion with parent
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   331
                // type instance, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   332
                testConversion(mode, parent, nonBcpSubClass, bcpSuperObj, null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   333
                        true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   334
                // Parent type to child type non-null conversion with child
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   335
                // type instance, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   336
                testConversion(mode, parent, nonBcpSubClass, testSubObj,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   337
                        testSubObj, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   338
                // Parent type to child type null conversion, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   339
                testConversion(mode, parent, nonBcpSubClass, null, null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   340
                        false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   341
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   342
            // Parent type to child type non-null conversion with
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   343
            // super sibling type instance, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   344
            testConversion(mode, bcpInterface, nonBcpSubClass,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   345
                    testSuperSiblingObj, null, true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   346
            Class[] siblings = {nonBcpSubClass, bcpSuperClass};
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   347
            for (Class sibling : siblings) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   348
                // Non-bcp class to bcp/non-bcp sibling class non-null
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   349
                // conversion with nonBcpSuperSiblingClass instance, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   350
                testConversion(mode, nonBcpSuperSiblingClass, sibling,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   351
                        testSuperSiblingObj, null, true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   352
                // Non-bcp class to bcp/non-bcp sibling class null conversion,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   353
                // should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   354
                testConversion(mode, nonBcpSuperSiblingClass, sibling,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   355
                        null, null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   356
                // Non-bcp interface to bcp/non-bcp sibling class non-null
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   357
                // conversion with nonBcpSubClass instance, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   358
                testConversion(mode, nonBcpInterface, sibling, testSubObj,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   359
                        testSubObj, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   360
                // Non-bcp interface to bcp/non-bcp sibling class
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   361
                // null conversion, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   362
                testConversion(mode, nonBcpInterface, sibling, null, null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   363
                        false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   364
                // Non-bcp interface to bcp/non-bcp sibling class non-null
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   365
                // conversion with nonBcpSuperSiblingClass instance, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   366
                testConversion(mode, nonBcpInterface, sibling,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   367
                        testSuperSiblingObj, testSubObj,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   368
                        true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   369
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   370
        }
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   371
    }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   372
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   373
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   374
     * Tests bootclasspath reference to reference conversions.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   375
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   376
    public static void testBCPRef2BCPRef() {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   377
        Class bcpInterface = CharSequence.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   378
        Class bcpSubClass1 = String.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   379
        Class bcpSubClass2 = StringBuffer.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   380
        Object testObj01 = new String("test");
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   381
        Object testObj02 = new StringBuffer("test");
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   382
        Class[] children = {bcpSubClass1, bcpSubClass2};
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   383
        Object[] childInst = {testObj01, testObj02};
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   384
        for (TestConversionMode mode : TestConversionMode.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   385
            for (int i = 0; i < children.length; i++) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   386
                // Child type to parent type non-null conversion, shoud succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   387
                testConversion(mode, children[i], bcpInterface, childInst[i],
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   388
                        childInst[i], false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   389
                // Child type to parent type null conversion, shoud succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   390
                testConversion(mode, children[i], bcpInterface, null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   391
                        null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   392
                // Parent type to child type non-null conversion with child
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   393
                // type instance, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   394
                testConversion(mode, bcpInterface,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   395
                        children[i], childInst[i], childInst[i], false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   396
                // Parent type to child type null conversion, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   397
                testConversion(mode, bcpInterface,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   398
                        children[i], null, null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   399
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   400
            // Sibling type non-null conversion, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   401
            testConversion(mode, bcpSubClass1,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   402
                    bcpSubClass2, testObj01, null, true,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   403
                    ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   404
            // Sibling type null conversion, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   405
            testConversion(mode, bcpSubClass1,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   406
                    bcpSubClass2, null, null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   407
            // Parent type to child type non-null conversion with sibling
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   408
            // type instance, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   409
            testConversion(mode, bcpInterface, bcpSubClass1, testObj02,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   410
                    null, true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   411
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   412
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   413
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   414
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   415
     * Dummy method used in {@link #testReturnAny2Void} and
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   416
     * {@link #testReturnVoid2Any} tests to form a method handle.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   417
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   418
    public static void retVoid() {}
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   419
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   420
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   421
     * Tests that non-null any return is successfully converted to non-type
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   422
     * void.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   423
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   424
    public static void testReturnAny2Void() {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   425
        for (Wrapper from : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   426
            testConversion(TestConversionMode.RETURN_VALUE, from.wrapperType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   427
                    void.class, RANDOM_VALUES.get(from),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   428
                    null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   429
            testConversion(TestConversionMode.RETURN_VALUE, from.primitiveType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   430
                    void.class, RANDOM_VALUES.get(from),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   431
                    null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   432
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   433
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   434
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   435
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   436
     * Tests that void return is successfully converted to primitive and
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   437
     * reference. Result should be zero for primitives and null for references.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   438
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   439
    public static void testReturnVoid2Any() {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   440
        for (Wrapper to : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   441
            testConversion(TestConversionMode.RETURN_VALUE, void.class,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   442
                    to.primitiveType(), null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   443
                    to.zero(), false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   444
            testConversion(TestConversionMode.RETURN_VALUE, void.class,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   445
                    to.wrapperType(), null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   446
                    null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   447
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   448
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   449
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   450
    private static void checkForWrongMethodTypeException(MethodHandle mh, MethodType mt) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   451
        try {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   452
            MethodHandles.explicitCastArguments(mh, mt);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   453
            throw new AssertionError("Expected WrongMethodTypeException is not thrown");
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   454
        } catch (WrongMethodTypeException wmte) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   455
            if (VERBOSE) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   456
                System.out.printf("Expected exception %s: %s\n",
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   457
                        wmte.getClass(), wmte.getMessage());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   458
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   459
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   460
    }
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   461
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   462
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   463
     * Tests that MHs.eCA method works correctly with MHs with multiple arguments.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   464
     * @throws Throwable
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   465
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   466
    public static void testMultipleArgs() throws Throwable {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   467
        int arity = 1 + RNG.nextInt(Helper.MAX_ARITY / 2 - 2);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   468
        int arityMinus = RNG.nextInt(arity);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   469
        int arityPlus = arity + RNG.nextInt(Helper.MAX_ARITY / 2 - arity) + 1;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   470
        MethodType mType = Helper.randomMethodTypeGenerator(arity);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   471
        MethodType mTypeNew = Helper.randomMethodTypeGenerator(arity);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   472
        MethodType mTypeNewMinus = Helper.randomMethodTypeGenerator(arityMinus);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   473
        MethodType mTypeNewPlus = Helper.randomMethodTypeGenerator(arityPlus);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   474
        Class<?> rType = mType.returnType();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   475
        MethodHandle original;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   476
        if (rType.equals(void.class)) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   477
            MethodType mt = MethodType.methodType(void.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   478
            original = MethodHandles.publicLookup()
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   479
                    .findStatic(THIS_CLASS, "retVoid", mt);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   480
        } else {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   481
            Object rValue = Helper.castToWrapper(1, rType);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   482
            original = MethodHandles.constant(rType, rValue);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   483
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   484
        original = Helper.addTrailingArgs(original, arity, mType.parameterList());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   485
        MethodHandle target = MethodHandles
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   486
                    .explicitCastArguments(original, mTypeNew);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   487
        Object[] parList = Helper.randomArgs(mTypeNew.parameterList());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   488
        for (int i = 0; i < parList.length; i++) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   489
            if (parList[i] instanceof String) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   490
                parList[i] = null; //getting rid of Stings produced by randomArgs
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   491
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   492
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   493
        target.invokeWithArguments(parList);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   494
        checkForWrongMethodTypeException(original, mTypeNewMinus);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   495
        checkForWrongMethodTypeException(original, mTypeNewPlus);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   496
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   497
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   498
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   499
     * Enumeration of test conversion modes.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   500
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   501
    public enum TestConversionMode {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   502
        RETURN_VALUE,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   503
        ARGUMENT;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   504
    }
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   505
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   506
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   507
     * Tests type and value conversion. Comparing with the given expected result.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   508
     *
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   509
     * @param mode - test conversion mode. See {@link #TestConversionMode}.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   510
     * @param from - source type.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   511
     * @param to - destination type.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   512
     * @param param - value to be converted.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   513
     * @param expectedResult - expected value after conversion.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   514
     * @param failureExpected - true if conversion failure expected.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   515
     * @param expectedException - expected exception class if
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   516
     * {@code failureExpected} is true.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   517
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   518
    public static void testConversion(TestConversionMode mode,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   519
            Class<?> from, Class<?> to, Object param,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   520
            Object expectedResult, boolean failureExpected,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   521
            Class<? extends Throwable> expectedException) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   522
        if (VERBOSE) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   523
            System.out.printf("Testing return value conversion: "
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   524
                    + "%-10s => %-10s: %5s: ", from.getSimpleName(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   525
                    to.getSimpleName(), param);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   526
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   527
        MethodHandle original = null;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   528
        MethodType newType = null;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   529
        switch (mode) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   530
            case RETURN_VALUE:
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   531
                if (from.equals(void.class)) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   532
                    MethodType mt = MethodType.methodType(void.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   533
                    try {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   534
                        original = MethodHandles.publicLookup()
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   535
                                .findStatic(THIS_CLASS, "retVoid", mt);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   536
                    } catch (NoSuchMethodException | IllegalAccessException ex) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   537
                        throw new Error("Unexpected issue", ex);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   538
                    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   539
                } else {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   540
                    original = MethodHandles.constant(from, param);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   541
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   542
                newType = original.type().changeReturnType(to);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   543
                break;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   544
            case ARGUMENT:
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   545
                if (from.equals(void.class) || to.equals(void.class)) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   546
                    throw new Error("Test issue: argument conversion does not"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   547
                            + " work with non-type void");
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   548
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   549
                original = MethodHandles.identity(to);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   550
                newType = original.type().changeParameterType(0, from);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   551
                break;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   552
            default:
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   553
                String msg = String.format("Test issue: unknown test"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   554
                        + " convertion mode %s.", mode.name());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   555
                throw new Error(msg);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   556
        }
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   557
        try {
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   558
            MethodHandle target = MethodHandles
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   559
                    .explicitCastArguments(original, newType);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   560
            Object result;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   561
            switch (mode) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   562
                case RETURN_VALUE:
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   563
                    result = target.invokeWithArguments();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   564
                    break;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   565
                case ARGUMENT:
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   566
                    result = target.invokeWithArguments(param);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   567
                    break;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   568
                default:
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   569
                    String msg = String.format("Test issue: unknown test"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   570
                            + " convertion mode %s.", mode.name());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   571
                    throw new Error(msg);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   572
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   573
            if (!failureExpected
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   574
                    && (expectedResult != null && !expectedResult.equals(result)
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   575
                    || expectedResult == null && result != null)) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   576
                String msg = String.format("Conversion result %s is not equal"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   577
                        + " to the expected result %10s",
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   578
                        result, expectedResult);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   579
                throw new AssertionError(msg);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   580
            }
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   581
            if (VERBOSE) {
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   582
                String resultStr;
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   583
                if (result != null) {
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   584
                    resultStr = String.format("Converted value and type are"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   585
                            + " %10s (%10s)", "'" + result + "'",
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   586
                            result.getClass().getSimpleName());
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   587
                } else {
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   588
                    resultStr = String.format("Converted value is %10s", result);
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   589
                }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   590
                System.out.println(resultStr);
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   591
            }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   592
            if (failureExpected) {
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   593
                String msg = String.format("No exception thrown while testing"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   594
                        + " return value conversion: %10s => %10s;"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   595
                        + " parameter: %10s",
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   596
                        from, to, param);
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   597
                throw new AssertionError(msg);
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   598
            }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   599
        } catch (AssertionError e) {
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   600
            throw e; // report test failure
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   601
        } catch (Throwable e) {
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   602
            if (VERBOSE) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   603
                System.out.printf("%s: %s\n", e.getClass(), e.getMessage());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   604
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   605
            if (!failureExpected || !e.getClass().equals(expectedException)) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   606
                String msg = String.format("Unexpected exception was thrown"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   607
                        + " while testing return value conversion:"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   608
                        + " %s => %s; parameter: %s", from, to, param);
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   609
                throw new AssertionError(msg, e);
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   610
            }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   611
        }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   612
    }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   613
}