diff options
author | Robert Fancsik <robert.fancsik@h-lab.eu> | 2021-10-28 12:45:47 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-28 12:45:47 +0200 |
commit | d2388e907f1354455db1045607ee487abf0ce526 (patch) | |
tree | c10ab559517efdd382972c3ec234352f66259b4c | |
parent | dd77ec914a36023abc34cbb09efad3cb46803a05 (diff) |
Implement CreateAsyncFromSyncIterator (#4802)
JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik robert.fancsik@h-lab.eu
24 files changed, 1015 insertions, 418 deletions
diff --git a/jerry-core/CMakeLists.txt b/jerry-core/CMakeLists.txt index 0a3f5e32..3c54a7e5 100644 --- a/jerry-core/CMakeLists.txt +++ b/jerry-core/CMakeLists.txt @@ -160,6 +160,7 @@ set(SOURCE_CORE_FILES ecma/builtin-objects/ecma-builtin-array.c ecma/builtin-objects/ecma-builtin-arraybuffer-prototype.c ecma/builtin-objects/ecma-builtin-arraybuffer.c + ecma/builtin-objects/ecma-builtin-async-from-sync-iterator-prototype.c ecma/builtin-objects/ecma-builtin-async-function-prototype.c ecma/builtin-objects/ecma-builtin-async-function.c ecma/builtin-objects/ecma-builtin-async-generator-function.c @@ -358,6 +359,7 @@ if(ENABLE_AMALGAM) ecma/builtin-objects/ecma-builtin-array.inc.h ecma/builtin-objects/ecma-builtin-arraybuffer-prototype.inc.h ecma/builtin-objects/ecma-builtin-arraybuffer.inc.h + ecma/builtin-objects/ecma-builtin-async-from-sync-iterator-prototype.inc.h ecma/builtin-objects/ecma-builtin-async-function-prototype.inc.h ecma/builtin-objects/ecma-builtin-async-function.inc.h ecma/builtin-objects/ecma-builtin-async-generator-function.inc.h diff --git a/jerry-core/api/jerry.c b/jerry-core/api/jerry.c index c9c2b0b9..c8a8524d 100644 --- a/jerry-core/api/jerry.c +++ b/jerry-core/api/jerry.c @@ -1542,6 +1542,7 @@ static const uint8_t jerry_class_object_type[] = #if JERRY_ESNEXT JERRY_OBJECT_TYPE_PROMISE, /**< type of ECMA_OBJECT_CLASS_PROMISE */ JERRY_OBJECT_TYPE_GENERIC, /**< type of ECMA_OBJECT_CLASS_PROMISE_CAPABILITY */ + JERRY_OBJECT_TYPE_GENERIC, /**< type of ECMA_OBJECT_CLASS_ASYNC_FROM_SYNC_ITERATOR */ #endif /* JERRY_ESNEXT */ #if JERRY_BUILTIN_DATAVIEW JERRY_OBJECT_TYPE_DATAVIEW, /**< type of ECMA_OBJECT_CLASS_DATAVIEW */ diff --git a/jerry-core/ecma/base/ecma-errors.c b/jerry-core/ecma/base/ecma-errors.c index 23cd88f0..27189eaf 100644 --- a/jerry-core/ecma/base/ecma-errors.c +++ b/jerry-core/ecma/base/ecma-errors.c @@ -130,6 +130,11 @@ const char * const ecma_error_class_is_non_configurable = "Prototype property of const char * const ecma_error_argument_is_not_an_object = "Argument is not an object"; /** + * Error message length of 'ecma_error_argument_is_not_an_object' + */ +const int ecma_error_argument_is_not_an_object_length = 25; + +/** * Error message, argument is not a Proxy object */ const char * const ecma_error_argument_is_not_a_proxy = "Argument is not a Proxy object"; diff --git a/jerry-core/ecma/base/ecma-errors.h b/jerry-core/ecma/base/ecma-errors.h index 21133d7d..8cab743e 100644 --- a/jerry-core/ecma/base/ecma-errors.h +++ b/jerry-core/ecma/base/ecma-errors.h @@ -69,6 +69,7 @@ extern const char * const ecma_error_arraybuffer_is_detached; extern const char * const ecma_error_cannot_convert_to_object; extern const char * const ecma_error_class_is_non_configurable; extern const char * const ecma_error_argument_is_not_an_object; +extern const int ecma_error_argument_is_not_an_object_length; extern const char * const ecma_error_argument_is_not_a_proxy; extern const char * const ecma_error_target_is_not_a_constructor; extern const char * const ecma_error_argument_is_not_an_regexp; diff --git a/jerry-core/ecma/base/ecma-gc.c b/jerry-core/ecma/base/ecma-gc.c index a5dc7243..f3e3c0dd 100644 --- a/jerry-core/ecma/base/ecma-gc.c +++ b/jerry-core/ecma/base/ecma-gc.c @@ -1013,6 +1013,19 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */ } break; } + case ECMA_OBJECT_CLASS_ASYNC_FROM_SYNC_ITERATOR: + { + ecma_async_from_sync_iterator_object_t *iter_p = (ecma_async_from_sync_iterator_object_t *) ext_object_p; + + ecma_gc_set_object_visited (ecma_get_object_from_value (iter_p->header.u.cls.u3.sync_iterator)); + + if (!ecma_is_value_undefined (iter_p->sync_next_method)) + { + ecma_gc_set_object_visited (ecma_get_object_from_value (iter_p->sync_next_method)); + } + + break; + } case ECMA_OBJECT_CLASS_ARRAY_ITERATOR: case ECMA_OBJECT_CLASS_SET_ITERATOR: case ECMA_OBJECT_CLASS_MAP_ITERATOR: @@ -1208,6 +1221,10 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */ } break; } + case ECMA_NATIVE_HANDLER_ASYNC_FROM_SYNC_ITERATOR_UNWRAP: + { + break; + } default: { JERRY_UNREACHABLE (); @@ -1911,6 +1928,11 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */ ext_object_size = sizeof (ecma_promise_capabality_t); break; } + case ECMA_OBJECT_CLASS_ASYNC_FROM_SYNC_ITERATOR: + { + ext_object_size = sizeof (ecma_async_from_sync_iterator_object_t); + break; + } #endif /* JERRY_ESNEXT */ #if JERRY_MODULE_SYSTEM case ECMA_OBJECT_CLASS_MODULE: @@ -2039,6 +2061,10 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */ ext_object_size = sizeof (ecma_promise_value_thunk_t); break; } + case ECMA_NATIVE_HANDLER_ASYNC_FROM_SYNC_ITERATOR_UNWRAP: + { + break; + } default: { JERRY_UNREACHABLE (); diff --git a/jerry-core/ecma/base/ecma-globals.h b/jerry-core/ecma/base/ecma-globals.h index 117049e9..b39c2adb 100644 --- a/jerry-core/ecma/base/ecma-globals.h +++ b/jerry-core/ecma/base/ecma-globals.h @@ -772,6 +772,7 @@ typedef enum #if JERRY_ESNEXT ECMA_OBJECT_CLASS_PROMISE, /**< Promise (ECMAScript v6, 25.4) */ ECMA_OBJECT_CLASS_PROMISE_CAPABILITY, /**< Promise capability (ECMAScript v6, 25.4.1.1) */ + ECMA_OBJECT_CLASS_ASYNC_FROM_SYNC_ITERATOR, /**< AsyncFromSyncIterator (ECMAScript v11, 25.1.4) */ #endif /* JERRY_ESNEXT */ #if JERRY_BUILTIN_DATAVIEW ECMA_OBJECT_CLASS_DATAVIEW, /**< DataView (ECMAScript v6, 24.2) */ @@ -1124,6 +1125,7 @@ typedef struct ecma_value_t head; /**< points to the async generator task queue head item */ ecma_value_t iterated_value; /**< for %Iterator%: [[IteratedObject]] property */ ecma_value_t promise; /**< PromiseCapability[[Promise]] internal slot */ + ecma_value_t sync_iterator; /**< IteratorRecord [[Iterator]] internal slot for AsyncFromSyncIterator */ ecma_value_t spread_value; /**< for spread object: spreaded element */ int32_t tza; /**< TimeZone adjustment for date objects */ #endif /* JERRY_ESNEXT */ @@ -2507,6 +2509,14 @@ typedef enum ECMA_CONSTRUCTOR_FUNCTION_HAS_HERITAGE = (1 << 0), /**< heritage object is present */ } ecma_constructor_function_flags_t; +/** + * Description of AsyncFromSyncIterator objects. + */ +typedef struct +{ + ecma_extended_object_t header; /**< header part */ + ecma_value_t sync_next_method; /**< IteratorRecord [[NextMethod]] internal slot */ +} ecma_async_from_sync_iterator_object_t; #endif /* JERRY_ESNEXT */ /** diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-async-from-sync-iterator-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-async-from-sync-iterator-prototype.c new file mode 100644 index 00000000..eb26c2ee --- /dev/null +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-async-from-sync-iterator-prototype.c @@ -0,0 +1,374 @@ +/* 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. + */ + +#include "ecma-builtin-handlers.h" +#include "ecma-builtins.h" +#include "ecma-exceptions.h" +#include "ecma-function-object.h" +#include "ecma-gc.h" +#include "ecma-globals.h" +#include "ecma-helpers.h" +#include "ecma-iterator-object.h" +#include "ecma-objects.h" +#include "ecma-promise-object.h" +#include "jcontext.h" +#include "jerryscript-types.h" +#include "jrt.h" +#include "lit-magic-strings.h" +#include "lit-strings.h" +#include "opcodes.h" +#include "vm-defines.h" + +#if JERRY_ESNEXT + +#define ECMA_BUILTINS_INTERNAL +#include "ecma-builtins-internal.h" + +/** + * This object has a custom dispatch function. + */ +#define BUILTIN_CUSTOM_DISPATCH + +/** + * List of built-in routine identifiers. + */ +enum +{ + ECMA_ASYNC_FROM_SYNC_ITERATOR_PROTOTYPE_ROUTINE_START = 0, /**< buitlin routine start id */ + ECMA_ASYNC_FROM_SYNC_ITERATOR_PROTOTYPE_ROUTINE_NEXT, /**< 'next' routine v11, 25.1.4.2.1 */ + ECMA_ASYNC_FROM_SYNC_ITERATOR_PROTOTYPE_ROUTINE_RETURN, /**< 'return' routine v11, 25.1.4.2.2 */ + ECMA_ASYNC_FROM_SYNC_ITERATOR_PROTOTYPE_ROUTINE_THROW /**< 'throw' routine v11, 25.1.4.2.3 */ +} ecma_async_from_sync_iterator_operation_type_t; + +#define BUILTIN_INC_HEADER_NAME "ecma-builtin-async-from-sync-iterator-prototype.inc.h" +#define BUILTIN_UNDERSCORED_ID async_from_sync_iterator_prototype +#include "ecma-builtin-internal-routines-template.inc.h" + +/** \addtogroup ecma ECMA + * @{ + * + * \addtogroup ecmabuiltins + * @{ + * + * \addtogroup generator ECMA %AsyncFromSyncIteratorPrototype% object built-in + * @{ + */ + +/** + * AsyncFromSyncIteratorContinuation operation + * + * See also: + * ECMAScript v11, 25.1.4.4 + * + * @return ecma value + * Returned value must be freed with ecma_free_value. + */ +static ecma_value_t +ecma_op_async_from_sync_iterator_prototype_continuation (ecma_value_t result, /**< routine's 'result' argument */ + ecma_object_t *capability_obj_p) /**< promise capability */ +{ + /* 1. */ + ecma_value_t done = ecma_op_iterator_complete (result); + + /* 2. */ + if (ECMA_IS_VALUE_ERROR (ecma_op_if_abrupt_reject_promise (&done, capability_obj_p))) + { + return done; + } + + uint16_t done_flag = ecma_is_value_false (done) ? 0 : (1 << ECMA_NATIVE_HANDLER_COMMON_FLAGS_SHIFT); + ecma_free_value (done); + + /* 3. */ + ecma_value_t value = ecma_op_iterator_value (result); + + /* 4. */ + if (ECMA_IS_VALUE_ERROR (ecma_op_if_abrupt_reject_promise (&value, capability_obj_p))) + { + return value; + } + + /* 5. */ + ecma_value_t builtin_promise = ecma_make_object_value (ecma_builtin_get (ECMA_BUILTIN_ID_PROMISE)); + ecma_value_t value_wrapper = ecma_promise_reject_or_resolve (builtin_promise, value, true); + ecma_free_value (value); + + /* 6. */ + if (ECMA_IS_VALUE_ERROR (ecma_op_if_abrupt_reject_promise (&value_wrapper, capability_obj_p))) + { + return value_wrapper; + } + + /* 8 - 9. */ + ecma_object_t *on_fullfilled = ecma_op_create_native_handler (ECMA_NATIVE_HANDLER_ASYNC_FROM_SYNC_ITERATOR_UNWRAP, + sizeof (ecma_extended_object_t)); + ((ecma_extended_object_t *) on_fullfilled)->u.built_in.u2.routine_flags = (uint8_t) done_flag; + + /* 10. */ + ecma_value_t then_result = ecma_promise_perform_then (value_wrapper, + ecma_make_object_value (on_fullfilled), + ECMA_VALUE_UNDEFINED, + capability_obj_p); + + JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (then_result)); + ecma_deref_object (on_fullfilled); + ecma_free_value (value_wrapper); + + /* 11. */ + return then_result; +} /* ecma_op_async_from_sync_iterator_prototype_continuation */ + +/** + * The %AsyncFromSyncIteratorPrototype% object's 'next' routine + * + * See also: + * ECMAScript v11, 25.1.4.2.1 + * + * @return ecma value + * Returned value must be freed with ecma_free_value. + */ +static ecma_value_t +ecma_builtin_async_from_sync_iterator_prototype_next (ecma_async_from_sync_iterator_object_t *iter_p, /**< iterator + * record*/ + ecma_object_t *capability_p, /**< promise capability */ + ecma_value_t value) /**< routine's 'value' argument */ +{ + /* 5. */ + ecma_value_t next_result = ecma_op_iterator_next (iter_p->header.u.cls.u3.sync_iterator, + iter_p->sync_next_method, + value); + + /* 6. */ + if (ECMA_IS_VALUE_ERROR (ecma_op_if_abrupt_reject_promise (&next_result, capability_p))) + { + return next_result; + } + + /* 7. */ + ecma_value_t result = ecma_op_async_from_sync_iterator_prototype_continuation (next_result, capability_p); + ecma_free_value (next_result); + + return result; +} /* ecma_builtin_async_from_sync_iterator_prototype_next */ + +/** + * The %AsyncFromSyncIteratorPrototype% object's 'return' and 'throw' routines + * + * See also: + * ECMAScript v11, 25.1.4.2.2 + * ECMAScript v11, 25.1.4.2.3 + * + * @return ecma value + * Returned value must be freed with ecma_free_value. + */ +static ecma_value_t +ecma_builtin_async_from_sync_iterator_prototype_do (ecma_async_from_sync_iterator_object_t *iter_p, /**< iterator + * record*/ + ecma_object_t *capability_obj_p, /**< promise capability */ + ecma_value_t value, /**< routine's 'value' argument */ + lit_magic_string_id_t method_id) /**< method id */ +{ + /* 5. */ + ecma_value_t sync_iterator = iter_p->header.u.cls.u3.sync_iterator; + ecma_value_t method = ecma_op_get_method_by_magic_id (sync_iterator, method_id); + + /* 6. */ + if (ECMA_IS_VALUE_ERROR (ecma_op_if_abrupt_reject_promise (&method, capability_obj_p))) + { + return method; + } + + ecma_promise_capabality_t *capability_p = (ecma_promise_capabality_t *) capability_obj_p; + + ecma_value_t call_arg; + uint32_t arg_size; + + if (ecma_is_value_empty (value)) + { + arg_size = 0; + call_arg = ECMA_VALUE_UNDEFINED; + } + else + { + arg_size = 1; + call_arg = value; + } + + /* 7. */ + if (ecma_is_value_undefined (method)) + { + ecma_value_t func_obj; + + if (method_id == LIT_MAGIC_STRING_RETURN) + { + /* 7.a. */ + call_arg = ecma_create_iter_result_object (call_arg, ECMA_VALUE_TRUE); + arg_size = 1; + func_obj = capability_p->resolve; + } + else + { + func_obj = capability_p->reject; + } + + /* 7.b. */ + ecma_value_t resolve = ecma_op_function_call (ecma_get_object_from_value (func_obj), + ECMA_VALUE_UNDEFINED, + &call_arg, + arg_size); + JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (resolve)); + ecma_free_value (resolve); + + if (method_id == LIT_MAGIC_STRING_RETURN) + { + ecma_free_value (call_arg); + } + + /* 7.c. */ + return ecma_copy_value (capability_p->header.u.cls.u3.promise); + } + + /* 8. */ + ecma_value_t call_result; + + if (!ecma_op_is_callable (method)) + { + ecma_free_value (method); + call_result = ecma_raise_type_error (ECMA_ERR_MSG (ecma_error_expected_a_function)); + } + else + { + ecma_object_t *method_func_obj = ecma_get_object_from_value (method); + call_result = ecma_op_function_call (method_func_obj, sync_iterator, &call_arg, arg_size); + ecma_deref_object (method_func_obj); + } + + /* 9. */ + if (ECMA_IS_VALUE_ERROR (ecma_op_if_abrupt_reject_promise (&call_result, capability_obj_p))) + { + return call_result; + } + + /* 10. */ + if (!ecma_is_value_object (call_result)) + { + ecma_free_value (call_result); + +#if JERRY_ERROR_MESSAGES + const lit_utf8_byte_t *msg_p = (const lit_utf8_byte_t *) ecma_error_argument_is_not_an_object; + lit_utf8_size_t msg_size = (lit_utf8_size_t) ecma_error_argument_is_not_an_object_length; + JERRY_ASSERT (lit_zt_utf8_string_size (msg_p) == msg_size); + ecma_string_t *error_msg_p = ecma_new_ecma_string_from_ascii (msg_p, msg_size); +#else /* !JERRY_ERROR_MESSAGES */ + ecma_string_t *error_msg_p = ecma_get_magic_string (LIT_MAGIC_STRING__EMPTY); +#endif /* JERRY_ERROR_MESSAGES */ + + ecma_object_t *type_error_obj_p = ecma_new_standard_error (JERRY_ERROR_TYPE, error_msg_p); + +#if JERRY_ERROR_MESSAGES + ecma_deref_ecma_string (error_msg_p); +#endif /* JERRY_ERROR_MESSAGES */ + + ecma_value_t type_error = ecma_make_object_value (type_error_obj_p); + + /* 10.a. */ + ecma_value_t reject = ecma_op_function_call (ecma_get_object_from_value (capability_p->reject), + ECMA_VALUE_UNDEFINED, + &type_error, + 1); + JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (reject)); + ecma_deref_object (type_error_obj_p); + ecma_free_value (reject); + + /* 10.b. */ + return ecma_copy_value (capability_p->header.u.cls.u3.promise); + } + + ecma_value_t result = ecma_op_async_from_sync_iterator_prototype_continuation (call_result, capability_obj_p); + ecma_free_value (call_result); + + return result; +} /* ecma_builtin_async_from_sync_iterator_prototype_do */ + +/** + * Dispatcher of the %AsyncFromSyncIteratorPrototype% built-in's routines + * + * @return ecma value + * Returned value must be freed with ecma_free_value. + */ +ecma_value_t +ecma_builtin_async_from_sync_iterator_prototype_dispatch_routine (uint8_t builtin_routine_id, /**< built-in wide + * routine + * identifier */ + ecma_value_t this_arg, /**< 'this' argument value */ + const ecma_value_t arguments_list_p[], /**< list of + * arguments + * passed to + * routine */ + uint32_t arguments_number) /**< length of + * arguments' list */ +{ + JERRY_UNUSED (arguments_number); + JERRY_ASSERT (ecma_is_value_object (this_arg)); + + ecma_object_t *this_obj_p = ecma_get_object_from_value (this_arg); + + JERRY_ASSERT (ecma_object_class_is (this_obj_p, ECMA_OBJECT_CLASS_ASYNC_FROM_SYNC_ITERATOR)); + + ecma_async_from_sync_iterator_object_t *iter_p = (ecma_async_from_sync_iterator_object_t *) this_obj_p; + + ecma_value_t builtin_promise = ecma_make_object_value (ecma_builtin_get (ECMA_BUILTIN_ID_PROMISE)); + ecma_object_t *capability_p = ecma_promise_new_capability (builtin_promise, ECMA_VALUE_UNDEFINED); + JERRY_ASSERT (capability_p != NULL); + + ecma_value_t result; + ecma_value_t arg = (arguments_number == 0 ? ECMA_VALUE_EMPTY : arguments_list_p[0]); + + switch (builtin_routine_id) + { + case ECMA_ASYNC_FROM_SYNC_ITERATOR_PROTOTYPE_ROUTINE_NEXT: + { + result = ecma_builtin_async_from_sync_iterator_prototype_next (iter_p, capability_p, arg); + break; + } + case ECMA_ASYNC_FROM_SYNC_ITERATOR_PROTOTYPE_ROUTINE_RETURN: + { + result = ecma_builtin_async_from_sync_iterator_prototype_do (iter_p, capability_p, arg, LIT_MAGIC_STRING_RETURN); + break; + } + case ECMA_ASYNC_FROM_SYNC_ITERATOR_PROTOTYPE_ROUTINE_THROW: + { + result = ecma_builtin_async_from_sync_iterator_prototype_do (iter_p, capability_p, arg, LIT_MAGIC_STRING_THROW); + break; + } + default: + { + JERRY_UNREACHABLE (); + break; + } + } + + ecma_deref_object (capability_p); + + return result; +} /* ecma_builtin_async_from_sync_iterator_prototype_dispatch_routine */ + +/** + * @} + * @} + * @} + */ + +#endif /* JERRY_ESNEXT */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-async-from-sync-iterator-prototype.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-async-from-sync-iterator-prototype.inc.h new file mode 100644 index 00000000..c1413fcb --- /dev/null +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-async-from-sync-iterator-prototype.inc.h @@ -0,0 +1,32 @@ +/* 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. + */ + +/* + * %AsyncFromSyncIteratorPrototype% built-in description (AsyncFunction.prototype) + */ + +#include "ecma-builtin-helpers-macro-defines.inc.h" + +#if JERRY_ESNEXT + +/* Routine properties: + * (property name, C routine name, arguments number or NON_FIXED, value of the routine's length property) */ +ROUTINE (LIT_MAGIC_STRING_NEXT, ECMA_ASYNC_FROM_SYNC_ITERATOR_PROTOTYPE_ROUTINE_NEXT, 1, 1) +ROUTINE (LIT_MAGIC_STRING_RETURN, ECMA_ASYNC_FROM_SYNC_ITERATOR_PROTOTYPE_ROUTINE_RETURN, 1, 1) +ROUTINE (LIT_MAGIC_STRING_THROW, ECMA_ASYNC_FROM_SYNC_ITERATOR_PROTOTYPE_ROUTINE_THROW, 1, 1) + +#endif /* JERRY_ESNEXT */ + +#include "ecma-builtin-helpers-macro-undefs.inc.h" diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-handlers.c b/jerry-core/ecma/builtin-objects/ecma-builtin-handlers.c index 0b9ba20f..984e9823 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-handlers.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-handlers.c @@ -19,6 +19,7 @@ #include "ecma-builtin-handlers.h" #include "ecma-promise-object.h" +#include "ecma-iterator-object.h" static const ecma_builtin_handler_t ecma_native_handlers[] = { diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-handlers.h b/jerry-core/ecma/builtin-objects/ecma-builtin-handlers.h index ce0e7dbe..de582adc 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-handlers.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-handlers.h @@ -44,7 +44,7 @@ typedef enum /** * Shift for Promise helper handler function. */ -#define ECMA_NATIVE_HANDLER_FLAGS_PROMISE_HELPER_SHIFT 2 +#define ECMA_NATIVE_HANDLER_COMMON_FLAGS_SHIFT 2 ecma_builtin_handler_t ecma_builtin_handler_get (ecma_native_handler_id_t id); 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 3e61e08e..b5b7a60e 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-handlers.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-handlers.inc.h @@ -19,6 +19,7 @@ ECMA_NATIVE_HANDLER (ECMA_NATIVE_HANDLER_PROMISE_THEN_FINALLY, ecma_promise_then 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_or_all_settled_handler_cb, 1) ECMA_NATIVE_HANDLER (ECMA_NATIVE_HANDLER_PROMISE_CAPABILITY_EXECUTOR, ecma_op_get_capabilities_executor_cb, 2) +ECMA_NATIVE_HANDLER (ECMA_NATIVE_HANDLER_ASYNC_FROM_SYNC_ITERATOR_UNWRAP, ecma_async_from_sync_iterator_unwrap_cb, 1) #if JERRY_BUILTIN_PROXY ECMA_NATIVE_HANDLER (ECMA_NATIVE_HANDLER_PROXY_REVOKE, ecma_proxy_revoke_cb, 0) #endif /* JERRY_BUILTIN_PROXY */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-promise.c b/jerry-core/ecma/builtin-objects/ecma-builtin-promise.c index 831aef3d..55afaa34 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-promise.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-promise.c @@ -66,45 +66,6 @@ enum */ /** - * Reject the promise if the value is error. - * - * See also: - * ES2015 25.4.1.1.1 - * - * @return ecma value of the new promise. - * Returned value must be freed with ecma_free_value. - */ -static inline ecma_value_t -ecma_builtin_promise_reject_abrupt (ecma_value_t value, /**< value */ - ecma_object_t *capability_obj_p) /**< capability */ -{ - JERRY_ASSERT (ecma_object_class_is (capability_obj_p, ECMA_OBJECT_CLASS_PROMISE_CAPABILITY)); - - if (!ECMA_IS_VALUE_ERROR (value)) - { - return value; - } - - ecma_value_t reason = jcontext_take_exception (); - - ecma_promise_capabality_t *capability_p = (ecma_promise_capabality_t *) capability_obj_p; - ecma_value_t call_ret = ecma_op_function_call (ecma_get_object_from_value (capability_p->reject), - ECMA_VALUE_UNDEFINED, - &reason, - 1); - ecma_free_value (reason); - - if (ECMA_IS_VALUE_ERROR (call_ret)) - { - return call_ret; - } - - ecma_free_value (call_ret); - - return ecma_copy_value (capability_p->header.u.cls.u3.promise); -} /* ecma_builtin_promise_reject_abrupt */ - -/** * Runtime Semantics: PerformPromiseRace. * * See also: @@ -118,7 +79,6 @@ 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)); @@ -127,6 +87,20 @@ 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; + 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); ecma_value_t ret_value = ECMA_VALUE_ERROR; @@ -184,6 +158,8 @@ 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 */ @@ -201,7 +177,6 @@ ecma_builtin_promise_perform (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]] */ { @@ -211,6 +186,20 @@ ecma_builtin_promise_perform (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. */ @@ -321,11 +310,11 @@ ecma_builtin_promise_perform (ecma_value_t iterator, /**< iteratorRecord */ /* p. */ executor_p->remaining_elements = remaining; - uint8_t executor_type = ECMA_PROMISE_ALL_RESOLVE << ECMA_NATIVE_HANDLER_FLAGS_PROMISE_HELPER_SHIFT; + uint8_t executor_type = ECMA_PROMISE_ALL_RESOLVE << ECMA_NATIVE_HANDLER_COMMON_FLAGS_SHIFT; if (builtin_routine_id == ECMA_PROMISE_ROUTINE_ALLSETTLED) { - executor_type = ECMA_PROMISE_ALLSETTLED_RESOLVE << ECMA_NATIVE_HANDLER_FLAGS_PROMISE_HELPER_SHIFT; + executor_type = ECMA_PROMISE_ALLSETTLED_RESOLVE << ECMA_NATIVE_HANDLER_COMMON_FLAGS_SHIFT; } executor_p->header.u.built_in.u2.routine_flags |= executor_type; @@ -343,11 +332,11 @@ ecma_builtin_promise_perform (ecma_value_t iterator, /**< iteratorRecord */ if (builtin_routine_id != ECMA_PROMISE_ROUTINE_ALL) { - uint8_t executor_type = ECMA_PROMISE_ALLSETTLED_REJECT << ECMA_NATIVE_HANDLER_FLAGS_PROMISE_HELPER_SHIFT; + uint8_t executor_type = ECMA_PROMISE_ALLSETTLED_REJECT << ECMA_NATIVE_HANDLER_COMMON_FLAGS_SHIFT; if (builtin_routine_id == ECMA_PROMISE_ROUTINE_ANY) { - executor_type = ECMA_PROMISE_ANY_REJECT << ECMA_NATIVE_HANDLER_FLAGS_PROMISE_HELPER_SHIFT; + executor_type = ECMA_PROMISE_ANY_REJECT << ECMA_NATIVE_HANDLER_COMMON_FLAGS_SHIFT; } ecma_object_t *reject_func_p = ecma_op_create_native_handler (ECMA_NATIVE_HANDLER_PROMISE_ALL_HELPER, @@ -390,6 +379,8 @@ 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 */ @@ -411,41 +402,22 @@ ecma_builtin_promise_helper (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); + ecma_value_t ret = ECMA_VALUE_ERROR; - if (ECMA_IS_VALUE_ERROR (iterator)) + if (ECMA_IS_VALUE_ERROR (ecma_op_if_abrupt_reject_promise (&iterator, capability_obj_p))) { + ecma_free_value (next_method); ecma_deref_object (capability_obj_p); return iterator; } - ecma_value_t ret = ECMA_VALUE_EMPTY; bool is_done = false; if (builtin_routine_id == ECMA_PROMISE_ROUTINE_RACE) { - ret = ecma_builtin_promise_perform_race (iterator, next_method, capability_obj_p, this_arg, resolve, &is_done); + ret = ecma_builtin_promise_perform_race (iterator, next_method, capability_obj_p, this_arg, &is_done); } else { @@ -453,7 +425,6 @@ ecma_builtin_promise_helper (ecma_value_t this_arg, /**< 'this' argument */ next_method, capability_obj_p, this_arg, - resolve, builtin_routine_id, &is_done); } @@ -465,12 +436,11 @@ ecma_builtin_promise_helper (ecma_value_t this_arg, /**< 'this' argument */ ret = ecma_op_iterator_close (iterator); } - ret = ecma_builtin_promise_reject_abrupt (ret, capability_obj_p); + ecma_op_if_abrupt_reject_promise (&ret, capability_obj_p); } ecma_free_value (iterator); ecma_free_value (next_method); - ecma_free_value (resolve); ecma_deref_object (capability_obj_p); return ret; diff --git a/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h index 66d0e23e..d03868d1 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h @@ -701,6 +701,13 @@ BUILTIN (ECMA_BUILTIN_ID_ASYNC_ITERATOR_PROTOTYPE, true, async_iterator_prototype) +/* The %AsyncFromSyncIteratorPrototype% object (ECMA-262 v11, 25.1.4.2) */ +BUILTIN (ECMA_BUILTIN_ID_ASYNC_FROM_SYNC_ITERATOR_PROTOTYPE, + ECMA_OBJECT_TYPE_BUILT_IN_GENERAL, + ECMA_BUILTIN_ID_ASYNC_ITERATOR_PROTOTYPE, + true, + async_from_sync_iterator_prototype) + /* The %(GeneratorFunction)% object */ BUILTIN_ROUTINE (ECMA_BUILTIN_ID_GENERATOR_FUNCTION, ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION, diff --git a/jerry-core/ecma/operations/ecma-iterator-object.c b/jerry-core/ecma/operations/ecma-iterator-object.c index ac8b963f..cf066d05 100644 --- a/jerry-core/ecma/operations/ecma-iterator-object.c +++ b/jerry-core/ecma/operations/ecma-iterator-object.c @@ -202,16 +202,49 @@ ecma_op_get_iterator (ecma_value_t value, /**< value to get iterator from */ return method; } } + /* 3.a */ else if (method == ECMA_VALUE_ASYNC_ITERATOR) { - /* TODO: CreateAsyncFromSyncIterator should be supported. */ use_default_method = true; + + /* 3.a.i */ method = ecma_op_get_method_by_symbol_id (value, LIT_GLOBAL_SYMBOL_ASYNC_ITERATOR); if (ECMA_IS_VALUE_ERROR (method)) { return method; } + + /* 3.a.ii */ + + if (ecma_is_value_undefined (method)) + { + method = ecma_op_get_method_by_symbol_id (value, LIT_GLOBAL_SYMBOL_ITERATOR); + + if (ECMA_IS_VALUE_ERROR (method)) + { + return method; + } + + ecma_value_t sync_next_method; + ecma_value_t sync_iterator = ecma_op_get_iterator (value, method, &sync_next_method); + + if (ECMA_IS_VALUE_ERROR (sync_iterator)) + { + ecma_free_value (method); + return sync_iterator; + } + + ecma_value_t async_iterator = ecma_op_create_async_from_sync_iterator (sync_iterator, + sync_next_method, + next_method_p); + + ecma_free_value (method); + ecma_free_value (sync_iterator); + ecma_free_value (sync_next_method); + + return async_iterator; + } } /* 3. */ @@ -397,6 +430,35 @@ ecma_op_iterator_throw (ecma_value_t iterator, /**< iterator value */ } /* ecma_op_iterator_throw */ /** + * IteratorComplete operation + * + * See also: ECMA-262 v10, 7.4.3 + * + * @return true/false - whether the iteration ended + */ +ecma_value_t +ecma_op_iterator_complete (ecma_value_t iter_result) /**< iterator value */ +{ + /* 1. */ + JERRY_ASSERT (ecma_is_value_object (iter_result)); + + /* 2. */ + ecma_object_t *obj_p = ecma_get_object_from_value (iter_result); + + ecma_value_t done = ecma_op_object_get_by_magic_id (obj_p, LIT_MAGIC_STRING_DONE); + + if (ECMA_IS_VALUE_ERROR (done)) + { + return done; + } + + ecma_value_t res = ecma_make_boolean_value (ecma_op_to_boolean (done)); + ecma_free_value (done); + + return res; +} /* ecma_op_iterator_complete */ + +/** * IteratorValue operation * * See also: ECMA-262 v6, 7.4.4 @@ -623,6 +685,66 @@ ecma_op_iterator_do (ecma_iterator_command_type_t command, /**< command to be ex return result; } /* ecma_op_iterator_do */ +/** + * CreateAsyncFromSyncIterator operation + * + * See also: ECMA-262 v10, 25.1.4.1 + * + * Note: + * Returned value must be freed with ecma_free_value. + * + * @return async from sync iterator object + */ +ecma_value_t +ecma_op_create_async_from_sync_iterator (ecma_value_t sync_iterator, /**< sync iterator */ + ecma_value_t sync_next_method, /**< sync iterator next method */ + ecma_value_t *async_next_method_p) /**< [out] async next method */ +{ + JERRY_ASSERT (ecma_is_value_object (sync_iterator)); + JERRY_ASSERT (ecma_is_value_object (sync_next_method) || ecma_is_value_undefined (sync_next_method)); + + /* 1. */ + ecma_object_t *obj_p = ecma_create_object (ecma_builtin_get (ECMA_BUILTIN_ID_ASYNC_FROM_SYNC_ITERATOR_PROTOTYPE), + sizeof (ecma_async_from_sync_iterator_object_t), + ECMA_OBJECT_TYPE_CLASS); + + ecma_async_from_sync_iterator_object_t *ext_obj_p = (ecma_async_from_sync_iterator_object_t *) obj_p; + + /* 2. */ + ext_obj_p->sync_next_method = sync_next_method; + ext_obj_p->header.u.cls.u3.sync_iterator = sync_iterator; + ext_obj_p->header.u.cls.type = ECMA_OBJECT_CLASS_ASYNC_FROM_SYNC_ITERATOR; + + /* 3. */ + *async_next_method_p = ecma_op_object_get_by_magic_id (obj_p, LIT_MAGIC_STRING_NEXT); + JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (*async_next_method_p)); + + /* 4. */ + return ecma_make_object_value (obj_p); +} /* ecma_op_create_async_from_sync_iterator */ + +/** + * Async-from-Sync Iterator Value Unwrap Functions + * + * See also: ES11 25.1.4.2.4 + * + * @return iterator result object + */ +ecma_value_t +ecma_async_from_sync_iterator_unwrap_cb (ecma_object_t *function_obj_p, /**< function object */ + const ecma_value_t args_p[], /**< argument list */ + const uint32_t args_count) /**< argument number */ +{ + ecma_extended_object_t *unwrap_p = (ecma_extended_object_t *) function_obj_p; + + /* 2. */ + ecma_value_t arg = args_count > 0 ? args_p[0] : ECMA_VALUE_UNDEFINED; + ecma_value_t done = ecma_make_boolean_value (unwrap_p->u.built_in.u2.routine_flags + >> ECMA_NATIVE_HANDLER_COMMON_FLAGS_SHIFT); + + return ecma_create_iter_result_object (arg, done); +} /* ecma_async_from_sync_iterator_unwrap_cb */ + #endif /* JERRY_ESNEXT */ /** diff --git a/jerry-core/ecma/operations/ecma-iterator-object.h b/jerry-core/ecma/operations/ecma-iterator-object.h index 9699bded..157b3432 100644 --- a/jerry-core/ecma/operations/ecma-iterator-object.h +++ b/jerry-core/ecma/operations/ecma-iterator-object.h @@ -59,6 +59,9 @@ ecma_value_t ecma_op_get_iterator (ecma_value_t value, ecma_value_t method, ecma_value_t *next_method_p); ecma_value_t +ecma_op_iterator_complete (ecma_value_t iter_result); + +ecma_value_t ecma_op_iterator_value (ecma_value_t iter_result); ecma_value_t @@ -74,6 +77,15 @@ ecma_value_t ecma_op_iterator_do (ecma_iterator_command_type_t command, ecma_value_t iterator, ecma_value_t next_method, ecma_value_t value, bool *done_p); +ecma_value_t +ecma_op_create_async_from_sync_iterator (ecma_value_t sync_iterator, ecma_value_t sync_next_method, + ecma_value_t *async_next_method_p); + +ecma_value_t +ecma_async_from_sync_iterator_unwrap_cb (ecma_object_t *function_obj_p, + const ecma_value_t args_p[], + const uint32_t args_count); + #endif /* JERRY_ESNEXT */ /** diff --git a/jerry-core/ecma/operations/ecma-objects.c b/jerry-core/ecma/operations/ecma-objects.c index a4aaf366..597f60a8 100644 --- a/jerry-core/ecma/operations/ecma-objects.c +++ b/jerry-core/ecma/operations/ecma-objects.c @@ -2937,6 +2937,7 @@ static const uint16_t ecma_class_object_magic_string_id[] = #if JERRY_ESNEXT LIT_MAGIC_STRING_PROMISE_UL, /**< magic string id of ECMA_OBJECT_CLASS_PROMISE */ LIT_MAGIC_STRING_OBJECT_UL, /**< magic string id of ECMA_OBJECT_CLASS_PROMISE_CAPABILITY */ + LIT_MAGIC_STRING_OBJECT_UL, /**< magic string id of ECMA_OBJECT_CLASS_ASYNC_FROM_SYNC_ITERATOR */ #endif /* JERRY_ESNEXT */ #if JERRY_BUILTIN_DATAVIEW LIT_MAGIC_STRING_DATAVIEW_UL, /**< magic string id of ECMA_OBJECT_CLASS_DATAVIEW */ diff --git a/jerry-core/ecma/operations/ecma-promise-object.c b/jerry-core/ecma/operations/ecma-promise-object.c index 3c6b7378..b5d135d8 100644 --- a/jerry-core/ecma/operations/ecma-promise-object.c +++ b/jerry-core/ecma/operations/ecma-promise-object.c @@ -607,7 +607,7 @@ ecma_promise_all_or_all_settled_handler_cb (ecma_object_t *function_obj_p, /**< ecma_promise_all_executor_t *executor_p = (ecma_promise_all_executor_t *) function_obj_p; uint8_t promise_type = executor_p->header.u.built_in.u2.routine_flags; - promise_type = (uint8_t) (promise_type >> ECMA_NATIVE_HANDLER_FLAGS_PROMISE_HELPER_SHIFT); + promise_type = (uint8_t) (promise_type >> ECMA_NATIVE_HANDLER_COMMON_FLAGS_SHIFT); /* 1 - 2. */ if (executor_p->index == 0) @@ -895,103 +895,6 @@ ecma_promise_reject_or_resolve (ecma_value_t this_arg, /**< "this" argument */ } /* ecma_promise_reject_or_resolve */ /** - * It performs the "then" operation on promiFulfilled - * and onRejected as its settlement actions. - * - * See also: 25.4.5.3.1 - * - * @return ecma value of the new promise object - * Returned value must be freed with ecma_free_value - */ -static ecma_value_t -ecma_promise_do_then (ecma_value_t promise, /**< the promise which call 'then' */ - ecma_value_t on_fulfilled, /**< on_fulfilled function */ - ecma_value_t on_rejected, /**< on_rejected function */ - ecma_object_t *result_capability_obj_p) /**< promise capability */ -{ - JERRY_ASSERT (ecma_object_class_is (result_capability_obj_p, ECMA_OBJECT_CLASS_PROMISE_CAPABILITY)); - - ecma_promise_capabality_t *capability_p = (ecma_promise_capabality_t *) result_capability_obj_p; - - /* 3. boolean true indicates "indentity" */ - if (!ecma_op_is_callable (on_fulfilled)) - { - on_fulfilled = ECMA_VALUE_TRUE; - } - - /* 4. boolean false indicates "thrower" */ - if (!ecma_op_is_callable (on_rejected)) - { - on_rejected = ECMA_VALUE_FALSE; - } - - ecma_object_t *promise_obj_p = ecma_get_object_from_value (promise); - ecma_promise_object_t *promise_p = (ecma_promise_object_t *) promise_obj_p; - - uint16_t flags = ecma_promise_get_flags (promise_obj_p); - - if (flags & ECMA_PROMISE_IS_PENDING) - { - /* 7. */ - /* [ capability, (on_fulfilled), (on_rejected) ] */ - ecma_value_t reaction_values[3]; - ecma_value_t *reactions_p = reaction_values + 1; - - uint8_t tag = 0; - - if (on_fulfilled != ECMA_VALUE_TRUE) - { - tag |= JMEM_FIRST_TAG_BIT_MASK; - *reactions_p++ = on_fulfilled; - } - - if (on_rejected != ECMA_VALUE_FALSE) - { - tag |= JMEM_SECOND_TAG_BIT_MASK; - *reactions_p++ = on_rejected; - } - - ECMA_SET_NON_NULL_POINTER_TAG (reaction_values[0], result_capability_obj_p, tag); - - uint32_t value_count = (uint32_t) (reactions_p - reaction_values); - ecma_collection_append (promise_p->reactions, reaction_values, value_count); - } - else if (flags & ECMA_PROMISE_IS_FULFILLED) - { - /* 8. */ - ecma_value_t value = ecma_promise_get_result (promise_obj_p); - ecma_enqueue_promise_reaction_job (ecma_make_object_value (result_capability_obj_p), on_fulfilled, value); - ecma_free_value (value); - } - else - { - /* 9. */ - ecma_value_t reason = ecma_promise_get_result (promise_obj_p); - ecma_enqueue_promise_reaction_job (ecma_make_object_value (result_capability_obj_p), on_rejected, reason); - ecma_free_value (reason); - -#if JERRY_PROMISE_CALLBACK - if (ecma_promise_get_flags (promise_obj_p) & ECMA_PROMISE_UNHANDLED_REJECT) - { - promise_p->header.u.cls.u1.promise_flags &= (uint8_t) ~ECMA_PROMISE_UNHANDLED_REJECT; - - if (JERRY_UNLIKELY (JERRY_CONTEXT (promise_callback_filters) & JERRY_PROMISE_EVENT_FILTER_ERROR)) - { - JERRY_ASSERT (JERRY_CONTEXT (promise_callback) != NULL); - JERRY_CONTEXT (promise_callback) (JERRY_PROMISE_EVENT_CATCH_HANDLER_ADDED, - promise, - ECMA_VALUE_UNDEFINED, - JERRY_CONTEXT (promise_callback_user_p)); - } - } -#endif /* JERRY_PROMISE_CALLBACK */ - } - - /* 10. */ - return ecma_copy_value (capability_p->header.u.cls.u3.promise); -} /* ecma_promise_do_then */ - -/** * The common function for ecma_builtin_promise_prototype_then * and ecma_builtin_promise_prototype_catch. * @@ -1029,7 +932,7 @@ ecma_promise_then (ecma_value_t promise, /**< the promise which call 'then' */ return ECMA_VALUE_ERROR; } - ecma_value_t ret = ecma_promise_do_then (promise, on_fulfilled, on_rejected, result_capability_obj_p); + ecma_value_t ret = ecma_promise_perform_then (promise, on_fulfilled, on_rejected, result_capability_obj_p); ecma_deref_object (result_capability_obj_p); return ret; @@ -1327,6 +1230,144 @@ ecma_promise_async_await (ecma_extended_object_t *async_generator_object_p, /**< } /* ecma_promise_async_await */ /** + * Reject the promise if the value is error. + * + * See also: + * ES2015 25.4.1.1.1 + * + * @return ecma value of the new promise. + * Returned value must be freed with ecma_free_value. + */ +ecma_value_t +ecma_op_if_abrupt_reject_promise (ecma_value_t *value_p, /**< [in - out] completion value */ + ecma_object_t *capability_obj_p) /**< capability */ +{ + JERRY_ASSERT (ecma_object_class_is (capability_obj_p, ECMA_OBJECT_CLASS_PROMISE_CAPABILITY)); + + if (!ECMA_IS_VALUE_ERROR (*value_p)) + { + return ECMA_VALUE_EMPTY; + } + + ecma_value_t reason = jcontext_take_exception (); + + ecma_promise_capabality_t *capability_p = (ecma_promise_capabality_t *) capability_obj_p; + ecma_value_t call_ret = ecma_op_function_call (ecma_get_object_from_value (capability_p->reject), + ECMA_VALUE_UNDEFINED, + &reason, + 1); + ecma_free_value (reason); + + if (ECMA_IS_VALUE_ERROR (call_ret)) + { + *value_p = call_ret; + return call_ret; + } + + ecma_free_value (call_ret); + *value_p = ecma_copy_value (capability_p->header.u.cls.u3.promise); + + return ECMA_VALUE_EMPTY; +} /* ecma_op_if_abrupt_reject_promise */ + +/** + * It performs the "then" operation on promiFulfilled + * and onRejected as its settlement actions. + * + * See also: 25.4.5.3.1 + * + * @return ecma value of the new promise object + * Returned value must be freed with ecma_free_value + */ +ecma_value_t +ecma_promise_perform_then (ecma_value_t promise, /**< the promise which call 'then' */ + ecma_value_t on_fulfilled, /**< on_fulfilled function */ + ecma_value_t on_rejected, /**< on_rejected function */ + ecma_object_t *result_capability_obj_p) /**< promise capability */ +{ + JERRY_ASSERT (ecma_object_class_is (result_capability_obj_p, ECMA_OBJECT_CLASS_PROMISE_CAPABILITY)); + + ecma_promise_capabality_t *capability_p = (ecma_promise_capabality_t *) result_capability_obj_p; + + /* 3. boolean true indicates "indentity" */ + if (!ecma_op_is_callable (on_fulfilled)) + { + on_fulfilled = ECMA_VALUE_TRUE; + } + + /* 4. boolean false indicates "thrower" */ + if (!ecma_op_is_callable (on_rejected)) + { + on_rejected = ECMA_VALUE_FALSE; + } + + ecma_object_t *promise_obj_p = ecma_get_object_from_value (promise); + ecma_promise_object_t *promise_p = (ecma_promise_object_t *) promise_obj_p; + + uint16_t flags = ecma_promise_get_flags (promise_obj_p); + + if (flags & ECMA_PROMISE_IS_PENDING) + { + /* 7. */ + /* [ capability, (on_fulfilled), (on_rejected) ] */ + ecma_value_t reaction_values[3]; + ecma_value_t *reactions_p = reaction_values + 1; + + uint8_t tag = 0; + + if (on_fulfilled != ECMA_VALUE_TRUE) + { + tag |= JMEM_FIRST_TAG_BIT_MASK; + *reactions_p++ = on_fulfilled; + } + + if (on_rejected != ECMA_VALUE_FALSE) + { + tag |= JMEM_SECOND_TAG_BIT_MASK; + *reactions_p++ = on_rejected; + } + + ECMA_SET_NON_NULL_POINTER_TAG (reaction_values[0], result_capability_obj_p, tag); + + uint32_t value_count = (uint32_t) (reactions_p - reaction_values); + ecma_collection_append (promise_p->reactions, reaction_values, value_count); + } + else if (flags & ECMA_PROMISE_IS_FULFILLED) + { + /* 8. */ + ecma_value_t value = ecma_promise_get_result (promise_obj_p); + ecma_enqueue_promise_reaction_job (ecma_make_object_value (result_capability_obj_p), on_fulfilled, value); + ecma_free_value (value); + } + else + { + /* 9. */ + ecma_value_t reason = ecma_promise_get_result (promise_obj_p); + ecma_enqueue_promise_reaction_job (ecma_make_object_value (result_capability_obj_p), on_rejected, reason); + ecma_free_value (reason); + +#if JERRY_PROMISE_CALLBACK + if (ecma_promise_get_flags (promise_obj_p) & ECMA_PROMISE_UNHANDLED_REJECT) + { + promise_p->header.u.cls.u1.promise_flags &= (uint8_t) ~ECMA_PROMISE_UNHANDLED_REJECT; + + if (JERRY_UNLIKELY (JERRY_CONTEXT (promise_callback_filters) & JERRY_PROMISE_EVENT_FILTER_ERROR)) + { + JERRY_ASSERT (JERRY_CONTEXT (promise_callback) != NULL); + JERRY_CONTEXT (promise_callback) (JERRY_PROMISE_EVENT_CATCH_HANDLER_ADDED, + promise, + ECMA_VALUE_UNDEFINED, + JERRY_CONTEXT (promise_callback_user_p)); + } + } +#endif /* JERRY_PROMISE_CALLBACK */ + } + + /* 10. */ + return ecma_copy_value (capability_p->header.u.cls.u3.promise); +} /* ecma_promise_perform_then */ + +/** * @} * @} */ diff --git a/jerry-core/ecma/operations/ecma-promise-object.h b/jerry-core/ecma/operations/ecma-promise-object.h index 852f474f..df9cb2ce 100644 --- a/jerry-core/ecma/operations/ecma-promise-object.h +++ b/jerry-core/ecma/operations/ecma-promise-object.h @@ -129,9 +129,15 @@ ecma_value_t ecma_promise_finally (ecma_value_t promise, ecma_value_t on_finally void ecma_promise_async_then (ecma_value_t promise, ecma_value_t executable_object); ecma_value_t ecma_promise_async_await (ecma_extended_object_t *async_generator_object_p, ecma_value_t value); ecma_value_t ecma_promise_run_executor (ecma_object_t *promise_p, ecma_value_t executor, ecma_value_t this_value); +ecma_value_t ecma_op_if_abrupt_reject_promise (ecma_value_t *value_p, ecma_object_t *capability_obj_p); uint32_t ecma_promise_remaining_inc_or_dec (ecma_value_t remaining, bool is_inc); +ecma_value_t ecma_promise_perform_then (ecma_value_t promise, + ecma_value_t on_fulfilled, + ecma_value_t on_rejected, + ecma_object_t *result_capability_obj_p); + /** * @} * @} diff --git a/tests/jerry/es.next/async-from-sync-iterator.js b/tests/jerry/es.next/async-from-sync-iterator.js new file mode 100644 index 00000000..97d2b269 --- /dev/null +++ b/tests/jerry/es.next/async-from-sync-iterator.js @@ -0,0 +1,210 @@ +/* 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. + */ + +/* 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. + */ + +async function f() { + let arr_idx = 0; + for await (let a of [0, 1, 2, 3]) { + assert(arr_idx++ == a); + } + + let char_code = "a".charCodeAt(0); + for await (let a of "abc") { + assert(char_code++ == a.charCodeAt(0)); + } + + let set_idx = 0; + for await (let a of new Set([0, 1, 2, 3])) { + assert(set_idx++ == a); + } + + let map_idx = 0; + for await (let [key, value] of new Map([0, 1, 2, 3].entries())) { + assert(map_idx++ == value); + } +} + +async function* asyncg(obj) { + yield* obj; +} + +async function f1() { + var caught = false; + var iter = asyncg({ + get [Symbol.iterator]() { + throw "Symbol.iteratorError" + }, + }); + + iter.next().catch(e => { + caught = true; + assert(e === "Symbol.iteratorError") + }).then(e => { + assert(caught) + }); +} + +async function f2() { + var caught = false; + var iter = asyncg({ + [Symbol.iterator]() { + return { + next() { + throw "nextError"; + }, + }; + }, + }); + + iter.next().catch(e => { + caught = true; + assert(e === "nextError") + }).then(e => { + assert(caught) + }); +} + +async function f3() { + var caught = false; + var iter = asyncg({ + [Symbol.iterator]() { + return { + next() { + return { + get value() { + throw "valueError" + }, + done: false + }; + }, + }; + }, + }); + + iter.next().catch(e => { + caught = true; + assert(e === "valueError") + }).then(e => { + assert(caught) + }); +} + +async function f4() { + var caught = false; + var iter = asyncg({ + [Symbol.iterator]() { + return { + next() { + return { + value: "value", + get done() { + throw "doneError" + }, + }; + }, + }; + }, + }); + + iter.next().catch(e => { + caught = true; + assert(e === "doneError") + }).then(e => { + assert(caught) + }); +} + +async function f5() { + var caught = false; + + var iter = asyncg({ + [Symbol.iterator]() { + return { + next() { + return { + value: 1, + done: false + }; + }, + get return () { + throw "returnError" + } + }; + } + }); + + iter.next().then(function (res) { + assert(res.value === 1); + assert(!res.done); + iter.return().catch(e => { + caught = true; + assert(e == "returnError"); + }).then(e => { + assert(caught); + }); + }); +} + +async function f6() { + var caught = false; + + var iter = asyncg({ + [Symbol.iterator]() { + return { + next() { + return { + value: 1, + done: false + }; + }, + get throw () { + throw "throwError" + } + }; + } + }); + + iter.next().then(function (res) { + assert(res.value === 1); + assert(!res.done); + iter.throw().catch(e => { + caught = true; + assert(e == "throwError"); + }).then(e => { + assert(caught); + }); + }); +} + +const tests = [f, f1, f2, f3, f4, f5, f6]; + +for (let t of tests) { + t(); +} + diff --git a/tests/jerry/es.next/promise-all-iterator.js b/tests/jerry/es.next/promise-all-iterator.js index 773aabea..eaae9f94 100644 --- a/tests/jerry/es.next/promise-all-iterator.js +++ b/tests/jerry/es.next/promise-all-iterator.js @@ -78,7 +78,7 @@ rejects.catch(result => { assert (result === "baz"); }); var closed = true; delete Promise.resolve; Promise.all(createIterable([1,2,3], {'return': function () { closed = false; }})); -assert (closed); +assert (!closed); var arr = []; Object.defineProperty(arr, Symbol.species, { get: function () { assert(false) }}); diff --git a/tests/jerry/es.next/promise-all-settled.js b/tests/jerry/es.next/promise-all-settled.js index 1ad71012..896545bd 100644 --- a/tests/jerry/es.next/promise-all-settled.js +++ b/tests/jerry/es.next/promise-all-settled.js @@ -100,7 +100,7 @@ rejects.then(result => { var closed = true; delete Promise.resolve; Promise.allSettled(createIterable([1,2,3], {'return': function () { closed = false; }})); -assert (closed); +assert (!closed); var arr = []; Object.defineProperty(arr, Symbol.species, { get: function () { assert(false) }}); diff --git a/tests/jerry/es.next/promise-any.js b/tests/jerry/es.next/promise-any.js index 238ac152..8b313136 100644 --- a/tests/jerry/es.next/promise-any.js +++ b/tests/jerry/es.next/promise-any.js @@ -82,7 +82,7 @@ rejects.catch(result => { assert (result == "AggregateError"); }); var closed = true; delete Promise.resolve; Promise.any(createIterable([1,2,3], {'return': function () { closed = false; }})); -assert (closed); +assert (!closed); var arr = []; Object.defineProperty(arr, Symbol.species, { get: function () { assert(false) }}); diff --git a/tests/jerry/es.next/promise-race-iterator.js b/tests/jerry/es.next/promise-race-iterator.js index 61f3a2f2..36f6d09a 100644 --- a/tests/jerry/es.next/promise-race-iterator.js +++ b/tests/jerry/es.next/promise-race-iterator.js @@ -66,7 +66,7 @@ rejects.catch(result => { assert (result === "baz"); }); var closed = true; delete Promise.resolve; Promise.race(createIterable([1,2,3], {'return': function () { closed = false; }})); -assert (closed); +assert (!closed); var arr = []; Object.defineProperty(arr, Symbol.species, { get: function () { assert(false) }}); diff --git a/tests/test262-esnext-excludelist.xml b/tests/test262-esnext-excludelist.xml index aaa42b9f..637564d2 100644 --- a/tests/test262-esnext-excludelist.xml +++ b/tests/test262-esnext-excludelist.xml @@ -6476,31 +6476,6 @@ features: [async-iteration] https://github.com/tc39/proposal-async-iteration --> - <test id="built-ins/AsyncFromSyncIteratorPrototype/next/absent-value-not-passed.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-poisoned-done.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-poisoned-value.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-prototype.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-rejected.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-unwrap-promise.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/return/absent-value-not-passed.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result-poisoned-done.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result-poisoned-value.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result-unwrap-promise.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/return/poisoned-get-return.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/return/poisoned-return.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/return/result-object-error.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/return/return-null.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/return/return-undefined.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result-poisoned-done.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result-poisoned-value.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result-unwrap-promise.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/throw/poisoned-get-throw.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/throw/poisoned-throw.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/throw/result-object-error.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/throw/throw-null.js"><reason></reason></test> - <test id="built-ins/AsyncFromSyncIteratorPrototype/throw/throw-undefined.js"><reason></reason></test> <test id="built-ins/AsyncGeneratorFunction/instance-await-expr-in-param.js"><reason></reason></test> <test id="built-ins/AsyncGeneratorFunction/instance-yield-expr-in-param.js"><reason></reason></test> <test id="built-ins/AsyncGeneratorPrototype/next/request-queue-await-order.js"><reason></reason></test> @@ -6547,57 +6522,21 @@ <test id="language/expressions/async-generator/named-eval-var-scope-syntax-err.js"><reason></reason></test> <test id="language/expressions/async-generator/named-yield-promise-reject-next-catch.js"><reason></reason></test> <test id="language/expressions/async-generator/named-yield-promise-reject-next-for-await-of-async-iterator.js"><reason></reason></test> - <test id="language/expressions/async-generator/named-yield-promise-reject-next-for-await-of-sync-iterator.js"><reason></reason></test> - <test id="language/expressions/async-generator/named-yield-promise-reject-next-yield-star-sync-iterator.js"><reason></reason></test> <test id="language/expressions/async-generator/named-yield-promise-reject-next.js"><reason></reason></test> - <test id="language/expressions/async-generator/named-yield-star-getiter-async-null-sync-get-abrupt.js"><reason></reason></test> - <test id="language/expressions/async-generator/named-yield-star-getiter-async-undefined-sync-get-abrupt.js"><reason></reason></test> - <test id="language/expressions/async-generator/named-yield-star-getiter-sync-get-abrupt.js"><reason></reason></test> - <test id="language/expressions/async-generator/named-yield-star-getiter-sync-returns-abrupt.js"><reason></reason></test> - <test id="language/expressions/async-generator/named-yield-star-sync-next.js"><reason></reason></test> - <test id="language/expressions/async-generator/named-yield-star-sync-return.js"><reason></reason></test> - <test id="language/expressions/async-generator/named-yield-star-sync-throw.js"><reason></reason></test> <test id="language/expressions/async-generator/yield-promise-reject-next-catch.js"><reason></reason></test> <test id="language/expressions/async-generator/yield-promise-reject-next-for-await-of-async-iterator.js"><reason></reason></test> - <test id="language/expressions/async-generator/yield-promise-reject-next-for-await-of-sync-iterator.js"><reason></reason></test> - <test id="language/expressions/async-generator/yield-promise-reject-next-yield-star-sync-iterator.js"><reason></reason></test> <test id="language/expressions/async-generator/yield-promise-reject-next.js"><reason></reason></test> - <test id="language/expressions/async-generator/yield-star-getiter-async-null-sync-get-abrupt.js"><reason></reason></test> <test id="language/expressions/async-generator/yield-star-getiter-async-return-method-is-null.js"><reason></reason></test> <test id="language/expressions/async-generator/yield-star-getiter-async-throw-method-is-null.js"><reason></reason></test> - <test id="language/expressions/async-generator/yield-star-getiter-async-undefined-sync-get-abrupt.js"><reason></reason></test> - <test id="language/expressions/async-generator/yield-star-getiter-sync-get-abrupt.js"><reason></reason></test> - <test id="language/expressions/async-generator/yield-star-getiter-sync-returns-abrupt.js"><reason></reason></test> - <test id="language/expressions/async-generator/yield-star-sync-next.js"><reason></reason></test> - <test id="language/expressions/async-generator/yield-star-sync-return.js"><reason></reason></test> - <test id="language/expressions/async-generator/yield-star-sync-throw.js"><reason></reason></test> <test id="language/expressions/async-generator/yield-thenable-create-resolving-functions-reject.js"><reason></reason></test> <test id="language/expressions/async-generator/yield-thenable-create-resolving-functions-resolve.js"><reason></reason></test> <test id="language/expressions/await/for-await-of-interleaved.js"><reason></reason></test> <test id="language/expressions/class/async-gen-method-static/yield-promise-reject-next-catch.js"><reason></reason></test> <test id="language/expressions/class/async-gen-method-static/yield-promise-reject-next-for-await-of-async-iterator.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method-static/yield-promise-reject-next-for-await-of-sync-iterator.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method-static/yield-promise-reject-next-yield-star-sync-iterator.js"><reason></reason></test> <test id="language/expressions/class/async-gen-method-static/yield-promise-reject-next.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method-static/yield-star-getiter-async-null-sync-get-abrupt.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method-static/yield-star-getiter-async-undefined-sync-get-abrupt.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method-static/yield-star-getiter-sync-get-abrupt.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method-static/yield-star-getiter-sync-returns-abrupt.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method-static/yield-star-sync-next.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method-static/yield-star-sync-return.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method-static/yield-star-sync-throw.js"><reason></reason></test> <test id="language/expressions/class/async-gen-method/yield-promise-reject-next-catch.js"><reason></reason></test> <test id="language/expressions/class/async-gen-method/yield-promise-reject-next-for-await-of-async-iterator.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method/yield-promise-reject-next-for-await-of-sync-iterator.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method/yield-promise-reject-next-yield-star-sync-iterator.js"><reason></reason></test> <test id="language/expressions/class/async-gen-method/yield-promise-reject-next.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method/yield-star-getiter-async-null-sync-get-abrupt.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method/yield-star-getiter-async-undefined-sync-get-abrupt.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method/yield-star-getiter-sync-get-abrupt.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method/yield-star-getiter-sync-returns-abrupt.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method/yield-star-sync-next.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method/yield-star-sync-return.js"><reason></reason></test> - <test id="language/expressions/class/async-gen-method/yield-star-sync-throw.js"><reason></reason></test> <test id="language/expressions/class/dstr/async-private-gen-meth-ary-init-iter-close.js"><reason></reason></test> <test id="language/expressions/class/dstr/async-private-gen-meth-ary-init-iter-no-close.js"><reason></reason></test> <test id="language/expressions/class/dstr/async-private-gen-meth-ary-name-iter-val.js"><reason></reason></test> @@ -7059,16 +6998,7 @@ <test id="language/expressions/object/method-definition/async-gen-meth-eval-var-scope-syntax-err.js"><reason></reason></test> <test id="language/expressions/object/method-definition/async-gen-yield-promise-reject-next-catch.js"><reason></reason></test> <test id="language/expressions/object/method-definition/async-gen-yield-promise-reject-next-for-await-of-async-iterator.js"><reason></reason></test> - <test id="language/expressions/object/method-definition/async-gen-yield-promise-reject-next-for-await-of-sync-iterator.js"><reason></reason></test> - <test id="language/expressions/object/method-definition/async-gen-yield-promise-reject-next-yield-star-sync-iterator.js"><reason></reason></test> <test id="language/expressions/object/method-definition/async-gen-yield-promise-reject-next.js"><reason></reason></test> - <test id="language/expressions/object/method-definition/async-gen-yield-star-getiter-async-null-sync-get-abrupt.js"><reason></reason></test> - <test id="language/expressions/object/method-definition/async-gen-yield-star-getiter-async-undefined-sync-get-abrupt.js"><reason></reason></test> - <test id="language/expressions/object/method-definition/async-gen-yield-star-getiter-sync-get-abrupt.js"><reason></reason></test> - <test id="language/expressions/object/method-definition/async-gen-yield-star-getiter-sync-returns-abrupt.js"><reason></reason></test> - <test id="language/expressions/object/method-definition/async-gen-yield-star-sync-next.js"><reason></reason></test> - <test id="language/expressions/object/method-definition/async-gen-yield-star-sync-return.js"><reason></reason></test> - <test id="language/expressions/object/method-definition/async-gen-yield-star-sync-throw.js"><reason></reason></test> <test id="language/module-code/top-level-await/syntax/for-await-await-expr-array-literal.js"><reason></reason></test> <test id="language/module-code/top-level-await/syntax/for-await-await-expr-func-expression.js"><reason></reason></test> <test id="language/module-code/top-level-await/syntax/for-await-await-expr-identifier.js"><reason></reason></test> @@ -7085,43 +7015,15 @@ <test id="language/statements/async-generator/return-undefined-implicit-and-explicit.js"><reason></reason></test> <test id="language/statements/async-generator/yield-promise-reject-next-catch.js"><reason></reason></test> <test id="language/statements/async-generator/yield-promise-reject-next-for-await-of-async-iterator.js"><reason></reason></test> - <test id="language/statements/async-generator/yield-promise-reject-next-for-await-of-sync-iterator.js"><reason></reason></test> - <test id="language/statements/async-generator/yield-promise-reject-next-yield-star-sync-iterator.js"><reason></reason></test> <test id="language/statements/async-generator/yield-promise-reject-next.js"><reason></reason></test> <test id="language/statements/async-generator/yield-return-then-getter-ticks.js"><reason></reason></test> - <test id="language/statements/async-generator/yield-star-async-from-sync-iterator-inaccessible.js"><reason></reason></test> - <test id="language/statements/async-generator/yield-star-getiter-async-null-sync-get-abrupt.js"><reason></reason></test> - <test id="language/statements/async-generator/yield-star-getiter-async-undefined-sync-get-abrupt.js"><reason></reason></test> - <test id="language/statements/async-generator/yield-star-getiter-sync-get-abrupt.js"><reason></reason></test> - <test id="language/statements/async-generator/yield-star-getiter-sync-returns-abrupt.js"><reason></reason></test> <test id="language/statements/async-generator/yield-star-return-then-getter-ticks.js"><reason></reason></test> - <test id="language/statements/async-generator/yield-star-sync-next.js"><reason></reason></test> - <test id="language/statements/async-generator/yield-star-sync-return.js"><reason></reason></test> - <test id="language/statements/async-generator/yield-star-sync-throw.js"><reason></reason></test> <test id="language/statements/class/async-gen-method-static/yield-promise-reject-next-catch.js"><reason></reason></test> <test id="language/statements/class/async-gen-method-static/yield-promise-reject-next-for-await-of-async-iterator.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method-static/yield-promise-reject-next-for-await-of-sync-iterator.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method-static/yield-promise-reject-next-yield-star-sync-iterator.js"><reason></reason></test> <test id="language/statements/class/async-gen-method-static/yield-promise-reject-next.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method-static/yield-star-getiter-async-null-sync-get-abrupt.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method-static/yield-star-getiter-async-undefined-sync-get-abrupt.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method-static/yield-star-getiter-sync-get-abrupt.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method-static/yield-star-getiter-sync-returns-abrupt.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method-static/yield-star-sync-next.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method-static/yield-star-sync-return.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method-static/yield-star-sync-throw.js"><reason></reason></test> <test id="language/statements/class/async-gen-method/yield-promise-reject-next-catch.js"><reason></reason></test> <test id="language/statements/class/async-gen-method/yield-promise-reject-next-for-await-of-async-iterator.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method/yield-promise-reject-next-for-await-of-sync-iterator.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method/yield-promise-reject-next-yield-star-sync-iterator.js"><reason></reason></test> <test id="language/statements/class/async-gen-method/yield-promise-reject-next.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method/yield-star-getiter-async-null-sync-get-abrupt.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method/yield-star-getiter-async-undefined-sync-get-abrupt.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method/yield-star-getiter-sync-get-abrupt.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method/yield-star-getiter-sync-returns-abrupt.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method/yield-star-sync-next.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method/yield-star-sync-return.js"><reason></reason></test> - <test id="language/statements/class/async-gen-method/yield-star-sync-throw.js"><reason></reason></test> <test id="language/statements/class/dstr/async-private-gen-meth-ary-init-iter-close.js"><reason></reason></test> <test id="language/statements/class/dstr/async-private-gen-meth-ary-init-iter-no-close.js"><reason></reason></test> <test id="language/statements/class/dstr/async-private-gen-meth-ary-name-iter-val.js"><reason></reason></test> @@ -7556,152 +7458,8 @@ <test id="language/statements/class/elements/same-line-async-gen-static-private-methods-with-fields.js"><reason></reason></test> <test id="language/statements/class/elements/same-line-async-gen-static-private-methods.js"><reason></reason></test> <test id="language/statements/class/elements/syntax/valid/grammar-static-private-async-gen-meth-prototype.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-from-sync-iterator-continuation-abrupt-completion-get-constructor.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-decl-dstr-array-elem-put-prop-ref-user-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-decl-dstr-array-elem-put-unresolvable-strict.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-ary-init-iter-get-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-iter-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elem-id-iter-val-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elision-iter-close.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elision-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-id-elision-next-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-id-iter-close.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-id-iter-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-id-iter-val-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-get-value-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-obj-ptrn-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-obj-ptrn-list-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-eval-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id-get-value-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-const-obj-ptrn-prop-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-ary-init-iter-get-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-iter-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elem-id-iter-val-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elision-iter-close.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elision-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id-elision-next-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id-iter-close.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id-iter-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id-iter-val-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-get-value-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-obj-ptrn-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-obj-ptrn-list-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-eval-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id-get-value-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-let-obj-ptrn-prop-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-ary-init-iter-get-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-iter-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elem-id-iter-val-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elision-iter-close.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elision-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id-elision-next-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id-iter-close.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id-iter-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id-iter-val-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-get-value-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-obj-ptrn-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-obj-ptrn-list-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-eval-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id-get-value-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-func-dstr-var-obj-ptrn-prop-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-yield-expr.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-get-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-null.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-skip.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-rtrn-close-null.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-thrw-close-skip.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-yield-expr.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-yield-expr.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-prop-ref-user-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-unresolvable-strict.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-target-yield-expr.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-thrw-close-skip.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-rest-nrml-close-skip.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-yield-expr.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-yield-expr.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-array-rest-yield-expr.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-yield-expr.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-yield-expr.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-target-yield-expr.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-array-yield-expr.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-obj-yield-expr.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-ary-init-iter-get-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-iter-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elem-id-iter-val-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elision-iter-close.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elision-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id-elision-next-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id-iter-close.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id-iter-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id-iter-val-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-get-value-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-list-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-eval-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id-get-value-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-prop-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-ary-init-iter-get-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-iter-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elem-id-iter-val-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elision-iter-close.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elision-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id-elision-next-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id-iter-close.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id-iter-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id-iter-val-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-get-value-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-list-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-eval-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id-get-value-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-prop-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-ary-init-iter-get-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-iter-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elem-id-iter-val-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elision-iter-close.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elision-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id-elision-next-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id-iter-close.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id-iter-step-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id-iter-val-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-get-value-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-id-init-unresolvable.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-list-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-eval-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id-get-value-err.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id-init-throws.js"><reason></reason></test> - <test id="language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-prop-id-init-unresolvable.js"><reason></reason></test> <test id="language/statements/for-await-of/let-block-with-newline.js"><reason></reason></test> <test id="language/statements/for-await-of/let-identifier-with-newline.js"><reason></reason></test> - <test id="language/statements/for-await-of/ticks-with-sync-iter-resolved-promise-and-constructor-lookup.js"><reason></reason></test> <test id="language/statements/switch/syntax/redeclaration/async-function-name-redeclaration-attempt-with-async-generator.js"><reason></reason></test> <test id="language/statements/switch/syntax/redeclaration/async-generator-name-redeclaration-attempt-with-async-function.js"><reason></reason></test> <test id="language/statements/switch/syntax/redeclaration/async-generator-name-redeclaration-attempt-with-async-generator.js"><reason></reason></test> @@ -7876,6 +7634,18 @@ <test id="language/global-code/script-decl-var-err.js"><reason></reason></test> <!-- Missing test262 support in JerryScript REPL - missing $262 object --> + <!-- No longer valid tests: since ECMAScript v11 GetIterator operator should be performed + before accessing "resolve" property + --> + <test id="built-ins/Promise/all/invoke-resolve-get-error.js"><reason></reason></test> + <test id="built-ins/Promise/all/resolve-non-callable.js"><reason></reason></test> + <test id="built-ins/Promise/allSettled/invoke-resolve-get-error.js"><reason></reason></test> + <test id="built-ins/Promise/allSettled/resolve-non-callable.js"><reason></reason></test> + <test id="built-ins/Promise/any/invoke-resolve-get-error.js"><reason></reason></test> + <test id="built-ins/Promise/any/resolve-non-callable.js"><reason></reason></test> + <test id="built-ins/Promise/race/invoke-resolve-get-error.js"><reason></reason></test> + <test id="built-ins/Promise/race/resolve-non-callable.js"><reason></reason></test> + <!-- Missing test262 support in JerryScript REPL - missing $262.detachArrayBuffer function https://github.com/tc39/test262/blob/main/INTERPRETING.md#host-defined-functions --> @@ -7886,4 +7656,9 @@ <test id="built-ins/Atomics/waitAsync/bigint/null-bufferdata-throws.js"><reason></reason></test> <test id="built-ins/Atomics/waitAsync/null-bufferdata-throws.js"><reason></reason></test> <!-- END - Missing test262 support in JerryScript REPL - missing $262.detachArrayBuffer function --> + + <!-- Missing $test262.IsHTMLDDA support + --> + <test id="annexB/language/statements/for-await-of/iterator-close-return-emulates-undefined-throws-when-called.js"><reason></reason></test> + <!-- END - Missing $test262.IsHTMLDDA support --> </excludeList> |