From 31166e8aa061b82dd3fa4d0971bb5abaa556a7d3 Mon Sep 17 00:00:00 2001 From: Andrey Zelenkov Date: Tue, 4 Apr 2017 06:16:49 +0300 Subject: [PATCH] Array.prototype.findIndex() method. --- njs/njs_array.c | 58 ++++++++++++++++++++++++++++++++++++++++ njs/test/njs_unit_test.c | 44 ++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) diff --git a/njs/njs_array.c b/njs/njs_array.c index 381e0822..46f10789 100644 --- a/njs/njs_array.c +++ b/njs/njs_array.c @@ -100,6 +100,8 @@ static njs_ret_t njs_array_prototype_filter_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); static njs_ret_t njs_array_prototype_find_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); +static njs_ret_t njs_array_prototype_find_index_continuation(njs_vm_t *vm, + njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); static njs_ret_t njs_array_prototype_map_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); static nxt_noinline uint32_t njs_array_prototype_map_index(njs_array_t *array, @@ -1531,6 +1533,54 @@ njs_array_prototype_find_continuation(njs_vm_t *vm, njs_value_t *args, } +static njs_ret_t +njs_array_prototype_find_index(njs_vm_t *vm, njs_value_t *args, + nxt_uint_t nargs, njs_index_t unused) +{ + nxt_int_t ret; + njs_array_iter_t *iter; + + ret = njs_array_iterator_args(vm, args, nargs); + if (nxt_slow_path(ret != NXT_OK)) { + return ret; + } + + iter = njs_vm_continuation(vm); + iter->u.cont.function = njs_array_prototype_find_index_continuation; + iter->retval.data.truth = 0; + + return njs_array_prototype_find_index_continuation(vm, args, nargs, unused); +} + + +static njs_ret_t +njs_array_prototype_find_index_continuation(njs_vm_t *vm, njs_value_t *args, + nxt_uint_t nargs, njs_index_t unused) +{ + double index; + njs_array_iter_t *iter; + + iter = njs_vm_continuation(vm); + index = iter->index; + + if (!njs_is_true(&iter->retval)) { + iter->index++; + + if (iter->index < iter->length + && iter->index < args[0].data.u.array->length) + { + return njs_array_prototype_find_apply(vm, iter, args, nargs); + } + + index = -1; + } + + njs_number_set(&vm->retval, index); + + return NXT_OK; +} + + static nxt_noinline njs_ret_t njs_array_prototype_find_apply(njs_vm_t *vm, njs_array_iter_t *iter, njs_value_t *args, nxt_uint_t nargs) @@ -2147,6 +2197,14 @@ static const njs_object_prop_t njs_array_prototype_properties[] = njs_continuation_size(njs_array_find_t), 0), }, + /* ES6. */ + { + .type = NJS_METHOD, + .name = njs_string("findIndex"), + .value = njs_native_function(njs_array_prototype_find_index, + njs_continuation_size(njs_array_iter_t), 0), + }, + { .type = NJS_METHOD, .name = njs_string("map"), diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 73cc5ded..5584a6a1 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -2926,6 +2926,50 @@ static njs_unit_test_t njs_test[] = "a.find(function(v, i, a) { a.shift(); return v == 4 })"), nxt_string("undefined") }, + { nxt_string("var a = [];" + "a.findIndex(function(v, i, a) { return v > 1 })"), + nxt_string("-1") }, + + { nxt_string("var a = [,NaN,0,-1];" + "a.findIndex(function(v, i, a) { return v > 1 })"), + nxt_string("-1") }, + + { nxt_string("var a = [,NaN,0,-1,2];" + "a.findIndex(function(v, i, a) { return v > 1 })"), + nxt_string("4") }, + + { nxt_string("var a = [1,2,3,-1,5];" + "a.findIndex(function(v, i, a) { return v > 1 })"), + nxt_string("1") }, + + { nxt_string("var a = [,1,,-1,5];" + "a.findIndex(function(v, i, a) { return v > 1 })"), + nxt_string("4") }, + + { nxt_string("var a = [,1,,-1,5,6];" + "a.findIndex(function(v, i, a) { return v > 1 })"), + nxt_string("4") }, + + { nxt_string("[].findIndex(function(v) { return (v === undefined) })"), + nxt_string("-1") }, + + { nxt_string("[,].findIndex(function(v) { return (v === undefined) })"), + nxt_string("0") }, + + { nxt_string("[1,2,,3].findIndex(function(el){return el === undefined})"), + nxt_string("2") }, + + { nxt_string("[,2,,3].findIndex(function(el){return el === undefined})"), + nxt_string("0") }, + + { nxt_string("var a = [1,2,3,4,5,6];" + "a.findIndex(function(v, i, a) { a.shift(); return v == 3 })"), + nxt_string("1") }, + + { nxt_string("var a = [1,2,3,4,5,6];" + "a.findIndex(function(v, i, a) { a.shift(); return v == 4 })"), + nxt_string("-1") }, + { nxt_string("var a = [];" "a.map(function(v, i, a) { return v + 1 })"), nxt_string("") }, -- 2.47.3