} njs_test262_wire_t;
-typedef struct {
- njs_opaque_value_t promise;
- njs_opaque_value_t reason;
-} njs_test262_rejected_t;
-
-
typedef enum {
NJS_TEST262_ASYNC_PENDING = 0,
NJS_TEST262_ASYNC_COMPLETE,
typedef struct {
njs_test262_t *ctx;
njs_mp_t *pool;
- njs_arr_t *rejected;
-
/*
* Asynchronous completion is signalled through print(), which is the
* interface INTERPRETING.md defines. A second completion is recorded
}
-/*
- * A promise rejected without a handler is a failure: the assertions of a test
- * can all pass while its asynchronous part throws.
- */
-
-static void
-njs_test262_rejection(njs_vm_t *vm, njs_external_ptr_t external,
- njs_bool_t is_handled, njs_value_t *promise, njs_value_t *reason)
-{
- void *ptr;
- njs_uint_t i;
- njs_test262_run_t *run;
- njs_test262_rejected_t *rejected;
-
- run = external;
-
- if (run->rejected == NULL) {
- return;
- }
-
- rejected = run->rejected->start;
-
- if (is_handled) {
- ptr = njs_value_ptr(promise);
-
- for (i = 0; i < run->rejected->items; i++) {
- if (njs_value_ptr(njs_value_arg(&rejected[i].promise)) == ptr) {
- njs_arr_remove(run->rejected, &rejected[i]);
- break;
- }
- }
-
- return;
- }
-
- rejected = njs_arr_add(run->rejected);
- if (rejected == NULL) {
- return;
- }
-
- njs_value_assign(&rejected->promise, promise);
- njs_value_assign(&rejected->reason, reason);
-}
-
-
/*
* Resolves an import relative to the importing module and keeps the result
* inside the suite tree. A _FIXTURE.js file is not enumerated as a test but
njs_test262_stage_t stage;
njs_test262_source_t *source;
njs_test262_metadata_t meta;
- njs_test262_rejected_t *rejected;
njs_memzero(result, sizeof(njs_test262_result_t));
run->dir.length--;
}
- run->rejected = njs_arr_create(pool, 4, sizeof(njs_test262_rejected_t));
- if (run->rejected == NULL) {
- ret = njs_test262_error(ctx, "memory allocation failed");
- goto done;
- }
-
sources = njs_arr_create(pool, 8, sizeof(njs_test262_source_t));
if (sources == NULL) {
ret = njs_test262_error(ctx, "memory allocation failed");
goto done;
}
- njs_vm_set_rejection_tracker(vm, njs_test262_rejection, run);
njs_vm_set_module_loader(vm, njs_test262_module_loader, run);
ret = njs_test262_bindings(ctx, vm);
}
}
- /*
- * A synchronous test may still have enqueued promise jobs. Draining them
- * keeps a rejected promise from being reported as a pass.
- */
-
for (jobs = 0; jobs < NJS_TEST262_MAX_JOBS; jobs++) {
ret = njs_vm_execute_pending_job(vm);
goto done;
}
- if (run->rejected->items != 0) {
- rejected = run->rejected->start;
-
- result->status = NJS_TEST262_FAIL;
- result->stage = NJS_TEST262_STAGE_JOBS;
-
- if (njs_vm_value_to_string(vm, &test,
- njs_value_arg(&rejected->reason)) == NJS_OK)
- {
- if (test.length > NJS_TEST262_MAX_MESSAGE) {
- test.length = NJS_TEST262_MAX_MESSAGE;
- }
-
- (void) njs_test262_str_printf(ctx, &result->message, "unhandled "
- "promise rejection: %V", &test);
-
- } else {
- result->message = njs_str_value("unhandled promise rejection");
- }
-
- ret = NJS_OK;
- goto done;
- }
-
result->stage = NJS_TEST262_STAGE_NONE;
if (meta.phase != NJS_TEST262_PHASE_NONE) {
built-ins/Promise/all/invoke-resolve-error-reject.js strict
built-ins/Promise/all/invoke-resolve-get-error-reject.js strict
built-ins/Promise/all/invoke-resolve-get-error.js strict
-built-ins/Promise/all/invoke-resolve-get-once-multiple-calls.js strict
built-ins/Promise/all/invoke-resolve-on-promises-every-iteration-of-promise.js strict
built-ins/Promise/all/invoke-resolve-on-values-every-iteration-of-promise.js strict
built-ins/Promise/all/invoke-then-error-close.js strict
built-ins/Promise/prototype/finally/subclass-species-constructor-reject-count.js strict
built-ins/Promise/prototype/finally/subclass-species-constructor-resolve-count.js strict
built-ins/Promise/prototype/finally/this-value-proxy.js strict
-built-ins/Promise/prototype/then/rxn-handler-fulfilled-next-abrupt.js strict
-built-ins/Promise/prototype/then/rxn-handler-rejected-next-abrupt.js strict
built-ins/Promise/race/S25.4.4.3_A2.2_T1.js strict
built-ins/Promise/race/S25.4.4.3_A2.2_T2.js strict
built-ins/Promise/race/S25.4.4.3_A2.2_T3.js strict
built-ins/Promise/race/resolve-throws-iterator-return-is-not-callable.js strict
built-ins/Promise/race/resolve-throws-iterator-return-null-or-undefined.js strict
built-ins/Promise/reject/ctx-non-ctor.js strict
-built-ins/Promise/resolve/arg-uniq-ctor.js strict
built-ins/Promise/resolve/ctx-non-ctor.js strict
built-ins/Promise/withResolvers/promise.js strict
built-ins/Promise/withResolvers/resolvers.js strict
language/expressions/optional-chaining/eval-optional-call.js strict
language/expressions/optional-chaining/iteration-statement-for-await-of.js strict
language/expressions/optional-chaining/iteration-statement-for-of-type-error.js strict
-language/expressions/optional-chaining/member-expression-async-identifier.js strict
language/expressions/optional-chaining/member-expression.js strict
language/expressions/optional-chaining/new-target-optional-call.js strict
language/expressions/optional-chaining/optional-chain-prod-arguments.js strict
language/statements/async-function/early-errors-declaration-arguments-in-formal-parameters.js strict
language/statements/async-function/early-errors-declaration-await-in-formals.js strict
language/statements/async-function/early-errors-declaration-eval-in-formal-parameters.js strict
-language/statements/async-function/evaluation-body.js strict
language/statements/async-function/evaluation-default-that-throws.js strict
language/statements/async-function/evaluation-unmapped-arguments.js strict
language/statements/async-function/rest-param-strict-body.js strict