[njs] Array.prototypes.includes() method.
Igor Sysoev
igor at sysoev.ru
Tue Oct 25 15:44:10 UTC 2016
details: http://hg.nginx.org/njs/rev/f21747d5ac83
branches:
changeset: 221:f21747d5ac83
user: Igor Sysoev <igor at sysoev.ru>
date: Tue Oct 25 17:52:18 2016 +0300
description:
Array.prototypes.includes() method.
diffstat:
njs/njs_array.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++
njs/test/njs_unit_test.c | 30 ++++++++++++++++
2 files changed, 115 insertions(+), 0 deletions(-)
diffs (142 lines):
diff -r 76e57071e411 -r f21747d5ac83 njs/njs_array.c
--- a/njs/njs_array.c Mon Oct 24 19:02:31 2016 +0300
+++ b/njs/njs_array.c Tue Oct 25 17:52:18 2016 +0300
@@ -1088,6 +1088,83 @@ done:
static njs_ret_t
+njs_array_prototype_includes(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ nxt_int_t i, length;
+ njs_value_t *value, *start;
+ njs_array_t *array;
+ const njs_value_t *retval;
+
+ retval = &njs_value_false;
+
+ if (nargs < 2 || !njs_is_array(&args[0])) {
+ goto done;
+ }
+
+ array = args[0].data.u.array;
+ length = array->length;
+
+ if (length == 0) {
+ goto done;
+ }
+
+ i = 0;
+
+ if (nargs > 2) {
+ i = args[2].data.u.number;
+
+ if (i >= length) {
+ goto done;
+ }
+
+ if (i < 0) {
+ i += length;
+
+ if (i < 0) {
+ i = 0;
+ }
+ }
+ }
+
+ start = array->start;
+ value = &args[1];
+
+ if (njs_is_number(value) && njs_is_nan(value->data.u.number)) {
+
+ do {
+ value = &start[i];
+
+ if (njs_is_number(value) && njs_is_nan(value->data.u.number)) {
+ retval = &njs_value_true;
+ break;
+ }
+
+ i++;
+
+ } while (i < length);
+
+ } else {
+ do {
+ if (njs_values_strict_equal(value, &start[i])) {
+ retval = &njs_value_true;
+ break;
+ }
+
+ i++;
+
+ } while (i < length);
+ }
+
+done:
+
+ vm->retval = *retval;
+
+ return NXT_OK;
+}
+
+
+static njs_ret_t
njs_array_prototype_for_each(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
njs_index_t unused)
{
@@ -1804,6 +1881,14 @@ static const njs_object_prop_t njs_arra
NJS_OBJECT_ARG, NJS_SKIP_ARG, NJS_INTEGER_ARG),
},
+ /* ES6. */
+ {
+ .type = NJS_METHOD,
+ .name = njs_string("includes"),
+ .value = njs_native_function(njs_array_prototype_includes, 0,
+ NJS_OBJECT_ARG, NJS_SKIP_ARG, NJS_INTEGER_ARG),
+ },
+
{
.type = NJS_METHOD,
.name = njs_string("forEach"),
diff -r 76e57071e411 -r f21747d5ac83 njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c Mon Oct 24 19:02:31 2016 +0300
+++ b/njs/test/njs_unit_test.c Tue Oct 25 17:52:18 2016 +0300
@@ -2410,6 +2410,36 @@ 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,3,4].includes()"),
+ nxt_string("false") },
+
+ { nxt_string("[1,2,3,4].includes(5)"),
+ nxt_string("false") },
+
+ { nxt_string("[1,2,3,4].includes(4, 3)"),
+ nxt_string("true") },
+
+ { nxt_string("[1,2,3,4].includes(4, 4)"),
+ nxt_string("false") },
+
+ { nxt_string("[1,2,3,4,3,4].includes(3, '2')"),
+ nxt_string("true") },
+
+ { nxt_string("[1,2,3,4,3,4].includes(4, -1)"),
+ nxt_string("true") },
+
+ { nxt_string("[1,2,3,4,3,4].includes(3, -10)"),
+ nxt_string("true") },
+
+ { nxt_string("[1,2,3,NaN,3,4].includes(NaN)"),
+ nxt_string("true") },
+
+ { nxt_string("[1,2,3,4,5].includes(NaN)"),
+ nxt_string("false") },
+
+ { nxt_string("[].includes.bind(0)(0, 0)"),
+ nxt_string("false") },
+
{ nxt_string("var a = []; var s = { sum: 0 };"
"a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
nxt_string("0") },
More information about the nginx-devel
mailing list