Skip to content

Commit 8def100

Browse files
OracleLabsAutomationelkorchi
authored andcommitted
[GR-58725] Backport to 24.1: Fix missing return value conversion in Polyglot.eval[File].
PullRequest: js/3288
2 parents b213e33 + dbb4185 commit 8def100

File tree

3 files changed

+53
-11
lines changed

3 files changed

+53
-11
lines changed

Diff for: graal-js/src/com.oracle.truffle.js.test/src/com/oracle/truffle/js/test/polyglot/PolyglotBuiltinTest.java

+39-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -47,16 +47,24 @@
4747
import static org.junit.Assert.assertTrue;
4848
import static org.junit.Assert.fail;
4949

50+
import java.io.File;
51+
import java.nio.file.Files;
52+
5053
import org.graalvm.polyglot.Context;
5154
import org.graalvm.polyglot.PolyglotAccess;
5255
import org.graalvm.polyglot.PolyglotException;
5356
import org.graalvm.polyglot.Source;
5457
import org.graalvm.polyglot.Value;
58+
import org.graalvm.polyglot.io.IOAccess;
5559
import org.graalvm.polyglot.proxy.ProxyExecutable;
5660
import org.junit.Test;
5761

62+
import com.oracle.truffle.api.CallTarget;
63+
import com.oracle.truffle.api.nodes.RootNode;
5864
import com.oracle.truffle.js.lang.JavaScriptLanguage;
65+
import com.oracle.truffle.js.runtime.Errors;
5966
import com.oracle.truffle.js.runtime.JSContextOptions;
67+
import com.oracle.truffle.js.runtime.JSRuntime;
6068
import com.oracle.truffle.js.test.JSTest;
6169

