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);
         }
     }