Mercurial > hg > truffle
changeset 22133:c334865b9d42
Make sure TruffleLanguage.createEnv is only called when Accessor.CURRENT_VM is known
author | Jaroslav Tulach <jaroslav.tulach@oracle.com> |
---|---|
date | Fri, 04 Sep 2015 10:39:23 +0200 |
parents | 19205292b0c7 |
children | 025869c88840 |
files | truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.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, 26 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java Fri Sep 04 09:10:27 2015 +0200 +++ b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java Fri Sep 04 10:39:23 2015 +0200 @@ -431,10 +431,7 @@ executor.execute(new Runnable() { @Override public void run() { - TruffleLanguage<?> langImpl = l.getImpl(); - lang[0] = langImpl; - TruffleVM.findDebuggerSupport(langImpl); - evalImpl(fillIn, s, result, langImpl, ready); + evalImpl(fillIn, lang, s, result, l, ready); } }); exceptionCheck(result); @@ -442,12 +439,15 @@ } @SuppressWarnings("try") - private void evalImpl(Debugger[] fillIn, Source s, Object[] result, TruffleLanguage<?> l, CountDownLatch ready) { + private void evalImpl(Debugger[] fillIn, TruffleLanguage<?>[] fillLang, Source s, Object[] result, Language l, CountDownLatch ready) { try (Closeable d = SPI.executionStart(this, fillIn, s)) { + TruffleLanguage<?> langImpl = l.getImpl(); + fillLang[0] = langImpl; + TruffleVM.findDebuggerSupport(langImpl); if (debugger == null) { debugger = fillIn[0]; } - result[0] = SPI.eval(l, s); + result[0] = SPI.eval(langImpl, s); } catch (IOException ex) { result[1] = ex; } finally { @@ -498,7 +498,10 @@ private void findGlobalSymbolImpl(Object[] obj, String globalName, TruffleLanguage<?>[] lang, CountDownLatch ready) { if (obj[0] == null) { for (Language dl : langs.values()) { - TruffleLanguage<?> l = dl.getImpl(); + TruffleLanguage<?> l = dl.getImpl(false); + if (l == null) { + continue; + } obj[0] = SPI.findExportedSymbol(dl.getEnv(), globalName, true); if (obj[0] != null) { lang[0] = l; @@ -508,7 +511,10 @@ } if (obj[0] == null) { for (Language dl : langs.values()) { - TruffleLanguage<?> l = dl.getImpl(); + TruffleLanguage<?> l = dl.getImpl(false); + if (l == null) { + continue; + } obj[0] = SPI.findExportedSymbol(dl.getEnv(), globalName, false); if (obj[0] != null) { lang[0] = l; @@ -737,7 +743,11 @@ } TruffleLanguage<?> getImpl() { - if (impl == null) { + return getImpl(true); + } + + TruffleLanguage<?> getImpl(boolean create) { + if (impl == null && create) { String n = props.getProperty(prefix + "className"); try { impl = LanguageCache.find(n, loader());
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java Fri Sep 04 09:10:27 2015 +0200 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java Fri Sep 04 10:39:23 2015 +0200 @@ -24,14 +24,13 @@ */ package com.oracle.truffle.api; -import java.io.*; -import java.lang.annotation.*; - import com.oracle.truffle.api.debug.*; import com.oracle.truffle.api.impl.*; import com.oracle.truffle.api.instrument.*; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.source.*; +import java.io.*; +import java.lang.annotation.*; import java.util.Collections; import java.util.Map; import java.util.WeakHashMap; @@ -217,6 +216,8 @@ public LangCtx(TruffleLanguage<C> lang, Env env) { this.lang = lang; + // following call verifies that Accessor.CURRENT_VM is provided + assert API.findLanguage(null, null) == null; this.ctx = lang.createContext(env); }
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java Fri Sep 04 09:10:27 2015 +0200 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java Fri Sep 04 10:39:23 2015 +0200 @@ -167,6 +167,9 @@ if (vm == null) { throw new IllegalStateException(); } + if (languageClass == null) { + return null; + } } else { vm = known; }