< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionsParser.java

Print this page

        

@@ -22,10 +22,13 @@
  */
 
 
 package org.graalvm.compiler.options;
 
+import static jdk.vm.ci.services.Services.IS_BUILDING_NATIVE_IMAGE;
+import static jdk.vm.ci.services.Services.IS_IN_NATIVE_IMAGE;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Formatter;
 import java.util.List;
 import java.util.ServiceLoader;

@@ -37,15 +40,19 @@
  * This class contains methods for parsing Graal options and matching them against a set of
  * {@link OptionDescriptors}. The {@link OptionDescriptors} are loaded via a {@link ServiceLoader}.
  */
 public class OptionsParser {
 
+    private static volatile List<OptionDescriptors> cachedOptionDescriptors;
+
     /**
-     * Gets an iterable composed of the {@link ServiceLoader}s to be used when looking for
-     * {@link OptionDescriptors} providers.
+     * Gets an iterable of available {@link OptionDescriptors}.
      */
     public static Iterable<OptionDescriptors> getOptionsLoader() {
+        if (IS_IN_NATIVE_IMAGE || cachedOptionDescriptors != null) {
+            return cachedOptionDescriptors;
+        }
         boolean java8OrEarlier = System.getProperty("java.specification.version").compareTo("1.9") < 0;
         ClassLoader loader;
         if (java8OrEarlier) {
             // On JDK 8, Graal and its extensions are loaded by same class loader.
             loader = OptionDescriptors.class.getClassLoader();

@@ -56,11 +63,19 @@
              * class loader. As such, we need to start the provider search at the app class loader
              * instead of the platform class loader.
              */
             loader = ClassLoader.getSystemClassLoader();
         }
-        return ServiceLoader.load(OptionDescriptors.class, loader);
+        Iterable<OptionDescriptors> result = ServiceLoader.load(OptionDescriptors.class, loader);
+        if (IS_BUILDING_NATIVE_IMAGE) {
+            ArrayList<OptionDescriptors> optionDescriptors = new ArrayList<>();
+            for (OptionDescriptors descriptors : result) {
+                optionDescriptors.add(descriptors);
+            }
+            OptionsParser.cachedOptionDescriptors = optionDescriptors;
+        }
+        return result;
     }
 
     /**
      * Parses a map representing assignments of values to options.
      *

@@ -176,11 +191,11 @@
                     throw new IllegalArgumentException("Value for option '" + name + "' has invalid number format: " + valueString);
                 }
             }
         }
 
-        desc.optionKey.update(values, value);
+        desc.getOptionKey().update(values, value);
     }
 
     private static long parseLong(String v) {
         String valueString = v.toLowerCase();
         long scale = 1;
< prev index next >