Mercurial > hg > graal-jvmci-8
changeset 22649:5cd42bb63fad
made initialization of OptionsLoader lazy again
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Fri, 02 Oct 2015 10:12:01 +0200 |
parents | 9f24bf92ee94 |
children | 939d5da65929 |
files | jvmci/jdk.internal.jvmci.options/src/jdk/internal/jvmci/options/JVMCIJarsOptionDescriptorsProvider.java jvmci/jdk.internal.jvmci.options/src/jdk/internal/jvmci/options/OptionsParser.java |
diffstat | 2 files changed, 32 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/jvmci/jdk.internal.jvmci.options/src/jdk/internal/jvmci/options/JVMCIJarsOptionDescriptorsProvider.java Thu Oct 01 17:13:13 2015 -0700 +++ b/jvmci/jdk.internal.jvmci.options/src/jdk/internal/jvmci/options/JVMCIJarsOptionDescriptorsProvider.java Fri Oct 02 10:12:01 2015 +0200 @@ -27,6 +27,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.jar.JarFile; @@ -39,15 +40,26 @@ * {@code META-INF/services/jdk.internal.jvmci.options.OptionDescriptors} files in * {@code <jre>/lib/jvmci/*.jar}. */ -class JVMCIJarsOptionDescriptorsProvider implements OptionDescriptorsProvider { +final class JVMCIJarsOptionDescriptorsProvider implements OptionDescriptorsProvider { static final String OptionDescriptorsServiceFile = "META-INF/services/" + OptionDescriptors.class.getName(); private final Iterator<File> jars; private final List<OptionDescriptors> optionsDescriptorsList; - JVMCIJarsOptionDescriptorsProvider() { + /** + * Creates a {@link JVMCIJarsOptionDescriptorsProvider} if at least one JVMCI jar is available + * otherwise returns null. + */ + static JVMCIJarsOptionDescriptorsProvider create() { List<File> jarsList = findJVMCIJars(); + if (jarsList.isEmpty()) { + return null; + } + return new JVMCIJarsOptionDescriptorsProvider(jarsList); + } + + private JVMCIJarsOptionDescriptorsProvider(List<File> jarsList) { this.jars = jarsList.iterator(); this.optionsDescriptorsList = new ArrayList<>(jarsList.size() * 3); } @@ -60,7 +72,7 @@ File lib = new File(javaHome, "lib"); File jvmci = new File(lib, "jvmci"); if (!jvmci.exists()) { - throw new InternalError(jvmci + " does not exist"); + return Collections.emptyList(); } List<File> jarFiles = new ArrayList<>();
--- a/jvmci/jdk.internal.jvmci.options/src/jdk/internal/jvmci/options/OptionsParser.java Thu Oct 01 17:13:13 2015 -0700 +++ b/jvmci/jdk.internal.jvmci.options/src/jdk/internal/jvmci/options/OptionsParser.java Fri Oct 02 10:12:01 2015 +0200 @@ -77,7 +77,7 @@ @SuppressWarnings("try") public static Boolean parseOptionsFromVM(String[] options, boolean parseOptionsFile) { try (InitTimer t = timer("ParseOptions")) { - JVMCIJarsOptionDescriptorsProvider odp = new JVMCIJarsOptionDescriptorsProvider(); + JVMCIJarsOptionDescriptorsProvider odp = JVMCIJarsOptionDescriptorsProvider.create(); if (parseOptionsFile) { File javaHome = new File(System.getProperty("java.home")); @@ -109,7 +109,7 @@ for (int i = 0; i < options.length / 2; i++) { String name = options[i * 2]; String value = options[i * 2 + 1]; - parseOption(OptionsLoader.options, name, value, null, odp); + parseOption(name, value, null, odp, null); } } } @@ -129,7 +129,15 @@ } String name = optionSetting.substring(0, eqIndex); String value = optionSetting.substring(eqIndex + 1); - parseOption(OptionsLoader.options, name, value, setter, odp); + parseOption(name, value, setter, odp, null); + } + + /** + * Resolves {@code options} to a non-null value. This ensures {@link OptionsLoader#options} is + * only loaded if necessary. + */ + private static SortedMap<String, OptionDescriptor> resolveOptions(SortedMap<String, OptionDescriptor> options) { + return options != null ? options : OptionsLoader.options; } /** @@ -138,16 +146,18 @@ * @param name the option name * @param valueString the option value as a string * @param setter the object to notify of the parsed option and value + * @param odp if non-null, the service to use for looking up {@link OptionDescriptor}s + * @param options the options database to use if {@code odp} is null * @throws IllegalArgumentException if there's a problem parsing {@code option} */ - public static void parseOption(SortedMap<String, OptionDescriptor> options, String name, String valueString, OptionConsumer setter, OptionDescriptorsProvider odp) { + public static void parseOption(String name, String valueString, OptionConsumer setter, OptionDescriptorsProvider odp, SortedMap<String, OptionDescriptor> options) { - OptionDescriptor desc = odp == null ? options.get(name) : odp.get(name); + OptionDescriptor desc = odp != null ? odp.get(name) : resolveOptions(options).get(name); if (desc == null && name.equals("PrintFlags")) { desc = OptionDescriptor.create("PrintFlags", Boolean.class, "Prints all JVMCI flags and exits", OptionsParser.class, "PrintFlags", PrintFlags); } if (desc == null) { - List<OptionDescriptor> matches = fuzzyMatch(options, name); + List<OptionDescriptor> matches = fuzzyMatch(resolveOptions(options), name); Formatter msg = new Formatter(); msg.format("Could not find option %s", name); if (!matches.isEmpty()) { @@ -189,7 +199,7 @@ } if (PrintFlags.getValue()) { - printFlags(options, "JVMCI", System.out); + printFlags(resolveOptions(options), "JVMCI", System.out); System.exit(0); } }