details: https://hg.nginx.org/njs/rev/71e6a00bd921 branches: changeset: 1042:71e6a00bd921 user: Dmitry Volyntsev <xei...@nginx.com> date: Thu Jul 11 21:29:59 2019 +0300 description: Fixed Array.prototype.lastIndexOf() with undefined arguments.
diffstat: njs/njs_array.c | 52 +++++++++++++++++++++++++---------------------- njs/test/njs_unit_test.c | 15 +++++++++++++ 2 files changed, 43 insertions(+), 24 deletions(-) diffs (116 lines): diff -r ea18aa7693da -r 71e6a00bd921 njs/njs_array.c --- a/njs/njs_array.c Thu Jul 11 16:10:33 2019 +0300 +++ b/njs/njs_array.c Thu Jul 11 21:29:59 2019 +0300 @@ -1280,52 +1280,56 @@ static njs_ret_t njs_array_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { - nxt_int_t i, n, index, length; - njs_value_t *value, *start; - njs_array_t *array; + nxt_int_t k, n, index, length; + njs_value_t *start; + njs_array_t *array; + const njs_value_t *this, *value; index = -1; - if (nargs < 2 || !njs_is_array(&args[0])) { + this = njs_arg(args, nargs, 0); + + if (!njs_is_array(this)) { goto done; } - array = njs_array(&args[0]); + array = njs_array(this); length = array->length; if (length == 0) { goto done; } - i = length - 1; - if (nargs > 2) { - n = njs_number(&args[2]); - - if (n < 0) { - i = n + length; - - if (i < 0) { - goto done; - } - - } else if (n < length) { - i = n; + n = njs_primitive_value_to_integer(njs_argument(args, 2)); + + } else { + n = length - 1; + } + + if (n >= 0) { + k = nxt_min(n, length - 1); + + } else { + k = n + length; + + if (k < 0) { + goto done; } } - value = &args[1]; + value = njs_arg(args, nargs, 1); start = array->start; do { - if (njs_values_strict_equal(value, &start[i])) { - index = i; + if (njs_values_strict_equal(value, &start[k])) { + index = k; break; } - i--; - - } while (i >= 0); + k--; + + } while (k >= 0); done: diff -r ea18aa7693da -r 71e6a00bd921 njs/test/njs_unit_test.c --- a/njs/test/njs_unit_test.c Thu Jul 11 16:10:33 2019 +0300 +++ b/njs/test/njs_unit_test.c Thu Jul 11 21:29:59 2019 +0300 @@ -3810,6 +3810,12 @@ static njs_unit_test_t njs_test[] = { nxt_string("[].lastIndexOf(1, -1)"), nxt_string("-1") }, + { nxt_string("[undefined].lastIndexOf()"), + nxt_string("0") }, + + { nxt_string("[undefined].lastIndexOf(undefined)"), + nxt_string("0") }, + { nxt_string("var a = [1,2,3,4]; a.lastIndexOf()"), nxt_string("-1") }, @@ -3837,6 +3843,15 @@ static njs_unit_test_t njs_test[] = { nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(3, -10)"), nxt_string("-1") }, + { nxt_string("[1,2,1].lastIndexOf(2,undefined)"), + nxt_string("-1") }, + + { nxt_string("[1,2,1].lastIndexOf(1,undefined)"), + nxt_string("0") }, + + { nxt_string("[1,2,1].lastIndexOf(1)"), + nxt_string("2") }, + { nxt_string("[1,2,3,4].includes()"), nxt_string("false") }, _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel