diff truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java @ 22100:2a22cec84114

Call reflection and service loader code from static initializers
author Christian Wimmer <christian.wimmer@oracle.com>
date Fri, 21 Aug 2015 11:17:20 -0700
parents 77562c7bc5a6
children c2cb9f1c8688
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java	Fri Aug 21 16:19:26 2015 +0200
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java	Fri Aug 21 11:17:20 2015 -0700
@@ -155,11 +155,20 @@
         return API.getDebugSupport(l);
     }
 
-    protected CallTarget createCallTarget(TruffleLanguage<?> lang, Object obj, Object[] args) throws IOException {
+    private static final SymbolInvoker INVOKER;
+
+    static {
+        SymbolInvoker singleton = null;
         for (SymbolInvoker si : ServiceLoader.load(SymbolInvoker.class)) {
-            return si.createCallTarget(lang, obj, args);
+            assert singleton == null : "More than one SymbolInvoker found: " + singleton + ", " + si;
+            singleton = si;
         }
-        throw new IOException("No symbol invoker found!");
+        assert singleton != null : "No SymbolInvoker found";
+        INVOKER = singleton;
+    }
+
+    protected CallTarget createCallTarget(TruffleLanguage<?> lang, Object obj, Object[] args) throws IOException {
+        return INVOKER.createCallTarget(lang, obj, args);
     }
 
     protected Class<? extends TruffleLanguage> findLanguage(RootNode n) {