src/java.base/share/classes/java/lang/invoke/BootstrapMethodInvoker.java
author redestad
Thu, 22 Feb 2018 11:16:43 +0100
changeset 48930 b1a5b4ad7427
parent 48921 576e024f10b6
child 50305 02934b0d661b
permissions -rw-r--r--
8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks Reviewed-by: psandoz
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
     1
/*
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
     2
 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
     4
 *
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    10
 *
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    15
 * accompanied this code).
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    16
 *
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    20
 *
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    23
 * questions.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    24
 */
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    25
package java.lang.invoke;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    26
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    27
import sun.invoke.util.Wrapper;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    28
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    29
import java.lang.invoke.AbstractConstantGroup.BSCIWithCache;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    30
import java.util.Arrays;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    31
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    32
import static java.lang.invoke.BootstrapCallInfo.makeBootstrapCallInfo;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    33
import static java.lang.invoke.ConstantGroup.makeConstantGroup;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    34
import static java.lang.invoke.MethodHandleNatives.*;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    35
import static java.lang.invoke.MethodHandleStatics.TRACE_METHOD_LINKAGE;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    36
import static java.lang.invoke.MethodHandles.Lookup;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    37
import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    38
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    39
final class BootstrapMethodInvoker {
48930
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    40
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    41
    /**
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    42
     * Factored code for invoking a bootstrap method for invokedynamic
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    43
     * or a dynamic constant.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    44
     * @param resultType the expected return type (either CallSite or a constant type)
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    45
     * @param bootstrapMethod the BSM to call
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    46
     * @param name the method name or constant name
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    47
     * @param type the method type or constant type
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    48
     * @param info information passed up from the JVM, to derive static arguments
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    49
     * @param callerClass the class containing the resolved method call or constant load
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    50
     * @param <T> the expected return type
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    51
     * @return the expected value, either a CallSite or a constant value
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    52
     */
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    53
    static <T> T invoke(Class<T> resultType,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    54
                        MethodHandle bootstrapMethod,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    55
                        // Callee information:
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    56
                        String name, Object type,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    57
                        // Extra arguments for BSM, if any:
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    58
                        Object info,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    59
                        // Caller information:
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    60
                        Class<?> callerClass) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    61
        MethodHandles.Lookup caller = IMPL_LOOKUP.in(callerClass);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    62
        Object result;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    63
        boolean pullMode = isPullModeBSM(bootstrapMethod);  // default value is false
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    64
        boolean vmIsPushing = !staticArgumentsPulled(info); // default value is true
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    65
        MethodHandle pullModeBSM;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    66
        // match the VM with the BSM
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    67
        if (vmIsPushing) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    68
            // VM is pushing arguments at us
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    69
            pullModeBSM = null;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    70
            if (pullMode) {
48895
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
    71
                bootstrapMethod = pushMePullYou(bootstrapMethod, true);
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    72
            }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    73
        } else {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    74
            // VM wants us to pull args from it
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    75
            pullModeBSM = pullMode ? bootstrapMethod :
48895
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
    76
                    pushMePullYou(bootstrapMethod, false);
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    77
            bootstrapMethod = null;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    78
        }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    79
        try {
48930
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    80
            // As an optimization we special case various known BSMs,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    81
            // such as LambdaMetafactory::metafactory and
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    82
            // StringConcatFactory::makeConcatWithConstants.
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    83
            //
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    84
            // By providing static type information or even invoking
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    85
            // exactly, we avoid emitting code to perform runtime
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    86
            // checking.
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    87
            info = maybeReBox(info);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    88
            if (info == null) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    89
                // VM is allowed to pass up a null meaning no BSM args
48930
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    90
                result = invoke(bootstrapMethod, caller, name, type);
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    91
            }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    92
            else if (!info.getClass().isArray()) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
    93
                // VM is allowed to pass up a single BSM arg directly
