jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java
author redestad
Tue, 09 Aug 2016 10:00:31 +0200
changeset 40211 8b78c9b31244
parent 39834 53a6fb443c20
child 40212 6863c0579ecf
permissions -rw-r--r--
8163369: Enable generating DMH classes at link time Reviewed-by: vlivanov, shade
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.lang.reflect.Method;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    29
import java.util.Arrays;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    30
import java.util.EnumSet;
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    31
import java.util.HashMap;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    32
import java.util.List;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    33
import java.util.Map;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    34
import java.util.Set;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    35
import java.util.stream.Collectors;
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
    36
import jdk.tools.jlink.plugin.ResourcePoolEntry;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    37
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
    38
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
    39
import jdk.tools.jlink.plugin.ResourcePoolBuilder;
39321
c60f34e8c057 8160641: PostProcessingPlugin and ExecutableImage should not be part of plugin API
sundar
parents: 39308
diff changeset
    40
import jdk.tools.jlink.plugin.Plugin;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    41
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
 * Plugin to generate java.lang.invoke classes.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    44
 */
39321
c60f34e8c057 8160641: PostProcessingPlugin and ExecutableImage should not be part of plugin API
sundar
parents: 39308
diff changeset
    45
public final class GenerateJLIClassesPlugin implements Plugin {
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    46
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    47
    private static final String NAME = "generate-jli-classes";
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    48
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    49
    private static final String BMH_PARAM = "bmh";
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    50
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    51
    private static final String BMH_SPECIES_PARAM = "bmh-species";
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    52
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    53
    private static final String DMH_PARAM = "dmh";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    54
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    55
    private static final String DESCRIPTION = PluginsResourceBundle.getDescription(NAME);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    56
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    57
    private static final String BMH = "java/lang/invoke/BoundMethodHandle";
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    58
    private static final Method BMH_FACTORY_METHOD;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    59
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    60
    private static final String DMH = "java/lang/invoke/DirectMethodHandle$Holder";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    61
    private static final String DMH_INVOKE_VIRTUAL = "invokeVirtual";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    62
    private static final String DMH_INVOKE_STATIC = "invokeStatic";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    63
    private static final String DMH_INVOKE_SPECIAL = "invokeSpecial";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    64
    private static final String DMH_NEW_INVOKE_SPECIAL = "newInvokeSpecial";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    65
    private static final String DMH_INVOKE_INTERFACE = "invokeInterface";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    66
    private static final String DMH_INVOKE_STATIC_INIT = "invokeStaticInit";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    67
    private static final Method DMH_FACTORY_METHOD;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    68
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    69
    List<String> speciesTypes;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    70
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    71
    Map<String, List<String>> dmhMethods;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    72
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    73
    public GenerateJLIClassesPlugin() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    74
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    75
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    76
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    77
    public String getName() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    78
        return NAME;
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
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    81
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    82
    public String getDescription() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    83
        return DESCRIPTION;
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
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    86
    @Override
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36758
diff changeset
    87
    public Set<State> getState() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36758
diff changeset
    88
        return EnumSet.of(State.AUTO_ENABLED, State.FUNCTIONAL);
36757
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
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    91
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    92
    public boolean hasArguments() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    93
        return true;
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
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    96
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    97
    public String getArgumentsDescription() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    98
       return PluginsResourceBundle.getArgument(NAME);
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
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   101
    /**
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   102
     * @return the default Species forms to generate.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   103
     *
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   104
     * This list was derived from running a small startup benchmark.
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   105
     * 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
   106
     * 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
   107
     */
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   108
    public static List<String> defaultSpecies() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   109
        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
   110
                "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
   111
                "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
   112
                "LILL", "I", "LLILL");
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   113
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   114
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   115
    /**
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   116
     * @return the list of default DirectMethodHandle methods to generate.
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   117
     */
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   118
    public static Map<String, List<String>> defaultDMHMethods() {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   119
        return Map.of(
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   120
            DMH_INVOKE_VIRTUAL, List.of("_L", "L_L", "LI_I"),
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   121
            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
   122
                "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
   123
                "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
   124
                "LIILL_L", "LIILL_I", "LIIL_I", "LILIL_I", "LILILL_I",
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   125
                "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
   126
            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
   127
                "_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
   128
                "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
   129
                "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
   130
                "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
   131
        );
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   132
    }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   133
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   134
    // Map from DirectMethodHandle method type to internal ID
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   135
    private static final Map<String, Integer> DMH_METHOD_TYPE_MAP =
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   136
            Map.of(
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   137
                DMH_INVOKE_VIRTUAL,     0,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   138
                DMH_INVOKE_STATIC,      1,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   139
                DMH_INVOKE_SPECIAL,     2,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   140
                DMH_NEW_INVOKE_SPECIAL, 3,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   141
                DMH_INVOKE_INTERFACE,   4,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   142
                DMH_INVOKE_STATIC_INIT, 5
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   143
            );
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   144
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   145
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   146
    public void configure(Map<String, String> config) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   147
        String mainArgument = config.get(NAME);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   148
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   149
        // Enable by default
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   150
        boolean bmhEnabled = true;
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   151
        boolean dmhEnabled = true;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   152
        if (mainArgument != null) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   153
            List<String> args = Arrays.asList(mainArgument.split(","));
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   154
            if (!args.contains(BMH_PARAM)) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   155
                bmhEnabled = false;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   156
            }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   157
            if (!args.contains(DMH_PARAM)) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   158
                dmhEnabled = false;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   159
            }
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   160
        }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   161
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   162
        if (!bmhEnabled) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   163
            speciesTypes = List.of();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   164
        } else {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   165
            String args = config.get(BMH_SPECIES_PARAM);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   166
            List<String> bmhSpecies;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   167
            if (args != null && !args.isEmpty()) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   168
                bmhSpecies = Arrays.stream(args.split(","))
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   169
                    .map(String::trim)
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   170
                    .filter(s -> !s.isEmpty())
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   171
                    .collect(Collectors.toList());
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   172
            } else {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   173
                bmhSpecies = defaultSpecies();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   174
            }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   175
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   176
            // Expand BMH species signatures
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   177
            speciesTypes = bmhSpecies.stream()
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   178
                    .map(type -> expandSignature(type))
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   179
                    .collect(Collectors.toList());
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   180
        }
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   181
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   182
        // DirectMethodHandles
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   183
        if (!dmhEnabled) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   184
            dmhMethods = Map.of();
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   185
        } else {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   186
            dmhMethods = new HashMap<>();
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   187
            for (String dmhParam : DMH_METHOD_TYPE_MAP.keySet()) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   188
                String args = config.get(dmhParam);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   189
                if (args != null && !args.isEmpty()) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   190
                    List<String> dmhMethodTypes = Arrays.stream(args.split(","))
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   191
                            .map(String::trim)
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   192
                            .filter(s -> !s.isEmpty())
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   193
                            .collect(Collectors.toList());
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   194
                    dmhMethods.put(dmhParam, dmhMethodTypes);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   195
                    // Validation check
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   196
                    for (String type : dmhMethodTypes) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   197
                        String[] typeParts = type.split("_");
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   198
                        // check return type (second part)
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   199
                        if (typeParts.length != 2 || typeParts[1].length() != 1
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   200
                                || "LJIFDV".indexOf(typeParts[1].charAt(0)) == -1) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   201
                            throw new PluginException(
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   202
                                    "Method type signature must be of form [LJIFD]*_[LJIFDV]");
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   203
                        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   204
                        // expand and check arguments (first part)
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   205
                        expandSignature(typeParts[0]);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   206
                    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   207
                }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   208
            }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   209
            if (dmhMethods.isEmpty()) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   210
                dmhMethods = defaultDMHMethods();
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   211
            }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   212
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   213
    }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   214
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   215
    private static void requireBasicType(char c) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   216
        if ("LIJFD".indexOf(c) < 0) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   217
            throw new PluginException(
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   218
                    "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
   219
        }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   220
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   221
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   222
    @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
   223
    public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   224
        // Copy all but DMH_ENTRY to out
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   225
        in.transformAndCopy(entry -> entry.path().equals(DMH_ENTRY) ? null : entry, out);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   226
        speciesTypes.forEach(types -> generateBMHClass(types, out));
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   227
        generateDMHClass(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
   228
        return out.build();
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   229
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   230
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   231
    @SuppressWarnings("unchecked")
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   232
    private void generateBMHClass(String types, ResourcePoolBuilder out) {
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   233
        try {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   234
            // Generate class
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   235
            Map.Entry<String, byte[]> result = (Map.Entry<String, byte[]>)
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   236
                    BMH_FACTORY_METHOD.invoke(null, types);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   237
            String className = result.getKey();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   238
            byte[] bytes = result.getValue();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   239
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   240
            // 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
   241
            ResourcePoolEntry ndata = ResourcePoolEntry.create(
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   242
                    "/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
   243
                    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
   244
            out.add(ndata);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   245
        } catch (Exception ex) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   246
            throw new PluginException(ex);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   247
        }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   248
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   249
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   250
    private void generateDMHClass(ResourcePoolBuilder out) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   251
        int count = 0;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   252
        for (List<String> entry : dmhMethods.values()) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   253
            count += entry.size();
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   254
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   255
        MethodType[] methodTypes = new MethodType[count];
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   256
        int[] dmhTypes = new int[count];
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   257
        int index = 0;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   258
        for (Map.Entry<String, List<String>> entry : dmhMethods.entrySet()) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   259
            String dmhType = entry.getKey();
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   260
            for (String type : entry.getValue()) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   261
                methodTypes[index] = asMethodType(type);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   262
                dmhTypes[index] = DMH_METHOD_TYPE_MAP.get(dmhType);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   263
                index++;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   264
            }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   265
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   266
        try {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   267
            byte[] bytes = (byte[])DMH_FACTORY_METHOD
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   268
                    .invoke(null,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   269
                            DMH,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   270
                            methodTypes,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   271
                            dmhTypes);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   272
            ResourcePoolEntry ndata = ResourcePoolEntry.create(DMH_ENTRY, bytes);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   273
            out.add(ndata);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   274
        } catch (Exception ex) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   275
            throw new PluginException(ex);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   276
        }
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
    private static final String DMH_ENTRY = "/java.base/" + DMH + ".class";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   279
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   280
    static {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   281
        try {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   282
            Class<?> BMHFactory = Class.forName("java.lang.invoke.BoundMethodHandle$Factory");
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   283
            BMH_FACTORY_METHOD = BMHFactory.getDeclaredMethod("generateConcreteBMHClassBytes",
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   284
                    String.class);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   285
            BMH_FACTORY_METHOD.setAccessible(true);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   286
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   287
            Class<?> DMHFactory = Class.forName("java.lang.invoke.DirectMethodHandle");
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   288
            DMH_FACTORY_METHOD = DMHFactory.getDeclaredMethod("generateDMHClassBytes",
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   289
                    String.class, MethodType[].class, int[].class);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   290
            DMH_FACTORY_METHOD.setAccessible(true);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   291
        } catch (Exception e) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   292
            throw new PluginException(e);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   293
        }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   294
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   295
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   296
    // Convert LL -> LL, L3 -> LLL
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   297
    private static String expandSignature(String signature) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   298
        StringBuilder sb = new StringBuilder();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   299
        char last = 'X';
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   300
        int count = 0;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   301
        for (int i = 0; i < signature.length(); i++) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   302
            char c = signature.charAt(i);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   303
            if (c >= '0' && c <= '9') {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   304
                count *= 10;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   305
                count += (c - '0');
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   306
            } else {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   307
                requireBasicType(c);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   308
                for (int j = 1; j < count; j++) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   309
                    sb.append(last);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   310
                }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   311
                sb.append(c);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   312
                last = c;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   313
                count = 0;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   314
            }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   315
        }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   316
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   317
        // 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
   318
        if (count > 1) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   319
            requireBasicType(last);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   320
            for (int j = 1; j < count; j++) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   321
                sb.append(last);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   322
            }
