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;
         }