details: https://hg.nginx.org/njs/rev/744122b4dccf
branches:
changeset: 1841:744122b4dccf
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Tue Apr 26 16:07:02 2022 -0700
description:
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.
diffstat:
src/njs_promise.c | 16 ++++++++++++++++
src/test/njs_unit_test.c | 7 +++++++
2 files changed, 23 insertions(+), 0 deletions(-)
diffs (64 lines):
diff -r 3fec53d722ef -r 744122b4dccf src/njs_promise.c
--- a/src/njs_promise.c Fri Apr 22 17:02:36 2022 -0700
+++ b/src/njs_promise.c Tue Apr 26 16:07:02 2022 -0700
@@ -1369,6 +1369,10 @@ njs_promise_perform_all_handler(njs_vm_t
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;
@@ -1459,6 +1463,10 @@ njs_promise_perform_all_settled_handler(
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;
@@ -1598,6 +1606,10 @@ njs_promise_perform_any_handler(njs_vm_t
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;
@@ -1745,6 +1757,10 @@ njs_promise_perform_race_handler(njs_vm_
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,
diff -r 3fec53d722ef -r 744122b4dccf src/test/njs_unit_test.c
--- a/src/test/njs_unit_test.c Fri Apr 22 17:02:36 2022 -0700
+++ b/src/test/njs_unit_test.c Tue Apr 26 16:07:02 2022 -0700
@@ -21149,6 +21149,13 @@ static njs_unit_test_t njs_externals_te
"}))"
".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") },
};
_______________________________________________
nginx-devel mailing list -- nginx-devel@nginx.org
To unsubscribe send an email to nginx-devel-leave@nginx.org