--- old/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.services/src/jdk/vm/ci/services/Services.java 2017-04-20 21:50:04.000000000 +0200 +++ new/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.services/src/jdk/vm/ci/services/Services.java 2017-04-20 21:50:04.000000000 +0200 @@ -26,18 +26,52 @@ import java.lang.reflect.Method; import java.util.Formatter; import java.util.Iterator; +import java.util.Map; import java.util.ServiceConfigurationError; import java.util.ServiceLoader; import java.util.Set; /** - * A mechanism for accessing service providers via JVMCI. + * Provides utilities needed by JVMCI clients. + * + * This class must be compilable on JDK 8 and so use of API added in JDK 9 is made via reflection. */ public final class Services { private Services() { } + /** + * Gets an unmodifiable copy of the system properties saved when {@link System} is initialized. + */ + @SuppressWarnings("unchecked") + public static Map getSavedProperties() { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + sm.checkPermission(new JVMCIPermission()); + } + try { + Class vmClass = Class.forName("jdk.internal.misc.VM"); + Method m = vmClass.getMethod("getSavedProperties"); + return (Map) m.invoke(null); + } catch (Exception e) { + throw new InternalError(e); + } + } + + /** + * Causes the JVMCI subsystem to be initialized if it isn't already initialized. + */ + public static void initializeJVMCI() { + try { + Class.forName("jdk.vm.ci.runtime.JVMCI"); + } catch (ClassNotFoundException e) { + throw new InternalError(e); + } + } + + // EVERYTHING BELOW HERE TO BE REMOVED AFTER NECESSARY GRAAL UPDATE + private static int getJavaSpecificationVersion() { String value = System.getProperty("java.specification.version"); if (value.startsWith("1.")) { @@ -185,4 +219,5 @@ } return singleProvider; } + }