src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java
author redestad
Mon, 12 Mar 2018 18:31:02 +0100
changeset 49206 e991d0be4cc9
parent 48071 a5cadeee8763
child 49240 5290e816c64c
permissions -rw-r--r--
8199453: Enable link-time generation of constructor forms Reviewed-by: alanb, psandoz, mchung
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
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
    27
import java.io.BufferedReader;
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
    28
import java.io.File;
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
    29
import java.io.IOException;
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
    30
import java.io.InputStream;
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
    31
import java.io.InputStreamReader;
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    32
import java.lang.invoke.MethodType;
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
    33
import java.lang.module.ModuleDescriptor;
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
    34
import java.nio.file.Files;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    35
import java.util.EnumSet;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    36
import java.util.Map;
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
    37
import java.util.Optional;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    38
import java.util.Set;
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
    39
import java.util.TreeMap;
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
    40
import java.util.TreeSet;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    41
import java.util.stream.Collectors;
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
    42
import java.util.stream.Stream;
40258
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
    43
import jdk.internal.misc.SharedSecrets;
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
    44
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
    45
import jdk.tools.jlink.plugin.ResourcePoolEntry;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    46
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
    47
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
    48
import jdk.tools.jlink.plugin.ResourcePoolBuilder;
39321
c60f34e8c057 8160641: PostProcessingPlugin and ExecutableImage should not be part of plugin API
sundar
parents: 39308
diff changeset
    49
import jdk.tools.jlink.plugin.Plugin;
36757
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
/**
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    52
 * Plugin to generate java.lang.invoke classes.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    53
 */
39321
c60f34e8c057 8160641: PostProcessingPlugin and ExecutableImage should not be part of plugin API
sundar
parents: 39308
diff changeset
    54
