Fix Array.prototype.reduce and reduceRight (#3487)

Don't throw TypeError when object length is 0 and initialValue is undefined.
Additionally the error message should be more precise and match other engines.

Fixes #3463

JerryScript-DCO-1.0-Signed-off-by: Csaba Osztrogonác oszi@inf.u-szeged.hu
This commit is contained in:
Csaba Osztrogonác
2020-01-06 15:17:54 +01:00
committed by Robert Fancsik
parent 40b38f70ef
commit 9e0709e401
4 changed files with 8 additions and 12 deletions
@@ -2069,9 +2069,9 @@ ecma_builtin_array_reduce_from (ecma_value_t callbackfn, /**< routine's 1st argu
}
/* 5. */
if (len == 0 && ecma_is_value_undefined (initial_value))
if (len == 0 && args_number == 1)
{
return ecma_raise_type_error (ECMA_ERR_MSG ("Initial value cannot be undefined."));
return ecma_raise_type_error (ECMA_ERR_MSG ("Reduce of empty array with no initial value."));
}
JERRY_ASSERT (ecma_is_value_object (callbackfn));
@@ -67,8 +67,8 @@ ROUTINE (LIT_MAGIC_STRING_FOR_EACH_UL, ECMA_ARRAY_PROTOTYPE_FOR_EACH, 2, 1)
ROUTINE (LIT_MAGIC_STRING_MAP, ECMA_ARRAY_PROTOTYPE_MAP, 2, 1)
ROUTINE (LIT_MAGIC_STRING_FILTER, ECMA_ARRAY_PROTOTYPE_FILTER, 2, 1)
/* Note these 2 routines must be in this order */
ROUTINE (LIT_MAGIC_STRING_REDUCE, ECMA_ARRAY_PROTOTYPE_REDUCE, NON_FIXED, 1)
ROUTINE (LIT_MAGIC_STRING_REDUCE_RIGHT_UL, ECMA_ARRAY_PROTOTYPE_REDUCE_RIGHT, NON_FIXED, 1)
ROUTINE (LIT_MAGIC_STRING_REDUCE, ECMA_ARRAY_PROTOTYPE_REDUCE, 2, 1)
ROUTINE (LIT_MAGIC_STRING_REDUCE_RIGHT_UL, ECMA_ARRAY_PROTOTYPE_REDUCE_RIGHT, 2, 1)
#if ENABLED (JERRY_ES2015)
ROUTINE (LIT_MAGIC_STRING_FIND, ECMA_ARRAY_PROTOTYPE_FIND, 2, 1)
ROUTINE (LIT_MAGIC_STRING_FIND_INDEX, ECMA_ARRAY_PROTOTYPE_FIND_INDEX, 2, 1)
+2 -8
View File
@@ -34,14 +34,6 @@ try {
assert(e instanceof TypeError);
}
try {
var arg2;
[].reduceRight(func, arg2);
assert(false);
} catch(e) {
assert(e instanceof TypeError);
}
try {
var a = new Array();
a.length = 10;
@@ -54,6 +46,8 @@ try {
// various checks
assert([].reduceRight(func, 1) === 1);
assert([].reduceRight(func, undefined) === undefined);
assert([0].reduceRight(func) === 0);
assert([0, 1].reduceRight(func) === 1);
+2
View File
@@ -39,6 +39,8 @@ catch(e) {
// various checks
assert ([].reduce(func, 1) === 1);
assert ([].reduce(func, undefined) === undefined);
assert ([0].reduce(func) === 0);
assert ([0, 1].reduce(func) === 1);