Welcome! Log In Create A New Profile

Advanced

[njs] Fixed aggregation methods of Promise ctor with array-like object.

Dmitry Volyntsev
April 26, 2022 07:12PM
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
Subject Author Views Posted

[njs] Fixed aggregation methods of Promise ctor with array-like object.

Dmitry Volyntsev 366 April 26, 2022 07:12PM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 71
Record Number of Users: 6 on February 13, 2018
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready