Mercurial > hg > truffle
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) {