# HG changeset patch # User Christian Humer # Date 1447775411 -3600 # Node ID dea950d41ef34ae68759ff0300a1fd80cf145c0f # Parent 6598b9b7aafd07d4860a988b5971b553ad21d161 Make CallTarget caching local to PolyglotEngine instances. diff -r 6598b9b7aafd -r dea950d41ef3 truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java --- 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 globals; private final Instrumenter instrumenter; private final Debugger debugger; + private final Map 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 diff -r 6598b9b7aafd -r dea950d41ef3 truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java --- 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 { - private final Map compiled = Collections.synchronizedMap(new WeakHashMap()); /** * 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 diff -r 6598b9b7aafd -r dea950d41ef3 truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java --- 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 {