@@ -545,7 +545,6 @@ ecma_builtin_array_prototype_object_reverse (ecma_value_t this_arg, /**< this ar
545545 ecma_object_t * obj_p , /**< array object */
546546 uint32_t len ) /**< array object's length */
547547{
548- /* 4. */
549548 uint32_t middle = len / 2 ;
550549
551550 if (ecma_op_object_is_fast_array (obj_p ))
@@ -571,31 +570,16 @@ ecma_builtin_array_prototype_object_reverse (ecma_value_t this_arg, /**< this ar
571570
572571 for (uint32_t lower = 0 ; lower < middle ; lower ++ )
573572 {
573+ uint32_t upper = len - lower - 1 ;
574574 ecma_value_t ret_value = ECMA_VALUE_ERROR ;
575- ecma_string_t * lower_str_p = ecma_new_ecma_string_from_uint32 (lower );
576-
577- /* 6.d and 6.e */
578- ecma_value_t lower_value = ecma_op_object_get (obj_p , lower_str_p );
579575
580- if (ECMA_IS_VALUE_ERROR (lower_value ))
581- {
582- ecma_deref_ecma_string (lower_str_p );
583- return lower_value ;
584- }
585-
586- /* 6.a */
587- uint32_t upper = len - lower - 1 ;
588- /* 6.b and 6.c */
576+ ecma_string_t * lower_str_p = ecma_new_ecma_string_from_uint32 (lower );
589577 ecma_string_t * upper_str_p = ecma_new_ecma_string_from_uint32 (upper );
590578
591- ecma_value_t upper_value = ecma_op_object_get (obj_p , upper_str_p );
592-
593- if (ECMA_IS_VALUE_ERROR (upper_value ))
594- {
595- goto clean_up ;
596- }
579+ #if ENABLED (JERRY_ES2015 )
580+ ecma_value_t lower_value = ECMA_VALUE_EMPTY ;
581+ ecma_value_t upper_value = ECMA_VALUE_EMPTY ;
597582
598- /* 6.f and 6.g */
599583 ecma_value_t has_lower = ecma_op_object_has_property (obj_p , lower_str_p );
600584
601585#if ENABLED (JERRY_ES2015_BUILTIN_PROXY )
@@ -605,6 +589,18 @@ ecma_builtin_array_prototype_object_reverse (ecma_value_t this_arg, /**< this ar
605589 }
606590#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
607591
592+ bool lower_exist = ecma_is_value_true (has_lower );
593+
594+ if (lower_exist )
595+ {
596+ lower_value = ecma_op_object_get (obj_p , lower_str_p );
597+
598+ if (ECMA_IS_VALUE_ERROR (lower_value ))
599+ {
600+ goto clean_up ;
601+ }
602+ }
603+
608604 ecma_value_t has_upper = ecma_op_object_has_property (obj_p , upper_str_p );
609605
610606#if ENABLED (JERRY_ES2015_BUILTIN_PROXY )
@@ -614,10 +610,41 @@ ecma_builtin_array_prototype_object_reverse (ecma_value_t this_arg, /**< this ar
614610 }
615611#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
616612
613+ bool upper_exist = ecma_is_value_true (has_upper );
614+
615+ if (upper_exist )
616+ {
617+ upper_value = ecma_op_object_get (obj_p , upper_str_p );
618+
619+ if (ECMA_IS_VALUE_ERROR (upper_value ))
620+ {
621+ goto clean_up ;
622+ }
623+ }
624+ #else /* !ENABLED (JERRY_ES2015) */
625+ ecma_value_t lower_value = ecma_op_object_get (obj_p , lower_str_p );
626+
627+ if (ECMA_IS_VALUE_ERROR (lower_value ))
628+ {
629+ ecma_deref_ecma_string (lower_str_p );
630+ ecma_deref_ecma_string (upper_str_p );
631+ return ret_value ;
632+ }
633+
634+ ecma_value_t upper_value = ecma_op_object_get (obj_p , upper_str_p );
635+
636+ if (ECMA_IS_VALUE_ERROR (upper_value ))
637+ {
638+ goto clean_up ;
639+ }
640+
641+ ecma_value_t has_lower = ecma_op_object_has_property (obj_p , lower_str_p );
642+ ecma_value_t has_upper = ecma_op_object_has_property (obj_p , upper_str_p );
643+
617644 bool lower_exist = ecma_is_value_true (has_lower );
618645 bool upper_exist = ecma_is_value_true (has_upper );
646+ #endif /* ENABLED (JERRY_ES2015) */
619647
620- /* 6.h */
621648 if (lower_exist && upper_exist )
622649 {
623650 ecma_value_t outer_put_value = ecma_op_object_put (obj_p , lower_str_p , upper_value , true);
@@ -634,7 +661,6 @@ ecma_builtin_array_prototype_object_reverse (ecma_value_t this_arg, /**< this ar
634661 goto clean_up ;
635662 }
636663 }
637- /* 6.i */
638664 else if (!lower_exist && upper_exist )
639665 {
640666 ecma_value_t put_value = ecma_op_object_put (obj_p , lower_str_p , upper_value , true);
@@ -646,14 +672,11 @@ ecma_builtin_array_prototype_object_reverse (ecma_value_t this_arg, /**< this ar
646672
647673 ecma_value_t del_value = ecma_op_object_delete (obj_p , upper_str_p , true);
648674
649- JERRY_ASSERT (ECMA_IS_VALUE_ERROR (del_value ) || ecma_is_value_boolean (del_value ));
650-
651675 if (ECMA_IS_VALUE_ERROR (del_value ))
652676 {
653677 goto clean_up ;
654678 }
655679 }
656- /* 6.j */
657680 else if (lower_exist )
658681 {
659682 ecma_value_t del_value = ecma_op_object_delete (obj_p , lower_str_p , true);
@@ -685,7 +708,6 @@ ecma_builtin_array_prototype_object_reverse (ecma_value_t this_arg, /**< this ar
685708 }
686709 }
687710
688- /* 7. */
689711 return ecma_copy_value (this_arg );
690712} /* ecma_builtin_array_prototype_object_reverse */
691713
0 commit comments