changeset 22305:ae5c160bd047

Fixed TruffleLanguage was null when using Value#as with asynchronous evaluation; Unbox EngineTruffleObject before casting to string.
author Christian Humer <christian.humer@oracle.com>
date Tue, 13 Oct 2015 18:53:04 +0200
parents 7e2abecabcac
children 8bc57c7bbf88
files truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java
diffstat 2 files changed, 17 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java	Mon Oct 12 11:41:22 2015 -0700
+++ b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/PolyglotEngine.java	Tue Oct 13 18:53:04 2015 +0200
@@ -499,10 +499,10 @@
             }
         });
         exceptionCheck(result);
-        return createValue(lang[0], result, ready);
+        return createValue(lang, result, ready);
     }
 
-    Value createValue(TruffleLanguage lang, Object[] result, CountDownLatch ready) {
+    Value createValue(TruffleLanguage[] lang, Object[] result, CountDownLatch ready) {
         return new Value(lang, result, ready);
     }
 
@@ -583,7 +583,7 @@
         } else {
             ready.countDown();
         }
-        return obj[0] == null ? null : createValue(lang[0], obj, ready);
+        return obj[0] == null ? null : createValue(lang, obj, ready);
     }
 
     private void findGlobalSymbolImpl(Object[] obj, String globalName, TruffleLanguage<?>[] lang, CountDownLatch ready) {
@@ -675,12 +675,12 @@
      * running on behind.
      */
     public class Value {
-        private final TruffleLanguage<?> language;
+        private final TruffleLanguage<?>[] language;
         private final Object[] result;
         private final CountDownLatch ready;
         private CallTarget target;
 
-        Value(TruffleLanguage<?> language, Object[] result, CountDownLatch ready) {
+        Value(TruffleLanguage<?>[] language, Object[] result, CountDownLatch ready) {
             this.language = language;
             this.result = result;
             this.ready = ready;
@@ -729,8 +729,12 @@
                 }
             }
             if (representation == String.class) {
-                final Class<? extends TruffleLanguage> clazz = language.getClass();
-                return representation.cast(SPI.toString(language, findEnv(clazz), obj));
+                final Class<? extends TruffleLanguage> clazz = language[0].getClass();
+                Object unwrapped = obj;
+                while (unwrapped instanceof EngineTruffleObject) {
+                    unwrapped = ((EngineTruffleObject) obj).getDelegate();
+                }
+                return representation.cast(SPI.toString(language[0], findEnv(clazz), unwrapped));
             }
             if (representation.isInstance(obj)) {
                 return representation.cast(obj);
@@ -773,8 +777,8 @@
             try (final Closeable c = SPI.executionStart(PolyglotEngine.this, -1, debugger, null)) {
                 List<Object> arr = new ArrayList<>();
                 if (thiz == null) {
-                    if (language != null) {
-                        Object global = SPI.languageGlobal(SPI.findLanguage(PolyglotEngine.this, language.getClass()));
+                    if (language[0] != null) {
+                        Object global = SPI.languageGlobal(SPI.findLanguage(PolyglotEngine.this, language[0].getClass()));
                         if (global != null) {
                             arr.add(global);
                         }
@@ -786,7 +790,7 @@
                 for (;;) {
                     try {
                         if (target == null) {
-                            target = SymbolInvokerImpl.createCallTarget(language, result[0], arr.toArray());
+                            target = SymbolInvokerImpl.createCallTarget(language[0], result[0], arr.toArray());
                         }
                         res[0] = target.call(arr.toArray());
                         break;
@@ -891,7 +895,7 @@
             checkThread();
 
             Object[] res = {SPI.languageGlobal(getEnv(true)), null};
-            return res[0] == null ? null : new Value(info.getImpl(true), res, null);
+            return res[0] == null ? null : new Value(new TruffleLanguage[]{info.getImpl(true)}, res, null);
         }
 
         /**
--- a/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java	Mon Oct 12 11:41:22 2015 -0700
+++ b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java	Tue Oct 13 18:53:04 2015 +0200
@@ -135,7 +135,7 @@
     }
 
     @Override
-    Value createValue(TruffleLanguage lang, Object[] result, CountDownLatch ready) {
+    Value createValue(TruffleLanguage[] lang, Object[] result, CountDownLatch ready) {
         return new Symbol(lang, result, ready);
     }
 
@@ -172,7 +172,7 @@
 
     @Deprecated
     public class Symbol extends Value {
-        Symbol(TruffleLanguage<?> language, Object[] result, CountDownLatch ready) {
+        Symbol(TruffleLanguage<?>[] language, Object[] result, CountDownLatch ready) {
             super(language, result, ready);
         }