6270
/**
@@ -279,4 +287,34 @@ public void testEvalInternalLanguage() {
279287
}
280288
}
281289
}
290+
291+
@SuppressWarnings("try")
292+
@Test
293+
public void testEvalReturnValue() throws Exception {
294+
try (AutoCloseable languageScope = TestLanguage.withTestLanguage(new TestLanguage() {
295+
@Override
296+
protected CallTarget parse(ParsingRequest request) throws Exception {
297+
String code = request.getSource().getCharacters().toString();
298+
if (code.startsWith("\"") && code.endsWith("\"")) {
299+
String string = code.substring(1, code.length() - 1);
300+
return RootNode.createConstantNode(string).getCallTarget();
301+
}
302+
throw Errors.createSyntaxError(code);
303+
}
304+
})) {
305+
IOAccess fileAccess = IOAccess.newBuilder().allowHostFileAccess(true).build();
306+
try (Context context = Context.newBuilder().allowIO(fileAccess).allowPolyglotAccess(PolyglotAccess.ALL).build()) {
307+
Value result = context.eval(Source.create(JavaScriptLanguage.ID, "Polyglot.eval('" + TestLanguage.ID + "', '\"something\"');"));
308+
assertTrue(result.isString());
309+
assertEquals("something", result.asString());
310+
311+
File tmpFile = File.createTempFile("polyglot-evalfile-test", null);
312+
tmpFile.deleteOnExit();
313+
Files.writeString(tmpFile.toPath(), "\"nanika\"");
314+
result = context.eval(Source.create(JavaScriptLanguage.ID, "Polyglot.evalFile('" + TestLanguage.ID + "', " + JSRuntime.quote(tmpFile.getPath()) + ");"));
315+
assertTrue(result.isString());
316+
assertEquals("nanika", result.asString());
317+
}
318+
}
319+
}
282320
}

Diff for: graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/builtins/PolyglotBuiltins.java

+12-8
Original file line numberDiff line numberDiff line change
@@ -253,17 +253,19 @@ protected Object evalCachedLanguage(TruffleString language, TruffleString source
253253
@Cached TruffleString.EqualNode strEq,
254254
@Cached @Shared TruffleString.ToJavaStringNode toJavaStringNode,
255255
@Cached("getLanguageIdAndMimeType(toJavaStringNode, language)") Pair<String, String> languagePair,
256-
@Cached @Shared IndirectCallNode callNode) {
257-
return callNode.call(evalStringIntl(source, languagePair.getFirst(), languagePair.getSecond()));
256+
@Cached @Shared IndirectCallNode callNode,
257+
@Cached @Shared ImportValueNode importValueNode) {
258+
return importValueNode.executeWithTarget(callNode.call(evalStringIntl(source, languagePair.getFirst(), languagePair.getSecond())));
258259
}
259260

260261
@Specialization(replaces = "evalCachedLanguage")
261262
@TruffleBoundary
262263
protected Object evalString(TruffleString language, TruffleString source,
263264
@Cached @Shared TruffleString.ToJavaStringNode toJavaStringNode,
264-
@Cached @Shared IndirectCallNode callNode) {
265+
@Cached @Shared IndirectCallNode callNode,
266+
@Cached @Shared ImportValueNode importValueNode) {
265267
Pair<String, String> pair = getLanguageIdAndMimeType(toJavaStringNode, language);
266-
return callNode.call(evalStringIntl(source, pair.getFirst(), pair.getSecond()));
268+
return importValueNode.executeWithTarget(callNode.call(evalStringIntl(source, pair.getFirst(), pair.getSecond())));
267269
}
268270

269271
private CallTarget evalStringIntl(TruffleString sourceText, String languageId, String mimeType) {
@@ -300,17 +302,19 @@ protected Object evalFileCachedLanguage(TruffleString language, TruffleString fi
300302
@Cached TruffleString.EqualNode strEq,
301303
@Cached @Shared TruffleString.ToJavaStringNode toJavaStringNode,
302304
@Cached("getLanguageIdAndMimeType(toJavaStringNode, language)") Pair<String, String> languagePair,
303-
@Cached @Shared IndirectCallNode callNode) {
304-
return callNode.call(evalFileIntl(file, languagePair.getFirst(), languagePair.getSecond()));
305+
@Cached @Shared IndirectCallNode callNode,
306+
@Cached @Shared ImportValueNode importValueNode) {
307+
return importValueNode.executeWithTarget(callNode.call(evalFileIntl(file, languagePair.getFirst(), languagePair.getSecond())));
305308
}
306309

307310
@Specialization(replaces = "evalFileCachedLanguage")
308311
@TruffleBoundary
309312
protected Object evalFileString(TruffleString language, TruffleString file,
310313
@Cached @Shared TruffleString.ToJavaStringNode toJavaStringNode,
311-
@Cached @Shared IndirectCallNode callNode) {
314+
@Cached @Shared IndirectCallNode callNode,
315+
@Cached @Shared ImportValueNode importValueNode) {
312316
Pair<String, String> pair = getLanguageIdAndMimeType(toJavaStringNode, language);
313-
return callNode.call(evalFileIntl(file, pair.getFirst(), pair.getSecond()));
317+
return importValueNode.executeWithTarget(callNode.call(evalFileIntl(file, pair.getFirst(), pair.getSecond())));
314318
}
315319

316320
private CallTarget evalFileIntl(TruffleString fileName, String languageId, String mimeType) {

Diff for: graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/interop/ExportValueNode.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,9 @@ protected static TruffleObject doTruffleObject(TruffleObject value, @SuppressWar
161161
}
162162

163163
@TruffleBoundary
164-
@Specialization(guards = {"!isTruffleObject(thiz)", "!isString(thiz)", "!isBoolean(thiz)", "!isNumberDouble(thiz)", "!isNumberLong(thiz)", "!isNumberInteger(thiz)"})
164+
@Specialization(guards = {"!isTruffleObject(value)", "!isString(value)", "!isBoolean(value)", "!isNumberDouble(value)", "!isNumberLong(value)", "!isNumberInteger(value)"})
165165
protected static Object doOther(Object value, @SuppressWarnings("unused") Object thiz, @SuppressWarnings("unused") boolean bindFunctions) {
166-
throw Errors.createTypeErrorFormat("Cannot convert to TruffleObject: %s", value == null ? null : value.getClass().getSimpleName());
166+
throw Errors.createTypeErrorFormat("Cannot convert to TruffleObject: %s", value == null ? null : value.getClass().getTypeName());
167167
}
168168

169169
@NeverDefault

0 commit comments

Comments
 (0)