Skip to content
Permalink
Browse files Browse the repository at this point in the history
Fixed aggregation methods of Promise ctor with array-like object.
Previously, while iterating over an array-like object the methods may be
resolved with INVALID values. INVALID value is a special internal type which
should never be visible by ordinary functions.

The fix is to ensure that absent elements are represented by undefined value.

The following methods were fixed Promise.all(), Promise.allSettled(),
    Promise.any(), Promise.race().

This closes #483 issue on Github.
  • Loading branch information
xeioex committed Apr 26, 2022
1 parent 2e00e95 commit 31ed93a
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
16 changes: 16 additions & 0 deletions src/njs_promise.c
Expand Up @@ -1369,6 +1369,10 @@ njs_promise_perform_all_handler(njs_vm_t *vm, njs_iterator_args_t *args,
njs_promise_all_context_t *context;
njs_promise_iterator_args_t *pargs;

if (!njs_is_valid(value)) {
value = njs_value_arg(&njs_value_undefined);
}

pargs = (njs_promise_iterator_args_t *) args;

capability = pargs->capability;
Expand Down Expand Up @@ -1459,6 +1463,10 @@ njs_promise_perform_all_settled_handler(njs_vm_t *vm, njs_iterator_args_t *args,
njs_promise_all_context_t *context;
njs_promise_iterator_args_t *pargs;

if (!njs_is_valid(value)) {
value = njs_value_arg(&njs_value_undefined);
}

pargs = (njs_promise_iterator_args_t *) args;

capability = pargs->capability;
Expand Down Expand Up @@ -1598,6 +1606,10 @@ njs_promise_perform_any_handler(njs_vm_t *vm, njs_iterator_args_t *args,
njs_promise_all_context_t *context;
njs_promise_iterator_args_t *pargs;

if (!njs_is_valid(value)) {
value = njs_value_arg(&njs_value_undefined);
}

pargs = (njs_promise_iterator_args_t *) args;

capability = pargs->capability;
Expand Down Expand Up @@ -1745,6 +1757,10 @@ njs_promise_perform_race_handler(njs_vm_t *vm, njs_iterator_args_t *args,
njs_promise_capability_t *capability;
njs_promise_iterator_args_t *pargs;

if (!njs_is_valid(value)) {
value = njs_value_arg(&njs_value_undefined);
}

pargs = (njs_promise_iterator_args_t *) args;

ret = njs_function_call(vm, pargs->function, pargs->constructor, value,
Expand Down
7 changes: 7 additions & 0 deletions src/test/njs_unit_test.c
Expand Up @@ -21149,6 +21149,13 @@ static njs_unit_test_t njs_externals_test[] =
"}))"
".then(v => $r.retval(v))"),
njs_str("a:async:pr:async2:pr:r,b:async:pr:async2:pr:r,c:async:pr:async2:pr:r") },

{ njs_str("async function f () {"
" var p = await Promise.race({length:1});"
" for (const v in 'test') { }"
"};"
"f().then(v => $r.retval('done'))"),
njs_str("done") },
};


Expand Down

0 comments on commit 31ed93a

Please sign in to comment.