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