48930
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    94
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    95
                // Call to StringConcatFactory::makeConcatWithConstants
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    96
                // with empty constant arguments?
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    97
                if (isStringConcatFactoryBSM(bootstrapMethod.type())) {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    98
                    result = (CallSite)bootstrapMethod
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
    99
                            .invokeExact(caller, name, (MethodType)type,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   100
                                         (String)info, new Object[0]);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   101
                } else {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   102
                    result = invoke(bootstrapMethod, caller, name, type, info);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   103
                }
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   104
            }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   105
            else if (info.getClass() == int[].class) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   106
                // VM is allowed to pass up a pair {argc, index}
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   107
                // referring to 'argc' BSM args at some place 'index'
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   108
                // in the guts of the VM (associated with callerClass).
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   109
                // The format of this index pair is private to the
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   110
                // handshake between the VM and this class only.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   111
                // This supports "pulling" of arguments.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   112
                // The VM is allowed to do this for any reason.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   113
                // The code in this method makes up for any mismatches.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   114
                BootstrapCallInfo<Object> bsci
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   115
                    = new VM_BSCI<>(bootstrapMethod, name, type, caller, (int[])info);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   116
                // Pull-mode API is (Lookup, BootstrapCallInfo) -> Object
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   117
                result = pullModeBSM.invoke(caller, bsci);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   118
            }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   119
            else {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   120
                // VM is allowed to pass up a full array of resolved BSM args
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   121
                Object[] argv = (Object[]) info;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   122
                maybeReBoxElements(argv);
48930
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   123
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   124
                MethodType bsmType = bootstrapMethod.type();
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   125
                if (isLambdaMetafactoryIndyBSM(bsmType) && argv.length == 3) {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   126
                    result = (CallSite)bootstrapMethod
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   127
                            .invokeExact(caller, name, (MethodType)type, (MethodType)argv[0],
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   128
                                    (MethodHandle)argv[1], (MethodType)argv[2]);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   129
                } else if (isLambdaMetafactoryCondyBSM(bsmType) && argv.length == 3) {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   130
                    result = bootstrapMethod
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   131
                            .invokeExact(caller, name, (Class<?>)type, (MethodType)argv[0],
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   132
                                    (MethodHandle)argv[1], (MethodType)argv[2]);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   133
                } else if (isStringConcatFactoryBSM(bsmType) && argv.length >= 1) {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   134
                    String recipe = (String)argv[0];
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   135
                    Object[] shiftedArgs = Arrays.copyOfRange(argv, 1, argv.length);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   136
                    result = (CallSite)bootstrapMethod.invokeExact(caller, name, (MethodType)type, recipe, shiftedArgs);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   137
                } else {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   138
                    switch (argv.length) {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   139
                        case 0:
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   140
                            result = invoke(bootstrapMethod, caller, name, type);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   141
                            break;
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   142
                        case 1:
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   143
                            result = invoke(bootstrapMethod, caller, name, type,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   144
                                            argv[0]);
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   145
                            break;
48930
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   146
                        case 2:
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   147
                            result = invoke(bootstrapMethod, caller, name, type,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   148
                                            argv[0], argv[1]);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   149
                            break;
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   150
                        case 3:
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   151
                            result = invoke(bootstrapMethod, caller, name, type,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   152
                                            argv[0], argv[1], argv[2]);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   153
                            break;
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   154
                        case 4:
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   155
                            result = invoke(bootstrapMethod, caller, name, type,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   156
                                            argv[0], argv[1], argv[2], argv[3]);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   157
                            break;
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   158
                        case 5:
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   159
                            result = invoke(bootstrapMethod, caller, name, type,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   160
                                            argv[0], argv[1], argv[2], argv[3], argv[4]);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   161
                            break;
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   162
                        case 6:
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   163
                            result = invoke(bootstrapMethod, caller, name, type,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   164
                                            argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   165
                            break;
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   166
                        default:
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   167
                            result = invokeWithManyArguments(bootstrapMethod, caller, name, type, argv);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   168
                    }
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   169
                }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   170
            }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   171
            if (resultType.isPrimitive()) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   172
                // Non-reference conversions are more than just plain casts.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   173
                // By pushing the value through a funnel of the form (T x)->x,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   174
                // the boxed result can be widened as needed.  See MH::asType.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   175
                MethodHandle funnel = MethodHandles.identity(resultType);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   176
                result = funnel.invoke(result);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   177
                // Now it is the wrapper type for resultType.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   178
                resultType = Wrapper.asWrapperType(resultType);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   179
            }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   180
            return resultType.cast(result);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   181
        }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   182
        catch (Error e) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   183
            // Pass through an Error, including BootstrapMethodError, any other
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   184
            // form of linkage error, such as IllegalAccessError if the bootstrap
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   185
            // method is inaccessible, or say ThreadDeath/OutOfMemoryError
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   186
            // See the "Linking Exceptions" section for the invokedynamic
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   187
            // instruction in JVMS 6.5.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   188
            throw e;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   189
        }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   190
        catch (Throwable ex) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   191
            // Wrap anything else in BootstrapMethodError
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   192
            throw new BootstrapMethodError("bootstrap method initialization exception", ex);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   193
        }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   194
    }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   195
