]> git.kaiwu.me - njs.git/commitdiff
Array.reverse() method.
authorIgor Sysoev <igor@sysoev.ru>
Wed, 29 Jun 2016 10:38:20 +0000 (13:38 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Wed, 29 Jun 2016 10:38:20 +0000 (13:38 +0300)
njs/njs_array.c
njs/test/njs_unit_test.c

index 9c154667d0d8bbbbcd6afc86dad63c62c50bbb01..9d61bb4b0fd788ef5dbb4fb44c915340cfdba5f3 100644 (file)
@@ -464,6 +464,39 @@ njs_array_prototype_shift(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 }
 
 
+static njs_ret_t
+njs_array_prototype_reverse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+    njs_index_t unused)
+{
+    nxt_uint_t   i, n, length;
+    njs_value_t  value;
+    njs_array_t  *array;
+
+    if (njs_is_array(&args[0])) {
+        array = args[0].data.u.array;
+        length = array->length;
+
+        if (length > 1) {
+            for (i = 0, n = length - 1; i < n; i++, n--) {
+                value = array->start[i];
+                array->start[i] = array->start[n];
+                array->start[n] = value;
+            }
+        }
+
+        vm->retval.data.u.array = array;
+        vm->retval.type = NJS_ARRAY;
+        vm->retval.data.truth = 1;
+
+    } else {
+        /* STUB */
+        vm->retval = args[0];
+    }
+
+    return NXT_OK;
+}
+
+
 /*
  * ECMAScript 5.1: try first to use object method "join", then
  * use the standard built-in method Object.prototype.toString().
@@ -969,6 +1002,13 @@ static const njs_object_prop_t  njs_array_prototype_properties[] =
         .value = njs_native_function(njs_array_prototype_shift, 0, 0),
     },
 
+    {
+        .type = NJS_METHOD,
+        .name = njs_string("reverse"),
+        .value = njs_native_function(njs_array_prototype_reverse, 0,
+                    NJS_OBJECT_ARG),
+    },
+
     {
         .type = NJS_METHOD,
         .name = njs_string("toString"),
index 0c2b9a939923810886aa95500dc61a4d96240b3a..448b4bea3c0f8f3548e307c688b8442202d872a9 100644 (file)
@@ -2186,6 +2186,21 @@ static njs_unit_test_t  njs_test[] =
                  "len +' '+ a +' '+ a.shift()"),
       nxt_string("5 3,4,5,1,2 3") },
 
+    { nxt_string("var a = []; a.reverse()"),
+      nxt_string("") },
+
+    { nxt_string("var a = [1]; a.reverse()"),
+      nxt_string("1") },
+
+    { nxt_string("var a = [1,2]; a.reverse()"),
+      nxt_string("2,1") },
+
+    { nxt_string("var a = [1,2,3]; a.reverse()"),
+      nxt_string("3,2,1") },
+
+    { nxt_string("var a = [1,2,3,4]; a.reverse()"),
+      nxt_string("4,3,2,1") },
+
     { nxt_string("var a = []; var s = { sum: 0 };"
                  "a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
       nxt_string("0") },
@@ -2966,6 +2981,9 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("'abc'.split(/abc/)"),
       nxt_string(",") },
 
+    { nxt_string("'0123456789'.split('').reverse().join('')"),
+      nxt_string("9876543210") },
+
     /* Functions. */
 
     { nxt_string("function f() { } f()"),