jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java
author redestad
Fri, 19 Aug 2016 13:50:03 +0200
changeset 40419 20e2e4b25a40
parent 40408 cf7e826d4d63
child 40543 629f1f599595
permissions -rw-r--r--
8164451: Generate all zero and identity forms at link time Reviewed-by: shade, mhaupt, vlivanov
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     1
/*
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     2
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     4
 *
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    10
 *
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    15
 * accompanied this code).
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    16
 *
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    20
 *
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    23
 * questions.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    24
 */
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    25
package jdk.tools.jlink.internal.plugins;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    26
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    27
import java.lang.invoke.MethodType;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    28
import java.util.Arrays;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    29
import java.util.EnumSet;
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    30
import java.util.HashMap;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    31
import java.util.List;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    32
import java.util.Map;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    33
import java.util.Set;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    34
import java.util.stream.Collectors;
40258
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
    35
import jdk.internal.misc.SharedSecrets;
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
    36
import jdk.internal.misc.JavaLangInvokeAccess;
39834
53a6fb443c20 8162538: plugin API should avoid read only pool, have module view separated from resource view and have pool builder to modify
sundar
parents: 39321
diff changeset
    37
import jdk.tools.jlink.plugin.ResourcePoolEntry;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    38
import jdk.tools.jlink.plugin.PluginException;
39834
53a6fb443c20 8162538: plugin API should avoid read only pool, have module view separated from resource view and have pool builder to modify
sundar
parents: 39321
diff changeset
    39
import jdk.tools.jlink.plugin.ResourcePool;
53a6fb443c20 8162538: plugin API should avoid read only pool, have module view separated from resource view and have pool builder to modify
sundar
parents: 39321
diff changeset
    40
import jdk.tools.jlink.plugin.ResourcePoolBuilder;
39321
c60f34e8c057 8160641: PostProcessingPlugin and ExecutableImage should not be part of plugin API
sundar
parents: 39308
diff changeset
    41
import jdk.tools.jlink.plugin.Plugin;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    42
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    43
/**
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    44
 * Plugin to generate java.lang.invoke classes.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    45
 */
39321
c60f34e8c057 8160641: PostProcessingPlugin and ExecutableImage should not be part of plugin API
sundar
parents: 39308
diff changeset
    46
