# HG changeset patch # User Jaroslav Tulach # Date 1447922421 -3600 # Node ID 086776aa7548ca16698f72c0ebb832325ba7a374 # Parent 0e86a9f324bf95e219c3905d6075a358cad67f38 Caching Source -> CallTarget mapping per PolyglotEngine.Language diff -r 0e86a9f324bf -r 086776aa7548 truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/vm/EngineTest.java --- a/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/vm/EngineTest.java Thu Nov 19 09:29:24 2015 +0100 +++ b/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/vm/EngineTest.java Thu Nov 19 09:40:21 2015 +0100 @@ -80,6 +80,9 @@ assertNotEquals("Two executions in different languages don't share the nodes", hashIn1Round1, altIn2Round1); assertNotEquals("Two executions in different languages don't share the nodes", hashIn2Round2, altIn1Round2); assertNotEquals("Two executions in different languages don't share the nodes", hashIn2Round2, altIn2Round2); + + assertNotEquals("Two executions in different engines don't share the nodes", hashIn1Round1, hashIn2Round1); + assertNotEquals("Two executions in different engines don't share the nodes", hashIn2Round2, hashIn1Round2); } protected Thread forbiddenThread() { diff -r 0e86a9f324bf -r 086776aa7548 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 Thu Nov 19 09:29:24 2015 +0100 +++ b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java Thu Nov 19 09:40:21 2015 +0100 @@ -61,6 +61,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.WeakHashMap; import java.util.logging.Level; /** @@ -422,7 +423,7 @@ try (Closeable d = SPI.executionStart(this, -1, debugger, s)) { TruffleLanguage langImpl = l.getImpl(true); fillLang[0] = langImpl; - return SPI.eval(langImpl, s); + return SPI.eval(langImpl, s, l.cache); } } @@ -724,10 +725,12 @@ * {@link PolyglotEngine#eval(com.oracle.truffle.api.source.Source) a code is evaluated} in it. */ public class Language { + private final Map cache; private final LanguageCache info; private TruffleLanguage.Env env; Language(LanguageCache info) { + this.cache = new WeakHashMap<>(); this.info = info; } @@ -885,8 +888,8 @@ } @Override - public Object eval(TruffleLanguage l, Source s) throws IOException { - return super.eval(l, s); + protected Object eval(TruffleLanguage l, Source s, Map cache) throws IOException { + return super.eval(l, s, cache); } @Override diff -r 0e86a9f324bf -r 086776aa7548 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 Thu Nov 19 09:29:24 2015 +0100 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java Thu Nov 19 09:40:21 2015 +0100 @@ -72,8 +72,6 @@ */ @SuppressWarnings("javadoc") public abstract class TruffleLanguage { - private final Map compiled = Collections.synchronizedMap(new WeakHashMap()); - /** * Constructor to be called by subclasses. */ @@ -461,14 +459,14 @@ } @Override - protected Object eval(TruffleLanguage language, Source source) throws IOException { - CallTarget target = language.compiled.get(source); + protected Object eval(TruffleLanguage language, Source source, Map cache) throws IOException { + CallTarget target = cache.get(source); 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); + cache.put(source, target); } try { return target.call(); diff -r 0e86a9f324bf -r 086776aa7548 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 Thu Nov 19 09:29:24 2015 +0100 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java Thu Nov 19 09:40:21 2015 +0100 @@ -49,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.Map; /** * Communication between PolyglotEngine, TruffleLanguage API/SPI, and other services. @@ -153,8 +154,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 Object eval(TruffleLanguage l, Source s, Map cache) throws IOException { + return API.eval(l, s, cache); } protected Object evalInContext(Object vm, SuspendedEvent ev, String code, FrameInstance frame) throws IOException {