From 9e0709e4013c7071e2a7b6d5894f8ba02eeb9263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csaba=20Osztrogon=C3=A1c?= Date: Mon, 6 Jan 2020 15:17:54 +0100 Subject: [PATCH] Fix Array.prototype.reduce and reduceRight (#3487) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../builtin-objects/ecma-builtin-array-prototype.c | 4 ++-- .../builtin-objects/ecma-builtin-array-prototype.inc.h | 4 ++-- tests/jerry/array-prototype-reduce-right.js | 10 ++-------- tests/jerry/array-prototype-reduce.js | 2 ++ 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c index acb05f525..c63298850 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c @@ -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)); diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.inc.h index 59ba8d323..5f12393d8 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.inc.h @@ -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) diff --git a/tests/jerry/array-prototype-reduce-right.js b/tests/jerry/array-prototype-reduce-right.js index a9a71cb27..9b3ca5fa8 100644 --- a/tests/jerry/array-prototype-reduce-right.js +++ b/tests/jerry/array-prototype-reduce-right.js @@ -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); diff --git a/tests/jerry/array-prototype-reduce.js b/tests/jerry/array-prototype-reduce.js index 6193ec7f0..908818a60 100644 --- a/tests/jerry/array-prototype-reduce.js +++ b/tests/jerry/array-prototype-reduce.js @@ -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);