public final class GenerateJLIClassesPlugin implements Plugin {
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    47
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    48
    private static final String NAME = "generate-jli-classes";
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    49
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    50
    private static final String BMH_PARAM = "bmh";
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    51
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    52
    private static final String BMH_SPECIES_PARAM = "bmh-species";
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    53
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    54
    private static final String DMH_PARAM = "dmh";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    55
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    56
    private static final String DESCRIPTION = PluginsResourceBundle.getDescription(NAME);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    57
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
    58
    private static final String DIRECT_METHOD_HANDLE = "java/lang/invoke/DirectMethodHandle$Holder";
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    59
    private static final String DMH_INVOKE_VIRTUAL = "invokeVirtual";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    60
    private static final String DMH_INVOKE_STATIC = "invokeStatic";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    61
    private static final String DMH_INVOKE_SPECIAL = "invokeSpecial";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    62
    private static final String DMH_NEW_INVOKE_SPECIAL = "newInvokeSpecial";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    63
    private static final String DMH_INVOKE_INTERFACE = "invokeInterface";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    64
    private static final String DMH_INVOKE_STATIC_INIT = "invokeStaticInit";
40258
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
    65
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
    66
    private static final String DELEGATING_METHOD_HANDLE = "java/lang/invoke/DelegatingMethodHandle$Holder";
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
    67
40419
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
    68
    private static final String BASIC_FORMS_HANDLE = "java/lang/invoke/LambdaForm$Holder";
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
    69
40258
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
    70
    private static final JavaLangInvokeAccess JLIA
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
    71
            = SharedSecrets.getJavaLangInvokeAccess();
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    72
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    73
    List<String> speciesTypes;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    74
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    75
    Map<String, List<String>> dmhMethods;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    76
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    77
    public GenerateJLIClassesPlugin() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    78
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    79
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    80
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    81
    public String getName() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    82
        return NAME;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    83
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    84
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    85
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    86
    public String getDescription() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    87
        return DESCRIPTION;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    88
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    89
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    90
    @Override
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36758
diff changeset
    91
    public Set<State> getState() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36758
diff changeset
    92
        return EnumSet.of(State.AUTO_ENABLED, State.FUNCTIONAL);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    93
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    94
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    95
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    96
    public boolean hasArguments() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    97
        return true;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    98
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    99
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   100
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   101
    public String getArgumentsDescription() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   102
       return PluginsResourceBundle.getArgument(NAME);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   103
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   104
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   105
    /**
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   106
     * @return the default Species forms to generate.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   107
     *
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   108
     * This list was derived from running a small startup benchmark.
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   109
     * A better long-term solution is to define and run a set of quick
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   110
     * generators and extracting this list as a step in the build process.
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   111
     */
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   112
    public static List<String> defaultSpecies() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   113
        return List.of("LL", "L3", "L4", "L5", "L6", "L7", "L7I",
38449
f9026e7a6321 8157449: Adjust link-time generated Species classes to match JDK-8148604 usage
redestad
parents: 38320
diff changeset
   114
                "L7II", "L7IIL", "L8", "L9", "L10", "L10I", "L10II", "L10IIL",
f9026e7a6321 8157449: Adjust link-time generated Species classes to match JDK-8148604 usage
redestad
parents: 38320
diff changeset
   115
                "L11", "L12", "L13", "LI", "D", "L3I", "LIL", "LLI", "LLIL",
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   116
                "LILL", "I", "LLILL");
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   117
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   118
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   119
    /**
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   120
     * @return the list of default DirectMethodHandle methods to generate.
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   121
     */
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   122
    public static Map<String, List<String>> defaultDMHMethods() {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   123
        return Map.of(
40212
6863c0579ecf 8163476: java/lang/StackWalker/VerifyStackTrace.java fails after JDK-8163369
redestad
parents: 40211
diff changeset
   124
            DMH_INVOKE_VIRTUAL, List.of("_L", "L_L", "LI_I", "LL_V"),
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   125
            DMH_INVOKE_SPECIAL, List.of("L_I", "L_L", "LF_L", "LD_L", "LL_L",
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   126
                "L3_L", "L4_L", "L5_L", "L6_L", "L7_L", "LI_I", "LI_L", "LIL_I",
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   127
                "LII_I", "LII_L", "LLI_L", "LLI_I", "LILI_I", "LIIL_L",
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   128
                "LIILL_L", "LIILL_I", "LIIL_I", "LILIL_I", "LILILL_I",
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   129
                "LILII_I", "LI3_I", "LI3L_I", "LI3LL_I", "LI3_L", "LI4_I"),
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   130
            DMH_INVOKE_STATIC, List.of("II_I", "IL_I", "ILIL_I", "ILII_I",
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   131
                "_I", "_L", "_V", "D_L", "F_L", "I_I", "II_L", "LI_L",
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   132
                "L_V", "L_L", "LL_L", "L3_L", "L4_L", "L5_L", "L6_L",
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   133
                "L7_L", "L8_L", "L9_L", "L9I_L", "L9II_L", "L9IIL_L",
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   134
                "L10_L", "L11_L", "L12_L", "L13_L", "L13I_L", "L13II_L")
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   135
        );
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   136
    }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   137
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   138
    // Map from DirectMethodHandle method type to internal ID
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   139
    private static final Map<String, Integer> DMH_METHOD_TYPE_MAP =
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   140
            Map.of(
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   141
                DMH_INVOKE_VIRTUAL,     0,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   142
                DMH_INVOKE_STATIC,      1,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   143
                DMH_INVOKE_SPECIAL,     2,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   144
                DMH_NEW_INVOKE_SPECIAL, 3,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   145
                DMH_INVOKE_INTERFACE,   4,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   146
                DMH_INVOKE_STATIC_INIT, 5
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   147
            );
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   148
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   149
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   150
    public void configure(Map<String, String> config) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   151
        String mainArgument = config.get(NAME);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   152
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   153
        // Enable by default
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   154
        boolean bmhEnabled = true;
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   155
        boolean dmhEnabled = true;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   156
        if (mainArgument != null) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   157
            List<String> args = Arrays.asList(mainArgument.split(","));
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   158
            if (!args.contains(BMH_PARAM)) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   159
                bmhEnabled = false;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   160
            }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   161
            if (!args.contains(DMH_PARAM)) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   162
                dmhEnabled = false;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   163
            }
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   164
        }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   165
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   166
        if (!bmhEnabled) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   167
            speciesTypes = List.of();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   168
        } else {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   169
            String args = config.get(BMH_SPECIES_PARAM);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   170
            List<String> bmhSpecies;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   171
            if (args != null && !args.isEmpty()) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   172
                bmhSpecies = Arrays.stream(args.split(","))
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   173
                    .map(String::trim)
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   174
                    .filter(s -> !s.isEmpty())
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   175
                    .collect(Collectors.toList());
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   176
            } else {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   177
                bmhSpecies = defaultSpecies();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   178
            }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   179
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   180
            // Expand BMH species signatures
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   181
            speciesTypes = bmhSpecies.stream()
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   182
                    .map(type -> expandSignature(type))
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   183
                    .collect(Collectors.toList());
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   184
        }
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   185
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   186
        // DirectMethodHandles
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   187
        if (!dmhEnabled) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   188
            dmhMethods = Map.of();
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   189
        } else {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   190
            dmhMethods = new HashMap<>();
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   191
            for (String dmhParam : DMH_METHOD_TYPE_MAP.keySet()) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   192
                String args = config.get(dmhParam);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   193
                if (args != null && !args.isEmpty()) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   194
                    List<String> dmhMethodTypes = Arrays.stream(args.split(","))
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   195
                            .map(String::trim)
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   196
                            .filter(s -> !s.isEmpty())
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   197
                            .collect(Collectors.toList());
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   198
                    dmhMethods.put(dmhParam, dmhMethodTypes);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   199
                    // Validation check
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   200
                    for (String type : dmhMethodTypes) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   201
                        String[] typeParts = type.split("_");
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   202
                        // check return type (second part)
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   203
                        if (typeParts.length != 2 || typeParts[1].length() != 1
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   204
                                || "LJIFDV".indexOf(typeParts[1].charAt(0)) == -1) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   205
                            throw new PluginException(
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   206
                                    "Method type signature must be of form [LJIFD]*_[LJIFDV]");
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   207
                        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   208
                        // expand and check arguments (first part)
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   209
                        expandSignature(typeParts[0]);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   210
                    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   211
                }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   212
            }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   213
            if (dmhMethods.isEmpty()) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   214
                dmhMethods = defaultDMHMethods();
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   215
            }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   216
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   217
    }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   218
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   219
    private static void requireBasicType(char c) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   220
        if ("LIJFD".indexOf(c) < 0) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   221
            throw new PluginException(
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   222
                    "Character " + c + " must correspond to a basic field type: LIJFD");
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   223
        }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   224
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   225
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   226
    @Override