48930
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   196
    // If we don't provide static type information for type, we'll generate runtime
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   197
    // checks. Let's try not to...
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   198
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   199
    private static Object invoke(MethodHandle bootstrapMethod, Lookup caller,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   200
                                 String name, Object type) throws Throwable {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   201
        if (type instanceof Class) {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   202
            return bootstrapMethod.invoke(caller, name, (Class<?>)type);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   203
        } else {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   204
            return bootstrapMethod.invoke(caller, name, (MethodType)type);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   205
        }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   206
    }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   207
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   208
    private static Object invoke(MethodHandle bootstrapMethod, Lookup caller,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   209
                                 String name, Object type, Object arg0) throws Throwable {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   210
        if (type instanceof Class) {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   211
            return bootstrapMethod.invoke(caller, name, (Class<?>)type, arg0);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   212
        } else {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   213
            return bootstrapMethod.invoke(caller, name, (MethodType)type, arg0);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   214
        }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   215
    }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   216
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   217
    private static Object invoke(MethodHandle bootstrapMethod, Lookup caller, String name,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   218
                                 Object type, Object arg0, Object arg1) throws Throwable {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   219
        if (type instanceof Class) {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   220
            return bootstrapMethod.invoke(caller, name, (Class<?>)type, arg0, arg1);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   221
        } else {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   222
            return bootstrapMethod.invoke(caller, name, (MethodType)type, arg0, arg1);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   223
        }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   224
    }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   225
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   226
    private static Object invoke(MethodHandle bootstrapMethod, Lookup caller, String name,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   227
                                 Object type, Object arg0, Object arg1,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   228
                                 Object arg2) throws Throwable {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   229
        if (type instanceof Class) {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   230
            return bootstrapMethod.invoke(caller, name, (Class<?>)type, arg0, arg1, arg2);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   231
        } else {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   232
            return bootstrapMethod.invoke(caller, name, (MethodType)type, arg0, arg1, arg2);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   233
        }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   234
    }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   235
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   236
    private static Object invoke(MethodHandle bootstrapMethod, Lookup caller, String name,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   237
                                 Object type, Object arg0, Object arg1,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   238
                                 Object arg2, Object arg3) throws Throwable {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   239
        if (type instanceof Class) {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   240
            return bootstrapMethod.invoke(caller, name, (Class<?>)type, arg0, arg1, arg2, arg3);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   241
        } else {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   242
            return bootstrapMethod.invoke(caller, name, (MethodType)type, arg0, arg1, arg2, arg3);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   243
        }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   244
    }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   245
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   246
    private static Object invoke(MethodHandle bootstrapMethod, Lookup caller,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   247
                                 String name, Object type, Object arg0, Object arg1,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   248
                                 Object arg2, Object arg3, Object arg4) throws Throwable {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   249
        if (type instanceof Class) {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   250
            return bootstrapMethod.invoke(caller, name, (Class<?>)type, arg0, arg1, arg2, arg3, arg4);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   251
        } else {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   252
            return bootstrapMethod.invoke(caller, name, (MethodType)type, arg0, arg1, arg2, arg3, arg4);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   253
        }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   254
    }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   255
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   256
    private static Object invoke(MethodHandle bootstrapMethod, Lookup caller,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   257
                                 String name, Object type, Object arg0, Object arg1,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   258
                                 Object arg2, Object arg3, Object arg4, Object arg5) throws Throwable {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   259
        if (type instanceof Class) {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   260
            return bootstrapMethod.invoke(caller, name, (Class<?>)type, arg0, arg1, arg2, arg3, arg4, arg5);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   261
        } else {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   262
            return bootstrapMethod.invoke(caller, name, (MethodType)type, arg0, arg1, arg2, arg3, arg4, arg5);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   263
        }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   264
    }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   265
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   266
    private static Object invokeWithManyArguments(MethodHandle bootstrapMethod, Lookup caller,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   267
                                                  String name, Object type, Object[] argv) throws Throwable {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   268
        final int NON_SPREAD_ARG_COUNT = 3;  // (caller, name, type)
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   269
        final int MAX_SAFE_SIZE = MethodType.MAX_MH_ARITY / 2 - NON_SPREAD_ARG_COUNT;
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   270
        if (argv.length >= MAX_SAFE_SIZE) {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   271
            // to be on the safe side, use invokeWithArguments which handles jumbo lists
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   272
            Object[] newargv = new Object[NON_SPREAD_ARG_COUNT + argv.length];
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   273
            newargv[0] = caller;
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   274
            newargv[1] = name;
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   275
            newargv[2] = type;
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   276
            System.arraycopy(argv, 0, newargv, NON_SPREAD_ARG_COUNT, argv.length);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   277
            return bootstrapMethod.invokeWithArguments(newargv);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   278
        } else {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   279
            MethodType invocationType = MethodType.genericMethodType(NON_SPREAD_ARG_COUNT + argv.length);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   280
            MethodHandle typedBSM = bootstrapMethod.asType(invocationType);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   281
            MethodHandle spreader = invocationType.invokers().spreadInvoker(NON_SPREAD_ARG_COUNT);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   282
            return spreader.invokeExact(typedBSM, (Object) caller, (Object) name, type, argv);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   283
        }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   284
    }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   285
