Skip to content

Commit 094ba2f

Browse files
authored
Update the Array.prototype.reverse method to support ES6 version (#3676)
JerryScript-DCO-1.0-Signed-off-by: Adam Szilagyi aszilagy@inf.u-szeged.hu
1 parent 97a35b0 commit 094ba2f

File tree

2 files changed

+55
-27
lines changed

2 files changed

+55
-27
lines changed

jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c

Lines changed: 49 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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

tests/jerry/es2015/proxy_get.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ assert(proxy2.prop === "value 3");
7373
assert(proxy2.nothing === "value 3");
7474
assert(proxy2.handler === "value 3");
7575

76+
var get = [];
77+
var p = new Proxy([0,,2,,4,,], { get: function(o, k) { get.push(k); return o[k]; }});
78+
Array.prototype.reverse.call(p);
79+
80+
assert(get + '' === "length,0,4,2");
81+
7682
// test when get throws an error
7783
var handler = new Proxy({}, {get: function() {throw 42;}});
7884
var proxy = new Proxy ({}, handler);

0 commit comments

Comments
 (0)