Mercurial > hg > truffle
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); }