From ed9e3eccf9841f96cdb1fc761795c2f966943564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csaba=20Osztrogon=C3=A1c?= Date: Mon, 6 Jul 2020 14:47:10 +0200 Subject: [PATCH] Make Date constructor conform to the latest spec (#3972) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date constructor called with 1 argument should accept Date objects too. JerryScript-DCO-1.0-Signed-off-by: Csaba Osztrogonác oszi@inf.u-szeged.hu --- .../ecma/builtin-objects/ecma-builtin-date.c | 72 ++++++++++++------- tests/test262-es6-excludelist.xml | 1 - 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-date.c b/jerry-core/ecma/builtin-objects/ecma-builtin-date.c index fa86ad789..ffdee89a2 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-date.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-date.c @@ -692,6 +692,7 @@ ecma_builtin_date_dispatch_call (const ecma_value_t *arguments_list_p, /**< argu * * See also: * ECMA-262 v5, 15.9.3.1 + * ECMA-262 v11, 20.4.2 * * @return ecma value */ @@ -725,53 +726,74 @@ ecma_builtin_date_dispatch_construct (const ecma_value_t *arguments_list_p, /**< ecma_number_t prim_value_num = ECMA_NUMBER_ZERO; + /* 20.4.2.3 */ if (arguments_list_len == 0) { prim_value_num = ecma_builtin_date_now_helper (); } + /* 20.4.2.2 */ else if (arguments_list_len == 1) { - ecma_value_t prim_comp_value = ecma_op_to_primitive (arguments_list_p[0], ECMA_PREFERRED_TYPE_NUMBER); + ecma_value_t argument = arguments_list_p[0]; + ecma_object_t *arg_obj = NULL; - if (ECMA_IS_VALUE_ERROR (prim_comp_value)) + /* 4.a */ + if (ecma_is_value_object (argument)) { - ecma_deref_object (obj_p); - return prim_comp_value; + arg_obj = ecma_get_object_from_value (argument); } - if (ecma_is_value_string (prim_comp_value)) + if (arg_obj && ecma_object_class_is (arg_obj, LIT_MAGIC_STRING_DATE_UL)) { - ecma_value_t parse_res_value = ecma_builtin_date_parse (ecma_make_object_value (obj_p), prim_comp_value); - - if (ECMA_IS_VALUE_ERROR (parse_res_value)) - { - ecma_deref_object (obj_p); - ecma_free_value (prim_comp_value); - return parse_res_value; - } - - prim_value_num = ecma_get_number_from_value (parse_res_value); - - ecma_free_value (parse_res_value); + ecma_extended_object_t *arg_ext_object_p = (ecma_extended_object_t *) arg_obj; + prim_value_num = *ECMA_GET_INTERNAL_VALUE_POINTER (ecma_number_t, arg_ext_object_p->u.class_prop.u.value); } + /* 4.b */ else { - ecma_value_t prim_value = ecma_op_to_number (arguments_list_p[0]); + ecma_value_t prim_comp_value = ecma_op_to_primitive (argument, ECMA_PREFERRED_TYPE_NUMBER); - if (ECMA_IS_VALUE_ERROR (prim_value)) + if (ECMA_IS_VALUE_ERROR (prim_comp_value)) { ecma_deref_object (obj_p); - ecma_free_value (prim_comp_value); - return prim_value; + return prim_comp_value; } - prim_value_num = ecma_date_time_clip (ecma_get_number_from_value (prim_value)); + if (ecma_is_value_string (prim_comp_value)) + { + ecma_value_t parse_res_value = ecma_builtin_date_parse (ecma_make_object_value (obj_p), prim_comp_value); - ecma_free_value (prim_value); + if (ECMA_IS_VALUE_ERROR (parse_res_value)) + { + ecma_deref_object (obj_p); + ecma_free_value (prim_comp_value); + return parse_res_value; + } + + prim_value_num = ecma_get_number_from_value (parse_res_value); + + ecma_free_value (parse_res_value); + } + else + { + ecma_value_t prim_value = ecma_op_to_number (argument); + + if (ECMA_IS_VALUE_ERROR (prim_value)) + { + ecma_deref_object (obj_p); + ecma_free_value (prim_comp_value); + return prim_value; + } + + prim_value_num = ecma_date_time_clip (ecma_get_number_from_value (prim_value)); + + ecma_free_value (prim_value); + } + + ecma_free_value (prim_comp_value); } - - ecma_free_value (prim_comp_value); } + /* 20.4.2.1 */ else { ecma_value_t time_value = ecma_date_construct_helper (arguments_list_p, arguments_list_len); diff --git a/tests/test262-es6-excludelist.xml b/tests/test262-es6-excludelist.xml index 87dfc14df..c4fa694b0 100644 --- a/tests/test262-es6-excludelist.xml +++ b/tests/test262-es6-excludelist.xml @@ -57,7 +57,6 @@ -