Skip to content

Commit ee1eb02

Browse files
committed
JSON.stringify() should try to use toJSON() of foreign objects.
1 parent 99c3e0c commit ee1eb02

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/builtins/helper/JSONStringifyStringNode.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,14 @@ private Object jsonStrPrepareForeign(JSONData data, int key, Object holder) {
199199

200200
private Object jsonStrPreparePart2(JSONData data, String key, Object holder, Object valueArg) {
201201
Object value = valueArg;
202+
boolean tryToJSON = false;
202203
if (JSRuntime.isObject(value) || JSRuntime.isBigInt(value)) {
204+
tryToJSON = true;
205+
} else if (JSRuntime.isForeignObject(value)) {
206+
InteropLibrary interop = InteropLibrary.getUncached(value);
207+
tryToJSON = interop.hasMembers(value) && !interop.isNull(value) && !interop.isBoolean(value) && !interop.isString(value) && !interop.isNumber(value);
208+
}
209+
if (tryToJSON) {
203210
value = jsonStrPrepareObject(key, value);
204211
}
205212

@@ -241,12 +248,12 @@ private Object jsonStrPrepareObject(Object key, Object value) {
241248
}
242249
Object toJSON = getToJSONProperty.getValue(value);
243250
if (JSRuntime.isCallable(toJSON)) {
244-
return jsonStrPrepareObjectFunction(key, value, (DynamicObject) toJSON);
251+
return jsonStrPrepareObjectFunction(key, value, toJSON);
245252
}
246253
return value;
247254
}
248255

249-
private Object jsonStrPrepareObjectFunction(Object key, Object value, DynamicObject toJSON) {
256+
private Object jsonStrPrepareObjectFunction(Object key, Object value, Object toJSON) {
250257
if (callToJSONFunction == null) {
251258
CompilerDirectives.transferToInterpreterAndInvalidate();
252259
callToJSONFunction = insert(JSFunctionCallNode.createCall());

0 commit comments

Comments
 (0)