test/jdk/java/lang/invoke/condy/ConstantBootstrapsTest.java
author psandoz
Thu, 01 Feb 2018 14:19:04 -0800
changeset 48834 19ef3f64bc10
parent 48827 8772acd913e5
child 48878 2f265d2ac735
permissions -rw-r--r--
8195694: ConstantBootstraps.invoke does not preserve variable arity Reviewed-by: jrose
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48827
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
     1
/*
48834
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
     2
 * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
48827
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
     4
 *
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
     7
 * published by the Free Software Foundation.
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
     8
 *
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    13
 * accompanied this code).
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    14
 *
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    18
 *
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    21
 * questions.
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    22
 */
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    23
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    24
/*
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    25
 * @test
48834
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
    26
 * @bug 8186046 8195694
48827
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    27
 * @summary Test dynamic constant bootstraps
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    28
 * @library /lib/testlibrary/bytecode /java/lang/invoke/common
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    29
 * @build jdk.experimental.bytecode.BasicClassBuilder test.java.lang.invoke.lib.InstructionHelper
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    30
 * @run testng ConstantBootstrapsTest
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    31
 * @run testng/othervm -XX:+UnlockDiagnosticVMOptions -XX:UseBootstrapCallInfo=3 ConstantBootstrapsTest
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    32
 */
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    33
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    34
import jdk.experimental.bytecode.PoolHelper;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    35
import org.testng.annotations.Test;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    36
import test.java.lang.invoke.lib.InstructionHelper;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    37
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    38
import java.lang.invoke.ConstantBootstraps;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    39
import java.lang.invoke.MethodHandle;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    40
import java.lang.invoke.MethodHandleInfo;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    41
import java.lang.invoke.MethodHandles;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    42
import java.lang.invoke.MethodType;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    43
import java.lang.invoke.VarHandle;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    44
import java.lang.invoke.WrongMethodTypeException;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    45
import java.math.BigInteger;
48834
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
    46
