Mercurial > hg > truffle
diff truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/impl/SymbolInvokerImpl.java @ 22084:77562c7bc5a6
Caching the CallTarget in Symbol, so it may get hot one day
author | Jaroslav Tulach <jaroslav.tulach@oracle.com> |
---|---|
date | Mon, 17 Aug 2015 15:20:42 +0200 |
parents | 245dc37053f3 |
children | 93bfc9602271 |
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/impl/SymbolInvokerImpl.java Mon Aug 17 14:54:11 2015 +0200 +++ b/truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/impl/SymbolInvokerImpl.java Mon Aug 17 15:20:42 2015 +0200 @@ -39,40 +39,48 @@ @SuppressWarnings("unchecked") @Override - protected Object invoke(TruffleLanguage<?> lang, Object symbol, Object... arr) throws IOException { - if (symbol instanceof String) { - return symbol; - } - if (symbol instanceof Number) { - return symbol; + protected CallTarget createCallTarget(TruffleLanguage<?> lang, Object symbol, Object... arr) throws IOException { + Class<? extends TruffleLanguage<?>> type = (Class<? extends TruffleLanguage<?>>) lang.getClass(); + RootNode symbolNode; + if ((symbol instanceof String) || (symbol instanceof Number) || (symbol instanceof Boolean) || (symbol instanceof Character)) { + symbolNode = new ConstantRootNode(type, symbol); + } else { + Node executeMain = Message.createExecute(arr.length).createNode(); + symbolNode = new TemporaryRoot(type, executeMain, (TruffleObject) symbol); } - if (symbol instanceof Boolean) { - return symbol; + return Truffle.getRuntime().createCallTarget(symbolNode); + } + + private final class ConstantRootNode extends RootNode { + + private final Object value; + + public ConstantRootNode(Class<? extends TruffleLanguage<?>> lang, Object value) { + super(lang, null, null); + this.value = value; } - Class<? extends TruffleLanguage<?>> type = (Class<? extends TruffleLanguage<?>>) lang.getClass(); - Node executeMain = Message.createExecute(arr.length).createNode(); - CallTarget callTarget = Truffle.getRuntime().createCallTarget(new TemporaryRoot(type, executeMain, (TruffleObject) symbol, arr)); - VirtualFrame frame = Truffle.getRuntime().createVirtualFrame(arr, UNUSED_FRAMEDESCRIPTOR); - return callTarget.call(frame); + + @Override + public Object execute(VirtualFrame vf) { + return value; + } } private static class TemporaryRoot extends RootNode { @Child private Node foreignAccess; @Child private ConvertNode convert; private final TruffleObject function; - private final Object[] args; - public TemporaryRoot(Class<? extends TruffleLanguage<?>> lang, Node foreignAccess, TruffleObject function, Object... args) { + public TemporaryRoot(Class<? extends TruffleLanguage<?>> lang, Node foreignAccess, TruffleObject function) { super(lang, null, null); this.foreignAccess = foreignAccess; this.convert = new ConvertNode(); this.function = function; - this.args = args; } @Override public Object execute(VirtualFrame frame) { - Object tmp = ForeignAccess.execute(foreignAccess, frame, function, args); + Object tmp = ForeignAccess.execute(foreignAccess, frame, function, frame.getArguments()); return convert.convert(frame, tmp); } }