@@ -1005,7 +1005,12 @@ static ecma_value_t
10051005ecma_builtin_json_serialize_array (ecma_json_stringify_context_t * context_p , /**< context*/
10061006 ecma_object_t * obj_p ) /**< the array object*/
10071007{
1008- JERRY_ASSERT (ecma_get_object_type (obj_p ) == ECMA_OBJECT_TYPE_ARRAY );
1008+ #ifndef JERRY_NDEBUG
1009+ ecma_value_t obj_value = ecma_make_object_value (obj_p );
1010+ ecma_value_t is_array = ecma_is_value_array (obj_value );
1011+
1012+ JERRY_ASSERT (ecma_is_value_true (is_array ));
1013+ #endif /* !JERRY_NDEBUG */
10091014
10101015 /* 1. */
10111016 if (ecma_json_has_object_in_stack (context_p -> occurence_stack_last_p , obj_p ))
@@ -1027,7 +1032,23 @@ ecma_builtin_json_serialize_array (ecma_json_stringify_context_t *context_p, /**
10271032 const bool has_gap = !ecma_compare_ecma_string_to_magic_id (context_p -> gap_str_p , LIT_MAGIC_STRING__EMPTY );
10281033
10291034 /* 6. */
1030- uint32_t array_length = ((ecma_extended_object_t * ) obj_p )-> u .array .length ;
1035+ uint32_t array_length ;
1036+
1037+ #if ENABLED (JERRY_ES2015_BUILTIN_PROXY )
1038+ if (ECMA_OBJECT_IS_PROXY (obj_p ))
1039+ {
1040+ ecma_value_t length_value = ecma_op_object_get_length (obj_p , & array_length );
1041+
1042+ if (ECMA_IS_VALUE_ERROR (length_value ))
1043+ {
1044+ return length_value ;
1045+ }
1046+ }
1047+ else
1048+ #endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
1049+ {
1050+ array_length = ((ecma_extended_object_t * ) obj_p )-> u .array .length ;
1051+ }
10311052
10321053 ecma_stringbuilder_append_byte (& context_p -> result_builder , LIT_CHAR_LEFT_SQUARE );
10331054
@@ -1260,11 +1281,21 @@ ecma_builtin_json_serialize_property (ecma_json_stringify_context_t *context_p,
12601281 /* 11. */
12611282 if (ecma_is_value_object (value ) && !ecma_op_is_callable (value ))
12621283 {
1284+ ecma_value_t is_array = ecma_is_value_array (value );
1285+
1286+ #if ENABLED (JERRY_ES2015 )
1287+ if (ECMA_IS_VALUE_ERROR (is_array ))
1288+ {
1289+ ecma_free_value (value );
1290+ return is_array ;
1291+ }
1292+ #endif /* ENABLED (JERRY_ES2015) */
1293+
12631294 ecma_object_t * obj_p = ecma_get_object_from_value (value );
12641295
12651296 ecma_value_t ret_value ;
12661297 /* 10.a */
1267- if (ecma_get_object_type ( obj_p ) == ECMA_OBJECT_TYPE_ARRAY )
1298+ if (ecma_is_value_true ( is_array ) )
12681299 {
12691300 ret_value = ecma_builtin_json_serialize_array (context_p , obj_p );
12701301 }
0 commit comments