@@ -601,6 +601,11 @@ ecma_builtin_json_parse_value (ecma_json_token_t *token_p) /**< token argument *
601
601
}
602
602
} /* ecma_builtin_json_parse_value */
603
603
604
+ static ecma_value_t
605
+ ecma_builtin_json_internalize_process_property (ecma_object_t * reviver_p ,
606
+ ecma_object_t * object_p ,
607
+ ecma_string_t * prop_name );
608
+
604
609
/**
605
610
* Abstract operation InternalizeJSONProperty
606
611
*
@@ -666,75 +671,50 @@ ecma_builtin_json_internalize_property (ecma_object_t *reviver_p, /**< reviver f
666
671
for (ecma_length_t i = 0 ; i < length ; i ++ )
667
672
{
668
673
ecma_string_t * prop_index = ecma_new_ecma_string_from_length (i );
674
+ ecma_value_t result = ecma_builtin_json_internalize_process_property (reviver_p , object_p , prop_index );
669
675
670
- ecma_value_t new_element = ecma_builtin_json_internalize_property ( reviver_p , object_p , prop_index );
676
+ ecma_deref_ecma_string ( prop_index );
671
677
672
- if (ECMA_IS_VALUE_ERROR (new_element ))
678
+ if (ECMA_IS_VALUE_ERROR (result ))
673
679
{
674
- ecma_deref_ecma_string (prop_index );
675
680
ecma_deref_object (object_p );
676
- return new_element ;
677
- }
678
-
679
- if (ecma_is_value_undefined (new_element ))
680
- {
681
- ecma_value_t delete_val = ecma_op_object_delete (object_p , prop_index , false);
682
- JERRY_ASSERT (ecma_is_value_boolean (delete_val ));
683
- }
684
- else
685
- {
686
- ecma_builtin_json_define_value_property (object_p ,
687
- prop_index ,
688
- new_element );
689
- ecma_free_value (new_element );
681
+ return result ;
690
682
}
691
683
692
- ecma_deref_ecma_string ( prop_index );
684
+ JERRY_ASSERT ( result == ECMA_VALUE_TRUE );
693
685
}
694
686
}
695
687
/* 3.d */
696
688
else
697
689
{
698
690
ecma_collection_t * props_p = ecma_op_object_get_enumerable_property_names (object_p ,
699
691
ECMA_ENUMERABLE_PROPERTY_KEYS );
700
-
692
+ #if ENABLED (JERRY_ESNEXT )
693
+ if (JERRY_UNLIKELY (props_p == NULL ))
694
+ {
695
+ ecma_deref_object (object_p );
696
+ return ECMA_VALUE_ERROR ;
697
+ }
698
+ #else /* !ENABLED (JERRY_ESNEXT) */
701
699
JERRY_ASSERT (props_p != NULL );
700
+ #endif /* ENABLED (JERRY_ESNEXT) */
702
701
703
702
ecma_value_t * buffer_p = props_p -> buffer_p ;
704
703
705
704
/* 3.d.iii */
706
705
for (uint32_t i = 0 ; i < props_p -> item_count ; i ++ )
707
706
{
708
707
ecma_string_t * property_name_p = ecma_get_string_from_value (buffer_p [i ]);
708
+ ecma_value_t result = ecma_builtin_json_internalize_process_property (reviver_p , object_p , property_name_p );
709
709
710
- /* 3.d.iii.1 */
711
- ecma_value_t result = ecma_builtin_json_internalize_property (reviver_p , object_p , property_name_p );
712
-
713
- /* 3.d.iii.2 */
714
710
if (ECMA_IS_VALUE_ERROR (result ))
715
711
{
716
712
ecma_collection_free (props_p );
717
713
ecma_deref_object (object_p );
718
-
719
714
return result ;
720
715
}
721
716
722
- /* 3.d.iii.3 */
723
- if (ecma_is_value_undefined (result ))
724
- {
725
- ecma_value_t delete_val = ecma_op_general_object_delete (object_p ,
726
- property_name_p ,
727
- false);
728
- JERRY_ASSERT (ecma_is_value_boolean (delete_val ));
729
- }
730
- /* 3.d.iii.4 */
731
- else
732
- {
733
- ecma_builtin_json_define_value_property (object_p ,
734
- property_name_p ,
735
- result );
736
- ecma_free_value (result );
737
- }
717
+ JERRY_ASSERT (result == ECMA_VALUE_TRUE );
738
718
}
739
719
740
720
ecma_collection_free (props_p );
@@ -754,6 +734,66 @@ ecma_builtin_json_internalize_property (ecma_object_t *reviver_p, /**< reviver f
754
734
return ret_value ;
755
735
} /* ecma_builtin_json_internalize_property */
756
736
737
+ /**
738
+ * Part of the InternalizeJSONProperty abstract method.
739
+ *
740
+ * See also:
741
+ * ECMA-262 v5, 15.12.2
742
+ * ECMA-262 v11, 24.5.1.1 in step 2
743
+ *
744
+ * @return ECMA_VALUE_TRUE - if no error occured.
745
+ * error if one of the operation failed.
746
+ */
747
+ static
748
+ ecma_value_t ecma_builtin_json_internalize_process_property (ecma_object_t * reviver_p , /**< reviver function */
749
+ ecma_object_t * object_p , /**< holder object */
750
+ ecma_string_t * prop_name ) /**< property name */
751
+ {
752
+ /* ES11: 2.b.iii.1 / 2.c.ii.1 */
753
+ ecma_value_t new_element = ecma_builtin_json_internalize_property (reviver_p , object_p , prop_name );
754
+
755
+ if (ECMA_IS_VALUE_ERROR (new_element ))
756
+ {
757
+ return new_element ;
758
+ }
759
+
760
+ /* ES11: 2.b.iii.2 / 2.c.ii.2 */
761
+ if (ecma_is_value_undefined (new_element ))
762
+ {
763
+ /* ES11: 2.b.iii.2.a / 2.c.ii.2.a */
764
+ ecma_value_t delete_val = ecma_op_object_delete (object_p , prop_name , false);
765
+
766
+ #if ENABLED (JERRY_ESNEXT )
767
+ if (ECMA_IS_VALUE_ERROR (delete_val ))
768
+ {
769
+ return delete_val ;
770
+ }
771
+ #endif /* ENABLED (JERRY_ESNEXT) */
772
+
773
+ JERRY_ASSERT (ecma_is_value_boolean (delete_val ));
774
+ }
775
+ else
776
+ {
777
+ /* ES11: 2.b.iii.3.a / 2.c.ii.3.a */
778
+ ecma_value_t def_value = ecma_builtin_helper_def_prop (object_p ,
779
+ prop_name ,
780
+ new_element ,
781
+ ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE_WRITABLE );
782
+ ecma_free_value (new_element );
783
+
784
+ #if ENABLED (JERRY_ESNEXT )
785
+ if (ECMA_IS_VALUE_ERROR (def_value ))
786
+ {
787
+ return def_value ;
788
+ }
789
+ #endif /* ENABLED (JERRY_ESNEXT) */
790
+
791
+ JERRY_ASSERT (ecma_is_value_boolean (def_value ));
792
+ }
793
+
794
+ return ECMA_VALUE_TRUE ;
795
+ } /* ecma_builtin_json_internalize_process_property */
796
+
757
797
/**
758
798
* Function to set a string token from the given arguments, fills its fields and advances the string pointer.
759
799
*
0 commit comments