48921
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   286
    private static final MethodType LMF_INDY_MT = MethodType.methodType(CallSite.class,
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   287
            Lookup.class, String.class, MethodType.class, MethodType.class, MethodHandle.class, MethodType.class);
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   288
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   289
    private static final MethodType LMF_CONDY_MT = MethodType.methodType(Object.class,
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   290
            Lookup.class, String.class, Class.class, MethodType.class, MethodHandle.class, MethodType.class);
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   291
48930
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   292
    private static final MethodType SCF_MT = MethodType.methodType(CallSite.class,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   293
            Lookup.class, String.class, MethodType.class, String.class, Object[].class);
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   294
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   295
    /**
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   296
     * @return true iff the BSM method type exactly matches
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   297
     *         {@see java.lang.invoke.StringConcatFactory#makeConcatWithConstants(MethodHandles.Lookup,
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   298
     *                 String,MethodType,String,Object...))}
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   299
     */
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   300
    private static boolean isStringConcatFactoryBSM(MethodType bsmType) {
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   301
        return bsmType == SCF_MT;
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   302
    }
b1a5b4ad7427 8198523: Refactor BootstrapMethodInvoker to further avoid runtime type checks
redestad
parents: 48921
diff changeset
   303
48921
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   304
    /**
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   305
     * @return true iff the BSM method type exactly matches
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   306
     *         {@see java.lang.invoke.LambdaMetafactory#metafactory(
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   307
     *          MethodHandles.Lookup,String,Class,MethodType,MethodHandle,MethodType)}
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   308
     */
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   309
    private static boolean isLambdaMetafactoryCondyBSM(MethodType bsmType) {
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   310
        return bsmType == LMF_CONDY_MT;
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   311
    }
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   312
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   313
    /**
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   314
     * @return true iff the BSM method type exactly matches
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   315
     *         {@see java.lang.invoke.LambdaMetafactory#metafactory(
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   316
     *          MethodHandles.Lookup,String,MethodType,MethodType,MethodHandle,MethodType)}
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   317
     */
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   318
    private static boolean isLambdaMetafactoryIndyBSM(MethodType bsmType) {
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   319
        return bsmType == LMF_INDY_MT;
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   320
    }
