@@ -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