diff options
author | kisbg <kisbg@inf.u-szeged.hu> | 2021-03-08 10:43:42 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-08 11:43:42 +0100 |
commit | dc3ae4ff06ee811b81b4679e3cd51138a37b4d96 (patch) | |
tree | 4a6f3475cf74bd8290249f99331ef80ec3393436 | |
parent | 96cd542bf5d09d12791931dcbf054f66f1b5f64f (diff) |
Implement Promise.allsettled (#4616)
Also i updated the promise race and all method to the latest standart
The two jerry/es.next test-cases has been update to support the latest standart
JerryScript-DCO-1.0-Signed-off-by: bence gabor kis kisbg@inf.u-szeged.hu
-rw-r--r-- | jerry-core/ecma/base/ecma-globals.h | 10 | ||||
-rw-r--r-- | jerry-core/ecma/builtin-objects/ecma-builtin-handlers.inc.h | 2 | ||||
-rw-r--r-- | jerry-core/ecma/builtin-objects/ecma-builtin-promise.c | 133 | ||||
-rw-r--r-- | jerry-core/ecma/builtin-objects/ecma-builtin-promise.inc.h | 1 | ||||
-rw-r--r-- | jerry-core/ecma/operations/ecma-promise-object.c | 59 | ||||
-rw-r--r-- | jerry-core/ecma/operations/ecma-promise-object.h | 4 | ||||
-rw-r--r-- | jerry-core/lit/lit-magic-strings.inc.h | 17 | ||||
-rw-r--r-- | jerry-core/lit/lit-magic-strings.ini | 5 | ||||
-rw-r--r-- | tests/jerry/es.next/promise-all-iterator.js | 4 | ||||
-rw-r--r-- | tests/jerry/es.next/promise-race-iterator.js | 4 | ||||
-rw-r--r-- | tests/test262-esnext-excludelist.xml | 107 |
11 files changed, 168 insertions, 178 deletions
diff --git a/jerry-core/ecma/base/ecma-globals.h b/jerry-core/ecma/base/ecma-globals.h index dfe047f5..693729d1 100644 --- a/jerry-core/ecma/base/ecma-globals.h +++ b/jerry-core/ecma/base/ecma-globals.h @@ -2120,6 +2120,16 @@ typedef struct * real index + 1 in the [[Values]] list - otherwise */ } ecma_promise_all_executor_t; +/** + * Promise prototype methods helper. + */ +typedef enum +{ + ECMA_PROMISE_ALL_RESOLVE, /**< promise.all resolve */ + ECMA_PROMISE_ALLSETTLED_RESOLVE, /**< promise.allSettled resolve */ + ECMA_PROMISE_ALLSETTLED_REJECT, /**< promise.allSettled reject */ +} ecma_promise_helper; + #endif /* JERRY_ESNEXT */ #if JERRY_BUILTIN_DATAVIEW diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-handlers.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-handlers.inc.h index 3c047ffc..3e61e08e 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-handlers.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-handlers.inc.h @@ -17,7 +17,7 @@ ECMA_NATIVE_HANDLER (ECMA_NATIVE_HANDLER_PROMISE_RESOLVE, ecma_promise_resolve_h ECMA_NATIVE_HANDLER (ECMA_NATIVE_HANDLER_PROMISE_REJECT, ecma_promise_reject_handler, 1) ECMA_NATIVE_HANDLER (ECMA_NATIVE_HANDLER_PROMISE_THEN_FINALLY, ecma_promise_then_finally_cb, 1) ECMA_NATIVE_HANDLER (ECMA_NATIVE_HANDLER_PROMISE_CATCH_FINALLY, ecma_promise_catch_finally_cb, 1) -ECMA_NATIVE_HANDLER (ECMA_NATIVE_HANDLER_PROMISE_ALL_HELPER, ecma_promise_all_handler_cb, 1) +ECMA_NATIVE_HANDLER (ECMA_NATIVE_HANDLER_PROMISE_ALL_HELPER, ecma_promise_all_or_all_settled_handler_cb, 1) ECMA_NATIVE_HANDLER (ECMA_NATIVE_HANDLER_PROMISE_CAPABILITY_EXECUTOR, ecma_op_get_capabilities_executor_cb, 2) #if JERRY_BUILTIN_PROXY ECMA_NATIVE_HANDLER (ECMA_NATIVE_HANDLER_PROXY_REVOKE, ecma_proxy_revoke_cb, 0) diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-promise.c b/jerry-core/ecma/builtin-objects/ecma-builtin-promise.c index d5957e0e..a55e61e9 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-promise.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-promise.c @@ -46,6 +46,7 @@ enum ECMA_PROMISE_ROUTINE_RESOLVE, ECMA_PROMISE_ROUTINE_RACE, ECMA_PROMISE_ROUTINE_ALL, + ECMA_PROMISE_ROUTINE_ALLSETTLED, ECMA_PROMISE_ROUTINE_SPECIES_GET }; @@ -116,6 +117,7 @@ ecma_builtin_promise_perform_race (ecma_value_t iterator, /**< the iterator for ecma_value_t next_method, /**< next method */ ecma_object_t *capability_obj_p, /**< PromiseCapability record */ ecma_value_t ctor, /**< Constructor value */ + ecma_value_t resolve, /** the resolve of Promise.all */ bool *done_p) /**< [out] iteratorRecord[[done]] */ { JERRY_ASSERT (ecma_is_value_object (iterator)); @@ -124,21 +126,6 @@ ecma_builtin_promise_perform_race (ecma_value_t iterator, /**< the iterator for ecma_promise_capabality_t *capability_p = (ecma_promise_capabality_t *) capability_obj_p; - /* 3. */ - ecma_value_t resolve = ecma_op_object_get_by_magic_id (ecma_get_object_from_value (ctor), LIT_MAGIC_STRING_RESOLVE); - - if (ECMA_IS_VALUE_ERROR (resolve)) - { - return resolve; - } - - /* 4. */ - if (!ecma_op_is_callable (resolve)) - { - ecma_free_value (resolve); - return ecma_raise_type_error (ECMA_ERR_MSG ("Resolve method must be callable")); - } - ecma_object_t *resolve_func_p = ecma_get_object_from_value (resolve); ecma_value_t ret_value = ECMA_VALUE_ERROR; @@ -196,12 +183,11 @@ ecma_builtin_promise_perform_race (ecma_value_t iterator, /**< the iterator for done: *done_p = true; exit: - ecma_deref_object (resolve_func_p); return ret_value; } /* ecma_builtin_promise_perform_race */ /** - * Runtime Semantics: PerformPromiseAll. + * Runtime Semantics: PerformPromise all or allSettled. * * See also: * ES2020 25.6.4.1.1 @@ -210,11 +196,14 @@ exit: * Returned value must be freed with ecma_free_value. */ static inline ecma_value_t -ecma_builtin_promise_perform_all (ecma_value_t iterator, /**< iteratorRecord */ - ecma_value_t next_method, /**< next method */ - ecma_object_t *capability_obj_p, /**< PromiseCapability record */ - ecma_value_t ctor, /**< the caller of Promise.race */ - bool *done_p) /**< [out] iteratorRecord[[done]] */ +ecma_builtin_promise_perform_all_or_all_settled (ecma_value_t iterator, /**< iteratorRecord */ + ecma_value_t next_method, /**< next method */ + ecma_object_t *capability_obj_p, /**< PromiseCapability record */ + ecma_value_t ctor, /**< the caller of Promise.all */ + ecma_value_t resolve, /** the resolve of Promise.all */ + uint8_t builtin_routine_id, /**< built-in wide routine + * identifier */ + bool *done_p) /**< [out] iteratorRecord[[done]] */ { /* 1. - 2. */ JERRY_ASSERT (ecma_object_class_is (capability_obj_p, LIT_INTERNAL_MAGIC_PROMISE_CAPABILITY)); @@ -222,20 +211,6 @@ ecma_builtin_promise_perform_all (ecma_value_t iterator, /**< iteratorRecord */ ecma_promise_capabality_t *capability_p = (ecma_promise_capabality_t *) capability_obj_p; - ecma_value_t resolve = ecma_op_object_get_by_magic_id (ecma_get_object_from_value (ctor), - LIT_MAGIC_STRING_RESOLVE); - - if (ECMA_IS_VALUE_ERROR (resolve)) - { - return resolve; - } - - if (!ecma_op_is_callable (resolve)) - { - ecma_free_value (resolve); - return ecma_raise_type_error (ECMA_ERR_MSG ("Resolve method must be callable")); - } - ecma_object_t *resolve_func_p = ecma_get_object_from_value (resolve); /* 3. */ @@ -333,17 +308,43 @@ ecma_builtin_promise_perform_all (ecma_value_t iterator, /**< iteratorRecord */ /* p. */ executor_p->remaining_elements = remaining; + executor_p->header.u.class_prop.extra_info = ECMA_PROMISE_ALL_RESOLVE; - /* q. */ - ecma_promise_remaining_inc_or_dec (remaining, true); + if (builtin_routine_id == ECMA_PROMISE_ROUTINE_ALLSETTLED) + { + executor_p->header.u.class_prop.extra_info = ECMA_PROMISE_ALLSETTLED_RESOLVE; + } - /* r. */ ecma_value_t args[2]; args[0] = ecma_make_object_value (executor_func_p); - args[1] = capability_p->reject; - ecma_value_t result = ecma_op_invoke_by_magic_id (next_promise, LIT_MAGIC_STRING_THEN, args, 2); - ecma_free_value (next_promise); - ecma_deref_object (executor_func_p); + + /* q. */ + ecma_promise_remaining_inc_or_dec (remaining, true); + ecma_value_t result; + if (builtin_routine_id == ECMA_PROMISE_ROUTINE_ALLSETTLED) + { + ecma_object_t *reject_func_p = ecma_op_create_native_handler (ECMA_NATIVE_HANDLER_PROMISE_ALL_HELPER, + sizeof (ecma_promise_all_executor_t)); + + ecma_promise_all_executor_t *reject_p = (ecma_promise_all_executor_t *) reject_func_p; + reject_p->index = idx; + reject_p->values = values_array; + reject_p->capability = ecma_make_object_value (capability_obj_p); + reject_p->remaining_elements = remaining; + reject_p->header.u.class_prop.extra_info = ECMA_PROMISE_ALLSETTLED_REJECT; + args[1] = ecma_make_object_value (reject_func_p); + result = ecma_op_invoke_by_magic_id (next_promise, LIT_MAGIC_STRING_THEN, args, 2); + ecma_free_value (next_promise); + ecma_deref_object (executor_func_p); + ecma_deref_object (reject_func_p); + } + else + { + args[1] = capability_p->reject; + result = ecma_op_invoke_by_magic_id (next_promise, LIT_MAGIC_STRING_THEN, args, 2); + ecma_free_value (next_promise); + ecma_deref_object (executor_func_p); + } /* s. */ if (ECMA_IS_VALUE_ERROR (result)) @@ -359,21 +360,20 @@ done: exit: ecma_free_value (remaining); ecma_deref_object (values_array_obj_p); - ecma_deref_object (resolve_func_p); - return ret_value; -} /* ecma_builtin_promise_perform_all */ +} /* ecma_builtin_promise_perform_all_or_all_settled */ /** - * The common function for both Promise.race and Promise.all. + * The common function for Promise.race, Promise.all and Promise.allSettled. * * @return ecma value of the new promise. * Returned value must be freed with ecma_free_value. */ static ecma_value_t -ecma_builtin_promise_race_or_all (ecma_value_t this_arg, /**< 'this' argument */ - ecma_value_t iterable, /**< the items to be resolved */ - bool is_race) /**< indicates whether it is race function */ +ecma_builtin_promise_helper (ecma_value_t this_arg, /**< 'this' argument */ + ecma_value_t iterable, /**< the items to be resolved */ + uint8_t builtin_routine_id) /**< built-in wide routine + * identifier */ { ecma_object_t *capability_obj_p = ecma_promise_new_capability (this_arg, ECMA_VALUE_UNDEFINED); @@ -382,6 +382,25 @@ ecma_builtin_promise_race_or_all (ecma_value_t this_arg, /**< 'this' argument */ return ECMA_VALUE_ERROR; } + ecma_value_t resolve = ecma_op_object_get_by_magic_id (ecma_get_object_from_value (this_arg), + LIT_MAGIC_STRING_RESOLVE); + + if (ECMA_IS_VALUE_ERROR (resolve)) + { + resolve = ecma_builtin_promise_reject_abrupt (resolve, capability_obj_p); + ecma_deref_object (capability_obj_p); + return resolve; + } + + if (!ecma_op_is_callable (resolve)) + { + ecma_free_value (resolve); + ecma_raise_type_error (ECMA_ERR_MSG ("Resolve method must be callable")); + resolve = ecma_builtin_promise_reject_abrupt (ECMA_VALUE_ERROR, capability_obj_p); + ecma_deref_object (capability_obj_p); + return resolve; + } + ecma_value_t next_method; ecma_value_t iterator = ecma_op_get_iterator (iterable, ECMA_VALUE_SYNC_ITERATOR, &next_method); iterator = ecma_builtin_promise_reject_abrupt (iterator, capability_obj_p); @@ -395,13 +414,14 @@ ecma_builtin_promise_race_or_all (ecma_value_t this_arg, /**< 'this' argument */ ecma_value_t ret = ECMA_VALUE_EMPTY; bool is_done = false; - if (is_race) + if (builtin_routine_id == ECMA_PROMISE_ROUTINE_RACE) { - ret = ecma_builtin_promise_perform_race (iterator, next_method, capability_obj_p, this_arg, &is_done); + ret = ecma_builtin_promise_perform_race (iterator, next_method, capability_obj_p, this_arg, resolve, &is_done); } else { - ret = ecma_builtin_promise_perform_all (iterator, next_method, capability_obj_p, this_arg, &is_done); + ret = ecma_builtin_promise_perform_all_or_all_settled (iterator, next_method, capability_obj_p, this_arg, resolve, + builtin_routine_id, &is_done); } if (ECMA_IS_VALUE_ERROR (ret)) @@ -416,10 +436,11 @@ ecma_builtin_promise_race_or_all (ecma_value_t this_arg, /**< 'this' argument */ ecma_free_value (iterator); ecma_free_value (next_method); + ecma_free_value (resolve); ecma_deref_object (capability_obj_p); return ret; -} /* ecma_builtin_promise_race_or_all */ +} /* ecma_builtin_promise_helper */ /** * Handle calling [[Call]] of built-in Promise object. @@ -486,9 +507,9 @@ ecma_builtin_promise_dispatch_routine (uint8_t builtin_routine_id, /**< built-in } case ECMA_PROMISE_ROUTINE_RACE: case ECMA_PROMISE_ROUTINE_ALL: + case ECMA_PROMISE_ROUTINE_ALLSETTLED: { - bool is_race = (builtin_routine_id == ECMA_PROMISE_ROUTINE_RACE); - return ecma_builtin_promise_race_or_all (this_arg, argument, is_race); + return ecma_builtin_promise_helper (this_arg, argument, builtin_routine_id); } case ECMA_PROMISE_ROUTINE_SPECIES_GET: { diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-promise.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-promise.inc.h index 93b9a9bc..1355e3f6 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-promise.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-promise.inc.h @@ -45,6 +45,7 @@ ROUTINE (LIT_MAGIC_STRING_REJECT, ECMA_PROMISE_ROUTINE_REJECT, 1, 1) ROUTINE (LIT_MAGIC_STRING_RESOLVE, ECMA_PROMISE_ROUTINE_RESOLVE, 1, 1) ROUTINE (LIT_MAGIC_STRING_RACE, ECMA_PROMISE_ROUTINE_RACE, 1, 1) ROUTINE (LIT_MAGIC_STRING_ALL, ECMA_PROMISE_ROUTINE_ALL, 1, 1) +ROUTINE (LIT_MAGIC_STRING_ALLSETTLED, ECMA_PROMISE_ROUTINE_ALLSETTLED, 1, 1) /* ES2015 25.4.4.6 */ ACCESSOR_READ_ONLY (LIT_GLOBAL_SYMBOL_SPECIES, diff --git a/jerry-core/ecma/operations/ecma-promise-object.c b/jerry-core/ecma/operations/ecma-promise-object.c index 6bfadb8e..67a404ac 100644 --- a/jerry-core/ecma/operations/ecma-promise-object.c +++ b/jerry-core/ecma/operations/ecma-promise-object.c @@ -609,7 +609,7 @@ ecma_promise_remaining_inc_or_dec (ecma_value_t remaining, /**< the remaining co } /* ecma_promise_remaining_inc_or_dec */ /** - * Native handler for Promise.all Resolve Element Function. + * Native handler for Promise.all and Promise.allSettled Resolve Element Function. * * See also: * ES2015 25.4.4.1.2 @@ -617,12 +617,13 @@ ecma_promise_remaining_inc_or_dec (ecma_value_t remaining, /**< the remaining co * @return ecma value of undefined. */ ecma_value_t -ecma_promise_all_handler_cb (ecma_object_t *function_obj_p, /**< function object */ +ecma_promise_all_or_all_settled_handler_cb (ecma_object_t *function_obj_p, /**< function object */ const ecma_value_t args_p[], /**< argument list */ const uint32_t args_count) /**< argument number */ { JERRY_UNUSED (args_count); ecma_promise_all_executor_t *executor_p = (ecma_promise_all_executor_t *) function_obj_p; + uint16_t promise_type = executor_p->header.u.class_prop.extra_info; /* 1 - 2. */ if (executor_p->index == 0) @@ -630,11 +631,53 @@ ecma_promise_all_handler_cb (ecma_object_t *function_obj_p, /**< function object return ECMA_VALUE_UNDEFINED; } - /* 8. */ - ecma_op_object_put_by_index (ecma_get_object_from_value (executor_p->values), - (uint32_t) (executor_p->index - 1), - args_p[0], - false); + if (promise_type == ECMA_PROMISE_ALL_RESOLVE) + { + /* 8. */ + ecma_op_object_put_by_index (ecma_get_object_from_value (executor_p->values), + (uint32_t) (executor_p->index - 1), + args_p[0], + false); + } + else + { + lit_magic_string_id_t status_property_val = LIT_MAGIC_STRING_REJECTED; + lit_magic_string_id_t data_propery_name = LIT_MAGIC_STRING_REASON; + + if (promise_type == ECMA_PROMISE_ALLSETTLED_RESOLVE) + { + status_property_val = LIT_MAGIC_STRING_FULFILLED; + data_propery_name = LIT_MAGIC_STRING_VALUE; + } + + ecma_object_t *obj_p = ecma_create_object (NULL, 0, ECMA_OBJECT_TYPE_GENERAL); + ecma_property_value_t *prop_value_p; + prop_value_p = ecma_create_named_data_property (obj_p, + ecma_get_magic_string (LIT_MAGIC_STRING_STATUS), + ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE_WRITABLE, + NULL); + + prop_value_p->value = ecma_make_magic_string_value (status_property_val); + + prop_value_p = ecma_create_named_data_property (obj_p, + ecma_get_magic_string (data_propery_name), + ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE_WRITABLE, + NULL); + prop_value_p->value = ECMA_VALUE_UNDEFINED; + + if (args_count != 0) + { + prop_value_p->value = ecma_copy_value_if_not_object (args_p[0]); + } + + ecma_value_t obj_val = ecma_make_object_value (obj_p); + /* 12. */ + ecma_op_object_put_by_index (ecma_get_object_from_value (executor_p->values), + (uint32_t) (executor_p->index - 1), + obj_val, + false); + ecma_deref_object (obj_p); + } /* 3. */ executor_p->index = 0; @@ -651,7 +694,7 @@ ecma_promise_all_handler_cb (ecma_object_t *function_obj_p, /**< function object } return ret; -} /* ecma_promise_all_handler_cb */ +} /* ecma_promise_all_or_all_settled_handler_cb */ /** * GetCapabilitiesExecutor Functions diff --git a/jerry-core/ecma/operations/ecma-promise-object.h b/jerry-core/ecma/operations/ecma-promise-object.h index c8e8c065..7bd14781 100644 --- a/jerry-core/ecma/operations/ecma-promise-object.h +++ b/jerry-core/ecma/operations/ecma-promise-object.h @@ -120,8 +120,8 @@ ecma_value_t ecma_promise_reject_handler (ecma_object_t *function_obj_p, const ecma_value_t argv[], const uint32_t args_count); ecma_value_t ecma_promise_resolve_handler (ecma_object_t *function_obj_p, const ecma_value_t argv[], const uint32_t args_count); -ecma_value_t ecma_promise_all_handler_cb (ecma_object_t *function_obj_p, - const ecma_value_t args_p[], const uint32_t args_count); +ecma_value_t ecma_promise_all_or_all_settled_handler_cb (ecma_object_t *function_obj_p, + const ecma_value_t args_p[], const uint32_t args_count); ecma_value_t ecma_op_get_capabilities_executor_cb (ecma_object_t *function_obj_p, const ecma_value_t args_p[], const uint32_t args_count); diff --git a/jerry-core/lit/lit-magic-strings.inc.h b/jerry-core/lit/lit-magic-strings.inc.h index bc0c104c..41fd45a9 100644 --- a/jerry-core/lit/lit-magic-strings.inc.h +++ b/jerry-core/lit/lit-magic-strings.inc.h @@ -392,6 +392,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_PAD_END, "padEnd") #if JERRY_BUILTIN_MATH LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_RANDOM, "random") #endif +#if JERRY_BUILTIN_PROMISE +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_REASON, "reason") +#endif #if JERRY_BUILTIN_ARRAY \ || JERRY_BUILTIN_TYPEDARRAY LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_REDUCE, "reduce") @@ -420,6 +423,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SOURCE, "source") #if JERRY_BUILTIN_ARRAY LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SPLICE, "splice") #endif +#if JERRY_BUILTIN_PROMISE +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_STATUS, "status") +#endif #if JERRY_BUILTIN_REGEXP && JERRY_ESNEXT LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_STICKY, "sticky") #endif @@ -602,6 +608,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_PAD_START, "padStart") || !(JERRY_ESNEXT) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_PARSE_INT, "parseInt") #endif +#if JERRY_BUILTIN_PROMISE +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_REJECTED, "rejected") +#endif #if JERRY_BUILTIN_DATE LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_HOURS_UL, "setHours") #endif @@ -660,6 +669,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ENCODE_URI, "encodeURI") || JERRY_ESNEXT LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_FIND_INDEX, "findIndex") #endif +#if JERRY_BUILTIN_PROMISE +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_FULFILLED, "fulfilled") +#endif #if JERRY_BUILTIN_DATE LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_UTC_DAY_UL, "getUTCDay") #endif @@ -711,6 +723,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_RANGE_ERROR_UL, "RangeError") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TYPED_ARRAY_UL, "TypedArray") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_UINT8_ARRAY_UL, "Uint8Array") #endif +#if JERRY_BUILTIN_PROMISE +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ALLSETTLED, "allSettled") +#endif #if JERRY_BUILTIN_DATAVIEW \ || JERRY_BUILTIN_TYPEDARRAY LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_BYTE_LENGTH_UL, "byteLength") @@ -1079,6 +1094,8 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (10, LIT_MAGIC_STRING_INT16_ARRAY_UL) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (10, LIT_MAGIC_STRING_RANGE_ERROR_UL) #elif JERRY_BUILTIN_TYPEDARRAY LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (10, LIT_MAGIC_STRING_TYPED_ARRAY_UL) +#elif JERRY_BUILTIN_PROMISE +LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (10, LIT_MAGIC_STRING_ALLSETTLED) #elif JERRY_BUILTIN_DATAVIEW \ || JERRY_BUILTIN_TYPEDARRAY LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (10, LIT_MAGIC_STRING_BYTE_LENGTH_UL) diff --git a/jerry-core/lit/lit-magic-strings.ini b/jerry-core/lit/lit-magic-strings.ini index 07ff4309..2b05f8bd 100644 --- a/jerry-core/lit/lit-magic-strings.ini +++ b/jerry-core/lit/lit-magic-strings.ini @@ -174,6 +174,7 @@ LIT_MAGIC_STRING_RETURN = "return" LIT_MAGIC_STRING_SEARCH = "search" LIT_MAGIC_STRING_SOURCE = "source" LIT_MAGIC_STRING_SPLICE = "splice" +LIT_MAGIC_STRING_STATUS = "status" LIT_MAGIC_STRING_STRING = "string" LIT_MAGIC_STRING_STICKY = "sticky" LIT_MAGIC_STRING_SYMBOL = "symbol" @@ -191,6 +192,7 @@ LIT_MAGIC_STRING_BOOLEAN = "boolean" LIT_MAGIC_STRING_COMPILE = "compile" LIT_MAGIC_STRING_DEFAULT = "default" LIT_MAGIC_STRING_DOTALL = "dotAll" +LIT_MAGIC_STRING_REASON = "reason" LIT_MAGIC_STRING_FLATMAP = "flatMap" LIT_MAGIC_STRING_FOR_EACH_UL = "forEach" LIT_MAGIC_STRING_GET_DATE_UL = "getDate" @@ -237,6 +239,7 @@ LIT_MAGIC_STRING_IS_FROZEN_UL = "isFrozen" LIT_MAGIC_STRING_IS_SEALED_UL = "isSealed" LIT_MAGIC_STRING_ITERATOR = "iterator" LIT_MAGIC_STRING_PARSE_INT = "parseInt" +LIT_MAGIC_STRING_REJECTED = "rejected" LIT_MAGIC_STRING_SET_HOURS_UL = "setHours" LIT_MAGIC_STRING_SET_INT16_UL = "setInt16" LIT_MAGIC_STRING_SET_INT32_UL = "setInt32" @@ -253,6 +256,7 @@ LIT_MAGIC_STRING_ARGUMENTS_UL = "Arguments" LIT_MAGIC_STRING_ANONYMOUS = "anonymous" LIT_MAGIC_STRING_CONSTRUCT = "construct" LIT_MAGIC_STRING_EVAL_ERROR_UL = "EvalError" +LIT_MAGIC_STRING_ALLSETTLED = "allSettled" LIT_MAGIC_STRING_INT8_ARRAY_UL = "Int8Array" LIT_MAGIC_STRING_IS_INTEGER = "isInteger" LIT_MAGIC_STRING_MAX_VALUE_U = "MAX_VALUE" @@ -264,6 +268,7 @@ LIT_MAGIC_STRING_ARGUMENTS = "arguments" LIT_MAGIC_STRING_DECODE_URI = "decodeURI" LIT_MAGIC_STRING_ENCODE_URI = "encodeURI" LIT_MAGIC_STRING_FIND_INDEX = "findIndex" +LIT_MAGIC_STRING_FULFILLED = "fulfilled" LIT_MAGIC_STRING_GENERATOR_UL = "Generator" LIT_MAGIC_STRING_GET_UTC_DAY_UL = "getUTCDay" LIT_MAGIC_STRING_GET_UINT16_UL = "getUint16" diff --git a/tests/jerry/es.next/promise-all-iterator.js b/tests/jerry/es.next/promise-all-iterator.js index 725f616a..773aabea 100644 --- a/tests/jerry/es.next/promise-all-iterator.js +++ b/tests/jerry/es.next/promise-all-iterator.js @@ -75,9 +75,9 @@ var rejects = Promise.all(createIterable([ fulfills.then(result => { assert (result + "" === "foo,bar"); }); rejects.catch(result => { assert (result === "baz"); }); -var closed = false; +var closed = true; delete Promise.resolve; -Promise.all(createIterable([1,2,3], {'return': function () { closed = true; }})); +Promise.all(createIterable([1,2,3], {'return': function () { closed = false; }})); assert (closed); var arr = []; diff --git a/tests/jerry/es.next/promise-race-iterator.js b/tests/jerry/es.next/promise-race-iterator.js index e343a79f..61f3a2f2 100644 --- a/tests/jerry/es.next/promise-race-iterator.js +++ b/tests/jerry/es.next/promise-race-iterator.js @@ -63,9 +63,9 @@ var rejects = Promise.race(createIterable([ fulfills.then(result => { assert (result + "" === "foo"); }); rejects.catch(result => { assert (result === "baz"); }); -var closed = false; +var closed = true; delete Promise.resolve; -Promise.race(createIterable([1,2,3], {'return': function () { closed = true; }})); +Promise.race(createIterable([1,2,3], {'return': function () { closed = false; }})); assert (closed); var arr = []; diff --git a/tests/test262-esnext-excludelist.xml b/tests/test262-esnext-excludelist.xml index eb6d8e8e..48fce160 100644 --- a/tests/test262-esnext-excludelist.xml +++ b/tests/test262-esnext-excludelist.xml @@ -90,10 +90,6 @@ <test id="built-ins/Number/prototype/toPrecision/exponential.js"><reason></reason></test> <test id="built-ins/Object/entries/order-after-define-property.js"><reason></reason></test> <test id="built-ins/Object/keys/order-after-define-property.js"><reason></reason></test> - <test id="built-ins/Promise/all/invoke-resolve-get-error.js"><reason>Test expects incorrect call order</reason></test> - <test id="built-ins/Promise/all/resolve-non-callable.js"><reason>Test expects incorrect call order</reason></test> - <test id="built-ins/Promise/race/invoke-resolve-get-error.js"><reason>Test expects incorrect call order</reason></test> - <test id="built-ins/Promise/race/resolve-non-callable.js"><reason>Test expects incorrect call order</reason></test> <test id="built-ins/Proxy/preventExtensions/trap-is-undefined-target-is-proxy.js"><reason></reason></test> <test id="built-ins/Proxy/setPrototypeOf/toboolean-trap-result-false.js"><reason></reason></test> <test id="built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec-match-get-0-tostring-throws.js"><reason></reason></test> @@ -8328,109 +8324,6 @@ <test id="language/statements/switch/syntax/redeclaration/generator-name-redeclaration-attempt-with-async-generator.js"><reason></reason></test> <!-- END - ES2018: Asynchronous Iteration --> - <!-- ES2020 - Promise.allSettled - features: [Promise.allSettled] - https://github.com/tc39/proposal-promise-allSettled - --> - <test id="built-ins/Promise/allSettled/call-resolve-element-after-return.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/call-resolve-element-items.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/call-resolve-element.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/capability-executor-called-twice.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/capability-executor-not-callable.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/capability-resolve-throws-no-close.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/capability-resolve-throws-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/ctx-ctor-throws.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/ctx-ctor.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/does-not-invoke-array-setters.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-resolve-error-close.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-resolve-error-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-resolve-get-error-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-resolve-get-error.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-resolve-get-once-multiple-calls.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-resolve-get-once-no-calls.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-resolve-on-promises-every-iteration-of-custom.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-resolve-on-promises-every-iteration-of-promise.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-resolve-on-values-every-iteration-of-promise.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-resolve-return.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-resolve.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-then-error-close.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-then-error-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-then-get-error-close.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-then-get-error-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/invoke-then.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/is-function.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-arg-is-false-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-arg-is-null-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-arg-is-number-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-arg-is-poisoned.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-arg-is-string-resolve.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-arg-is-symbol-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-arg-is-true-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-arg-is-undefined-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-assigned-false-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-assigned-null-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-assigned-number-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-assigned-string-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-assigned-symbol-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-assigned-true-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-assigned-undefined-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-next-err-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-next-val-err-no-close.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-next-val-err-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-returns-false-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-returns-null-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-returns-number-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-returns-string-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-returns-symbol-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-returns-true-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-returns-undefined-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-step-err-no-close.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/iter-step-err-reject.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/length.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/name.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/new-reject-function.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/new-resolve-function.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/prop-desc.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/reject-deferred.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/reject-element-function-extensible.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/reject-element-function-length.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/reject-element-function-multiple-calls.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/reject-element-function-name.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/reject-element-function-nonconstructor.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/reject-element-function-prototype.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/reject-ignored-deferred.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/reject-ignored-immed.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/reject-immed.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-before-loop-exit-from-same.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-before-loop-exit.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-element-function-extensible.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-element-function-length.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-element-function-name.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-element-function-nonconstructor.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-element-function-prototype.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-from-same-thenable.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-ignores-late-rejection-deferred.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-ignores-late-rejection.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-non-callable.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-non-thenable.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-not-callable-reject-with-typeerror.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-poisoned-then.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolve-thenable.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolved-all-fulfilled.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolved-all-mixed.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolved-all-rejected.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolved-immed.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolved-sequence-extra-ticks.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolved-sequence-mixed.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolved-sequence-with-rejections.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolved-sequence.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolved-then-catch-finally.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolves-empty-array.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/resolves-to-array.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/returns-promise.js"><reason></reason></test> - <test id="built-ins/Promise/allSettled/species-get-error.js"><reason></reason></test> - <!-- END - ES2020 - Promise.allSettled --> - <!-- Missing test262 support in JerryScript REPL - missing $262 object https://github.com/tc39/test262/blob/main/INTERPRETING.md#host-defined-functions --> |