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);
         }
     }