jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java
author redestad
Wed, 31 Aug 2016 14:20:02 +0200
changeset 40681 87d3f0e6a51f
parent 40562 c44c16dcaaef
child 41831 2dd91b18195b
permissions -rw-r--r--
8164858: Enable build-time use of java.lang.invoke resolve tracing Reviewed-by: erikj, vlivanov
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     1
/*
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     2
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     4
 *
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    10
 *
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    15
 * accompanied this code).
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    16
 *
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    20
 *
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    23
 * questions.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    24
 */
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    25
package jdk.tools.jlink.internal.plugins;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    26
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
    27
import java.io.File;
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
    28
import java.io.IOException;
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    29
import java.lang.invoke.MethodType;
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
    30
import java.nio.file.Files;
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
    31
import java.util.ArrayList;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    32
import java.util.EnumSet;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    33
import java.util.List;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    34
import java.util.Map;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    35
import java.util.Set;
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
    36
import java.util.TreeMap;
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
    37
import java.util.TreeSet;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    38
import java.util.stream.Collectors;
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
    39
import java.util.stream.Stream;
40258
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
    40
import jdk.internal.misc.SharedSecrets;
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
    41
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
    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);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    56
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
    57
    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
    58
    private static final String DMH_INVOKE_VIRTUAL = "invokeVirtual";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    59
    private static final String DMH_INVOKE_STATIC = "invokeStatic";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    60
    private static final String DMH_INVOKE_SPECIAL = "invokeSpecial";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    61
    private static final String DMH_NEW_INVOKE_SPECIAL = "newInvokeSpecial";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    62
    private static final String DMH_INVOKE_INTERFACE = "invokeInterface";
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    63
    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
    64
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
    65
    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
    66
    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
    67
    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
    68
40258
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
    69
    private static final JavaLangInvokeAccess JLIA
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
    70
            = SharedSecrets.getJavaLangInvokeAccess();
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    71
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
    72
    Set<String> speciesTypes;
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    73
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
    74
    Set<String> invokerTypes;
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
    75
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
    76
    Map<String, Set<String>> dmhMethods;
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
    77
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    78
    public GenerateJLIClassesPlugin() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    79
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    80
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    81
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    82
    public String getName() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    83
        return NAME;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    84
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    85
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    86
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    87
    public String getDescription() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    88
        return DESCRIPTION;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    89
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    90
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    91
    @Override
