Implement CreateAsyncFromSyncIterator (#4802)

JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik robert.fancsik@h-lab.eu
This commit is contained in:
Robert Fancsik
2021-10-28 12:45:47 +02:00
committed by GitHub
parent dd77ec914a
commit d2388e907f
24 changed files with 1015 additions and 418 deletions
+2
View File
@@ -160,6 +160,7 @@ set(SOURCE_CORE_FILES
ecma/builtin-objects/ecma-builtin-array.c ecma/builtin-objects/ecma-builtin-array.c
ecma/builtin-objects/ecma-builtin-arraybuffer-prototype.c ecma/builtin-objects/ecma-builtin-arraybuffer-prototype.c
ecma/builtin-objects/ecma-builtin-arraybuffer.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-prototype.c
ecma/builtin-objects/ecma-builtin-async-function.c ecma/builtin-objects/ecma-builtin-async-function.c
ecma/builtin-objects/ecma-builtin-async-generator-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-array.inc.h
ecma/builtin-objects/ecma-builtin-arraybuffer-prototype.inc.h ecma/builtin-objects/ecma-builtin-arraybuffer-prototype.inc.h
ecma/builtin-objects/ecma-builtin-arraybuffer.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-prototype.inc.h
ecma/builtin-objects/ecma-builtin-async-function.inc.h ecma/builtin-objects/ecma-builtin-async-function.inc.h
ecma/builtin-objects/ecma-builtin-async-generator-function.inc.h ecma/builtin-objects/ecma-builtin-async-generator-function.inc.h
+1
View File
@@ -1542,6 +1542,7 @@ static const uint8_t jerry_class_object_type[] =
#if JERRY_ESNEXT #if JERRY_ESNEXT
JERRY_OBJECT_TYPE_PROMISE, /**< type of ECMA_OBJECT_CLASS_PROMISE */ 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_PROMISE_CAPABILITY */
JERRY_OBJECT_TYPE_GENERIC, /**< type of ECMA_OBJECT_CLASS_ASYNC_FROM_SYNC_ITERATOR */
#endif /* JERRY_ESNEXT */ #endif /* JERRY_ESNEXT */
#if JERRY_BUILTIN_DATAVIEW #if JERRY_BUILTIN_DATAVIEW
JERRY_OBJECT_TYPE_DATAVIEW, /**< type of ECMA_OBJECT_CLASS_DATAVIEW */ JERRY_OBJECT_TYPE_DATAVIEW, /**< type of ECMA_OBJECT_CLASS_DATAVIEW */
+5
View File
@@ -129,6 +129,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"; 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 * Error message, argument is not a Proxy object
*/ */
+1
View File
@@ -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_cannot_convert_to_object;
extern const char * const ecma_error_class_is_non_configurable; extern const char * const ecma_error_class_is_non_configurable;
extern const char * const ecma_error_argument_is_not_an_object; 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_argument_is_not_a_proxy;
extern const char * const ecma_error_target_is_not_a_constructor; extern const char * const ecma_error_target_is_not_a_constructor;
extern const char * const ecma_error_argument_is_not_an_regexp; extern const char * const ecma_error_argument_is_not_an_regexp;
+26
View File
@@ -1013,6 +1013,19 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
} }
break; 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_ARRAY_ITERATOR:
case ECMA_OBJECT_CLASS_SET_ITERATOR: case ECMA_OBJECT_CLASS_SET_ITERATOR:
case ECMA_OBJECT_CLASS_MAP_ITERATOR: case ECMA_OBJECT_CLASS_MAP_ITERATOR:
@@ -1208,6 +1221,10 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
} }
break; break;
} }
case ECMA_NATIVE_HANDLER_ASYNC_FROM_SYNC_ITERATOR_UNWRAP:
{
break;
}
default: default:
{ {
JERRY_UNREACHABLE (); 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); ext_object_size = sizeof (ecma_promise_capabality_t);
break; break;
} }
case ECMA_OBJECT_CLASS_ASYNC_FROM_SYNC_ITERATOR:
{
ext_object_size = sizeof (ecma_async_from_sync_iterator_object_t);
break;
}
#endif /* JERRY_ESNEXT */ #endif /* JERRY_ESNEXT */
#if JERRY_MODULE_SYSTEM #if JERRY_MODULE_SYSTEM
case ECMA_OBJECT_CLASS_MODULE: 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); ext_object_size = sizeof (ecma_promise_value_thunk_t);
break; break;
} }
case ECMA_NATIVE_HANDLER_ASYNC_FROM_SYNC_ITERATOR_UNWRAP:
{
break;
}
default: default:
{ {
JERRY_UNREACHABLE (); JERRY_UNREACHABLE ();
+10
View File
@@ -772,6 +772,7 @@ typedef enum
#if JERRY_ESNEXT #if JERRY_ESNEXT
ECMA_OBJECT_CLASS_PROMISE, /**< Promise (ECMAScript v6, 25.4) */ 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_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 */ #endif /* JERRY_ESNEXT */
#if JERRY_BUILTIN_DATAVIEW #if JERRY_BUILTIN_DATAVIEW
ECMA_OBJECT_CLASS_DATAVIEW, /**< DataView (ECMAScript v6, 24.2) */ 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 head; /**< points to the async generator task queue head item */
ecma_value_t iterated_value; /**< for %Iterator%: [[IteratedObject]] property */ ecma_value_t iterated_value; /**< for %Iterator%: [[IteratedObject]] property */
ecma_value_t promise; /**< PromiseCapability[[Promise]] internal slot */ 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 */ ecma_value_t spread_value; /**< for spread object: spreaded element */
int32_t tza; /**< TimeZone adjustment for date objects */ int32_t tza; /**< TimeZone adjustment for date objects */
#endif /* JERRY_ESNEXT */ #endif /* JERRY_ESNEXT */
@@ -2507,6 +2509,14 @@ typedef enum
ECMA_CONSTRUCTOR_FUNCTION_HAS_HERITAGE = (1 << 0), /**< heritage object is present */ ECMA_CONSTRUCTOR_FUNCTION_HAS_HERITAGE = (1 << 0), /**< heritage object is present */
} ecma_constructor_function_flags_t; } 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 */ #endif /* JERRY_ESNEXT */
/** /**
@@ -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 */
@@ -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"
@@ -19,6 +19,7 @@
#include "ecma-builtin-handlers.h" #include "ecma-builtin-handlers.h"
#include "ecma-promise-object.h" #include "ecma-promise-object.h"
#include "ecma-iterator-object.h"
static const ecma_builtin_handler_t ecma_native_handlers[] = static const ecma_builtin_handler_t ecma_native_handlers[] =
{ {
@@ -44,7 +44,7 @@ typedef enum
/** /**
* Shift for Promise helper handler function. * 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_t
ecma_builtin_handler_get (ecma_native_handler_id_t id); ecma_builtin_handler_get (ecma_native_handler_id_t id);
@@ -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_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_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_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 #if JERRY_BUILTIN_PROXY
ECMA_NATIVE_HANDLER (ECMA_NATIVE_HANDLER_PROXY_REVOKE, ecma_proxy_revoke_cb, 0) ECMA_NATIVE_HANDLER (ECMA_NATIVE_HANDLER_PROXY_REVOKE, ecma_proxy_revoke_cb, 0)
#endif /* JERRY_BUILTIN_PROXY */ #endif /* JERRY_BUILTIN_PROXY */
@@ -65,45 +65,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. * Runtime Semantics: PerformPromiseRace.
* *
@@ -118,7 +79,6 @@ ecma_builtin_promise_perform_race (ecma_value_t iterator, /**< the iterator for
ecma_value_t next_method, /**< next method */ ecma_value_t next_method, /**< next method */
ecma_object_t *capability_obj_p, /**< PromiseCapability record */ ecma_object_t *capability_obj_p, /**< PromiseCapability record */
ecma_value_t ctor, /**< Constructor value */ ecma_value_t ctor, /**< Constructor value */
ecma_value_t resolve, /** the resolve of Promise.all */
bool *done_p) /**< [out] iteratorRecord[[done]] */ bool *done_p) /**< [out] iteratorRecord[[done]] */
{ {
JERRY_ASSERT (ecma_is_value_object (iterator)); 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_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_object_t *resolve_func_p = ecma_get_object_from_value (resolve);
ecma_value_t ret_value = ECMA_VALUE_ERROR; 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:
*done_p = true; *done_p = true;
exit: exit:
ecma_deref_object (resolve_func_p);
return ret_value; return ret_value;
} /* ecma_builtin_promise_perform_race */ } /* 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_value_t next_method, /**< next method */
ecma_object_t *capability_obj_p, /**< PromiseCapability record */ ecma_object_t *capability_obj_p, /**< PromiseCapability record */
ecma_value_t ctor, /**< the caller of Promise.all */ 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 */ uint8_t builtin_routine_id, /**< built-in wide routine identifier */
bool *done_p) /**< [out] iteratorRecord[[done]] */ 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_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_object_t *resolve_func_p = ecma_get_object_from_value (resolve);
/* 3. */ /* 3. */
@@ -321,11 +310,11 @@ ecma_builtin_promise_perform (ecma_value_t iterator, /**< iteratorRecord */
/* p. */ /* p. */
executor_p->remaining_elements = remaining; 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) 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; 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) 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) 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, ecma_object_t *reject_func_p = ecma_op_create_native_handler (ECMA_NATIVE_HANDLER_PROMISE_ALL_HELPER,
@@ -390,6 +379,8 @@ done:
exit: exit:
ecma_free_value (remaining); ecma_free_value (remaining);
ecma_deref_object (values_array_obj_p); ecma_deref_object (values_array_obj_p);
ecma_deref_object (resolve_func_p);
return ret_value; return ret_value;
} /* ecma_builtin_promise_perform */ } /* ecma_builtin_promise_perform */
@@ -411,41 +402,22 @@ ecma_builtin_promise_helper (ecma_value_t this_arg, /**< 'this' argument */
return ECMA_VALUE_ERROR; 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 next_method;
ecma_value_t iterator = ecma_op_get_iterator (iterable, ECMA_VALUE_SYNC_ITERATOR, &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); ecma_deref_object (capability_obj_p);
return iterator; return iterator;
} }
ecma_value_t ret = ECMA_VALUE_EMPTY;
bool is_done = false; bool is_done = false;
if (builtin_routine_id == ECMA_PROMISE_ROUTINE_RACE) 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 else
{ {
@@ -453,7 +425,6 @@ ecma_builtin_promise_helper (ecma_value_t this_arg, /**< 'this' argument */
next_method, next_method,
capability_obj_p, capability_obj_p,
this_arg, this_arg,
resolve,
builtin_routine_id, builtin_routine_id,
&is_done); &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_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 (iterator);
ecma_free_value (next_method); ecma_free_value (next_method);
ecma_free_value (resolve);
ecma_deref_object (capability_obj_p); ecma_deref_object (capability_obj_p);
return ret; return ret;
@@ -701,6 +701,13 @@ BUILTIN (ECMA_BUILTIN_ID_ASYNC_ITERATOR_PROTOTYPE,
true, true,
async_iterator_prototype) 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 */ /* The %(GeneratorFunction)% object */
BUILTIN_ROUTINE (ECMA_BUILTIN_ID_GENERATOR_FUNCTION, BUILTIN_ROUTINE (ECMA_BUILTIN_ID_GENERATOR_FUNCTION,
ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION, ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION,
@@ -202,16 +202,49 @@ ecma_op_get_iterator (ecma_value_t value, /**< value to get iterator from */
return method; return method;
} }
} }
/* 3.a */
else if (method == ECMA_VALUE_ASYNC_ITERATOR) else if (method == ECMA_VALUE_ASYNC_ITERATOR)
{ {
/* TODO: CreateAsyncFromSyncIterator should be supported. */
use_default_method = true; use_default_method = true;
/* 3.a.i */
method = ecma_op_get_method_by_symbol_id (value, LIT_GLOBAL_SYMBOL_ASYNC_ITERATOR); method = ecma_op_get_method_by_symbol_id (value, LIT_GLOBAL_SYMBOL_ASYNC_ITERATOR);
if (ECMA_IS_VALUE_ERROR (method)) if (ECMA_IS_VALUE_ERROR (method))
{ {
return 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. */ /* 3. */
@@ -396,6 +429,35 @@ ecma_op_iterator_throw (ecma_value_t iterator, /**< iterator value */
return result; return result;
} /* ecma_op_iterator_throw */ } /* 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 * IteratorValue operation
* *
@@ -623,6 +685,66 @@ ecma_op_iterator_do (ecma_iterator_command_type_t command, /**< command to be ex
return result; return result;
} /* ecma_op_iterator_do */ } /* 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 */ #endif /* JERRY_ESNEXT */
/** /**
@@ -58,6 +58,9 @@ ecma_create_array_from_iter_element (ecma_value_t value, ecma_value_t index_valu
ecma_value_t ecma_value_t
ecma_op_get_iterator (ecma_value_t value, ecma_value_t method, ecma_value_t *next_method_p); 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_value_t
ecma_op_iterator_value (ecma_value_t iter_result); ecma_op_iterator_value (ecma_value_t iter_result);
@@ -74,6 +77,15 @@ ecma_value_t
ecma_op_iterator_do (ecma_iterator_command_type_t command, ecma_value_t iterator, 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 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 */ #endif /* JERRY_ESNEXT */
/** /**
@@ -2937,6 +2937,7 @@ static const uint16_t ecma_class_object_magic_string_id[] =
#if JERRY_ESNEXT #if JERRY_ESNEXT
LIT_MAGIC_STRING_PROMISE_UL, /**< magic string id of ECMA_OBJECT_CLASS_PROMISE */ 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_PROMISE_CAPABILITY */
LIT_MAGIC_STRING_OBJECT_UL, /**< magic string id of ECMA_OBJECT_CLASS_ASYNC_FROM_SYNC_ITERATOR */
#endif /* JERRY_ESNEXT */ #endif /* JERRY_ESNEXT */
#if JERRY_BUILTIN_DATAVIEW #if JERRY_BUILTIN_DATAVIEW
LIT_MAGIC_STRING_DATAVIEW_UL, /**< magic string id of ECMA_OBJECT_CLASS_DATAVIEW */ LIT_MAGIC_STRING_DATAVIEW_UL, /**< magic string id of ECMA_OBJECT_CLASS_DATAVIEW */
+140 -99
View File
@@ -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; 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; 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. */ /* 1 - 2. */
if (executor_p->index == 0) if (executor_p->index == 0)
@@ -894,103 +894,6 @@ ecma_promise_reject_or_resolve (ecma_value_t this_arg, /**< "this" argument */
return promise; return promise;
} /* ecma_promise_reject_or_resolve */ } /* 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 * The common function for ecma_builtin_promise_prototype_then
* and ecma_builtin_promise_prototype_catch. * 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; 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); ecma_deref_object (result_capability_obj_p);
return ret; return ret;
@@ -1326,6 +1229,144 @@ ecma_promise_async_await (ecma_extended_object_t *async_generator_object_p, /**<
return ECMA_VALUE_UNDEFINED; return ECMA_VALUE_UNDEFINED;
} /* ecma_promise_async_await */ } /* 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 */
/** /**
* @} * @}
* @} * @}
@@ -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); 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_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_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); 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);
/** /**
* @} * @}
* @} * @}
@@ -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();
}
+1 -1
View File
@@ -78,7 +78,7 @@ rejects.catch(result => { assert (result === "baz"); });
var closed = true; var closed = true;
delete Promise.resolve; delete Promise.resolve;
Promise.all(createIterable([1,2,3], {'return': function () { closed = false; }})); Promise.all(createIterable([1,2,3], {'return': function () { closed = false; }}));
assert (closed); assert (!closed);
var arr = []; var arr = [];
Object.defineProperty(arr, Symbol.species, { get: function () { assert(false) }}); Object.defineProperty(arr, Symbol.species, { get: function () { assert(false) }});
+1 -1
View File
@@ -100,7 +100,7 @@ rejects.then(result => {
var closed = true; var closed = true;
delete Promise.resolve; delete Promise.resolve;
Promise.allSettled(createIterable([1,2,3], {'return': function () { closed = false; }})); Promise.allSettled(createIterable([1,2,3], {'return': function () { closed = false; }}));
assert (closed); assert (!closed);
var arr = []; var arr = [];
Object.defineProperty(arr, Symbol.species, { get: function () { assert(false) }}); Object.defineProperty(arr, Symbol.species, { get: function () { assert(false) }});
+1 -1
View File
@@ -82,7 +82,7 @@ rejects.catch(result => { assert (result == "AggregateError"); });
var closed = true; var closed = true;
delete Promise.resolve; delete Promise.resolve;
Promise.any(createIterable([1,2,3], {'return': function () { closed = false; }})); Promise.any(createIterable([1,2,3], {'return': function () { closed = false; }}));
assert (closed); assert (!closed);
var arr = []; var arr = [];
Object.defineProperty(arr, Symbol.species, { get: function () { assert(false) }}); Object.defineProperty(arr, Symbol.species, { get: function () { assert(false) }});
+1 -1
View File
@@ -66,7 +66,7 @@ rejects.catch(result => { assert (result === "baz"); });
var closed = true; var closed = true;
delete Promise.resolve; delete Promise.resolve;
Promise.race(createIterable([1,2,3], {'return': function () { closed = false; }})); Promise.race(createIterable([1,2,3], {'return': function () { closed = false; }}));
assert (closed); assert (!closed);
var arr = []; var arr = [];
Object.defineProperty(arr, Symbol.species, { get: function () { assert(false) }}); Object.defineProperty(arr, Symbol.species, { get: function () { assert(false) }});
+17 -242
View File
@@ -6476,31 +6476,6 @@
features: [async-iteration] features: [async-iteration]
https://github.com/tc39/proposal-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-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/AsyncGeneratorFunction/instance-yield-expr-in-param.js"><reason></reason></test>
<test id="built-ins/AsyncGeneratorPrototype/next/request-queue-await-order.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-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-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-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-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-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-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-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-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-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-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/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/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-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-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-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-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-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-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-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-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> <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-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-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-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-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-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-func-expression.js"><reason></reason></test>
<test id="language/module-code/top-level-await/syntax/for-await-await-expr-identifier.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/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-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-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-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-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-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-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-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-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-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-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-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-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-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> <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-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/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/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-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/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-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-function.js"><reason></reason></test>
<test id="language/statements/switch/syntax/redeclaration/async-generator-name-redeclaration-attempt-with-async-generator.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> <test id="language/global-code/script-decl-var-err.js"><reason></reason></test>
<!-- Missing test262 support in JerryScript REPL - missing $262 object --> <!-- 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 <!-- Missing test262 support in JerryScript REPL - missing $262.detachArrayBuffer function
https://github.com/tc39/test262/blob/main/INTERPRETING.md#host-defined-functions 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/bigint/null-bufferdata-throws.js"><reason></reason></test>
<test id="built-ins/Atomics/waitAsync/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 --> <!-- 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> </excludeList>