public final class GenerateJLIClassesPlugin implements Plugin {
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    55
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    56
    private static final String NAME = "generate-jli-classes";
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    57
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    58
    private static final String DESCRIPTION = PluginsResourceBundle.getDescription(NAME);
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
    59
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
    60
    private static final String DEFAULT_TRACE_FILE = "default_jli_trace.txt";
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    61
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
    62
    private static final String DIRECT_HOLDER = "java/lang/invoke/DirectMethodHandle$Holder";
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    63
    private static final String DMH_INVOKE_VIRTUAL = "invokeVirtual";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    64
    private static final String DMH_INVOKE_STATIC = "invokeStatic";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    65
    private static final String DMH_INVOKE_SPECIAL = "invokeSpecial";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    66
    private static final String DMH_NEW_INVOKE_SPECIAL = "newInvokeSpecial";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    67
    private static final String DMH_INVOKE_INTERFACE = "invokeInterface";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    68
    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
    69
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
    70
    private static final String DELEGATING_HOLDER = "java/lang/invoke/DelegatingMethodHandle$Holder";
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
    71
    private static final String BASIC_FORMS_HOLDER = "java/lang/invoke/LambdaForm$Holder";
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
    72
    private static final String INVOKERS_HOLDER = "java/lang/invoke/Invokers$Holder";
40419
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
    73
40258
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
    74
    private static final JavaLangInvokeAccess JLIA
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
    75
            = SharedSecrets.getJavaLangInvokeAccess();
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    76
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
    77
    Set<String> speciesTypes = Set.of();
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
    78
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
    79
    Set<String> invokerTypes = Set.of();
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    80
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
    81
    Map<String, Set<String>> dmhMethods = Map.of();
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
    82
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
    83
    String mainArgument;
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
    84
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    85
    public GenerateJLIClassesPlugin() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    86
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    87
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    88
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    89
    public String getName() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    90
        return NAME;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    91
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    92
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    93
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    94
    public String getDescription() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    95
        return DESCRIPTION;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    96
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    97
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    98
    @Override
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36758
diff changeset
    99
    public Set<State> getState() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36758
diff changeset
   100
        return EnumSet.of(State.AUTO_ENABLED, State.FUNCTIONAL);
36757
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
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   103
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   104
    public boolean hasArguments() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   105
        return true;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   106
    }
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
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   109
    public String getArgumentsDescription() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   110
       return PluginsResourceBundle.getArgument(NAME);
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
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
     * @return the default Species forms to generate.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   115
     *
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   116
     * This list was derived from running a small startup benchmark.
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   117
     * 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
   118
     * 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
   119
     */
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   120
    public static Set<String> defaultSpecies() {
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   121
        return Set.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
   122
                "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
   123
                "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
   124
                "LILL", "I", "LLILL");
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   125
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   126
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   127
    /**
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   128
     * @return the default invoker forms to generate.
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   129
     */
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   130
    private static Set<String> defaultInvokers() {
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   131
        return Set.of("LL_L", "LL_I", "LILL_I", "L6_L");
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   132
    }
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   133
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   134
    /**
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   135
     * @return the list of default DirectMethodHandle methods to generate.
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   136
     */
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   137
    private static Map<String, Set<String>> defaultDMHMethods() {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   138
        return Map.of(
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   139
            DMH_INVOKE_VIRTUAL, Set.of("L_L", "LL_L", "LLI_I", "L3_V"),
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   140
            DMH_INVOKE_SPECIAL, Set.of("LL_I", "LL_L", "LLF_L", "LLD_L", "L3_L",
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   141
                "L4_L", "L5_L", "L6_L", "L7_L", "L8_L", "LLI_I", "LLI_L",
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   142
                "LLIL_I", "LLII_I", "LLII_L", "L3I_L", "L3I_I", "LLILI_I",
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   143
                "LLIIL_L", "LLIILL_L", "LLIILL_I", "LLIIL_I", "LLILIL_I",
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   144
                "LLILILL_I", "LLILII_I", "LLI3_I", "LLI3L_I", "LLI3LL_I",
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   145
                "LLI3_L", "LLI4_I"),
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   146
            DMH_INVOKE_STATIC, Set.of("LII_I", "LIL_I", "LILIL_I", "LILII_I",
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   147
                "L_I", "L_L", "L_V", "LD_L", "LF_L", "LI_I", "LII_L", "LLI_L",
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   148
                "LL_V", "LL_L", "L3_L", "L4_L", "L5_L", "L6_L", "L7_L",
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   149
                "L8_L", "L9_L", "L10_L", "L10I_L", "L10II_L", "L10IIL_L",
49206
e991d0be4cc9 8199453: Enable link-time generation of constructor forms
redestad
parents: 48071
diff changeset
   150
                "L11_L", "L12_L", "L13_L", "L14_L", "L14I_L", "L14II_L"),
e991d0be4cc9 8199453: Enable link-time generation of constructor forms
redestad
parents: 48071
diff changeset
   151
            DMH_NEW_INVOKE_SPECIAL, Set.of("L_L", "LL_L")
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   152
        );
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   153
    }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   154
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   155
    // Map from DirectMethodHandle method type to internal ID
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   156
    private static final Map<String, Integer> DMH_METHOD_TYPE_MAP =
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   157
            Map.of(
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   158
                DMH_INVOKE_VIRTUAL,     0,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   159
                DMH_INVOKE_STATIC,      1,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   160
                DMH_INVOKE_SPECIAL,     2,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   161
                DMH_NEW_INVOKE_SPECIAL, 3,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   162
                DMH_INVOKE_INTERFACE,   4,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   163
                DMH_INVOKE_STATIC_INIT, 5
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   164
            );
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   165
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   166
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   167
    public void configure(Map<String, String> config) {
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   168
        mainArgument = config.get(NAME);
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   169
    }
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   170
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   171
    public void initialize(ResourcePool in) {
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   172
        // Start with the default configuration
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   173
        speciesTypes = defaultSpecies().stream()
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   174
                .map(type -> expandSignature(type))
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   175
                .collect(Collectors.toSet());
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   176
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   177
        invokerTypes = defaultInvokers();
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   178
        validateMethodTypes(invokerTypes);
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   179
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   180
        dmhMethods = defaultDMHMethods();
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   181
        for (Set<String> dmhMethodTypes : dmhMethods.values()) {
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   182
            validateMethodTypes(dmhMethodTypes);
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   183
        }
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   184
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   185
        // Extend the default configuration with the contents in the supplied
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   186
        // input file - if none was supplied we look for the default file
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   187
        if (mainArgument == null || !mainArgument.startsWith("@")) {
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   188
            try (InputStream traceFile =
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   189
                    this.getClass().getResourceAsStream(DEFAULT_TRACE_FILE)) {
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   190
                if (traceFile != null) {
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   191
                    readTraceConfig(
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   192
                        new BufferedReader(
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   193
                            new InputStreamReader(traceFile)).lines());
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   194
                }
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   195
            } catch (Exception e) {
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   196
                throw new PluginException("Couldn't read " + DEFAULT_TRACE_FILE, e);
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   197
            }
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   198
        } else {
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   199
            File file = new File(mainArgument.substring(1));
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   200
            if (file.exists()) {
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   201
                readTraceConfig(fileLines(file));
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   202
            }
40211
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
    }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   205
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   206
    private void readTraceConfig(Stream<String> lines) {
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   207
        // Use TreeSet/TreeMap to keep things sorted in a deterministic
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   208
        // order to avoid scrambling the layout on small changes and to
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   209
        // ease finding methods in the generated code
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   210
        speciesTypes = new TreeSet<>(speciesTypes);
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   211
        invokerTypes = new TreeSet<>(invokerTypes);
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   212
        TreeMap<String, Set<String>> newDMHMethods = new TreeMap<>();
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   213
        for (Map.Entry<String, Set<String>> entry : dmhMethods.entrySet()) {
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   214
            newDMHMethods.put(entry.getKey(), new TreeSet<>(entry.getValue()));
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   215
        }
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   216
        dmhMethods = newDMHMethods;
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   217
        lines.map(line -> line.split(" "))
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   218
             .forEach(parts -> {
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   219
                switch (parts[0]) {
47753
a2008587c13f 8184777: Factor out species generation logic from BoundMethodHandle
redestad
parents: 47216
diff changeset
   220
                    case "[SPECIES_RESOLVE]":
a2008587c13f 8184777: Factor out species generation logic from BoundMethodHandle
redestad
parents: 47216
diff changeset
   221
                        // Allow for new types of species data classes being resolved here
a2008587c13f 8184777: Factor out species generation logic from BoundMethodHandle
redestad
parents: 47216
diff changeset
   222
                        if (parts.length == 3 && parts[1].startsWith("java.lang.invoke.BoundMethodHandle$Species_")) {
a2008587c13f 8184777: Factor out species generation logic from BoundMethodHandle
redestad
parents: 47216
diff changeset
   223
                            String species = parts[1].substring("java.lang.invoke.BoundMethodHandle$Species_".length());
a2008587c13f 8184777: Factor out species generation logic from BoundMethodHandle
redestad
parents: 47216
diff changeset
   224
                            if (!"L".equals(species)) {
a2008587c13f 8184777: Factor out species generation logic from BoundMethodHandle
redestad
parents: 47216
diff changeset
   225
                                speciesTypes.add(expandSignature(species));
a2008587c13f 8184777: Factor out species generation logic from BoundMethodHandle
redestad
parents: 47216
diff changeset
   226
                            }
a2008587c13f 8184777: Factor out species generation logic from BoundMethodHandle
redestad
parents: 47216
diff changeset
   227
                        }
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   228
                        break;
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   229
                    case "[LF_RESOLVE]":
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   230
                        String methodType = parts[3];
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   231
                        validateMethodType(methodType);
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   232
                        if (parts[1].contains("Invokers")) {
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   233
                            invokerTypes.add(methodType);
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   234
                        } else if (parts[1].contains("DirectMethodHandle")) {
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   235
                            String dmh = parts[2];
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   236
                            // ignore getObject etc for now (generated
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   237
                            // by default)
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   238
                            if (DMH_METHOD_TYPE_MAP.containsKey(dmh)) {
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   239
                                addDMHMethodType(dmh, methodType);
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   240
                            }
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   241
                        }
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   242
                        break;
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   243
                    default: break; // ignore
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   244
                }
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   245
            });
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   246
    }
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   247
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   248
    private void addDMHMethodType(String dmh, String methodType) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   249
        validateMethodType(methodType);
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   250
        Set<String> methodTypes = dmhMethods.get(dmh);
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   251
        if (methodTypes == null) {
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   252
            methodTypes = new TreeSet<>();
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   253
            dmhMethods.put(dmh, methodTypes);
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   254
        }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   255
        methodTypes.add(methodType);
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   256
    }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   257
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   258
    private Stream<String> fileLines(File file) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   259
        try {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   260
            return Files.lines(file.toPath());
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   261
        } catch (IOException io) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   262
            throw new PluginException("Couldn't read file");
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   263
        }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   264
    }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   265
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   266
    private void validateMethodTypes(Set<String> dmhMethodTypes) {
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   267
        for (String type : dmhMethodTypes) {
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   268
            validateMethodType(type);
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   269
        }
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   270
    }
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   271
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   272
    private void validateMethodType(String type) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   273
        String[] typeParts = type.split("_");
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   274
        // check return type (second part)
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   275
        if (typeParts.length != 2 || typeParts[1].length() != 1
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   276
                || "LJIFDV".indexOf(typeParts[1].charAt(0)) == -1) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   277
            throw new PluginException(
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   278
                    "Method type signature must be of form [LJIFD]*_[LJIFDV]");
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   279
        }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   280
        // expand and check arguments (first part)
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   281
        expandSignature(typeParts[0]);
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   282
    }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   283
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   284
    private static void requireBasicType(char c) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   285
        if ("LIJFD".indexOf(c) < 0) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   286
            throw new PluginException(
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   287
                    "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
   288
        }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   289
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   290
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   291
    @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
   292
    public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   293
        initialize(in);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   294
        // 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
   295
        in.transformAndCopy(entry -> {
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   296
                // filter out placeholder entries
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   297
                if (entry.path().equals(DIRECT_METHOD_HOLDER_ENTRY) ||
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   298
                    entry.path().equals(DELEGATING_METHOD_HOLDER_ENTRY) ||
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   299
                    entry.path().equals(INVOKERS_HOLDER_ENTRY) ||
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   300
                    entry.path().equals(BASIC_FORMS_HOLDER_ENTRY)) {
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   301
                    return null;
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   302
                } else {
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   303
                    return entry;
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   304
                }
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   305
            }, out);
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   306
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   307
        // Generate BMH Species classes
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   308
        speciesTypes.forEach(types -> generateBMHClass(types, out));
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   309
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   310
        // Generate LambdaForm Holder classes