38320
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36758
diff changeset
    92
    public Set<State> getState() {
e24c7029e8ba 8156914: jlink API minor cleanups
sundar
parents: 36758
diff changeset
    93
        return EnumSet.of(State.AUTO_ENABLED, State.FUNCTIONAL);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    94
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    95
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    96
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    97
    public boolean hasArguments() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    98
        return true;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
    99
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   100
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   101
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   102
    public String getArgumentsDescription() {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   103
       return PluginsResourceBundle.getArgument(NAME);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   104
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   105
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   106
    /**
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   107
     * @return the default Species forms to generate.
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   108
     *
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   109
     * This list was derived from running a small startup benchmark.
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   110
     * 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
   111
     * 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
   112
     */
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   113
    public static Set<String> defaultSpecies() {
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   114
        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
   115
                "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
   116
                "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
   117
                "LILL", "I", "LLILL");
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   118
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   119
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   120
    /**
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   121
     * @return the default invoker forms to generate.
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   122
     */
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   123
    private static Set<String> defaultInvokers() {
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   124
        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
   125
    }
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   126
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   127
    /**
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   128
     * @return the list of default DirectMethodHandle methods to generate.
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   129
     */
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   130
    private static Map<String, Set<String>> defaultDMHMethods() {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   131
        return Map.of(
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   132
            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
   133
            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
   134
                "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
   135
                "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
   136
                "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
   137
                "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
   138
                "LLI3_L", "LLI4_I"),
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   139
            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
   140
                "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
   141
                "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
   142
                "L8_L", "L9_L", "L10_L", "L10I_L", "L10II_L", "L10IIL_L",
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   143
                "L11_L", "L12_L", "L13_L", "L14_L", "L14I_L", "L14II_L")
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   144
        );
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   145
    }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   146
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   147
    // Map from DirectMethodHandle method type to internal ID
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   148
    private static final Map<String, Integer> DMH_METHOD_TYPE_MAP =
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   149
            Map.of(
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   150
                DMH_INVOKE_VIRTUAL,     0,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   151
                DMH_INVOKE_STATIC,      1,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   152
                DMH_INVOKE_SPECIAL,     2,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   153
                DMH_NEW_INVOKE_SPECIAL, 3,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   154
                DMH_INVOKE_INTERFACE,   4,
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   155
                DMH_INVOKE_STATIC_INIT, 5
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   156
            );
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   157
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   158
    @Override
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   159
    public void configure(Map<String, String> config) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   160
        String mainArgument = config.get(NAME);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   161
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   162
        if ("none".equals(mainArgument)) {
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   163
            speciesTypes = Set.of();
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   164
            invokerTypes = Set.of();
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   165
            dmhMethods = Map.of();
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   166
            return;
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   167
        }
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   168
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   169
        // Start with the default configuration
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   170
        Set<String> defaultBMHSpecies = defaultSpecies();
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   171
        // Expand BMH species signatures
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   172
        defaultBMHSpecies = defaultBMHSpecies.stream()
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   173
                .map(type -> expandSignature(type))
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   174
                .collect(Collectors.toSet());
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   175
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   176
        Set<String> defaultInvokerTypes = defaultInvokers();
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   177
        validateMethodTypes(defaultInvokerTypes);
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   178
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   179
        Map<String, Set<String>> defaultDmhMethods = defaultDMHMethods();
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   180
        for (Set<String> dmhMethodTypes : defaultDmhMethods.values()) {
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   181
            validateMethodTypes(dmhMethodTypes);
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   182
        }
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
        // Extend the default configuration with the contents in the supplied
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   185
        // input file
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   186
        if (mainArgument == null || !mainArgument.startsWith("@")) {
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   187
            speciesTypes = defaultBMHSpecies;
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   188
            invokerTypes = defaultInvokerTypes;
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   189
            dmhMethods = defaultDmhMethods;
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   190
        } else {
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   191
            File file = new File(mainArgument.substring(1));
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   192
            if (file.exists()) {
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   193
                // Use TreeSet/TreeMap to keep things sorted in a deterministic
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   194
                // order to avoid scrambling the layout on small changes and to
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   195
                // ease finding methods in the generated code
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   196
                speciesTypes = new TreeSet<>(defaultBMHSpecies);
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   197
                invokerTypes = new TreeSet<>(defaultInvokerTypes);
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   198
                dmhMethods = new TreeMap<>();
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   199
                for (Map.Entry<String, Set<String>> entry : defaultDmhMethods.entrySet()) {
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   200
                    dmhMethods.put(entry.getKey(), new TreeSet<>(entry.getValue()));
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   201
                }
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   202
                fileLines(file)
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   203
                    .map(line -> line.split(" "))
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   204
                    .forEach(parts -> {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   205
                        switch (parts[0]) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   206
                            case "[BMH_RESOLVE]":
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   207
                                speciesTypes.add(expandSignature(parts[1]));
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   208
                                break;
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   209
                            case "[LF_RESOLVE]":
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   210
                                String methodType = parts[3];
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   211
                                validateMethodType(methodType);
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   212
                                if (parts[1].contains("Invokers")) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   213
                                    invokerTypes.add(methodType);
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   214
                                } else if (parts[1].contains("DirectMethodHandle")) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   215
                                    String dmh = parts[2];
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   216
                                    // ignore getObject etc for now (generated
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   217
                                    // by default)
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   218
                                    if (DMH_METHOD_TYPE_MAP.containsKey(dmh)) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   219
                                        addDMHMethodType(dmh, methodType);
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   220
                                    }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   221
                                }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   222
                                break;
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   223
                            default: break; // ignore
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   224
                        }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   225
                });
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   226
            }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   227
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   228
    }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   229
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   230
    private void addDMHMethodType(String dmh, String methodType) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   231
        validateMethodType(methodType);
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   232
        Set<String> methodTypes = dmhMethods.get(dmh);
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   233
        if (methodTypes == null) {
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   234
            methodTypes = new TreeSet<>();
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   235
            dmhMethods.put(dmh, methodTypes);
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   236
        }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   237
        methodTypes.add(methodType);
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   238
    }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   239
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   240
    private Stream<String> fileLines(File file) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   241
        try {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   242
            return Files.lines(file.toPath());
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   243
        } catch (IOException io) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   244
            throw new PluginException("Couldn't read file");
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   245
        }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   246
    }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   247
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   248
    private void validateMethodTypes(Set<String> dmhMethodTypes) {
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   249
        for (String type : dmhMethodTypes) {
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   250
            validateMethodType(type);
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   251
        }
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   252
    }
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   253
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   254
    private void validateMethodType(String type) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   255
        String[] typeParts = type.split("_");
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   256
        // check return type (second part)
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   257
        if (typeParts.length != 2 || typeParts[1].length() != 1
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   258
                || "LJIFDV".indexOf(typeParts[1].charAt(0)) == -1) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   259
            throw new PluginException(
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   260
                    "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
   261
        }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   262
        // expand and check arguments (first part)
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   263
        expandSignature(typeParts[0]);
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
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   266
    private static void requireBasicType(char c) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   267
        if ("LIJFD".indexOf(c) < 0) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   268
            throw new PluginException(
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   269
                    "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
   270
        }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   271
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   272
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   273
    @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
   274
    public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   275
        // 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
   276
        in.transformAndCopy(entry -> {
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   277
                // filter out placeholder entries
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   278
                if (entry.path().equals(DIRECT_METHOD_HOLDER_ENTRY) ||
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   279
                    entry.path().equals(DELEGATING_METHOD_HOLDER_ENTRY) ||
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   280
                    entry.path().equals(INVOKERS_HOLDER_ENTRY) ||
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   281
                    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
   282
                    return null;
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   283
                } else {
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   284
                    return entry;
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   285
                }
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   286
            }, out);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   287
        speciesTypes.forEach(types -> generateBMHClass(types, out));
