From: Dmitry Volyntsev Date: Thu, 11 Jul 2019 18:29:59 +0000 (+0300) Subject: Fixed Array.prototype.lastIndexOf() with undefined arguments. X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=80357a1ef1fab638e4accfd6a073b6c1d91d786d;p=njs.git Fixed Array.prototype.lastIndexOf() with undefined arguments. --- diff --git a/njs/njs_array.c b/njs/njs_array.c index 99b18749..b86bd78a 100644 --- a/njs/njs_array.c +++ b/njs/njs_array.c @@ -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]); + n = njs_primitive_value_to_integer(njs_argument(args, 2)); + + } else { + n = length - 1; + } - if (n < 0) { - i = n + length; + if (n >= 0) { + k = nxt_min(n, length - 1); - if (i < 0) { - goto done; - } + } else { + k = n + length; - } else if (n < length) { - i = n; + 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--; + k--; - } while (i >= 0); + } while (k >= 0); done: diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index d5ff6ad0..db497a8c 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -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") },