40419
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   311
        generateHolderClasses(out);
43837
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   312
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   313
        // Let it go
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   314
        speciesTypes = null;
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   315
        invokerTypes = null;
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   316
        dmhMethods = null;
51a9f82cff03 8175026: Capture build-time parameters to --generate-jli-classes
redestad
parents: 41831
diff changeset
   317
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
   318
        return out.build();
36757
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
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   321
    @SuppressWarnings("unchecked")
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   322
    private void generateBMHClass(String types, ResourcePoolBuilder out) {
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   323
        try {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   324
            // Generate class
40258
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
   325
            Map.Entry<String, byte[]> result =
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
   326
                    JLIA.generateConcreteBMHClassBytes(types);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   327
            String className = result.getKey();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   328
            byte[] bytes = result.getValue();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   329
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   330
            // 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
   331
            ResourcePoolEntry ndata = ResourcePoolEntry.create(
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   332
                    "/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
   333
                    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
   334
            out.add(ndata);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   335
        } catch (Exception ex) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   336
            throw new PluginException(ex);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   337
        }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   338
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   339
40419
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   340
    private void generateHolderClasses(ResourcePoolBuilder out) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   341
        int count = 0;
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   342
        for (Set<String> entry : dmhMethods.values()) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   343
            count += entry.size();
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   344
        }
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   345
        MethodType[] directMethodTypes = new MethodType[count];
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   346
        int[] dmhTypes = new int[count];
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   347
        int index = 0;
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   348
        for (Map.Entry<String, Set<String>> entry : dmhMethods.entrySet()) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   349
            String dmhType = entry.getKey();
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   350
            for (String type : entry.getValue()) {
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   351
                // The DMH type to actually ask for is retrieved by removing
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   352
                // the first argument, which needs to be of Object.class
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   353
                MethodType mt = asMethodType(type);
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   354
                if (mt.parameterCount() < 1 ||
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   355
                    mt.parameterType(0) != Object.class) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   356
                    throw new PluginException(
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   357
                            "DMH type parameter must start with L");
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   358
                }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   359
                directMethodTypes[index] = mt.dropParameterTypes(0, 1);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   360
                dmhTypes[index] = DMH_METHOD_TYPE_MAP.get(dmhType);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   361
                index++;
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
        }
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   364
        MethodType[] invokerMethodTypes = new MethodType[this.invokerTypes.size()];
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   365
        int i = 0;
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   366
        for (String invokerType : invokerTypes) {
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   367
            // The invoker type to ask for is retrieved by removing the first
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   368
            // and the last argument, which needs to be of Object.class
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   369
            MethodType mt = asMethodType(invokerType);
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   370
            final int lastParam = mt.parameterCount() - 1;
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   371
            if (mt.parameterCount() < 2 ||
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   372
                    mt.parameterType(0) != Object.class ||
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   373
                    mt.parameterType(lastParam) != Object.class) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   374
                throw new PluginException(
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   375
                        "Invoker type parameter must start and end with L");
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   376
            }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   377
            mt = mt.dropParameterTypes(lastParam, lastParam + 1);
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   378
            invokerMethodTypes[i] = mt.dropParameterTypes(0, 1);
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   379
            i++;
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   380
        }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   381
        try {
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   382
            byte[] bytes = JLIA.generateDirectMethodHandleHolderClassBytes(
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   383
                    DIRECT_HOLDER, directMethodTypes, dmhTypes);
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   384
            ResourcePoolEntry ndata = ResourcePoolEntry
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   385
                    .create(DIRECT_METHOD_HOLDER_ENTRY, bytes);
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   386
            out.add(ndata);
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   387
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   388
            bytes = JLIA.generateDelegatingMethodHandleHolderClassBytes(
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   389
                    DELEGATING_HOLDER, directMethodTypes);
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   390
            ndata = ResourcePoolEntry.create(DELEGATING_METHOD_HOLDER_ENTRY, bytes);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   391
            out.add(ndata);
40419
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   392
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   393
            bytes = JLIA.generateInvokersHolderClassBytes(INVOKERS_HOLDER,
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   394
                    invokerMethodTypes);
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   395
            ndata = ResourcePoolEntry.create(INVOKERS_HOLDER_ENTRY, bytes);
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   396
            out.add(ndata);
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   397
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   398
            bytes = JLIA.generateBasicFormsClassBytes(BASIC_FORMS_HOLDER);
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   399
            ndata = ResourcePoolEntry.create(BASIC_FORMS_HOLDER_ENTRY, bytes);
40419
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   400
            out.add(ndata);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   401
        } catch (Exception ex) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   402
            throw new PluginException(ex);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   403
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   404
    }
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   405
    private static final String DIRECT_METHOD_HOLDER_ENTRY =
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   406
            "/java.base/" + DIRECT_HOLDER + ".class";
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   407
    private static final String DELEGATING_METHOD_HOLDER_ENTRY =
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   408
            "/java.base/" + DELEGATING_HOLDER + ".class";
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   409
    private static final String BASIC_FORMS_HOLDER_ENTRY =
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   410
            "/java.base/" + BASIC_FORMS_HOLDER + ".class";
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   411
    private static final String INVOKERS_HOLDER_ENTRY =
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   412
            "/java.base/" + INVOKERS_HOLDER + ".class";
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   413
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   414
    // Convert LL -> LL, L3 -> LLL
