From abdc8cd24f47014958b55004eaeae8a5d9c93ca7 Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Wed, 29 Jun 2016 13:38:20 +0300 Subject: [PATCH] Array.reverse() method. --- njs/njs_array.c | 40 ++++++++++++++++++++++++++++++++++++++++ njs/test/njs_unit_test.c | 18 ++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/njs/njs_array.c b/njs/njs_array.c index 9c154667..9d61bb4b 100644 --- a/njs/njs_array.c +++ b/njs/njs_array.c @@ -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"), diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 0c2b9a93..448b4bea 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -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()"), -- 2.47.3