From cf097ca16bec45f5f8b122e663feb322026dedc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20B=C3=A1tyai?= Date: Fri, 24 Jul 2020 12:54:54 +0200 Subject: [PATCH] Fix values of properties that reference intrinsic function objects (#4024) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JerryScript-DCO-1.0-Signed-off-by: Dániel Bátyai daniel.batyai@h-lab.eu --- jerry-core/ecma/base/ecma-globals.h | 9 +- .../ecma-builtin-array-iterator-prototype.c | 8 +- .../ecma-builtin-array-prototype.c | 47 +----- .../ecma-builtin-array-prototype.inc.h | 6 +- .../ecma-builtin-date-prototype.c | 14 +- .../ecma-builtin-date-prototype.inc.h | 15 +- .../builtin-objects/ecma-builtin-intrinsic.c | 156 +++++++++++++----- .../ecma-builtin-intrinsic.inc.h | 8 +- .../ecma-builtin-map-prototype.inc.h | 6 +- .../ecma-builtin-set-prototype.inc.h | 6 +- .../ecma-builtin-string-prototype.c | 2 +- .../ecma/builtin-objects/ecma-builtins.c | 8 +- .../ecma-builtin-typedarray-prototype.c | 103 +----------- .../ecma-builtin-typedarray-prototype.inc.h | 9 +- .../ecma/operations/ecma-array-object.c | 48 +++++- .../ecma/operations/ecma-array-object.h | 5 +- .../ecma/operations/ecma-container-object.c | 19 +-- .../ecma/operations/ecma-container-object.h | 6 +- .../ecma/operations/ecma-iterator-object.c | 12 +- .../ecma/operations/ecma-iterator-object.h | 6 +- .../ecma/operations/ecma-typedarray-object.c | 33 ++++ .../ecma/operations/ecma-typedarray-object.h | 3 + jerry-core/lit/lit-magic-strings.h | 4 +- jerry-core/lit/lit-magic-strings.inc.h | 37 +++-- tests/jerry/es.next/intrinsic-properties.js | 30 ++++ tests/test262-es6-excludelist.xml | 1 - tools/gen-magic-strings.py | 4 +- 27 files changed, 349 insertions(+), 256 deletions(-) create mode 100644 tests/jerry/es.next/intrinsic-properties.js diff --git a/jerry-core/ecma/base/ecma-globals.h b/jerry-core/ecma/base/ecma-globals.h index 204040815..8209214f2 100644 --- a/jerry-core/ecma/base/ecma-globals.h +++ b/jerry-core/ecma/base/ecma-globals.h @@ -705,10 +705,11 @@ typedef enum */ typedef enum { - ECMA_ITERATOR_KEYS, /**< List only key indices */ - ECMA_ITERATOR_VALUES, /**< List only key values */ - ECMA_ITERATOR_KEYS_VALUES, /**< List key indices and values */ -} ecma_array_iterator_type_t; + ECMA_ITERATOR_KEYS, /**< keys iterator */ + ECMA_ITERATOR_VALUES, /**< values iterator */ + ECMA_ITERATOR_ENTRIES, /**< entries iterator */ + ECMA_ITERATOR__COUNT, /**< number of iterator kinds */ +} ecma_iterator_kind_t; #endif /* ENABLED (JERRY_ESNEXT) */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-array-iterator-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-array-iterator-prototype.c index b362eb648..ac0c18b32 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-array-iterator-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-array-iterator-prototype.c @@ -123,9 +123,9 @@ ecma_builtin_array_iterator_prototype_object_next (ecma_value_t this_val) /**< t } /* 7. */ - uint8_t iterator_type = ext_obj_p->u.pseudo_array.extra_info; + uint8_t iterator_kind = ext_obj_p->u.pseudo_array.extra_info; - if (iterator_type == ECMA_ITERATOR_KEYS) + if (iterator_kind == ECMA_ITERATOR_KEYS) { /* 12. */ return ecma_create_iter_result_object (ecma_make_uint32_value (index), ECMA_VALUE_FALSE); @@ -143,14 +143,14 @@ ecma_builtin_array_iterator_prototype_object_next (ecma_value_t this_val) /**< t ecma_value_t result; /* 16. */ - if (iterator_type == ECMA_ITERATOR_VALUES) + if (iterator_kind == ECMA_ITERATOR_VALUES) { result = ecma_create_iter_result_object (get_value, ECMA_VALUE_FALSE); } else { /* 17.a */ - JERRY_ASSERT (iterator_type == ECMA_ITERATOR_KEYS_VALUES); + JERRY_ASSERT (iterator_kind == ECMA_ITERATOR_ENTRIES); /* 17.b */ ecma_value_t entry_array_value; 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 acb55b599..958637f17 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c @@ -46,7 +46,9 @@ enum { ECMA_ARRAY_PROTOTYPE_ROUTINE_START = ECMA_BUILTIN_ID__COUNT - 1, /* Note: these 2 routine ids must be in this order */ +#if !ENABLED (JERRY_ESNEXT) ECMA_ARRAY_PROTOTYPE_TO_STRING, +#endif /* !ENABLED (JERRY_ESNEXT) */ ECMA_ARRAY_PROTOTYPE_CONCAT, ECMA_ARRAY_PROTOTYPE_TO_LOCALE_STRING, ECMA_ARRAY_PROTOTYPE_JOIN, @@ -117,45 +119,6 @@ ecma_builtin_array_prototype_helper_set_length (ecma_object_t *object, /**< obje return ret_value; } /* ecma_builtin_array_prototype_helper_set_length */ -/** - * The Array.prototype object's 'toString' routine - * - * See also: - * ECMA-262 v5, 15.4.4.2 - * - * @return ecma value - * Returned value must be freed with ecma_free_value. - */ -static ecma_value_t -ecma_builtin_array_prototype_object_to_string (ecma_value_t this_arg, /**< this argument */ - ecma_object_t *obj_p) /**< array object */ - -{ - /* 2. */ - ecma_value_t join_value = ecma_op_object_get_by_magic_id (obj_p, LIT_MAGIC_STRING_JOIN); - - if (ECMA_IS_VALUE_ERROR (join_value)) - { - return join_value; - } - - if (!ecma_op_is_callable (join_value)) - { - /* 3. */ - ecma_free_value (join_value); - return ecma_builtin_helper_object_to_string (this_arg); - } - - /* 4. */ - ecma_object_t *join_func_obj_p = ecma_get_object_from_value (join_value); - - ecma_value_t ret_value = ecma_op_function_call (join_func_obj_p, this_arg, NULL, 0); - - ecma_deref_object (join_func_obj_p); - - return ret_value; -} /* ecma_builtin_array_prototype_object_to_string */ - /** * The Array.prototype object's 'toLocaleString' routine * @@ -2693,11 +2656,13 @@ ecma_builtin_array_prototype_dispatch_routine (uint16_t builtin_routine_id, /**< { ecma_value_t ret_value; +#if !ENABLED (JERRY_ESNEXT) if (builtin_routine_id == ECMA_ARRAY_PROTOTYPE_TO_STRING) { - ret_value = ecma_builtin_array_prototype_object_to_string (this_arg, obj_p); + ret_value = ecma_array_object_to_string (obj_this); } else +#endif /* !ENABLED (JERRY_ESNEXT) */ { JERRY_ASSERT (builtin_routine_id == ECMA_ARRAY_PROTOTYPE_CONCAT); ret_value = ecma_builtin_array_prototype_object_concat (arguments_list_p, @@ -2717,7 +2682,7 @@ ecma_builtin_array_prototype_dispatch_routine (uint16_t builtin_routine_id, /**< if (builtin_routine_id == ECMA_ARRAY_PROTOTYPE_ENTRIES) { - ret_value = ecma_op_create_array_iterator (obj_p, ECMA_ITERATOR_KEYS_VALUES); + ret_value = ecma_op_create_array_iterator (obj_p, ECMA_ITERATOR_ENTRIES); } else { 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 78f2fbd9c..4326e1caf 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 @@ -46,8 +46,10 @@ NUMBER_VALUE (LIT_MAGIC_STRING_LENGTH, /* Routine properties: * (property name, C routine name, arguments number or NON_FIXED, value of the routine's length property) */ -ROUTINE (LIT_MAGIC_STRING_TO_STRING_UL, ECMA_ARRAY_PROTOTYPE_TO_STRING, 0, 0) ROUTINE (LIT_MAGIC_STRING_TO_LOCALE_STRING_UL, ECMA_ARRAY_PROTOTYPE_TO_LOCALE_STRING, 0, 0) +#if !ENABLED (JERRY_ESNEXT) +ROUTINE (LIT_MAGIC_STRING_TO_STRING_UL, ECMA_ARRAY_PROTOTYPE_TO_STRING, 0, 0) +#endif /* !ENABLED (JERRY_ESNEXT) */ ROUTINE (LIT_MAGIC_STRING_CONCAT, ECMA_ARRAY_PROTOTYPE_CONCAT, NON_FIXED, 1) ROUTINE (LIT_MAGIC_STRING_JOIN, ECMA_ARRAY_PROTOTYPE_JOIN, 1, 1) ROUTINE (LIT_MAGIC_STRING_POP, ECMA_ARRAY_PROTOTYPE_POP, 0, 0) @@ -77,6 +79,8 @@ ROUTINE (LIT_MAGIC_STRING_COPY_WITHIN, ECMA_ARRAY_PROTOTYPE_COPY_WITHIN, NON_FIX ROUTINE (LIT_MAGIC_STRING_ENTRIES, ECMA_ARRAY_PROTOTYPE_ENTRIES, 0, 0) ROUTINE (LIT_MAGIC_STRING_KEYS, ECMA_ARRAY_PROTOTYPE_KEYS, 0, 0) ROUTINE (LIT_MAGIC_STRING_INCLUDES, ECMA_ARRAY_PROTOTYPE_INCLUDES, NON_FIXED, 1) +INTRINSIC_PROPERTY (LIT_MAGIC_STRING_TO_STRING_UL, LIT_MAGIC_STRING_TO_STRING_UL, + ECMA_PROPERTY_CONFIGURABLE_WRITABLE) INTRINSIC_PROPERTY (LIT_MAGIC_STRING_VALUES, LIT_INTERNAL_MAGIC_STRING_ARRAY_PROTOTYPE_VALUES, ECMA_PROPERTY_CONFIGURABLE_WRITABLE) INTRINSIC_PROPERTY (LIT_GLOBAL_SYMBOL_ITERATOR, LIT_INTERNAL_MAGIC_STRING_ARRAY_PROTOTYPE_VALUES, diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-date-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-date-prototype.c index 45defa3e4..d13b4cdcc 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-date-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-date-prototype.c @@ -93,8 +93,10 @@ enum ECMA_DATE_PROTOTYPE_TO_STRING, /* ECMA-262 v5, 15.9.5.2 */ ECMA_DATE_PROTOTYPE_TO_DATE_STRING, /* ECMA-262 v5, 15.9.5.3 */ - ECMA_DATE_PROTOTYPE_TO_TIME_STRING, /* ECMA-262 v5, 15.9.5.4 */ +#if !ENABLED (JERRY_ESNEXT) ECMA_DATE_PROTOTYPE_TO_UTC_STRING, /* ECMA-262 v5, 15.9.5.42 */ +#endif /* ENABLED (JERRY_ESNEXT) */ + ECMA_DATE_PROTOTYPE_TO_TIME_STRING, /* ECMA-262 v5, 15.9.5.4 */ ECMA_DATE_PROTOTYPE_TO_ISO_STRING, /* ECMA-262 v5, 15.9.5.43 */ ECMA_DATE_PROTOTYPE_GET_TIME, /* ECMA-262 v5, 15.9.5.9 */ @@ -681,15 +683,17 @@ ecma_builtin_date_prototype_dispatch_routine (uint16_t builtin_routine_id, /**< { return ecma_date_value_to_date_string (*prim_value_p); } - case ECMA_DATE_PROTOTYPE_TO_TIME_STRING: +#if !ENABLED (JERRY_ESNEXT) + case ECMA_DATE_PROTOTYPE_TO_UTC_STRING: { - return ecma_date_value_to_time_string (*prim_value_p); + return ecma_date_value_to_utc_string (*prim_value_p); } +#endif /* ENABLED (JERRY_ESNEXT) */ default: { - JERRY_ASSERT (builtin_routine_id == ECMA_DATE_PROTOTYPE_TO_UTC_STRING); + JERRY_ASSERT (builtin_routine_id == ECMA_DATE_PROTOTYPE_TO_TIME_STRING); - return ecma_date_value_to_utc_string (*prim_value_p); + return ecma_date_value_to_time_string (*prim_value_p); } } } /* ecma_builtin_date_prototype_dispatch_routine */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-date-prototype.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-date-prototype.inc.h index bca0e4cef..920f9f37f 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-date-prototype.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-date-prototype.inc.h @@ -65,18 +65,27 @@ ROUTINE (LIT_MAGIC_STRING_SET_MONTH_UL, ECMA_DATE_PROTOTYPE_SET_MONTH, 2, 2) ROUTINE (LIT_MAGIC_STRING_SET_UTC_MONTH_UL, ECMA_DATE_PROTOTYPE_SET_UTC_MONTH, 2, 2) ROUTINE (LIT_MAGIC_STRING_SET_FULL_YEAR_UL, ECMA_DATE_PROTOTYPE_SET_FULL_YEAR, NON_FIXED, 3) ROUTINE (LIT_MAGIC_STRING_SET_UTC_FULL_YEAR_UL, ECMA_DATE_PROTOTYPE_SET_UTC_FULL_YEAR, NON_FIXED, 3) -ROUTINE (LIT_MAGIC_STRING_TO_UTC_STRING_UL, ECMA_DATE_PROTOTYPE_TO_UTC_STRING, 0, 0) ROUTINE (LIT_MAGIC_STRING_TO_ISO_STRING_UL, ECMA_DATE_PROTOTYPE_TO_ISO_STRING, 0, 0) ROUTINE (LIT_MAGIC_STRING_TO_JSON_UL, ECMA_DATE_PROTOTYPE_TO_JSON, 1, 1) #if ENABLED (JERRY_ESNEXT) ROUTINE_CONFIGURABLE_ONLY (LIT_GLOBAL_SYMBOL_TO_PRIMITIVE, ECMA_DATE_PROTOTYPE_TO_PRIMITIVE, 1, 1) -#endif /* ENABLED (JERRY_ESNEXT) */ +INTRINSIC_PROPERTY (LIT_MAGIC_STRING_TO_UTC_STRING_UL, LIT_MAGIC_STRING_TO_UTC_STRING_UL, + ECMA_PROPERTY_CONFIGURABLE_WRITABLE) +#if ENABLED (JERRY_BUILTIN_ANNEXB) +INTRINSIC_PROPERTY (LIT_MAGIC_STRING_TO_GMT_STRING_UL, LIT_MAGIC_STRING_TO_UTC_STRING_UL, + ECMA_PROPERTY_CONFIGURABLE_WRITABLE) +#endif /* ENABLED (JERRY_BUILTIN_ANNEXB) */ +#else /* !ENABLED (JERRY_ESNEXT) */ +ROUTINE (LIT_MAGIC_STRING_TO_UTC_STRING_UL, ECMA_DATE_PROTOTYPE_TO_UTC_STRING, 0, 0) +#if ENABLED (JERRY_BUILTIN_ANNEXB) +ROUTINE (LIT_MAGIC_STRING_TO_GMT_STRING_UL, ECMA_DATE_PROTOTYPE_TO_UTC_STRING, 0, 0) +#endif /* ENABLED (JERRY_BUILTIN_ANNEXB) */ +#endif /* !ENABLED (JERRY_ESNEXT) */ #if ENABLED (JERRY_BUILTIN_ANNEXB) ROUTINE (LIT_MAGIC_STRING_GET_YEAR_UL, ECMA_DATE_PROTOTYPE_GET_YEAR, 0, 0) ROUTINE (LIT_MAGIC_STRING_SET_YEAR_UL, ECMA_DATE_PROTOTYPE_SET_YEAR, 1, 1) -ROUTINE (LIT_MAGIC_STRING_TO_GMT_STRING_UL, ECMA_DATE_PROTOTYPE_TO_UTC_STRING, 0, 0) #endif /* ENABLED (JERRY_BUILTIN_ANNEXB) */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.c b/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.c index b7247f1ba..c87f2259b 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.c @@ -14,8 +14,10 @@ */ #include "ecma-builtins.h" +#include "ecma-builtin-helpers.h" #include "ecma-container-object.h" #include "ecma-array-object.h" +#include "ecma-typedarray-object.h" #include "ecma-gc.h" #include "lit-char-helpers.h" @@ -35,10 +37,14 @@ enum { ECMA_INTRINSIC_ROUTINE_START = ECMA_BUILTIN_ID__COUNT - 1, - ECMA_INTRINSIC_PARSE_FLOAT, - ECMA_INTRINSIC_PARSE_INT, ECMA_INTRINSIC_ARRAY_PROTOTYPE_VALUES, - ECMA_INTRINSIC_SET_PROTOTYPE_KEYS + ECMA_INTRINSIC_TYPEDARRAY_PROTOTYPE_VALUES, + ECMA_INTRINSIC_MAP_PROTOTYPE_ENTRIES, + ECMA_INTRINSIC_SET_PROTOTYPE_VALUES, + ECMA_INTRINSIC_ARRAY_TO_STRING, + ECMA_INTRINSIC_DATE_TO_UTC_STRING, + ECMA_INTRINSIC_PARSE_FLOAT, + ECMA_INTRINSIC_PARSE_INT }; #define BUILTIN_INC_HEADER_NAME "ecma-builtin-intrinsic.inc.h" @@ -83,6 +89,32 @@ ecma_builtin_intrinsic_array_prototype_values (ecma_value_t this_value) /**< thi return ret_value; } /* ecma_builtin_intrinsic_array_prototype_values */ +/** + * The Map.prototype entries and [@@iterator] routines + * + * See also: + * ECMA-262 v6, 23.1.3.4 + * ECMA-262 v6, 23.1.3.12 + * + * @return ecma value + * Returned value must be freed with ecma_free_value. + */ +static ecma_value_t +ecma_builtin_intrinsic_map_prototype_entries (ecma_value_t this_value) +{ + ecma_extended_object_t *map_object_p = ecma_op_container_get_object (this_value, LIT_MAGIC_STRING_MAP_UL); + + if (map_object_p == NULL) + { + return ECMA_VALUE_ERROR; + } + + return ecma_op_container_create_iterator (this_value, + ECMA_BUILTIN_ID_MAP_ITERATOR_PROTOTYPE, + ECMA_PSEUDO_MAP_ITERATOR, + ECMA_ITERATOR_ENTRIES); +} /* ecma_builtin_intrinsic_map_prototype_entries */ + /** * The Set.prototype values, keys and [@@iterator] routines * @@ -94,7 +126,7 @@ ecma_builtin_intrinsic_array_prototype_values (ecma_value_t this_value) /**< thi * Returned value must be freed with ecma_free_value. */ static ecma_value_t -ecma_builtin_intrinsic_set_prototype_keys (ecma_value_t this_value) +ecma_builtin_intrinsic_set_prototype_values (ecma_value_t this_value) { ecma_extended_object_t *map_object_p = ecma_op_container_get_object (this_value, LIT_MAGIC_STRING_SET_UL); @@ -104,10 +136,10 @@ ecma_builtin_intrinsic_set_prototype_keys (ecma_value_t this_value) } return ecma_op_container_create_iterator (this_value, - 0, ECMA_BUILTIN_ID_SET_ITERATOR_PROTOTYPE, - ECMA_PSEUDO_SET_ITERATOR); -} /* ecma_builtin_intrinsic_set_prototype_keys */ + ECMA_PSEUDO_SET_ITERATOR, + ECMA_ITERATOR_VALUES); +} /* ecma_builtin_intrinsic_set_prototype_values */ /** * Dispatcher of the built-in's routines @@ -124,48 +156,90 @@ ecma_builtin_intrinsic_dispatch_routine (uint16_t builtin_routine_id, /**< built { JERRY_UNUSED (arguments_number); - ecma_value_t routine_arg_1 = arguments_list_p[0]; - ecma_value_t routine_arg_2 = arguments_list_p[1]; - - if (builtin_routine_id == ECMA_INTRINSIC_ARRAY_PROTOTYPE_VALUES) + switch (builtin_routine_id) { - return ecma_builtin_intrinsic_array_prototype_values (this_arg); - } - - if (builtin_routine_id == ECMA_INTRINSIC_SET_PROTOTYPE_KEYS) - { - return ecma_builtin_intrinsic_set_prototype_keys (this_arg); - } - - ecma_value_t ret_value = ECMA_VALUE_EMPTY; - if (builtin_routine_id <= ECMA_INTRINSIC_PARSE_INT) - { - ecma_string_t *str_p = ecma_op_to_string (routine_arg_1); - - if (JERRY_UNLIKELY (str_p == NULL)) + case ECMA_INTRINSIC_ARRAY_PROTOTYPE_VALUES: { - return ECMA_VALUE_ERROR; + return ecma_builtin_intrinsic_array_prototype_values (this_arg); } - - ECMA_STRING_TO_UTF8_STRING (str_p, string_buff, string_buff_size); - - if (builtin_routine_id == ECMA_INTRINSIC_PARSE_INT) + case ECMA_INTRINSIC_TYPEDARRAY_PROTOTYPE_VALUES: { - ret_value = ecma_number_parse_int (string_buff, - string_buff_size, - routine_arg_2); + return ecma_typedarray_iterators_helper (this_arg, ECMA_ITERATOR_VALUES); } - else + case ECMA_INTRINSIC_SET_PROTOTYPE_VALUES: { - JERRY_ASSERT (builtin_routine_id == ECMA_INTRINSIC_PARSE_FLOAT); - ret_value = ecma_number_parse_float (string_buff, - string_buff_size); + return ecma_builtin_intrinsic_set_prototype_values (this_arg); + } + case ECMA_INTRINSIC_MAP_PROTOTYPE_ENTRIES: + { + return ecma_builtin_intrinsic_map_prototype_entries (this_arg); + } + case ECMA_INTRINSIC_ARRAY_TO_STRING: + { + ecma_value_t this_obj = ecma_op_to_object (this_arg); + if (ECMA_IS_VALUE_ERROR (this_obj)) + { + return this_obj; + } + + ecma_value_t result = ecma_array_object_to_string (this_obj); + ecma_deref_object (ecma_get_object_from_value (this_obj)); + + return result; + } + case ECMA_INTRINSIC_DATE_TO_UTC_STRING: + { + if (!ecma_is_value_object (this_arg) + || !ecma_object_class_is (ecma_get_object_from_value (this_arg), LIT_MAGIC_STRING_DATE_UL)) + { + return ecma_raise_type_error (ECMA_ERR_MSG ("'this' is not a Date object")); + } + + ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) ecma_get_object_from_value (this_arg); + ecma_number_t *prim_value_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_number_t, + ext_object_p->u.class_prop.u.value); + + if (ecma_number_is_nan (*prim_value_p)) + { + return ecma_make_magic_string_value (LIT_MAGIC_STRING_INVALID_DATE_UL); + } + + return ecma_date_value_to_utc_string (*prim_value_p); + } + default: + { + JERRY_ASSERT (builtin_routine_id == ECMA_INTRINSIC_PARSE_INT + || builtin_routine_id == ECMA_INTRINSIC_PARSE_FLOAT); + + ecma_string_t *str_p = ecma_op_to_string (arguments_list_p[0]); + + if (JERRY_UNLIKELY (str_p == NULL)) + { + return ECMA_VALUE_ERROR; + } + + ecma_value_t result; + ECMA_STRING_TO_UTF8_STRING (str_p, string_buff, string_buff_size); + + if (builtin_routine_id == ECMA_INTRINSIC_PARSE_INT) + { + result = ecma_number_parse_int (string_buff, + string_buff_size, + arguments_list_p[1]); + } + else + { + JERRY_ASSERT (builtin_routine_id == ECMA_INTRINSIC_PARSE_FLOAT); + result = ecma_number_parse_float (string_buff, + string_buff_size); + } + + ECMA_FINALIZE_UTF8_STRING (string_buff, string_buff_size); + ecma_deref_ecma_string (str_p); + + return result; } - ECMA_FINALIZE_UTF8_STRING (string_buff, string_buff_size); - ecma_deref_ecma_string (str_p); } - - return ret_value; } /* ecma_builtin_intrinsic_dispatch_routine */ /** diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.inc.h index 3a9ecc49e..89ae67c8b 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.inc.h @@ -70,9 +70,13 @@ SYMBOL_VALUE (LIT_GLOBAL_SYMBOL_UNSCOPABLES, LIT_MAGIC_STRING_UNSCOPABLES) /* Routine properties: * (property name, C routine name, arguments number or NON_FIXED, value of the routine's length property) */ +ROUTINE (LIT_INTERNAL_MAGIC_STRING_ARRAY_PROTOTYPE_VALUES, ECMA_INTRINSIC_ARRAY_PROTOTYPE_VALUES, 0, 0) +ROUTINE (LIT_INTERNAL_MAGIC_STRING_TYPEDARRAY_PROTOTYPE_VALUES, ECMA_INTRINSIC_TYPEDARRAY_PROTOTYPE_VALUES, 0, 0) +ROUTINE (LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_VALUES, ECMA_INTRINSIC_SET_PROTOTYPE_VALUES, 0, 0) +ROUTINE (LIT_INTERNAL_MAGIC_STRING_MAP_PROTOTYPE_ENTRIES, ECMA_INTRINSIC_MAP_PROTOTYPE_ENTRIES, 0, 0) +ROUTINE (LIT_MAGIC_STRING_TO_STRING_UL, ECMA_INTRINSIC_ARRAY_TO_STRING, 0, 0) +ROUTINE (LIT_MAGIC_STRING_TO_UTC_STRING_UL, ECMA_INTRINSIC_DATE_TO_UTC_STRING, 0, 0) ROUTINE (LIT_MAGIC_STRING_PARSE_FLOAT, ECMA_INTRINSIC_PARSE_FLOAT, 1, 1) ROUTINE (LIT_MAGIC_STRING_PARSE_INT, ECMA_INTRINSIC_PARSE_INT, 2, 2) -ROUTINE (LIT_INTERNAL_MAGIC_STRING_ARRAY_PROTOTYPE_VALUES, ECMA_INTRINSIC_ARRAY_PROTOTYPE_VALUES, 0, 0) -ROUTINE (LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_KEYS, ECMA_INTRINSIC_SET_PROTOTYPE_KEYS, 0, 0) #endif /* ENABLED (JERRY_ESNEXT) */ #include "ecma-builtin-helpers-macro-undefs.inc.h" diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-map-prototype.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-map-prototype.inc.h index bc75896fb..bbc0d7005 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-map-prototype.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-map-prototype.inc.h @@ -42,10 +42,12 @@ ROUTINE (LIT_MAGIC_STRING_FOR_EACH_UL, ECMA_CONTAINER_ROUTINE_FOREACH, 2, 1) ROUTINE (LIT_MAGIC_STRING_GET, ECMA_CONTAINER_ROUTINE_GET, 1, 1) ROUTINE (LIT_MAGIC_STRING_HAS, ECMA_CONTAINER_ROUTINE_HAS, 1, 1) ROUTINE (LIT_MAGIC_STRING_SET, ECMA_CONTAINER_ROUTINE_SET, 2, 2) -ROUTINE (LIT_MAGIC_STRING_ENTRIES, ECMA_CONTAINER_ROUTINE_ENTRIES, 0, 0) ROUTINE (LIT_MAGIC_STRING_VALUES, ECMA_CONTAINER_ROUTINE_VALUES, 0, 0) ROUTINE (LIT_MAGIC_STRING_KEYS, ECMA_CONTAINER_ROUTINE_KEYS, 0, 0) -ROUTINE (LIT_GLOBAL_SYMBOL_ITERATOR, ECMA_CONTAINER_ROUTINE_ENTRIES, 0, 0) +INTRINSIC_PROPERTY (LIT_MAGIC_STRING_ENTRIES, LIT_INTERNAL_MAGIC_STRING_MAP_PROTOTYPE_ENTRIES, + ECMA_PROPERTY_CONFIGURABLE_WRITABLE) +INTRINSIC_PROPERTY (LIT_GLOBAL_SYMBOL_ITERATOR, LIT_INTERNAL_MAGIC_STRING_MAP_PROTOTYPE_ENTRIES, + ECMA_PROPERTY_CONFIGURABLE_WRITABLE) /* ECMA-262 v6, 23.1.3.10 */ ACCESSOR_READ_ONLY (LIT_MAGIC_STRING_SIZE, diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-set-prototype.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-set-prototype.inc.h index 4263c5d30..d241ca5e8 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-set-prototype.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-set-prototype.inc.h @@ -42,11 +42,11 @@ ROUTINE (LIT_MAGIC_STRING_DELETE, ECMA_CONTAINER_ROUTINE_DELETE, 1, 1) ROUTINE (LIT_MAGIC_STRING_FOR_EACH_UL, ECMA_CONTAINER_ROUTINE_FOREACH, 2, 1) ROUTINE (LIT_MAGIC_STRING_HAS, ECMA_CONTAINER_ROUTINE_HAS, 1, 1) ROUTINE (LIT_MAGIC_STRING_ENTRIES, ECMA_CONTAINER_ROUTINE_ENTRIES, 0, 0) -INTRINSIC_PROPERTY (LIT_MAGIC_STRING_VALUES, LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_KEYS, +INTRINSIC_PROPERTY (LIT_MAGIC_STRING_VALUES, LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_VALUES, ECMA_PROPERTY_CONFIGURABLE_WRITABLE) -INTRINSIC_PROPERTY (LIT_GLOBAL_SYMBOL_ITERATOR, LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_KEYS, +INTRINSIC_PROPERTY (LIT_GLOBAL_SYMBOL_ITERATOR, LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_VALUES, ECMA_PROPERTY_CONFIGURABLE_WRITABLE) -INTRINSIC_PROPERTY (LIT_MAGIC_STRING_KEYS, LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_KEYS, +INTRINSIC_PROPERTY (LIT_MAGIC_STRING_KEYS, LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_VALUES, ECMA_PROPERTY_CONFIGURABLE_WRITABLE) ACCESSOR_READ_ONLY (LIT_MAGIC_STRING_SIZE, diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c index 9bb1cf57b..b8d0a17f6 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c @@ -1243,7 +1243,7 @@ ecma_builtin_string_prototype_object_iterator (ecma_value_t to_string) /**< this return ecma_op_create_iterator_object (ecma_copy_value (to_string), ecma_builtin_get (ECMA_BUILTIN_ID_STRING_ITERATOR_PROTOTYPE), ECMA_PSEUDO_STRING_ITERATOR, - 0); + ECMA_ITERATOR_VALUES); } /* ecma_builtin_string_prototype_object_iterator */ #endif /* ENABLED (JERRY_ESNEXT) */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtins.c b/jerry-core/ecma/builtin-objects/ecma-builtins.c index 056fd523b..0ca9130f6 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtins.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtins.c @@ -721,13 +721,15 @@ ecma_builtin_routine_try_to_instantiate_property (ecma_object_t *object_p, /**< if (JERRY_UNLIKELY (name_id > LIT_NON_INTERNAL_MAGIC_STRING__COUNT)) { /* Note: Whenever new intrinsic routine is being added this mapping should be updated as well! */ - if (JERRY_UNLIKELY (name_id == LIT_INTERNAL_MAGIC_STRING_ARRAY_PROTOTYPE_VALUES)) + if (JERRY_UNLIKELY (name_id == LIT_INTERNAL_MAGIC_STRING_ARRAY_PROTOTYPE_VALUES) + || JERRY_UNLIKELY (name_id == LIT_INTERNAL_MAGIC_STRING_TYPEDARRAY_PROTOTYPE_VALUES) + || JERRY_UNLIKELY (name_id == LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_VALUES)) { name_p = ecma_get_magic_string (LIT_MAGIC_STRING_VALUES); } - else if (JERRY_UNLIKELY (name_id == LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_KEYS)) + else if (JERRY_UNLIKELY (name_id == LIT_INTERNAL_MAGIC_STRING_MAP_PROTOTYPE_ENTRIES)) { - name_p = ecma_get_magic_string (LIT_MAGIC_STRING_VALUES); + name_p = ecma_get_magic_string (LIT_MAGIC_STRING_ENTRIES); } else { diff --git a/jerry-core/ecma/builtin-objects/typedarray/ecma-builtin-typedarray-prototype.c b/jerry-core/ecma/builtin-objects/typedarray/ecma-builtin-typedarray-prototype.c index cd4cf5a37..5f9795e04 100644 --- a/jerry-core/ecma/builtin-objects/typedarray/ecma-builtin-typedarray-prototype.c +++ b/jerry-core/ecma/builtin-objects/typedarray/ecma-builtin-typedarray-prototype.c @@ -329,39 +329,6 @@ ecma_builtin_typedarray_prototype_for_each (ecma_value_t this_arg, /**< this arg TYPEDARRAY_ROUTINE_FOREACH); } /* ecma_builtin_typedarray_prototype_for_each */ -/** - * Helper function for typedArray.prototype object's {'keys', 'values', 'entries', '@@iterator'} - * routines common parts. - * - * See also: - * ECMA-262 v6, 22.2.3.15 - * ECMA-262 v6, 22.2.3.29 - * ECMA-262 v6, 22.2.3.6 - * ECMA-262 v6, 22.1.3.30 - * - * Note: - * Returned value must be freed with ecma_free_value. - * - * @return iterator result object, if success - * error - otherwise - */ -static ecma_value_t -ecma_builtin_typedarray_iterators_helper (ecma_value_t this_arg, /**< this argument */ - uint8_t type) /**< any combination of ecma_iterator_type_t bits */ -{ - if (!ecma_is_typedarray (this_arg)) - { - return ecma_raise_type_error (ECMA_ERR_MSG ("Argument 'this' is not a TypedArray.")); - } - - ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_ARRAY_ITERATOR_PROTOTYPE); - - return ecma_op_create_iterator_object (this_arg, - prototype_obj_p, - ECMA_PSEUDO_ARRAY_ITERATOR, - type); -} /* ecma_builtin_typedarray_iterators_helper */ - /** * The %TypedArray%.prototype object's 'keys' routine * @@ -375,25 +342,9 @@ ecma_builtin_typedarray_iterators_helper (ecma_value_t this_arg, /**< this argum static ecma_value_t ecma_builtin_typedarray_prototype_keys (ecma_value_t this_arg) /**< this argument */ { - return ecma_builtin_typedarray_iterators_helper (this_arg, ECMA_ITERATOR_KEYS); + return ecma_typedarray_iterators_helper (this_arg, ECMA_ITERATOR_KEYS); } /* ecma_builtin_typedarray_prototype_keys */ -/** - * The %TypedArray%.prototype object's 'values' and @@iterator routines - * - * See also: - * ES2015, 22.2.3.29 - * ES2015, 22.1.3.30 - * - * @return ecma value - * Returned value must be freed with ecma_free_value. - */ -static ecma_value_t -ecma_builtin_typedarray_prototype_values (ecma_value_t this_arg) /**< this argument */ -{ - return ecma_builtin_typedarray_iterators_helper (this_arg, ECMA_ITERATOR_VALUES); -} /* ecma_builtin_typedarray_prototype_values */ - /** * The %TypedArray%.prototype object's 'entries' routine * @@ -407,7 +358,7 @@ ecma_builtin_typedarray_prototype_values (ecma_value_t this_arg) /**< this argum static ecma_value_t ecma_builtin_typedarray_prototype_entries (ecma_value_t this_arg) /**< this argument */ { - return ecma_builtin_typedarray_iterators_helper (this_arg, ECMA_ITERATOR_KEYS_VALUES); + return ecma_typedarray_iterators_helper (this_arg, ECMA_ITERATOR_ENTRIES); } /* ecma_builtin_typedarray_prototype_entries */ /** @@ -1179,56 +1130,6 @@ cleanup: return ret_value; } /* ecma_builtin_typedarray_prototype_join */ -/** - * The TypedArray.prototype object's 'toString' routine basen on - * the Array.porottype object's 'toString' - * - * See also: - * ECMA-262 v5, 15.4.4.2 - * - * @return ecma value - * Returned value must be freed with ecma_free_value. - */ -static ecma_value_t -ecma_builtin_typedarray_prototype_object_to_string (ecma_value_t this_arg) /**< this argument */ -{ - ecma_value_t ret_value = ECMA_VALUE_EMPTY; - - /* 1. */ - ecma_value_t obj_this_value = ecma_op_to_object (this_arg); - if (ECMA_IS_VALUE_ERROR (obj_this_value)) - { - return obj_this_value; - } - ecma_object_t *obj_p = ecma_get_object_from_value (obj_this_value); - - /* 2. */ - ecma_value_t join_value = ecma_op_object_get_by_magic_id (obj_p, LIT_MAGIC_STRING_JOIN); - if (ECMA_IS_VALUE_ERROR (join_value)) - { - ecma_free_value (obj_this_value); - return join_value; - } - - if (!ecma_op_is_callable (join_value)) - { - /* 3. */ - ret_value = ecma_builtin_helper_object_to_string (this_arg); - } - else - { - /* 4. */ - ecma_object_t *join_func_obj_p = ecma_get_object_from_value (join_value); - - ret_value = ecma_op_function_call (join_func_obj_p, this_arg, NULL, 0); - } - - ecma_free_value (join_value); - ecma_free_value (obj_this_value); - - return ret_value; -} /* ecma_builtin_typedarray_prototype_object_to_string */ - /** * The %TypedArray%.prototype object's 'subarray' routine. * diff --git a/jerry-core/ecma/builtin-objects/typedarray/ecma-builtin-typedarray-prototype.inc.h b/jerry-core/ecma/builtin-objects/typedarray/ecma-builtin-typedarray-prototype.inc.h index 0ce3d1a4b..6d1fce369 100644 --- a/jerry-core/ecma/builtin-objects/typedarray/ecma-builtin-typedarray-prototype.inc.h +++ b/jerry-core/ecma/builtin-objects/typedarray/ecma-builtin-typedarray-prototype.inc.h @@ -52,7 +52,6 @@ ACCESSOR_READ_ONLY (LIT_GLOBAL_SYMBOL_TO_STRING_TAG, /* Routine properties: * (property name, C routine name, arguments number or NON_FIXED, value of the routine's length property) */ -ROUTINE (LIT_MAGIC_STRING_TO_STRING_UL, ecma_builtin_typedarray_prototype_object_to_string, 0, 0) ROUTINE (LIT_MAGIC_STRING_JOIN, ecma_builtin_typedarray_prototype_join, 1, 1) ROUTINE (LIT_MAGIC_STRING_EVERY, ecma_builtin_typedarray_prototype_every, 2, 1) ROUTINE (LIT_MAGIC_STRING_SOME, ecma_builtin_typedarray_prototype_some, 2, 1) @@ -74,9 +73,13 @@ ROUTINE (LIT_MAGIC_STRING_COPY_WITHIN, ecma_builtin_typedarray_prototype_copy_wi ROUTINE (LIT_MAGIC_STRING_SLICE, ecma_builtin_typedarray_prototype_slice, NON_FIXED, 2) ROUTINE (LIT_MAGIC_STRING_TO_LOCALE_STRING_UL, ecma_builtin_typedarray_prototype_to_locale_string, 0, 0) ROUTINE (LIT_MAGIC_STRING_KEYS, ecma_builtin_typedarray_prototype_keys, 0, 0) -ROUTINE (LIT_MAGIC_STRING_VALUES, ecma_builtin_typedarray_prototype_values, 0, 0) ROUTINE (LIT_MAGIC_STRING_ENTRIES, ecma_builtin_typedarray_prototype_entries, 0, 0) -ROUTINE (LIT_GLOBAL_SYMBOL_ITERATOR, ecma_builtin_typedarray_prototype_values, 0, 0) +INTRINSIC_PROPERTY (LIT_MAGIC_STRING_TO_STRING_UL, LIT_MAGIC_STRING_TO_STRING_UL, + ECMA_PROPERTY_CONFIGURABLE_WRITABLE) +INTRINSIC_PROPERTY (LIT_MAGIC_STRING_VALUES, LIT_INTERNAL_MAGIC_STRING_TYPEDARRAY_PROTOTYPE_VALUES, + ECMA_PROPERTY_CONFIGURABLE_WRITABLE) +INTRINSIC_PROPERTY (LIT_GLOBAL_SYMBOL_ITERATOR, LIT_INTERNAL_MAGIC_STRING_TYPEDARRAY_PROTOTYPE_VALUES, + ECMA_PROPERTY_CONFIGURABLE_WRITABLE) #endif /* ENABLED (JERRY_BUILTIN_TYPEDARRAY) */ diff --git a/jerry-core/ecma/operations/ecma-array-object.c b/jerry-core/ecma/operations/ecma-array-object.c index 3597213d5..cfdef1417 100644 --- a/jerry-core/ecma/operations/ecma-array-object.c +++ b/jerry-core/ecma/operations/ecma-array-object.c @@ -768,14 +768,14 @@ ecma_op_array_species_create (ecma_object_t *original_array_p, /**< The object f */ ecma_value_t ecma_op_create_array_iterator (ecma_object_t *obj_p, /**< array object */ - ecma_array_iterator_type_t type) /**< array iterator type */ + ecma_iterator_kind_t kind) /**< array iterator kind */ { ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_ARRAY_ITERATOR_PROTOTYPE); return ecma_op_create_iterator_object (ecma_make_object_value (obj_p), prototype_obj_p, ECMA_PSEUDO_ARRAY_ITERATOR, - (uint8_t) type); + kind); } /* ecma_op_create_array_iterator */ #endif /* ENABLED (JERRY_ESNEXT) */ @@ -1196,6 +1196,50 @@ ecma_array_get_length (ecma_object_t *array_p) /**< array object */ return ((ecma_extended_object_t *) array_p)->u.array.length; } /* ecma_array_get_length */ +/** + * The Array.prototype and %TypedArray%.prototype objects' 'toString' routine. + * + * See also: + * ECMA-262 v5, 15.4.4.2 + * ECMA-262 v6, 22.1.3.7 + * + * @return ecma value + * Returned value must be freed with ecma_free_value. + */ +ecma_value_t +ecma_array_object_to_string (ecma_value_t this_arg) /**< this argument */ +{ + JERRY_ASSERT (ecma_is_value_object (this_arg)); + + ecma_value_t ret_value = ECMA_VALUE_EMPTY; + + ecma_object_t *obj_p = ecma_get_object_from_value (this_arg); + + /* 2. */ + ecma_value_t join_value = ecma_op_object_get_by_magic_id (obj_p, LIT_MAGIC_STRING_JOIN); + if (ECMA_IS_VALUE_ERROR (join_value)) + { + return join_value; + } + + if (!ecma_op_is_callable (join_value)) + { + /* 3. */ + ret_value = ecma_builtin_helper_object_to_string (this_arg); + } + else + { + /* 4. */ + ecma_object_t *join_func_obj_p = ecma_get_object_from_value (join_value); + + ret_value = ecma_op_function_call (join_func_obj_p, this_arg, NULL, 0); + } + + ecma_free_value (join_value); + + return ret_value; +} /* ecma_array_object_to_string */ + /** * List names of a String object's lazy instantiated properties * diff --git a/jerry-core/ecma/operations/ecma-array-object.h b/jerry-core/ecma/operations/ecma-array-object.h index 6a4a664d7..982639a84 100644 --- a/jerry-core/ecma/operations/ecma-array-object.h +++ b/jerry-core/ecma/operations/ecma-array-object.h @@ -106,7 +106,7 @@ ecma_op_array_species_create (ecma_object_t *original_array_p, ecma_value_t ecma_op_create_array_iterator (ecma_object_t *obj_p, - ecma_array_iterator_type_t type); + ecma_iterator_kind_t kind); #endif /* ENABLED (JERRY_ESNEXT) */ ecma_value_t @@ -118,6 +118,9 @@ ecma_op_array_object_define_own_property (ecma_object_t *object_p, ecma_string_t uint32_t ecma_array_get_length (ecma_object_t *array_p); +ecma_value_t +ecma_array_object_to_string (ecma_value_t this_arg); + void ecma_op_array_list_lazy_property_names (ecma_object_t *obj_p, uint32_t opts, diff --git a/jerry-core/ecma/operations/ecma-container-object.c b/jerry-core/ecma/operations/ecma-container-object.c index a7db78f07..0165c037b 100644 --- a/jerry-core/ecma/operations/ecma-container-object.c +++ b/jerry-core/ecma/operations/ecma-container-object.c @@ -974,17 +974,16 @@ ecma_op_container_remove_weak_entry (ecma_object_t *object_p, /**< internal cont * @return Map/Set iterator object, if success * error - otherwise */ -ecma_value_t +inline ecma_value_t JERRY_ATTR_ALWAYS_INLINE ecma_op_container_create_iterator (ecma_value_t this_arg, /**< this argument */ - uint8_t type, /**< any combination of - * ecma_iterator_type_t bits */ ecma_builtin_id_t proto_id, /**< prototype builtin id */ - ecma_pseudo_array_type_t iterator_type) /**< type of the iterator */ + ecma_pseudo_array_type_t iterator_type, /**< iterator type */ + ecma_iterator_kind_t kind) /**< iterator kind */ { return ecma_op_create_iterator_object (this_arg, ecma_builtin_get (proto_id), - (uint8_t) iterator_type, - type); + iterator_type, + kind); } /* ecma_op_container_create_iterator */ /** @@ -1129,7 +1128,7 @@ ecma_op_container_iterator_next (ecma_value_t this_val, /**< this argument */ } else { - JERRY_ASSERT (iterator_kind == ECMA_ITERATOR_KEYS_VALUES); + JERRY_ASSERT (iterator_kind == ECMA_ITERATOR_ENTRIES); ecma_value_t entry_array_value; entry_array_value = ecma_create_array_from_iter_element (value_arg, key_arg); @@ -1216,12 +1215,12 @@ ecma_builtin_container_dispatch_routine (uint16_t builtin_routine_id, /**< built iterator_type = ECMA_PSEUDO_SET_ITERATOR; } - uint8_t mode = (uint8_t) (builtin_routine_id - ECMA_CONTAINER_ROUTINE_KEYS); + ecma_iterator_kind_t kind = (ecma_iterator_kind_t) (builtin_routine_id - ECMA_CONTAINER_ROUTINE_KEYS); return ecma_op_container_create_iterator (this_arg, - mode, builtin_iterator_prototype, - iterator_type); + iterator_type, + kind); } default: { diff --git a/jerry-core/ecma/operations/ecma-container-object.h b/jerry-core/ecma/operations/ecma-container-object.h index af0e0681e..d07965042 100644 --- a/jerry-core/ecma/operations/ecma-container-object.h +++ b/jerry-core/ecma/operations/ecma-container-object.h @@ -70,8 +70,10 @@ ecma_value_t ecma_op_container_delete_weak (ecma_extended_object_t *map_object_p void ecma_op_container_unref_weak (ecma_object_t *object_p, ecma_value_t ref_holder); void ecma_op_container_remove_weak_entry (ecma_object_t *container_p, ecma_value_t key_arg); void ecma_op_container_free_entries (ecma_object_t *object_p); -ecma_value_t ecma_op_container_create_iterator (ecma_value_t this_arg, uint8_t type, - ecma_builtin_id_t proto_id, ecma_pseudo_array_type_t iterator_type); +ecma_value_t ecma_op_container_create_iterator (ecma_value_t this_arg, + ecma_builtin_id_t proto_id, + ecma_pseudo_array_type_t iterator_type, + ecma_iterator_kind_t kind); ecma_value_t ecma_op_container_iterator_next (ecma_value_t this_val, ecma_pseudo_array_type_t iterator_type); ecma_value_t ecma_builtin_container_dispatch_routine (uint16_t builtin_routine_id, ecma_value_t this_arg, const ecma_value_t arguments_list_p[], diff --git a/jerry-core/ecma/operations/ecma-iterator-object.c b/jerry-core/ecma/operations/ecma-iterator-object.c index 35ee14202..f3d7dda03 100644 --- a/jerry-core/ecma/operations/ecma-iterator-object.c +++ b/jerry-core/ecma/operations/ecma-iterator-object.c @@ -135,11 +135,13 @@ ecma_create_iter_result_object (ecma_value_t value, /**< value */ ecma_value_t ecma_op_create_iterator_object (ecma_value_t iterated_value, /**< value from create iterator */ ecma_object_t *prototype_obj_p, /**< prototype object */ - uint8_t iterator_type, /**< iterator type, see ecma_pseudo_array_type_t */ - uint8_t extra_info) /**< extra information */ + ecma_pseudo_array_type_t iterator_type, /**< iterator type */ + ecma_iterator_kind_t kind) /**< iterator kind*/ { /* 1. */ - JERRY_ASSERT (iterator_type >= ECMA_PSEUDO_ARRAY_ITERATOR && iterator_type <= ECMA_PSEUDO_ARRAY__MAX); + JERRY_ASSERT (iterator_type >= ECMA_PSEUDO_ARRAY_ITERATOR + && iterator_type <= ECMA_PSEUDO_ARRAY__MAX + && kind < ECMA_ITERATOR__COUNT); /* 2. */ ecma_object_t *object_p = ecma_create_object (prototype_obj_p, @@ -147,14 +149,14 @@ ecma_op_create_iterator_object (ecma_value_t iterated_value, /**< value from cre ECMA_OBJECT_TYPE_PSEUDO_ARRAY); ecma_extended_object_t *ext_obj_p = (ecma_extended_object_t *) object_p; - ext_obj_p->u.pseudo_array.type = iterator_type; + ext_obj_p->u.pseudo_array.type = (uint8_t) iterator_type; /* 3. */ ext_obj_p->u.pseudo_array.u2.iterated_value = iterated_value; /* 4. */ ext_obj_p->u.pseudo_array.u1.iterator_index = 0; /* 5. */ - ext_obj_p->u.pseudo_array.extra_info = extra_info; + ext_obj_p->u.pseudo_array.extra_info = (uint8_t) kind; /* 6. */ return ecma_make_object_value (object_p); diff --git a/jerry-core/ecma/operations/ecma-iterator-object.h b/jerry-core/ecma/operations/ecma-iterator-object.h index 0ec118cb9..9febcf183 100644 --- a/jerry-core/ecma/operations/ecma-iterator-object.h +++ b/jerry-core/ecma/operations/ecma-iterator-object.h @@ -44,8 +44,10 @@ typedef enum #define ECMA_ITERATOR_INDEX_LIMIT UINT16_MAX ecma_value_t -ecma_op_create_iterator_object (ecma_value_t iterated_value, ecma_object_t *prototype_obj_p, - uint8_t iterator_type, uint8_t extra_info); +ecma_op_create_iterator_object (ecma_value_t iterated_value, + ecma_object_t *prototype_obj_p, + ecma_pseudo_array_type_t iterator_type, + ecma_iterator_kind_t kind); ecma_value_t ecma_create_iter_result_object (ecma_value_t value, ecma_value_t done); diff --git a/jerry-core/ecma/operations/ecma-typedarray-object.c b/jerry-core/ecma/operations/ecma-typedarray-object.c index b20de7314..a69998e46 100644 --- a/jerry-core/ecma/operations/ecma-typedarray-object.c +++ b/jerry-core/ecma/operations/ecma-typedarray-object.c @@ -1221,6 +1221,39 @@ ecma_op_create_typedarray (const ecma_value_t *arguments_list_p, /**< the arg li return ret; } /* ecma_op_create_typedarray */ +/** + * Helper function for typedArray.prototype object's {'keys', 'values', 'entries', '@@iterator'} + * routines common parts. + * + * See also: + * ECMA-262 v6, 22.2.3.15 + * ECMA-262 v6, 22.2.3.29 + * ECMA-262 v6, 22.2.3.6 + * ECMA-262 v6, 22.1.3.30 + * + * Note: + * Returned value must be freed with ecma_free_value. + * + * @return iterator result object, if success + * error - otherwise + */ +ecma_value_t +ecma_typedarray_iterators_helper (ecma_value_t this_arg, /**< this argument */ + ecma_iterator_kind_t kind) /**< iterator kind */ +{ + if (!ecma_is_typedarray (this_arg)) + { + return ecma_raise_type_error (ECMA_ERR_MSG ("Argument 'this' is not a TypedArray.")); + } + + ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_ARRAY_ITERATOR_PROTOTYPE); + + return ecma_op_create_iterator_object (this_arg, + prototype_obj_p, + ECMA_PSEUDO_ARRAY_ITERATOR, + kind); +} /* ecma_typedarray_iterators_helper */ + /** * Check if the object is typedarray * diff --git a/jerry-core/ecma/operations/ecma-typedarray-object.h b/jerry-core/ecma/operations/ecma-typedarray-object.h index 0cce7fb63..b3eae8f4c 100644 --- a/jerry-core/ecma/operations/ecma-typedarray-object.h +++ b/jerry-core/ecma/operations/ecma-typedarray-object.h @@ -58,6 +58,9 @@ ecma_value_t ecma_op_create_typedarray (const ecma_value_t *arguments_list_p, ecma_object_t *proto_p, uint8_t element_size_shift, ecma_typedarray_type_t typedarray_id); +ecma_value_t +ecma_typedarray_iterators_helper (ecma_value_t this_arg, ecma_iterator_kind_t kind); + bool ecma_object_is_typedarray (ecma_object_t *obj_p); bool ecma_is_typedarray (ecma_value_t target); void ecma_op_typedarray_list_lazy_property_names (ecma_object_t *obj_p, diff --git a/jerry-core/lit/lit-magic-strings.h b/jerry-core/lit/lit-magic-strings.h index a38286b33..d41385509 100644 --- a/jerry-core/lit/lit-magic-strings.h +++ b/jerry-core/lit/lit-magic-strings.h @@ -41,7 +41,9 @@ typedef enum LIT_INTERNAL_MAGIC_STRING_MAP_KEY, /**< Property key used when an object is a key in a map object */ LIT_INTERNAL_MAGIC_API_INTERNAL, /**< Property key used to add non-visible JS properties from the public API */ LIT_INTERNAL_MAGIC_STRING_ARRAY_PROTOTYPE_VALUES, /**< %ArrayProto_values% intrinsic routine */ - LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_KEYS, /**< Set.prototype values, keys and [@@iterator] routines */ + LIT_INTERNAL_MAGIC_STRING_TYPEDARRAY_PROTOTYPE_VALUES, /**< %TypedArray%.prototype values and [@@iterator] routine */ + LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_VALUES, /**< Set.prototype values, keys and [@@iterator] routines */ + LIT_INTERNAL_MAGIC_STRING_MAP_PROTOTYPE_ENTRIES, /**< Map.prototype entries and [@@iterator] routines */ LIT_INTERNAL_MAGIC_THIS_BINDING_VALUE, /**< FunctionEnvironmentRecord [[ThisBindingValue]] internal slot */ LIT_INTERNAL_MAGIC_PROMISE_CAPABILITY, /**< PromiseCapability record */ /* List of well known symbols */ diff --git a/jerry-core/lit/lit-magic-strings.inc.h b/jerry-core/lit/lit-magic-strings.inc.h index d0338347f..f2bd8610a 100644 --- a/jerry-core/lit/lit-magic-strings.inc.h +++ b/jerry-core/lit/lit-magic-strings.inc.h @@ -48,7 +48,8 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_OF, "of") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_LN2_U, "LN2") #endif #if ENABLED (JERRY_BUILTIN_CONTAINER) \ -|| ENABLED (JERRY_BUILTIN_MAP) +|| ENABLED (JERRY_BUILTIN_MAP) \ +|| ENABLED (JERRY_ESNEXT) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_MAP_UL, "Map") #endif LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_NAN, "NaN") @@ -162,10 +163,7 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_FROM, "from") #if ENABLED (JERRY_BUILTIN_MATH) && ENABLED (JERRY_ESNEXT) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_IMUL, "imul") #endif -#if ENABLED (JERRY_BUILTIN_ARRAY) \ -|| ENABLED (JERRY_BUILTIN_TYPEDARRAY) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_JOIN, "join") -#endif LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_KEYS, "keys") #if ENABLED (JERRY_BUILTIN_MATH) && ENABLED (JERRY_ESNEXT) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_LOG2, "log2") @@ -394,7 +392,7 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SEARCH, "search") #endif #if !ENABLED (JERRY_ESNEXT) && ENABLED (JERRY_BUILTIN_REGEXP) \ || ENABLED (JERRY_BUILTIN_REGEXP) && ENABLED (JERRY_ESNEXT) \ -|| ENABLED (JERRY_BUILTIN_REGEXP) && !( ENABLED (JERRY_ESNEXT)) +|| ENABLED (JERRY_BUILTIN_REGEXP) && !(ENABLED (JERRY_ESNEXT)) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SOURCE, "source") #endif #if ENABLED (JERRY_BUILTIN_ARRAY) @@ -565,7 +563,7 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ITERATOR, "iterator") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_PAD_START, "padStart") #endif #if ENABLED (JERRY_ESNEXT) \ -|| !( ENABLED (JERRY_ESNEXT)) +|| !(ENABLED (JERRY_ESNEXT)) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_PARSE_INT, "parseInt") #endif #if ENABLED (JERRY_BUILTIN_DATE) @@ -638,7 +636,7 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_LASTINDEX_UL, "lastIndex") #endif #if !ENABLED (JERRY_ESNEXT) && ENABLED (JERRY_BUILTIN_REGEXP) \ || ENABLED (JERRY_BUILTIN_REGEXP) && ENABLED (JERRY_ESNEXT) \ -|| ENABLED (JERRY_BUILTIN_REGEXP) && !( ENABLED (JERRY_ESNEXT)) +|| ENABLED (JERRY_BUILTIN_REGEXP) && !(ENABLED (JERRY_ESNEXT)) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_MULTILINE, "multiline") #endif LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_PROTOTYPE, "prototype") @@ -693,11 +691,11 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_UTC_DATE_UL, "getUTCDate") #endif #if !ENABLED (JERRY_ESNEXT) && ENABLED (JERRY_BUILTIN_REGEXP) \ || ENABLED (JERRY_BUILTIN_REGEXP) && ENABLED (JERRY_ESNEXT) \ -|| ENABLED (JERRY_BUILTIN_REGEXP) && !( ENABLED (JERRY_ESNEXT)) +|| ENABLED (JERRY_BUILTIN_REGEXP) && !(ENABLED (JERRY_ESNEXT)) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_IGNORECASE_UL, "ignoreCase") #endif #if ENABLED (JERRY_ESNEXT) \ -|| !( ENABLED (JERRY_ESNEXT)) +|| !(ENABLED (JERRY_ESNEXT)) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_PARSE_FLOAT, "parseFloat") #endif #if ENABLED (JERRY_BUILTIN_DATAVIEW) @@ -755,7 +753,8 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_FULL_YEAR_UL, "setFullYear") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_UTC_HOURS_UL, "setUTCHours") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_UTC_MONTH_UL, "setUTCMonth") #endif -#if ENABLED (JERRY_BUILTIN_ANNEXB) && ENABLED (JERRY_BUILTIN_DATE) +#if ENABLED (JERRY_BUILTIN_ANNEXB) && ENABLED (JERRY_BUILTIN_DATE) && ENABLED (JERRY_ESNEXT) \ +|| ENABLED (JERRY_BUILTIN_ANNEXB) && ENABLED (JERRY_BUILTIN_DATE) && !(ENABLED (JERRY_ESNEXT)) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TO_GMT_STRING_UL, "toGMTString") #endif #if ENABLED (JERRY_BUILTIN_DATE) @@ -771,7 +770,8 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TO_PRECISION_UL, "toPrecision") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TO_PRIMITIVE, "toPrimitive") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TO_STRING_TAG, "toStringTag") #endif -#if ENABLED (JERRY_BUILTIN_DATE) +#if ENABLED (JERRY_BUILTIN_DATE) && !(ENABLED (JERRY_ESNEXT)) \ +|| ENABLED (JERRY_ESNEXT) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TO_UTC_STRING_UL, "toUTCString") #endif #if ENABLED (JERRY_BUILTIN_STRING) @@ -786,7 +786,8 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_FLOAT32_ARRAY_UL, "Float32Array") #if ENABLED (JERRY_BUILTIN_TYPEDARRAY) && ENABLED (JERRY_NUMBER_TYPE_FLOAT64) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_FLOAT64_ARRAY_UL, "Float64Array") #endif -#if ENABLED (JERRY_BUILTIN_DATE) +#if ENABLED (JERRY_BUILTIN_DATE) \ +|| ENABLED (JERRY_ESNEXT) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_INVALID_DATE_UL, "Invalid Date") #endif #if ENABLED (JERRY_BUILTIN_MAP) \ @@ -937,7 +938,8 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (1, LIT_MAGIC_STRING_OF) #elif ENABLED (JERRY_BUILTIN_MATH) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (1, LIT_MAGIC_STRING_LN2_U) #elif ENABLED (JERRY_BUILTIN_CONTAINER) \ -|| ENABLED (JERRY_BUILTIN_MAP) +|| ENABLED (JERRY_BUILTIN_MAP) \ +|| ENABLED (JERRY_ESNEXT) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (1, LIT_MAGIC_STRING_MAP_UL) #else LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (1, LIT_MAGIC_STRING_NAN) @@ -952,7 +954,8 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (2, LIT_MAGIC_STRING_OF) #elif ENABLED (JERRY_BUILTIN_MATH) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (2, LIT_MAGIC_STRING_LN2_U) #elif ENABLED (JERRY_BUILTIN_CONTAINER) \ -|| ENABLED (JERRY_BUILTIN_MAP) +|| ENABLED (JERRY_BUILTIN_MAP) \ +|| ENABLED (JERRY_ESNEXT) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (2, LIT_MAGIC_STRING_MAP_UL) #else LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (2, LIT_MAGIC_STRING_NAN) @@ -960,7 +963,8 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (2, LIT_MAGIC_STRING_NAN) #if ENABLED (JERRY_BUILTIN_MATH) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (3, LIT_MAGIC_STRING_LN2_U) #elif ENABLED (JERRY_BUILTIN_CONTAINER) \ -|| ENABLED (JERRY_BUILTIN_MAP) +|| ENABLED (JERRY_BUILTIN_MAP) \ +|| ENABLED (JERRY_ESNEXT) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (3, LIT_MAGIC_STRING_MAP_UL) #else LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (3, LIT_MAGIC_STRING_NAN) @@ -1007,7 +1011,8 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (11, LIT_MAGIC_STRING_RESOURCE_ANON) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (12, LIT_MAGIC_STRING_FLOAT32_ARRAY_UL) #elif ENABLED (JERRY_BUILTIN_TYPEDARRAY) && ENABLED (JERRY_NUMBER_TYPE_FLOAT64) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (12, LIT_MAGIC_STRING_FLOAT64_ARRAY_UL) -#elif ENABLED (JERRY_BUILTIN_DATE) +#elif ENABLED (JERRY_BUILTIN_DATE) \ +|| ENABLED (JERRY_ESNEXT) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (12, LIT_MAGIC_STRING_INVALID_DATE_UL) #elif ENABLED (JERRY_BUILTIN_MAP) \ || ENABLED (JERRY_ESNEXT) diff --git a/tests/jerry/es.next/intrinsic-properties.js b/tests/jerry/es.next/intrinsic-properties.js new file mode 100644 index 000000000..488bb9915 --- /dev/null +++ b/tests/jerry/es.next/intrinsic-properties.js @@ -0,0 +1,30 @@ +// Copyright JS Foundation and other contributors, http://js.foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +assert(Array.prototype.values === Array.prototype[Symbol.iterator]); +assert(Set.prototype.values === Set.prototype[Symbol.iterator]); +assert(Set.prototype.keys === Set.prototype[Symbol.iterator]); +assert(Map.prototype.entries === Map.prototype[Symbol.iterator]); +assert(Date.prototype.toGMTString === Date.prototype.toUTCString); +assert(Number.parseInt === parseInt); +assert(Number.parseFloat === parseFloat); + +var typedarrays = [Uint8Array, Uint16Array, Uint32Array, Int8Array, Int16Array, Int32Array, Float32Array, Float64Array]; +for (ta1 of typedarrays) { + for (ta2 of typedarrays) { + assert(ta1.prototype.values === ta2.prototype[Symbol.iterator]); + } + + assert(ta1.prototype.toString === Array.prototype.toString); +} diff --git a/tests/test262-es6-excludelist.xml b/tests/test262-es6-excludelist.xml index 26bcbaafa..7a88a2194 100644 --- a/tests/test262-es6-excludelist.xml +++ b/tests/test262-es6-excludelist.xml @@ -60,7 +60,6 @@ - diff --git a/tools/gen-magic-strings.py b/tools/gen-magic-strings.py index 06e774aac..f8c11fa50 100755 --- a/tools/gen-magic-strings.py +++ b/tools/gen-magic-strings.py @@ -127,11 +127,11 @@ def extract_magic_string_refs(debug=False): guard_stack.append([process_guard(if_match.group(1))]) elif elif_match is not None: guards = guard_stack[-1] - guards[-1] = '!(%s)' % guards[-1] + guards[-1] = '!(%s)' % guards[-1].strip() guards.append(process_guard(elif_match.group(1))) elif else_match is not None: guards = guard_stack[-1] - guards[-1] = '!(%s)' % guards[-1] + guards[-1] = '!(%s)' % guards[-1].strip() elif endif_match is not None: guard_stack.pop()