47753
a2008587c13f 8184777: Factor out species generation logic from BoundMethodHandle
redestad
parents: 47216
diff changeset
   415
    public static String expandSignature(String signature) {
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   416
        StringBuilder sb = new StringBuilder();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   417
        char last = 'X';
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   418
        int count = 0;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   419
        for (int i = 0; i < signature.length(); i++) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   420
            char c = signature.charAt(i);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   421
            if (c >= '0' && c <= '9') {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   422
                count *= 10;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   423
                count += (c - '0');
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   424
            } else {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   425
                requireBasicType(c);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   426
                for (int j = 1; j < count; j++) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   427
                    sb.append(last);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   428
                }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   429
                sb.append(c);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   430
                last = c;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   431
                count = 0;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   432
            }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   433
        }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   434
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   435
        // 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
   436
        if (count > 1) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   437
            requireBasicType(last);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   438
            for (int j = 1; j < count; j++) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   439
                sb.append(last);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   440
            }
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   441
        }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   442
        return sb.toString();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   443
    }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   444
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   445
    private static MethodType asMethodType(String basicSignatureString) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   446
        String[] parts = basicSignatureString.split("_");
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   447
        assert(parts.length == 2);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   448
        assert(parts[1].length() == 1);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   449
        String parameters = expandSignature(parts[0]);
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   450
        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
   451
        if (parameters.isEmpty()) {
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   452
            return MethodType.methodType(rtype);
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   453
        } else {
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   454
            Class<?>[] ptypes = new Class<?>[parameters.length()];
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   455
            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
   456
                ptypes[i] = simpleType(parameters.charAt(i));
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   457
            }
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   458
            return MethodType.methodType(rtype, ptypes);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   459
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   460
    }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   461
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   462
    private static Class<?> simpleType(char c) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   463
        switch (c) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   464
            case 'F':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   465
                return float.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   466
            case 'D':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   467
                return double.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   468
            case 'I':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   469
                return int.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   470
            case 'L':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   471
                return Object.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   472
            case 'J':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   473
                return long.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   474
            case 'V':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   475
                return void.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   476
            case 'Z':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   477
            case 'B':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   478
            case 'S':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   479
            case 'C':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   480
                throw new IllegalArgumentException("Not a valid primitive: " + c +
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   481
                        " (use I instead)");
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   482
            default:
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   483
                throw new IllegalArgumentException("Not a primitive: " + c);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   484
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   485
    }
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   486
}