39834
53a6fb443c20 8162538: plugin API should avoid read only pool, have module view separated from resource view and have pool builder to modify
sundar
parents: 39321
diff changeset
   227
    public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   228
        // Copy all but DMH_ENTRY to out
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   229
        in.transformAndCopy(entry -> {
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   230
                // filter out placeholder entries
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   231
                if (entry.path().equals(DIRECT_METHOD_HANDLE_ENTRY) ||
40419
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   232
                    entry.path().equals(DELEGATING_METHOD_HANDLE_ENTRY) ||
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   233
                    entry.path().equals(BASIC_FORMS_HANDLE_ENTRY)) {
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   234
                    return null;
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   235
                } else {
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   236
                    return entry;
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   237
                }
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   238
            }, out);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   239
        speciesTypes.forEach(types -> generateBMHClass(types, out));
40419
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   240
        generateHolderClasses(out);
39834
53a6fb443c20 8162538: plugin API should avoid read only pool, have module view separated from resource view and have pool builder to modify
sundar
parents: 39321
diff changeset
   241
        return out.build();
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   242
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   243
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   244
    @SuppressWarnings("unchecked")
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   245
    private void generateBMHClass(String types, ResourcePoolBuilder out) {
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   246
        try {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   247
            // Generate class
40258
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
   248
            Map.Entry<String, byte[]> result =
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
   249
                    JLIA.generateConcreteBMHClassBytes(types);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   250
            String className = result.getKey();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   251
            byte[] bytes = result.getValue();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   252
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   253
            // Add class to pool
39834
53a6fb443c20 8162538: plugin API should avoid read only pool, have module view separated from resource view and have pool builder to modify
sundar
parents: 39321
diff changeset
   254
            ResourcePoolEntry ndata = ResourcePoolEntry.create(
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   255
                    "/java.base/" + className + ".class",
39151
34455cc82f5e 8147794: Jlink's ModuleEntry.stream can't be consumed more than once and ModuleEntry content should be read only if needed
sundar
parents: 39129
diff changeset
   256
                    bytes);
39834
53a6fb443c20 8162538: plugin API should avoid read only pool, have module view separated from resource view and have pool builder to modify
sundar
parents: 39321
diff changeset
   257
            out.add(ndata);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   258
        } catch (Exception ex) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   259
            throw new PluginException(ex);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   260
        }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   261
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   262
40419
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   263
    private void generateHolderClasses(ResourcePoolBuilder out) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   264
        int count = 0;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   265
        for (List<String> entry : dmhMethods.values()) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   266
            count += entry.size();
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   267
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   268
        MethodType[] methodTypes = new MethodType[count];
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   269
        int[] dmhTypes = new int[count];
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   270
        int index = 0;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   271
        for (Map.Entry<String, List<String>> entry : dmhMethods.entrySet()) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   272
            String dmhType = entry.getKey();
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   273
            for (String type : entry.getValue()) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   274
                methodTypes[index] = asMethodType(type);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   275
                dmhTypes[index] = DMH_METHOD_TYPE_MAP.get(dmhType);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   276
                index++;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   277
            }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   278
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   279
        try {
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   280
            byte[] bytes = JLIA.generateDirectMethodHandleHolderClassBytes(
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   281
                    DIRECT_METHOD_HANDLE, methodTypes, dmhTypes);
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   282
            ResourcePoolEntry ndata = ResourcePoolEntry
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   283
                    .create(DIRECT_METHOD_HANDLE_ENTRY, bytes);
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   284
            out.add(ndata);
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   285
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   286
            bytes = JLIA.generateDelegatingMethodHandleHolderClassBytes(
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   287
                    DELEGATING_METHOD_HANDLE, methodTypes);
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   288
            ndata = ResourcePoolEntry.create(DELEGATING_METHOD_HANDLE_ENTRY, bytes);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   289
            out.add(ndata);
40419
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   290
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   291
            bytes = JLIA.generateBasicFormsClassBytes(BASIC_FORMS_HANDLE);
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   292
            ndata = ResourcePoolEntry.create(BASIC_FORMS_HANDLE_ENTRY, bytes);
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   293
            out.add(ndata);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   294
        } catch (Exception ex) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   295
            throw new PluginException(ex);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   296
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   297
    }
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   298
    private static final String DIRECT_METHOD_HANDLE_ENTRY =
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   299
            "/java.base/" + DIRECT_METHOD_HANDLE + ".class";
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   300
    private static final String DELEGATING_METHOD_HANDLE_ENTRY =
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   301
            "/java.base/" + DELEGATING_METHOD_HANDLE + ".class";