import java.util.Collection;
48827
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    47
import java.util.List;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    48
import java.util.Map;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    49
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    50
import static org.testng.Assert.assertEquals;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    51
import static org.testng.Assert.assertNull;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    52
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    53
@Test
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    54
public class ConstantBootstrapsTest {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    55
    static final MethodHandles.Lookup L = MethodHandles.lookup();
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    56
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    57
    static MethodType lookupMT(Class<?> ret, Class<?>... params) {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    58
        return MethodType.methodType(ret, MethodHandles.Lookup.class, String.class, Class.class).
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    59
                appendParameterTypes(params);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    60
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    61
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    62
    public void testNullConstant() throws Throwable {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    63
        var handle = InstructionHelper.ldcDynamicConstant(L, "_", Object.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    64
                                                          ConstantBootstraps.class, "nullConstant", lookupMT(Object.class),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    65
                                                          S -> {});
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    66
        assertNull(handle.invoke());
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    67
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    68
        handle = InstructionHelper.ldcDynamicConstant(L, "_", MethodType.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    69
                                                      ConstantBootstraps.class, "nullConstant", lookupMT(Object.class),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    70
                                                      S -> {});
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    71
        assertNull(handle.invoke());
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    72
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    73
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    74
    @Test(expectedExceptions = IllegalArgumentException.class)
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    75
    public void testNullConstantPrimitiveClass() {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    76
        ConstantBootstraps.nullConstant(MethodHandles.lookup(), null, int.class);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    77
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    78
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    79
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    80
    public void testPrimitiveClass() throws Throwable {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    81
        var pm = Map.of(
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    82
                "I", int.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    83
                "J", long.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    84
                "S", short.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    85
                "B", byte.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    86
                "C", char.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    87
                "F", float.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    88
                "D", double.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    89
                "Z", boolean.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    90
                "V", void.class
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    91
        );
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    92
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    93
        for (var desc : pm.keySet()) {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    94
            var handle = InstructionHelper.ldcDynamicConstant(L, desc, Class.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    95
                                                              ConstantBootstraps.class, "primitiveClass", lookupMT(Class.class),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    96
                                                              S -> {});
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    97
            assertEquals(handle.invoke(), pm.get(desc));
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    98
        }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
    99
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   100
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   101
    @Test(expectedExceptions = NullPointerException.class)
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   102
    public void testPrimitiveClassNullName() {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   103
        ConstantBootstraps.primitiveClass(MethodHandles.lookup(), null, Class.class);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   104
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   105
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   106
    @Test(expectedExceptions = NullPointerException.class)
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   107
    public void testPrimitiveClassNullType() {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   108
        ConstantBootstraps.primitiveClass(MethodHandles.lookup(), "I", null);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   109
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   110
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   111
    @Test(expectedExceptions = IllegalArgumentException.class)
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   112
    public void testPrimitiveClassEmptyName() {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   113
        ConstantBootstraps.primitiveClass(MethodHandles.lookup(), "", Class.class);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   114
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   115
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   116
    @Test(expectedExceptions = IllegalArgumentException.class)
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   117
    public void testPrimitiveClassWrongNameChar() {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   118
        ConstantBootstraps.primitiveClass(MethodHandles.lookup(), "L", Class.class);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   119
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   120
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   121
    @Test(expectedExceptions = IllegalArgumentException.class)
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   122
    public void testPrimitiveClassWrongNameString() {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   123
        ConstantBootstraps.primitiveClass(MethodHandles.lookup(), "Ljava/lang/Object;", Class.class);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   124
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   125
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   126
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   127
    public void testEnumConstant() throws Throwable {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   128
        for (var v : StackWalker.Option.values()) {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   129
            var handle = InstructionHelper.ldcDynamicConstant(L, v.name(), StackWalker.Option.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   130
                                                              ConstantBootstraps.class, "enumConstant", lookupMT(Enum.class),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   131
                                                              S -> { });
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   132
            assertEquals(handle.invoke(), v);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   133
        }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   134
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   135
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   136
    @Test(expectedExceptions = IllegalArgumentException.class)
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   137
    public void testEnumConstantUnknown() {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   138
        ConstantBootstraps.enumConstant(MethodHandles.lookup(), "DOES_NOT_EXIST", StackWalker.Option.class);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   139
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   140
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   141
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   142
    public void testGetStaticDecl() throws Throwable {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   143
        var handle = InstructionHelper.ldcDynamicConstant(L, "TYPE", Class.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   144
                                                          ConstantBootstraps.class, "getStaticFinal", lookupMT(Object.class, Class.class),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   145
                                                          S -> { S.add("java/lang/Integer", PoolHelper::putClass); });
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   146
        assertEquals(handle.invoke(), int.class);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   147
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   148
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   149
    public void testGetStaticSelf() throws Throwable {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   150
        var handle = InstructionHelper.ldcDynamicConstant(L, "MAX_VALUE", int.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   151
                                                          ConstantBootstraps.class, "getStaticFinal", lookupMT(Object.class),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   152
                                                          S -> { });
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   153
        assertEquals(handle.invoke(), Integer.MAX_VALUE);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   154
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   155
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   156
        handle = InstructionHelper.ldcDynamicConstant(L, "ZERO", BigInteger.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   157
                                                      ConstantBootstraps.class, "getStaticFinal", lookupMT(Object.class),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   158
                                                      S -> { });
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   159
        assertEquals(handle.invoke(), BigInteger.ZERO);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   160
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   161
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   162
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   163
    public void testInvoke() throws Throwable {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   164
        var handle = InstructionHelper.ldcDynamicConstant(
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   165
                L, "_", List.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   166
                ConstantBootstraps.class, "invoke", lookupMT(Object.class, MethodHandle.class, Object[].class),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   167
                S -> {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   168
                    S.add("", (P, Z) -> {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   169
                        return P.putHandle(MethodHandleInfo.REF_invokeStatic, "java/util/List", "of",
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   170
                                           MethodType.methodType(List.class, Object[].class).toMethodDescriptorString(),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   171
                                           true);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   172
                    });
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   173
                    S.add(1).add(2).add(3).add(4);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   174
                });
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   175
        assertEquals(handle.invoke(), List.of(1, 2, 3, 4));
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   176
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   177
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   178
    public void testInvokeAsType() throws Throwable {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   179
        var handle = InstructionHelper.ldcDynamicConstant(
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   180
                L, "_", int.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   181
                ConstantBootstraps.class, "invoke", lookupMT(Object.class, MethodHandle.class, Object[].class),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   182
                S -> {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   183
                    S.add("", (P, Z) -> {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   184
                        return P.putHandle(MethodHandleInfo.REF_invokeStatic, "java/lang/Integer", "valueOf",
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   185
                                           MethodType.methodType(Integer.class, String.class).toMethodDescriptorString(),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   186
                                           false);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   187
                    });
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   188
                    S.add("42");
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   189
                });
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   190
        assertEquals(handle.invoke(), 42);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   191
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   192
48834
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   193
    public void testInvokeAsTypeVariableArity() throws Throwable {
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   194
        // The constant type is Collection but the invoke return type is List
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   195
        var handle = InstructionHelper.ldcDynamicConstant(
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   196
                L, "_", Collection.class,
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   197
                ConstantBootstraps.class, "invoke", lookupMT(Object.class, MethodHandle.class, Object[].class),
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   198
                S -> {
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   199
                    S.add("", (P, Z) -> {
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   200
                        return P.putHandle(MethodHandleInfo.REF_invokeStatic, "java/util/List", "of",
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   201
                                           MethodType.methodType(List.class, Object[].class).toMethodDescriptorString(),
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   202
                                           true);
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   203
                    });
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   204
                    S.add(1).add(2).add(3).add(4);
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   205
                });
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   206
        assertEquals(handle.invoke(), List.of(1, 2, 3, 4));
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   207
    }
19ef3f64bc10 8195694: ConstantBootstraps.invoke does not preserve variable arity
psandoz
parents: 48827
diff changeset
   208
48827
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   209
    @Test(expectedExceptions = ClassCastException.class)
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   210
    public void testInvokeAsTypeClassCast() throws Throwable {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   211
        ConstantBootstraps.invoke(MethodHandles.lookup(), "_", String.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   212
                                  MethodHandles.lookup().findStatic(Integer.class, "valueOf", MethodType.methodType(Integer.class, String.class)),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   213
                                  "42");
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   214
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   215
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   216
    @Test(expectedExceptions = WrongMethodTypeException.class)
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   217
    public void testInvokeAsTypeWrongReturnType() throws Throwable {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   218
        ConstantBootstraps.invoke(MethodHandles.lookup(), "_", short.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   219
                                  MethodHandles.lookup().findStatic(Integer.class, "parseInt", MethodType.methodType(int.class, String.class)),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   220
                                  "42");
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   221
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   222
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   223
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   224
    static class X {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   225
        public String f;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   226
        public static String sf;
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   227
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   228
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   229
    public void testVarHandleField() throws Throwable {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   230
        var handle = InstructionHelper.ldcDynamicConstant(
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   231
                L, "f", VarHandle.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   232
                ConstantBootstraps.class, "fieldVarHandle", lookupMT(VarHandle.class, Class.class, Class.class),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   233
                S -> {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   234
                    S.add(X.class.getName().replace('.', '/'), PoolHelper::putClass).
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   235
                            add("java/lang/String", PoolHelper::putClass);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   236
                });
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   237
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   238
        var vhandle = (VarHandle) handle.invoke();
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   239
        assertEquals(vhandle.varType(), String.class);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   240
        assertEquals(vhandle.coordinateTypes(), List.of(X.class));
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   241
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   242
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   243
    public void testVarHandleStaticField() throws Throwable {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   244
        var handle = InstructionHelper.ldcDynamicConstant(
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   245
                L, "sf", VarHandle.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   246
                ConstantBootstraps.class, "staticFieldVarHandle", lookupMT(VarHandle.class, Class.class, Class.class),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   247
                S -> {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   248
                    S.add(X.class.getName().replace('.', '/'), PoolHelper::putClass).
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   249
                            add("java/lang/String", PoolHelper::putClass);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   250
                });
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   251
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   252
        var vhandle = (VarHandle) handle.invoke();
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   253
        assertEquals(vhandle.varType(), String.class);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   254
        assertEquals(vhandle.coordinateTypes(), List.of());
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   255
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   256
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   257
    public void testVarHandleArray() throws Throwable {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   258
        var handle = InstructionHelper.ldcDynamicConstant(
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   259
                L, "_", VarHandle.class,
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   260
                ConstantBootstraps.class, "arrayVarHandle", lookupMT(VarHandle.class, Class.class),
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   261
                S -> {
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   262
                    S.add(String[].class.getName().replace('.', '/'), PoolHelper::putClass);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   263
                });
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   264
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   265
        var vhandle = (VarHandle) handle.invoke();
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   266
        assertEquals(vhandle.varType(), String.class);
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   267
        assertEquals(vhandle.coordinateTypes(), List.of(String[].class, int.class));
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   268
    }
8772acd913e5 8187742: Minimal set of bootstrap methods for constant dynamic
psandoz
parents:
diff changeset
   269
}