576e024f10b6 8198418: Invoke LambdaMetafactory::metafactory exactly from the BootstrapMethodInvoker
redestad
parents: 48895
diff changeset
   321
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   322
    /** The JVM produces java.lang.Integer values to box
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   323
     *  CONSTANT_Integer boxes but does not intern them.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   324
     *  Let's intern them.  This is slightly wrong for
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   325
     *  a {@code CONSTANT_Dynamic} which produces an
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   326
     *  un-interned integer (e.g., {@code new Integer(0)}).
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   327
     */
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   328
    private static Object maybeReBox(Object x) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   329
        if (x instanceof Integer) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   330
            int xi = (int) x;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   331
            if (xi == (byte) xi)
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   332
                x = xi;  // must rebox; see JLS 5.1.7
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   333
        }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   334
        return x;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   335
    }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   336
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   337
    private static void maybeReBoxElements(Object[] xa) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   338
        for (int i = 0; i < xa.length; i++) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   339
            xa[i] = maybeReBox(xa[i]);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   340
        }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   341
    }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   342
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   343
    /** Canonical VM-aware implementation of BootstrapCallInfo.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   344
     * Knows how to dig into the JVM for lazily resolved (pull-mode) constants.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   345
     */
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   346
    private static final class VM_BSCI<T> extends BSCIWithCache<T> {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   347
        private final int[] indexInfo;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   348
        private final Class<?> caller;  // for index resolution only
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   349
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   350
        VM_BSCI(MethodHandle bsm, String name, T type,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   351
                Lookup lookup, int[] indexInfo) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   352
            super(bsm, name, type, indexInfo[0]);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   353
            if (!lookup.hasPrivateAccess())  //D.I.D.
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   354
                throw new AssertionError("bad Lookup object");
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   355
            this.caller = lookup.lookupClass();
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   356
            this.indexInfo = indexInfo;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   357
            // scoop up all the easy stuff right away:
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   358
            prefetchIntoCache(0, size());
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   359
        }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   360
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   361
        @Override Object fillCache(int i) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   362
            Object[] buf = { null };
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   363
            copyConstants(i, i+1, buf, 0);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   364
            Object res = wrapNull(buf[0]);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   365
            cache[i] = res;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   366
            int next = i + 1;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   367
            if (next < cache.length && cache[next] == null)
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   368
                maybePrefetchIntoCache(next, false);  // try to prefetch
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   369
            return res;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   370
        }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   371
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   372
        @Override public int copyConstants(int start, int end,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   373
                                           Object[] buf, int pos) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   374
            int i = start, bufi = pos;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   375
            while (i < end) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   376
                Object x = cache[i];
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   377
                if (x == null)  break;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   378
                buf[bufi++] = unwrapNull(x);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   379
                i++;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   380
            }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   381
            // give up at first null and grab the rest in one big block
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   382
            if (i >= end)  return i;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   383
            Object[] temp = new Object[end - i];
48895
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   384
            if (TRACE_METHOD_LINKAGE) {
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   385
                System.out.println("resolving more BSM arguments: " +
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   386
                        Arrays.asList(caller.getSimpleName(), Arrays.toString(indexInfo), i, end));
48895
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   387
            }
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   388
            copyOutBootstrapArguments(caller, indexInfo,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   389
                                      i, end, temp, 0,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   390
                                      true, null);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   391
            for (Object x : temp) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   392
                x = maybeReBox(x);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   393
                buf[bufi++] = x;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   394
                cache[i++] = wrapNull(x);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   395
            }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   396
            if (end < cache.length && cache[end] == null)
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   397
                maybePrefetchIntoCache(end, true);  // try to prefetch
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   398
            return i;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   399
        }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   400
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   401
        private static final int MIN_PF = 4;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   402
        private void maybePrefetchIntoCache(int i, boolean bulk) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   403
            int len = cache.length;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   404
            assert(0 <= i && i <= len);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   405
            int pfLimit = i;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   406
            if (bulk)  pfLimit += i;  // exponential prefetch expansion
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   407
            // try to prefetch at least MIN_PF elements
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   408
            if (pfLimit < i + MIN_PF)  pfLimit = i + MIN_PF;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   409
            if (pfLimit > len || pfLimit < 0)  pfLimit = len;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   410
            // stop prefetching where cache is more full than empty
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   411
            int empty = 0, nonEmpty = 0, lastEmpty = i;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   412
            for (int j = i; j < pfLimit; j++) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   413
                if (cache[j] == null) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   414
                    empty++;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   415
                    lastEmpty = j;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   416
                } else {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   417
                    nonEmpty++;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   418
                    if (nonEmpty > empty) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   419
                        pfLimit = lastEmpty + 1;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   420
                        break;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   421
                    }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   422
                    if (pfLimit < len)  pfLimit++;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   423
                }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   424
            }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   425
            if (bulk && empty < MIN_PF && pfLimit < len)
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   426
                return;  // not worth the effort
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   427
            prefetchIntoCache(i, pfLimit);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   428
        }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   429
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   430
        private void prefetchIntoCache(int i, int pfLimit) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   431
            if (pfLimit <= i)  return;  // corner case
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   432
            Object[] temp = new Object[pfLimit - i];
