changeset 22374:299c279c87b3

Backed out changeset dea950d41ef3
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Wed, 18 Nov 2015 09:02:41 +0100
parents dea950d41ef3
children b4e89154a774
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 16:50:11 2015 +0100
+++ b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java	Wed Nov 18 09:02:41 2015 +0100
@@ -37,7 +37,6 @@
 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;
 
@@ -62,7 +61,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.logging.Level;
 
 /**
@@ -115,7 +113,6 @@
     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;
 
     /**
@@ -425,16 +422,7 @@
         try (Closeable d = SPI.executionStart(this, -1, debugger, s)) {
             TruffleLanguage<?> langImpl = l.getImpl(true);
             fillLang[0] = langImpl;
-            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);
-            }
+            return SPI.eval(langImpl, s);
         }
     }
 
@@ -897,8 +885,8 @@
         }
 
         @Override
-        public CallTarget parseForEval(TruffleLanguage<?> l, Source s) throws IOException {
-            return super.parseForEval(l, s);
+        public Object eval(TruffleLanguage<?> l, Source s) throws IOException {
+            return super.eval(l, s);
         }
 
         @Override
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java	Tue Nov 17 16:50:11 2015 +0100
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java	Wed Nov 18 09:02:41 2015 +0100
@@ -31,7 +31,9 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
-import java.util.Objects;
+import java.util.Collections;
+import java.util.Map;
+import java.util.WeakHashMap;
 
 import com.oracle.truffle.api.debug.Debugger;
 import com.oracle.truffle.api.debug.SuspendedEvent;
@@ -47,6 +49,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.Objects;
 
 /**
  * An entry point for everyone who wants to implement a Truffle based language. By providing an
@@ -69,6 +72,7 @@
  */
 @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.
@@ -436,12 +440,20 @@
         }
 
         @Override
-        protected CallTarget parseForEval(TruffleLanguage<?> language, Source source) throws IOException {
-            CallTarget target = language.parse(source, null);
+        protected Object eval(TruffleLanguage<?> language, Source source) throws IOException {
+            CallTarget target = language.compiled.get(source);
             if (target == null) {
-                throw new IOException("Parsing has not produced a CallTarget for " + source);
+                target = language.parse(source, null);
+                if (target == null) {
+                    throw new IOException("Parsing has not produced a CallTarget for " + source);
+                }
+                language.compiled.put(source, target);
             }
-            return target;
+            try {
+                return target.call();
+            } catch (Throwable ex) {
+                throw new IOException(ex);
+            }
         }
 
         @Override
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java	Tue Nov 17 16:50:11 2015 +0100
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java	Wed Nov 18 09:02:41 2015 +0100
@@ -153,8 +153,8 @@
         return API.attachEnv(vm, language, stdOut, stdErr, stdIn, instrumenter);
     }
 
-    protected CallTarget parseForEval(TruffleLanguage<?> l, Source s) throws IOException {
-        return API.parseForEval(l, s);
+    protected Object eval(TruffleLanguage<?> l, Source s) throws IOException {
+        return API.eval(l, s);
     }
 
     protected Object evalInContext(Object vm, SuspendedEvent ev, String code, FrameInstance frame) throws IOException {