diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-json.c b/jerry-core/ecma/builtin-objects/ecma-builtin-json.c index aa42c4cfb..c55732f20 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-json.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-json.c @@ -1253,15 +1253,25 @@ ecma_builtin_json_serialize_property (ecma_json_stringify_context_t *context_p, } /* 3. */ - if (ecma_is_value_object (value)) + if (ecma_is_value_object (value) || ecma_is_value_bigint (value)) { - ecma_object_t *value_obj_p = ecma_get_object_from_value (value); + ecma_value_t to_object_value = ecma_op_to_object (value); - ecma_value_t to_json = ecma_op_object_get_by_magic_id (value_obj_p, LIT_MAGIC_STRING_TO_JSON_UL); + if (ECMA_IS_VALUE_ERROR (to_object_value)) + { + ecma_free_value (value); + return to_object_value; + } + + ecma_object_t *value_obj_p = ecma_get_object_from_value (to_object_value); + ecma_value_t to_json = ecma_op_object_get_with_receiver (value_obj_p, + ecma_get_magic_string (LIT_MAGIC_STRING_TO_JSON_UL), + value); + + ecma_deref_object (value_obj_p); if (ECMA_IS_VALUE_ERROR (to_json)) { - ecma_deref_object (value_obj_p); return to_json; } @@ -1273,14 +1283,13 @@ ecma_builtin_json_serialize_property (ecma_json_stringify_context_t *context_p, ecma_object_t *to_json_obj_p = ecma_get_object_from_value (to_json); ecma_value_t result = ecma_op_function_call (to_json_obj_p, value, call_args, 1); - ecma_deref_object (value_obj_p); + ecma_free_value (value); if (ECMA_IS_VALUE_ERROR (result)) { ecma_deref_object (to_json_obj_p); return result; } - value = result; } ecma_free_value (to_json); @@ -1344,6 +1353,15 @@ ecma_builtin_json_serialize_property (ecma_json_stringify_context_t *context_p, value = ext_object_p->u.class_prop.u.value; ecma_deref_object (obj_p); } +#if ENABLED (JERRY_BUILTIN_BIGINT) + /* 5.d */ + else if (class_name == LIT_MAGIC_STRING_BIGINT_UL) + { + ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p; + value = ecma_copy_value (ext_object_p->u.class_prop.u.value); + ecma_deref_object (obj_p); + } +#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */ } /* 6. - 8. */ @@ -1400,18 +1418,26 @@ ecma_builtin_json_serialize_property (ecma_json_stringify_context_t *context_p, return ECMA_VALUE_EMPTY; } +#if ENABLED (JERRY_BUILTIN_BIGINT) + if (ecma_is_value_bigint (value)) + { + ecma_free_value (value); + return ecma_raise_type_error (ECMA_ERR_MSG ("BigInt cannot be serialized")); + } +#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */ + /* 11. */ if (ecma_is_value_object (value) && !ecma_op_is_callable (value)) { ecma_value_t is_array = ecma_is_value_array (value); -#if ENABLED (JERRY_ESNEXT) +#if ENABLED (JERRY_BUILTIN_BIGINT) if (ECMA_IS_VALUE_ERROR (is_array)) { ecma_free_value (value); return is_array; } -#endif /* ENABLED (JERRY_ESNEXT) */ +#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */ ecma_object_t *obj_p = ecma_get_object_from_value (value); diff --git a/tests/test262-esnext-excludelist.xml b/tests/test262-esnext-excludelist.xml index d7ffadd2b..63b488dec 100644 --- a/tests/test262-esnext-excludelist.xml +++ b/tests/test262-esnext-excludelist.xml @@ -788,10 +788,6 @@ - - - -