Mercurial > hg > truffle
changeset 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 | 9e0ac14f941b |
files | truffle/com.oracle.truffle.api.interop/src/com/oracle/truffle/api/interop/impl/SymbolInvokerImpl.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/SymbolInvoker.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/vm/TruffleVM.java |
diffstat | 4 files changed, 36 insertions(+), 23 deletions(-) [+] |
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); } }
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java Mon Aug 17 14:54:11 2015 +0200 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java Mon Aug 17 15:20:42 2015 +0200 @@ -155,9 +155,9 @@ return API.getDebugSupport(l); } - protected Object invoke(TruffleLanguage<?> lang, Object obj, Object[] args) throws IOException { + protected CallTarget createCallTarget(TruffleLanguage<?> lang, Object obj, Object[] args) throws IOException { for (SymbolInvoker si : ServiceLoader.load(SymbolInvoker.class)) { - return si.invoke(lang, obj, args); + return si.createCallTarget(lang, obj, args); } throw new IOException("No symbol invoker found!"); }
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/SymbolInvoker.java Mon Aug 17 14:54:11 2015 +0200 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/SymbolInvoker.java Mon Aug 17 15:20:42 2015 +0200 @@ -24,6 +24,7 @@ */ package com.oracle.truffle.api.impl; +import com.oracle.truffle.api.CallTarget; import com.oracle.truffle.api.TruffleLanguage; import java.io.*; @@ -32,5 +33,5 @@ * associated nodes too much. */ public abstract class SymbolInvoker { - protected abstract Object invoke(TruffleLanguage<?> lang, Object symbol, Object... args) throws IOException; + protected abstract CallTarget createCallTarget(TruffleLanguage<?> lang, Object symbol, Object... args) throws IOException; }
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/vm/TruffleVM.java Mon Aug 17 14:54:11 2015 +0200 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/vm/TruffleVM.java Mon Aug 17 15:20:42 2015 +0200 @@ -453,6 +453,7 @@ private final TruffleLanguage<?> language; private final Object obj; private final Object global; + private CallTarget target; Symbol(TruffleLanguage<?> language, Object obj, Object global) { this.language = language; @@ -487,7 +488,10 @@ arr.add(thiz); } arr.addAll(Arrays.asList(args)); - return SPI.invoke(language, obj, arr.toArray()); + if (target == null) { + target = SPI.createCallTarget(language, obj, arr.toArray()); + } + return target.call(arr.toArray()); } } } @@ -658,8 +662,8 @@ } @Override - protected Object invoke(TruffleLanguage<?> lang, Object obj, Object[] args) throws IOException { - return super.invoke(lang, obj, args); + protected CallTarget createCallTarget(TruffleLanguage<?> lang, Object obj, Object[] args) throws IOException { + return super.createCallTarget(lang, obj, args); } @Override