[njs] Array.reverse() method.
Igor Sysoev
igor at sysoev.ru
Tue Jul 5 13:12:42 UTC 2016
details: http://hg.nginx.org/njs/rev/ef2b708510b1
branches:
changeset: 115:ef2b708510b1
user: Igor Sysoev <igor at sysoev.ru>
date: Wed Jun 29 13:38:20 2016 +0300
description:
Array.reverse() method.
diffstat:
njs/njs_array.c | 40 ++++++++++++++++++++++++++++++++++++++++
njs/test/njs_unit_test.c | 18 ++++++++++++++++++
2 files changed, 58 insertions(+), 0 deletions(-)
diffs (92 lines):
diff -r 41404eee5063 -r ef2b708510b1 njs/njs_array.c
--- a/njs/njs_array.c Tue Jun 28 19:28:00 2016 +0300
+++ b/njs/njs_array.c Wed Jun 29 13:38:20 2016 +0300
@@ -464,6 +464,39 @@ njs_array_prototype_shift(njs_vm_t *vm,
}
+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().
@@ -971,6 +1004,13 @@ static const njs_object_prop_t njs_arra
{
.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"),
.value = njs_native_function(njs_array_prototype_to_string,
NJS_CONTINUATION_SIZE, 0),
diff -r 41404eee5063 -r ef2b708510b1 njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c Tue Jun 28 19:28:00 2016 +0300
+++ b/njs/test/njs_unit_test.c Wed Jun 29 13:38:20 2016 +0300
@@ -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()"),
More information about the nginx-devel
mailing list