Welcome! Log In Create A New Profile

Advanced

[njs] Fixed Array.prototype.concat() when "this" is a slow array.

Dmitry Volyntsev
February 21, 2022 11:58AM
details: https://hg.nginx.org/njs/rev/5064e36ad7b9
branches:
changeset: 1829:5064e36ad7b9
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Mon Feb 21 16:52:47 2022 +0000
description:
Fixed Array.prototype.concat() when "this" is a slow array.

Previously, when the current appended element is fast array the "this"
array was expected to always be a fast array also. This may not be the
case when the previous appended element was not fast thus converting
the "this" array to a slow form.

Previous fix introduced in 2c1382bab643 (0.7.2) was not complete, the
correct fix is to never assume "this" is fast, whereas njs_array_add()
may only be called with fast arrays.

This closes #471 issue in Github.

diffstat:

src/njs_array.c | 9 ++++++---
src/test/njs_unit_test.c | 5 +++++
2 files changed, 11 insertions(+), 3 deletions(-)

diffs (41 lines):

diff -r 77c398f26d7e -r 5064e36ad7b9 src/njs_array.c
--- a/src/njs_array.c Mon Feb 21 14:49:38 2022 +0000
+++ b/src/njs_array.c Mon Feb 21 16:52:47 2022 +0000
@@ -364,6 +364,8 @@ njs_array_expand(njs_vm_t *vm, njs_array
uint64_t size;
njs_value_t *start, *old;

+ njs_assert(array->object.fast_array);
+
free_before = array->start - array->data;
free_after = array->size - array->length - free_before;

@@ -1754,9 +1756,10 @@ njs_array_prototype_concat(njs_vm_t *vm,
njs_set_invalid(&retval);
}

- ret = njs_array_add(vm, array, &retval);
- if (njs_slow_path(ret != NJS_OK)) {
- return NJS_ERROR;
+ ret = njs_value_property_i64_set(vm, &this, length,
+ &retval);
+ if (njs_slow_path(ret == NJS_ERROR)) {
+ return ret;
}
}

diff -r 77c398f26d7e -r 5064e36ad7b9 src/test/njs_unit_test.c
--- a/src/test/njs_unit_test.c Mon Feb 21 14:49:38 2022 +0000
+++ b/src/test/njs_unit_test.c Mon Feb 21 16:52:47 2022 +0000
@@ -4253,6 +4253,11 @@ static njs_unit_test_t njs_test[] =
"njs.dump([a[0], a[33],a.length])"),
njs_str("[1,1,65]") },

+ { njs_str("var a = [1]; a[1111111] = 2;"
+ "var a2 = [3].concat(a, [4]);"
+ "njs.dump(a2)"),
+ njs_str("[3,1,<1111110 empty items>,2,4]") },
+
{ njs_str("var re = /abc/; re[Symbol.isConcatSpreadable] = true;"
"re[0] = 1, re[1] = 2, re[2] = 3, re.length = 3;"
"[].concat(re)"),
_______________________________________________
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 Array.prototype.concat() when "this" is a slow array.

Dmitry Volyntsev 423 February 21, 2022 11:58AM



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

Online Users

Guests: 84
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