diff graal/com.oracle.truffle.api/src/com/oracle/truffle/api/Truffle.java @ 21887:543f150e7fa0

com.oracle.jvmci.service.Service is now a marker for service implementations available via JVMCI; removed Truffle -> JVMCI dependency
author Doug Simon <doug.simon@oracle.com>
date Tue, 09 Jun 2015 22:44:34 +0200
parents ffe693cc427f
children 0a6e10379b9b
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/Truffle.java	Tue Jun 09 22:31:05 2015 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/Truffle.java	Tue Jun 09 22:44:34 2015 +0200
@@ -24,9 +24,9 @@
  */
 package com.oracle.truffle.api;
 
+import java.lang.reflect.*;
 import java.security.*;
 
-import com.oracle.jvmci.service.*;
 import com.oracle.truffle.api.impl.*;
 
 /**
@@ -55,11 +55,22 @@
         return AccessController.doPrivileged(new PrivilegedAction<TruffleRuntime>() {
             public TruffleRuntime run() {
                 TruffleRuntimeAccess access = null;
+                Class<?> servicesClass = null;
                 try {
-                    access = Services.loadSingle(TruffleRuntimeAccess.class, false);
-                } catch (NoClassDefFoundError e) {
+                    servicesClass = Class.forName("com.oracle.jvmci.service.Services");
+                } catch (ClassNotFoundException e) {
                     // JVMCI is unavailable
                 }
+                if (servicesClass != null) {
+                    try {
+                        Method m = servicesClass.getDeclaredMethod("loadSingle", Class.class, boolean.class);
+                        access = (TruffleRuntimeAccess) m.invoke(null, TruffleRuntimeAccess.class, false);
+                    } catch (Throwable e) {
+                        // Fail fast for other errors
+                        throw (InternalError) new InternalError().initCause(e);
+                    }
+                }
+                // TODO: try standard ServiceLoader?
                 if (access != null) {
                     return access.getRuntime();
                 }