Make Date constructor conform to the latest spec (#3972)

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
This commit is contained in:
Csaba Osztrogonác
2020-07-06 14:47:10 +02:00
committed by GitHub
parent c1e90da0b4
commit ed9e3eccf9
2 changed files with 47 additions and 26 deletions
@@ -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);
-1
View File
@@ -57,7 +57,6 @@
<test id="built-ins/Array/prototype/slice/S15.4.4.10_A3_T1.js"><reason></reason></test>
<test id="built-ins/Array/prototype/slice/S15.4.4.10_A3_T2.js"><reason></reason></test>
<test id="built-ins/Array/prototype/splice/S15.4.4.12_A3_T1.js"><reason></reason></test>
<test id="built-ins/Date/construct_with_date.js"><reason></reason></test>
<test id="built-ins/decodeURIComponent/S15.1.3.2_A2.5_T1.js"><reason></reason></test>
<test id="built-ins/decodeURI/S15.1.3.1_A2.5_T1.js"><reason></reason></test>
<test id="built-ins/GeneratorPrototype/next/context-constructor-invocation.js"><reason></reason></test>