src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionsParser.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionsParser.java Tue Mar 12 12:12:01 2019 -0700
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionsParser.java Tue Mar 12 19:17:42 2019 +0100
@@ -24,6 +24,9 @@
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;
@@ -39,11 +42,15 @@
*/
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) {
@@ -58,7 +65,15 @@
*/
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;
}
/**
@@ -178,7 +193,7 @@
}
}
- desc.optionKey.update(values, value);
+ desc.getOptionKey().update(values, value);
}
private static long parseLong(String v) {