48895
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   433
            if (TRACE_METHOD_LINKAGE) {
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   434
                System.out.println("prefetching BSM arguments: " +
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   435
                        Arrays.asList(caller.getSimpleName(), Arrays.toString(indexInfo), i, pfLimit));
48895
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   436
            }
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   437
            copyOutBootstrapArguments(caller, indexInfo,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   438
                                      i, pfLimit, temp, 0,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   439
                                      false, NOT_PRESENT);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   440
            for (Object x : temp) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   441
                if (x != NOT_PRESENT && cache[i] == null) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   442
                    cache[i] = wrapNull(maybeReBox(x));
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   443
                }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   444
                i++;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   445
            }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   446
        }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   447
    }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   448
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   449
    /*non-public*/ static final
48895
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   450
    class PushAdapter {
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   451
        // skeleton for push-mode BSM which wraps a pull-mode BSM:
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   452
        static Object pushToBootstrapMethod(MethodHandle pullModeBSM,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   453
                                            MethodHandles.Lookup lookup, String name, Object type,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   454
                                            Object... arguments) throws Throwable {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   455
            ConstantGroup cons = makeConstantGroup(Arrays.asList(arguments));
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   456
            BootstrapCallInfo<?> bsci = makeBootstrapCallInfo(pullModeBSM, name, type, cons);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   457
            if (TRACE_METHOD_LINKAGE)
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   458
                System.out.println("pull-mode BSM gets pushed arguments from fake BSCI");
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   459
            return pullModeBSM.invoke(lookup, bsci);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   460
        }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   461
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   462
        static final MethodHandle MH_pushToBootstrapMethod;
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   463
        static {
48895
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   464
            final Class<?> THIS_CLASS = PushAdapter.class;
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   465
            try {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   466
                MH_pushToBootstrapMethod = IMPL_LOOKUP
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   467
                    .findStatic(THIS_CLASS, "pushToBootstrapMethod",
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   468
                                MethodType.methodType(Object.class, MethodHandle.class,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   469
                                        Lookup.class, String.class, Object.class, Object[].class));
48895
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   470
            } catch (Throwable ex) {
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   471
                throw new InternalError(ex);
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   472
            }
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   473
        }
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   474
    }
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   475
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   476
    /*non-public*/ static final
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   477
    class PullAdapter {
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   478
        // skeleton for pull-mode BSM which wraps a push-mode BSM:
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   479
        static Object pullFromBootstrapMethod(MethodHandle pushModeBSM,
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   480
                                              MethodHandles.Lookup lookup,
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   481
                                              BootstrapCallInfo<?> bsci)
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   482
                throws Throwable {
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   483
            int argc = bsci.size();
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   484
            switch (argc) {
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   485
                case 0:
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   486
                    return pushModeBSM.invoke(lookup, bsci.invocationName(), bsci.invocationType());
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   487
                case 1:
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   488
                    return pushModeBSM.invoke(lookup, bsci.invocationName(), bsci.invocationType(),
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   489
                            bsci.get(0));
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   490
                case 2:
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   491
                    return pushModeBSM.invoke(lookup, bsci.invocationName(), bsci.invocationType(),
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   492
                            bsci.get(0), bsci.get(1));
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   493
                case 3:
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   494
                    return pushModeBSM.invoke(lookup, bsci.invocationName(), bsci.invocationType(),
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   495
                            bsci.get(0), bsci.get(1), bsci.get(2));
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   496
                case 4:
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   497
                    return pushModeBSM.invoke(lookup, bsci.invocationName(), bsci.invocationType(),
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   498
                            bsci.get(0), bsci.get(1), bsci.get(2), bsci.get(3));
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   499
                case 5:
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   500
                    return pushModeBSM.invoke(lookup, bsci.invocationName(), bsci.invocationType(),
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   501
                            bsci.get(0), bsci.get(1), bsci.get(2), bsci.get(3), bsci.get(4));
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   502
                case 6:
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   503
                    return pushModeBSM.invoke(lookup, bsci.invocationName(), bsci.invocationType(),
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   504
                            bsci.get(0), bsci.get(1), bsci.get(2), bsci.get(3), bsci.get(4), bsci.get(5));
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   505
                default:
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   506
                    final int NON_SPREAD_ARG_COUNT = 3;  // (lookup, name, type)
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   507
                    final int MAX_SAFE_SIZE = MethodType.MAX_MH_ARITY / 2 - NON_SPREAD_ARG_COUNT;
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   508
                    if (argc >= MAX_SAFE_SIZE) {
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   509
                        // to be on the safe side, use invokeWithArguments which handles jumbo lists
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   510
                        Object[] newargv = new Object[NON_SPREAD_ARG_COUNT + argc];
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   511
                        newargv[0] = lookup;
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   512
                        newargv[1] = bsci.invocationName();
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   513
                        newargv[2] = bsci.invocationType();
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   514
                        bsci.copyConstants(0, argc, newargv, NON_SPREAD_ARG_COUNT);
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   515
                        return pushModeBSM.invokeWithArguments(newargv);
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   516
                    }
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   517
                    MethodType invocationType = MethodType.genericMethodType(NON_SPREAD_ARG_COUNT + argc);
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   518
                    MethodHandle typedBSM = pushModeBSM.asType(invocationType);
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   519
                    MethodHandle spreader = invocationType.invokers().spreadInvoker(NON_SPREAD_ARG_COUNT);
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   520
                    Object[] argv = new Object[argc];
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   521
                    bsci.copyConstants(0, argc, argv, 0);
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   522
                    return spreader.invokeExact(typedBSM, (Object) lookup, (Object) bsci.invocationName(), bsci.invocationType(), argv);
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   523
                }
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   524
        }
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   525
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   526
        static final MethodHandle MH_pullFromBootstrapMethod;
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   527
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   528
        static {
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   529
            final Class<?> THIS_CLASS = PullAdapter.class;
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   530
            try {
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   531
                MH_pullFromBootstrapMethod = IMPL_LOOKUP
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   532
                    .findStatic(THIS_CLASS, "pullFromBootstrapMethod",
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   533
                                MethodType.methodType(Object.class, MethodHandle.class,
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   534
                                        Lookup.class, BootstrapCallInfo.class));
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   535
            } catch (Throwable ex) {
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   536
                throw new InternalError(ex);
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   537
            }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   538
        }
48895
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   539
    }
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   540
48895
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   541
    /** Given a push-mode BSM (taking one argument) convert it to a
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   542
     *  pull-mode BSM (taking N pre-resolved arguments).
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   543
     *  This method is used when, in fact, the JVM is passing up
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   544
     *  pre-resolved arguments, but the BSM is expecting lazy stuff.
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   545
     *  Or, when goToPushMode is true, do the reverse transform.
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   546
     *  (The two transforms are exactly inverse.)
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   547
     */
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   548
    static MethodHandle pushMePullYou(MethodHandle bsm, boolean goToPushMode) {
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   549
        if (TRACE_METHOD_LINKAGE) {
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   550
            System.out.println("converting BSM of type " + bsm.type() + " to "
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   551
                    + (goToPushMode ? "push mode" : "pull mode"));
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   552
        }
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   553
        assert(isPullModeBSM(bsm) == goToPushMode); // there must be a change
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   554
        if (goToPushMode) {
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   555
            return PushAdapter.MH_pushToBootstrapMethod.bindTo(bsm).withVarargs(true);
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   556
        } else {
7a1916641c0c 8195850: Improve startup of code to pull arguments from BootstrapMethodInvoker
redestad
parents: 48826
diff changeset
   557
            return PullAdapter.MH_pullFromBootstrapMethod.bindTo(bsm).withVarargs(false);
48826
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   558
        }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   559
    }
c4d9d1b08e2e 8186209: Tool support for ConstantDynamic
psandoz
parents:
diff changeset
   560
}