]> git.kaiwu.me - njs.git/commitdiff
Fixed Array.prototype.lastIndexOf() with undefined arguments.
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 11 Jul 2019 18:29:59 +0000 (21:29 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 11 Jul 2019 18:29:59 +0000 (21:29 +0300)
njs/njs_array.c
njs/test/njs_unit_test.c

index 99b187491b33e8a274a0283074763e41c52c96f4..b86bd78a97d65d78b585d924069f63d6e529ef9d 100644 (file)
@@ -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:
 
index d5ff6ad006b932208a05768dd808ee8e17a00132..db497a8cef9d8ff450c15ce8e08f56dc4b749c7a 100644 (file)
@@ -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") },