# HG changeset patch # User Jaroslav Tulach # Date 1441355963 -7200 # Node ID c334865b9d42350d81808f5e513e73c63936d943 # Parent 19205292b0c71884158482e296c83dc003864869 Make sure TruffleLanguage.createEnv is only called when Accessor.CURRENT_VM is known diff -r 19205292b0c7 -r c334865b9d42 truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java --- 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()); diff -r 19205292b0c7 -r c334865b9d42 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 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 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); } diff -r 19205292b0c7 -r c334865b9d42 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 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; }