Skip to content

Commit 31ed93a

Browse files
committed
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.
1 parent 2e00e95 commit 31ed93a

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

Diff for: src/njs_promise.c

+16
Original file line numberDiff line numberDiff line change
@@ -1369,6 +1369,10 @@ njs_promise_perform_all_handler(njs_vm_t *vm, njs_iterator_args_t *args,
13691369
njs_promise_all_context_t *context;
13701370
njs_promise_iterator_args_t *pargs;
13711371

1372+
if (!njs_is_valid(value)) {
1373+
value = njs_value_arg(&njs_value_undefined);
1374+
}
1375+
13721376
pargs = (njs_promise_iterator_args_t *) args;
13731377

13741378
capability = pargs->capability;
@@ -1459,6 +1463,10 @@ njs_promise_perform_all_settled_handler(njs_vm_t *vm, njs_iterator_args_t *args,
14591463
njs_promise_all_context_t *context;
14601464
njs_promise_iterator_args_t *pargs;
14611465

1466+
if (!njs_is_valid(value)) {
1467+
value = njs_value_arg(&njs_value_undefined);
1468+
}
1469+
14621470
pargs = (njs_promise_iterator_args_t *) args;
14631471

14641472
capability = pargs->capability;
@@ -1598,6 +1606,10 @@ njs_promise_perform_any_handler(njs_vm_t *vm, njs_iterator_args_t *args,
15981606
njs_promise_all_context_t *context;
15991607
njs_promise_iterator_args_t *pargs;
16001608

1609+
if (!njs_is_valid(value)) {
1610+
value = njs_value_arg(&njs_value_undefined);
1611+
}
1612+
16011613
pargs = (njs_promise_iterator_args_t *) args;
16021614

16031615
capability = pargs->capability;
@@ -1745,6 +1757,10 @@ njs_promise_perform_race_handler(njs_vm_t *vm, njs_iterator_args_t *args,
17451757
njs_promise_capability_t *capability;
17461758
njs_promise_iterator_args_t *pargs;
17471759

1760+
if (!njs_is_valid(value)) {
1761+
value = njs_value_arg(&njs_value_undefined);
1762+
}
1763+
17481764
pargs = (njs_promise_iterator_args_t *) args;
17491765

17501766
ret = njs_function_call(vm, pargs->function, pargs->constructor, value,

Diff for: src/test/njs_unit_test.c

+7
Original file line numberDiff line numberDiff line change
@@ -21149,6 +21149,13 @@ static njs_unit_test_t njs_externals_test[] =
2114921149
"}))"
2115021150
".then(v => $r.retval(v))"),
2115121151
njs_str("a:async:pr:async2:pr:r,b:async:pr:async2:pr:r,c:async:pr:async2:pr:r") },
21152+
21153+
{ njs_str("async function f () {"
21154+
" var p = await Promise.race({length:1});"
21155+
" for (const v in 'test') { }"
21156+
"};"
21157+
"f().then(v => $r.retval('done'))"),
21158+
njs_str("done") },
2115221159
};
2115321160

2115421161

0 commit comments

Comments
 (0)