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