36757
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
        return sb.toString();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   325
    }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   326
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   327
    private static MethodType asMethodType(String basicSignatureString) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   328
        String[] parts = basicSignatureString.split("_");
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   329
        assert(parts.length == 2);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   330
        assert(parts[1].length() == 1);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   331
        String parameters = expandSignature(parts[0]);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   332
        Class<?> rtype = primitiveType(parts[1].charAt(0));
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   333
        Class<?>[] ptypes = new Class<?>[parameters.length()];
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   334
        for (int i = 0; i < ptypes.length; i++) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   335
            ptypes[i] = primitiveType(parameters.charAt(i));
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   336
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   337
        return MethodType.methodType(rtype, ptypes);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   338
    }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   339
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   340
    private static Class<?> primitiveType(char c) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   341
        switch (c) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   342
            case 'F':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   343
                return float.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   344
            case 'D':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   345
                return double.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   346
            case 'I':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   347
                return int.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   348
            case 'L':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   349
                return Object.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   350
            case 'J':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   351
                return long.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   352
            case 'V':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   353
                return void.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   354
            case 'Z':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   355
            case 'B':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   356
            case 'S':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   357
            case 'C':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   358
                throw new IllegalArgumentException("Not a valid primitive: " + c +
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   359
                        " (use I instead)");
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   360
            default:
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   361
                throw new IllegalArgumentException("Not a primitive: " + c);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   362
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   363
    }
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   364
}