changeset 22373:dea950d41ef3

Make CallTarget caching local to PolyglotEngine instances.
author Christian Humer <christian.humer@oracle.com>
date Tue, 17 Nov 2015 16:50:11 +0100
parents 6598b9b7aafd
children 299c279c87b3
files truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java
diffstat 3 files changed, 22 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java	Tue Nov 17 11:02:55 2015 +0100
+++ b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java	Tue Nov 17 16:50:11 2015 +0100
@@ -37,6 +37,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.WeakHashMap;
 import java.util.concurrent.Executor;
 import java.util.logging.Logger;
 
@@ -61,6 +62,7 @@
 import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.api.nodes.RootNode;
 import com.oracle.truffle.api.source.Source;
+
 import java.util.logging.Level;
 
 /**
@@ -113,6 +115,7 @@
     private final Map<String, Object> globals;
     private final Instrumenter instrumenter;
     private final Debugger debugger;
+    private final Map<Source, CallTarget> cache = new WeakHashMap<>();
     private boolean disposed;
 
     /**
@@ -422,7 +425,16 @@
         try (Closeable d = SPI.executionStart(this, -1, debugger, s)) {
             TruffleLanguage<?> langImpl = l.getImpl(true);
             fillLang[0] = langImpl;
-            return SPI.eval(langImpl, s);
+            CallTarget cachedTarget = cache.get(s);
+            if (cachedTarget == null) {
+                cachedTarget = SPI.parseForEval(langImpl, s);
+                cache.put(s, cachedTarget);
+            }
+            try {
+                return cachedTarget.call();
+            } catch (Throwable ex) {
+                throw new IOException(ex);
+            }
         }
     }
 
@@ -885,8 +897,8 @@
         }
 
         @Override
-        public Object eval(TruffleLanguage<?> l, Source s) throws IOException {
-            return super.eval(l, s);
+        public CallTarget parseForEval(TruffleLanguage<?> l, Source s) throws IOException {
+            return super.parseForEval(l, s);
         }
 
         @Override
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java	Tue Nov 17 11:02:55 2015 +0100
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java	Tue Nov 17 16:50:11 2015 +0100
@@ -31,9 +31,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
-import java.util.Collections;
-import java.util.Map;
-import java.util.WeakHashMap;
+import java.util.Objects;
 
 import com.oracle.truffle.api.debug.Debugger;
 import com.oracle.truffle.api.debug.SuspendedEvent;
@@ -49,7 +47,6 @@
 import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.api.nodes.RootNode;
 import com.oracle.truffle.api.source.Source;
-import java.util.Objects;
 
 /**
  * An entry point for everyone who wants to implement a Truffle based language. By providing an
@@ -72,7 +69,6 @@
  */
 @SuppressWarnings("javadoc")
 public abstract class TruffleLanguage<C> {
-    private final Map<Source, CallTarget> compiled = Collections.synchronizedMap(new WeakHashMap<Source, CallTarget>());
 
     /**
      * Constructor to be called by subclasses.
@@ -440,20 +436,12 @@
         }
 
         @Override
-        protected Object eval(TruffleLanguage<?> language, Source source) throws IOException {
-            CallTarget target = language.compiled.get(source);
+        protected CallTarget parseForEval(TruffleLanguage<?> language, Source source) throws IOException {
+            CallTarget target = language.parse(source, null);
             if (target == null) {
-                target = language.parse(source, null);
-                if (target == null) {
-                    throw new IOException("Parsing has not produced a CallTarget for " + source);
-                }
-                language.compiled.put(source, target);
+                throw new IOException("Parsing has not produced a CallTarget for " + source);
             }
-            try {
-                return target.call();
-            } catch (Throwable ex) {
-                throw new IOException(ex);
-            }
+            return target;
         }
 
         @Override
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java	Tue Nov 17 11:02:55 2015 +0100
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java	Tue Nov 17 16:50:11 2015 +0100
@@ -153,8 +153,8 @@
         return API.attachEnv(vm, language, stdOut, stdErr, stdIn, instrumenter);
     }
 
-    protected Object eval(TruffleLanguage<?> l, Source s) throws IOException {
-        return API.eval(l, s);
+    protected CallTarget parseForEval(TruffleLanguage<?> l, Source s) throws IOException {
+        return API.parseForEval(l, s);
     }
 
     protected Object evalInContext(Object vm, SuspendedEvent ev, String code, FrameInstance frame) throws IOException {