40419
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   302
    private static final String BASIC_FORMS_HANDLE_ENTRY =
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   303
            "/java.base/" + BASIC_FORMS_HANDLE + ".class";
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   304
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   305
    // Convert LL -> LL, L3 -> LLL
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   306
    private static String expandSignature(String signature) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   307
        StringBuilder sb = new StringBuilder();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   308
        char last = 'X';
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   309
        int count = 0;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   310
        for (int i = 0; i < signature.length(); i++) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   311
            char c = signature.charAt(i);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   312
            if (c >= '0' && c <= '9') {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   313
                count *= 10;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   314
                count += (c - '0');
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   315
            } else {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   316
                requireBasicType(c);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   317
                for (int j = 1; j < count; j++) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   318
                    sb.append(last);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   319
                }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   320
                sb.append(c);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   321
                last = c;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   322
                count = 0;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   323
            }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   324
        }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   325
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   326
        // ended with a number, e.g., "L2": append last char count - 1 times
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   327
        if (count > 1) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   328
            requireBasicType(last);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   329
            for (int j = 1; j < count; j++) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   330
                sb.append(last);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   331
            }
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   332
        }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   333
        return sb.toString();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   334
    }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   335
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   336
    private static MethodType asMethodType(String basicSignatureString) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   337
        String[] parts = basicSignatureString.split("_");
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   338
        assert(parts.length == 2);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   339
        assert(parts[1].length() == 1);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   340
        String parameters = expandSignature(parts[0]);
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   341
        Class<?> rtype = simpleType(parts[1].charAt(0));
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   342
        if (parameters.isEmpty()) {
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   343
            return MethodType.methodType(rtype);
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   344
        } else {
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   345
            Class<?>[] ptypes = new Class<?>[parameters.length()];
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   346
            for (int i = 0; i < ptypes.length; i++) {
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   347
                ptypes[i] = simpleType(parameters.charAt(i));
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   348
            }
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   349
            return MethodType.methodType(rtype, ptypes);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   350
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   351
    }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   352
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   353
    private static Class<?> simpleType(char c) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   354
        switch (c) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   355
            case 'F':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   356
                return float.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   357
            case 'D':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   358
                return double.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   359
            case 'I':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   360
                return int.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   361
            case 'L':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   362
                return Object.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   363
            case 'J':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   364
                return long.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   365
            case 'V':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   366
                return void.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   367
            case 'Z':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   368
            case 'B':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   369
            case 'S':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   370
            case 'C':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   371
                throw new IllegalArgumentException("Not a valid primitive: " + c +
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   372
                        " (use I instead)");
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   373
            default:
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   374
                throw new IllegalArgumentException("Not a primitive: " + c);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   375
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   376
    }
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   377
}