40419
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   288
        generateHolderClasses(out);
39834
53a6fb443c20 8162538: plugin API should avoid read only pool, have module view separated from resource view and have pool builder to modify
sundar
parents: 39321
diff changeset
   289
        return out.build();
36757
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
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   292
    @SuppressWarnings("unchecked")
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   293
    private void generateBMHClass(String types, ResourcePoolBuilder out) {
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   294
        try {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   295
            // Generate class
40258
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
   296
            Map.Entry<String, byte[]> result =
e6ba2e5c7a29 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke
redestad
parents: 40212
diff changeset
   297
                    JLIA.generateConcreteBMHClassBytes(types);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   298
            String className = result.getKey();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   299
            byte[] bytes = result.getValue();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   300
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   301
            // 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
   302
            ResourcePoolEntry ndata = ResourcePoolEntry.create(
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   303
                    "/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
   304
                    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
   305
            out.add(ndata);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   306
        } catch (Exception ex) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   307
            throw new PluginException(ex);
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
    }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   310
40419
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   311
    private void generateHolderClasses(ResourcePoolBuilder out) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   312
        int count = 0;
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   313
        for (Set<String> entry : dmhMethods.values()) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   314
            count += entry.size();
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   315
        }
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   316
        MethodType[] directMethodTypes = new MethodType[count];
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   317
        int[] dmhTypes = new int[count];
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   318
        int index = 0;
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   319
        for (Map.Entry<String, Set<String>> entry : dmhMethods.entrySet()) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   320
            String dmhType = entry.getKey();
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   321
            for (String type : entry.getValue()) {
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   322
                // 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
   323
                // 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
   324
                MethodType mt = asMethodType(type);
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   325
                if (mt.parameterCount() < 1 ||
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   326
                    mt.parameterType(0) != Object.class) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   327
                    throw new PluginException(
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   328
                            "DMH type parameter must start with L");
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   329
                }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   330
                directMethodTypes[index] = mt.dropParameterTypes(0, 1);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   331
                dmhTypes[index] = DMH_METHOD_TYPE_MAP.get(dmhType);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   332
                index++;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   333
            }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   334
        }
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   335
        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
   336
        int i = 0;
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   337
        for (String invokerType : invokerTypes) {
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   338
            // 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
   339
            // 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
   340
            MethodType mt = asMethodType(invokerType);
40559
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   341
            final int lastParam = mt.parameterCount() - 1;
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   342
            if (mt.parameterCount() < 2 ||
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   343
                    mt.parameterType(0) != Object.class ||
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   344
                    mt.parameterType(lastParam) != Object.class) {
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   345
                throw new PluginException(
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   346
                        "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
   347
            }
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   348
            mt = mt.dropParameterTypes(lastParam, lastParam + 1);
e727ba540ee6 8163371: Enable tracing which JLI classes can be pre-generated
redestad
parents: 40543
diff changeset
   349
            invokerMethodTypes[i] = mt.dropParameterTypes(0, 1);
40681
87d3f0e6a51f 8164858: Enable build-time use of java.lang.invoke resolve tracing
redestad
parents: 40562
diff changeset
   350
            i++;
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   351
        }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   352
        try {
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   353
            byte[] bytes = JLIA.generateDirectMethodHandleHolderClassBytes(
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   354
                    DIRECT_HOLDER, directMethodTypes, dmhTypes);
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   355
            ResourcePoolEntry ndata = ResourcePoolEntry
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   356
                    .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
   357
            out.add(ndata);
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   358
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   359
            bytes = JLIA.generateDelegatingMethodHandleHolderClassBytes(
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   360
                    DELEGATING_HOLDER, directMethodTypes);
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   361
            ndata = ResourcePoolEntry.create(DELEGATING_METHOD_HOLDER_ENTRY, bytes);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   362
            out.add(ndata);
40419
20e2e4b25a40 8164451: Generate all zero and identity forms at link time
redestad
parents: 40408
diff changeset
   363
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   364
            bytes = JLIA.generateInvokersHolderClassBytes(INVOKERS_HOLDER,
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   365
                    invokerMethodTypes);
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   366
            ndata = ResourcePoolEntry.create(INVOKERS_HOLDER_ENTRY, bytes);
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   367
            out.add(ndata);
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   368
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   369
            bytes = JLIA.generateBasicFormsClassBytes(BASIC_FORMS_HOLDER);
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   370
            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
   371
            out.add(ndata);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   372
        } catch (Exception ex) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   373
            throw new PluginException(ex);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   374
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   375
    }
