# HG changeset patch # User Doug Simon # Date 1443773521 -7200 # Node ID 5cd42bb63fad02139f1b1983f607d4348afe019b # Parent 9f24bf92ee949540492a778855f11f407c120ffc made initialization of OptionsLoader lazy again diff -r 9f24bf92ee94 -r 5cd42bb63fad jvmci/jdk.internal.jvmci.options/src/jdk/internal/jvmci/options/JVMCIJarsOptionDescriptorsProvider.java --- 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 /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 jars; private final List optionsDescriptorsList; - JVMCIJarsOptionDescriptorsProvider() { + /** + * Creates a {@link JVMCIJarsOptionDescriptorsProvider} if at least one JVMCI jar is available + * otherwise returns null. + */ + static JVMCIJarsOptionDescriptorsProvider create() { List jarsList = findJVMCIJars(); + if (jarsList.isEmpty()) { + return null; + } + return new JVMCIJarsOptionDescriptorsProvider(jarsList); + } + + private JVMCIJarsOptionDescriptorsProvider(List 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 jarFiles = new ArrayList<>(); diff -r 9f24bf92ee94 -r 5cd42bb63fad jvmci/jdk.internal.jvmci.options/src/jdk/internal/jvmci/options/OptionsParser.java --- 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 resolveOptions(SortedMap 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 options, String name, String valueString, OptionConsumer setter, OptionDescriptorsProvider odp) { + public static void parseOption(String name, String valueString, OptionConsumer setter, OptionDescriptorsProvider odp, SortedMap 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 matches = fuzzyMatch(options, name); + List 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); } }