40543
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   376
    private static final String DIRECT_METHOD_HOLDER_ENTRY =
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   377
            "/java.base/" + DIRECT_HOLDER + ".class";
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   378
    private static final String DELEGATING_METHOD_HOLDER_ENTRY =
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   379
            "/java.base/" + DELEGATING_HOLDER + ".class";
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   380
    private static final String BASIC_FORMS_HOLDER_ENTRY =
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   381
            "/java.base/" + BASIC_FORMS_HOLDER + ".class";
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   382
    private static final String INVOKERS_HOLDER_ENTRY =
629f1f599595 8164569: Generate non-customized invoker forms at link time
redestad
parents: 40419
diff changeset
   383
            "/java.base/" + INVOKERS_HOLDER + ".class";
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   384
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   385
    // Convert LL -> LL, L3 -> LLL
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   386
    private static String expandSignature(String signature) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   387
        StringBuilder sb = new StringBuilder();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   388
        char last = 'X';
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   389
        int count = 0;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   390
        for (int i = 0; i < signature.length(); i++) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   391
            char c = signature.charAt(i);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   392
            if (c >= '0' && c <= '9') {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   393
                count *= 10;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   394
                count += (c - '0');
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   395
            } else {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   396
                requireBasicType(c);
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   397
                for (int j = 1; j < count; j++) {
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   398
                    sb.append(last);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   399
                }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   400
                sb.append(c);
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   401
                last = c;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   402
                count = 0;
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   403
            }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   404
        }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   405
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   406
        // 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
   407
        if (count > 1) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   408
            requireBasicType(last);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   409
            for (int j = 1; j < count; j++) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   410
                sb.append(last);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   411
            }
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   412
        }
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   413
        return sb.toString();
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   414
    }
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   415
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   416
    private static MethodType asMethodType(String basicSignatureString) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   417
        String[] parts = basicSignatureString.split("_");
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   418
        assert(parts.length == 2);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   419
        assert(parts[1].length() == 1);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   420
        String parameters = expandSignature(parts[0]);
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   421
        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
   422
        if (parameters.isEmpty()) {
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   423
            return MethodType.methodType(rtype);
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   424
        } else {
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   425
            Class<?>[] ptypes = new Class<?>[parameters.length()];
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   426
            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
   427
                ptypes[i] = simpleType(parameters.charAt(i));
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   428
            }
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   429
            return MethodType.methodType(rtype, ptypes);
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   430
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   431
    }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   432
40408
cf7e826d4d63 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle at link time
redestad
parents: 40258
diff changeset
   433
    private static Class<?> simpleType(char c) {
40211
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   434
        switch (c) {
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   435
            case 'F':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   436
                return float.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   437
            case 'D':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   438
                return double.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   439
            case 'I':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   440
                return int.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   441
            case 'L':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   442
                return Object.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   443
            case 'J':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   444
                return long.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   445
            case 'V':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   446
                return void.class;
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   447
            case 'Z':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   448
            case 'B':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   449
            case 'S':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   450
            case 'C':
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   451
                throw new IllegalArgumentException("Not a valid primitive: " + c +
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   452
                        " (use I instead)");
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   453
            default:
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   454
                throw new IllegalArgumentException("Not a primitive: " + c);
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   455
        }
8b78c9b31244 8163369: Enable generating DMH classes at link time
redestad
parents: 39834
diff changeset
   456
    }
36757
c859c6feee56 8152641: Plugin to generate BMH$Species classes ahead-of-time
redestad
parents:
diff changeset
   457
}