[njs] Array.splice() function.
details: http://hg.nginx.org/njs/rev/3dc4385c805c branches: changeset: 151:3dc4385c805c user: Igor Sysoev date: Wed Aug 10 18:03:54 2016 +0300 description: Array.splice() function. diffstat: njs/njs_array.c | 88 njs/test/njs_unit_test.c | 15 2 files changed, 103 insertions(+), 0 deletions(-) diffs (130 lines): diff -r 050db82b0d46 -r 3dc4385c805c njs/njs_array.c --- a/njs/njs_array.c Wed Aug 10 15:52:25 2016 +0300 +++ b/njs/njs_array.c Wed Aug 10 18:03:54 2016 +0300 @@ -530,6 +530,87 @@ njs_array_prototype_shift(njs_vm_t *vm, static njs_ret_t +njs_array_prototype_splice(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, +njs_index_t unused) +{ +njs_ret_tret; +nxt_int_titems, delta; +nxt_uint_t i, n, start, delete, length; +njs_array_t *array, *deleted; + +array = NULL; +start = 0; +delete = 0; + +if (njs_is_array(&args[0])) { +array = args[0].data.u.array; + +if (nargs > 1) { +start = args[1].data.u.number; + +if (nargs > 2) { +delete = args[2].data.u.number; + +} else { +delete = array->length - start; +} +} +} + +deleted = njs_array_alloc(vm, delete, 0); +if (nxt_slow_path(deleted == NULL)) { +return NXT_ERROR; +} + +if (array != NULL && (delete != 0 || nargs > 3)) { +length = array->length; + +/* Move deleted items to a new array to return. */ +for (i = 0, n = start; i < delete && n < length; i++, n++) { +/* No retention required. */ +deleted->start[i] = array->start[n]; +} + +items = nargs - 3; +items = items >= 0 ? items : 0; +delta = items - delete; + +if (delta != 0) { +/* + * Relocate the rest of items. + * Index of the first item is in "n". + */ +if (delta > 0) { +ret = njs_array_realloc(vm, array, 0, array->size + delta); +if (nxt_slow_path(ret != NXT_OK)) { +return ret; +} +} + +memmove(&array->start[start + items], &array->start[n], +(array->length - n) * sizeof(njs_value_t)); + +array->length += delta; +} + +/* Copy new items. */ +n = start; + +for (i = 3; i < nargs; i++) { +/* GC: njs_retain(&args[i]); */ +array->start[n++] = args[i]; +} +} + +vm->retval.data.u.array = deleted; +vm->retval.type = NJS_ARRAY; +vm->retval.data.truth = 1; + +return NXT_OK; +} + + +static njs_ret_t njs_array_prototype_reverse(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { @@ -1437,6 +1518,13 @@ static const njs_object_prop_t njs_arra { .type = NJS_METHOD, +.name = njs_string("splice"), +.value = njs_native_function(njs_array_prototype_splice, 0, +NJS_OBJECT_ARG, NJS_INTEGER_ARG, NJS_INTEGER_ARG), +}, + +{ +.type = NJS_METHOD, .name = njs_string("reverse"), .value = njs_native_function(njs_array_prototype_reverse, 0, NJS_OBJECT_ARG), diff -r 050db82b0d46 -r 3dc4385c805c njs/test/njs_unit_test.c --- a/njs/test/njs_unit_test.c Wed Aug 10 15:52:25 2016 +0300 +++ b/njs/test/njs_unit_test.c Wed Aug 10 18:03:54 2016 +0300 @@ -2256,6 +2256,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.splice()"), + nxt_string("") }, + +{ nxt_string("var a = [0,1,2,3,4,5,6,7];" + "a.splice(3).join(':') + '|' + a"), + nxt_string("3:4:5:6:7|0,1,2") }, + +{ nxt_string("var a = [0,1,2,3,4,5,6,7];" + "a.splice(3, 2).join(':') + '|' + a"), + nxt_string("3:4|0,1,2,5,6,7") }, + +{ nxt_string("var a = [0,1,2,3,4,5,6,7];" + "a.splice(3, 2, 8, 9, 10, 11 ).join(':') + '|' + a"), + nxt_string("3:4|0,1,2,8,9,10,11,5,6,7") }, + { nxt_string("var a = []; a.reverse()"), nxt_string("") }, ___ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel
[njs] Array.indexOf() and Array.lastIndexOf() functions.
details: http://hg.nginx.org/njs/rev/050db82b0d46 branches: changeset: 150:050db82b0d46 user: Igor Sysoev date: Wed Aug 10 15:52:25 2016 +0300 description: Array.indexOf() and Array.lastIndexOf() functions. diffstat: njs/njs_array.c | 80 njs/njs_vm.c | 4 +- njs/njs_vm.h | 2 + njs/test/njs_unit_test.c | 30 ++ 4 files changed, 113 insertions(+), 3 deletions(-) diffs (177 lines): diff -r bd3464a20ad2 -r 050db82b0d46 njs/njs_array.c --- a/njs/njs_array.c Wed Aug 10 11:57:56 2016 +0300 +++ b/njs/njs_array.c Wed Aug 10 15:52:25 2016 +0300 @@ -58,6 +58,8 @@ static njs_ret_t njs_array_prototype_joi njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); static nxt_noinline njs_value_t *njs_array_copy(njs_value_t *dst, njs_value_t *src); +static njs_ret_t njs_array_index_of(njs_vm_t *vm, njs_value_t *args, +nxt_uint_t nargs, nxt_bool_t first); static nxt_noinline njs_ret_t njs_array_prototype_for_each_cont(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused); static nxt_noinline njs_ret_t njs_array_prototype_some_cont(njs_vm_t *vm, @@ -836,6 +838,70 @@ njs_array_copy(njs_value_t *dst, njs_val static njs_ret_t +njs_array_prototype_index_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, +njs_index_t unused) +{ +return njs_array_index_of(vm, args, nargs, 1); +} + + +static njs_ret_t +njs_array_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args, +nxt_uint_t nargs, njs_index_t unused) +{ +return njs_array_index_of(vm, args, nargs, 0); +} + + +static njs_ret_t +njs_array_index_of(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, +nxt_bool_t first) +{ +nxt_int_ti, index, length; +njs_value_t *value; +njs_array_t *array; + +index = -1; + +if (nargs > 1) { +i = 0; +array = args[0].data.u.array; +length = array->length; + +if (nargs > 2) { +i = args[2].data.u.number; + +if (i < 0) { +i += length; + +if (i < 0) { +i = 0; +} +} +} + +value = &args[1]; + +while (i < length) { +if (njs_values_strict_equal(value, &array->start[i])) { +index = i; + +if (first) { +break; +} +} + +i++; +} +} + +njs_number_set(&vm->retval, index); + +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) { @@ -1399,6 +1465,20 @@ static const njs_object_prop_t njs_arra { .type = NJS_METHOD, +.name = njs_string("indexOf"), +.value = njs_native_function(njs_array_prototype_index_of, 0, + NJS_OBJECT_ARG, NJS_SKIP_ARG, NJS_INTEGER_ARG), +}, + +{ +.type = NJS_METHOD, +.name = njs_string("lastIndexOf"), +.value = njs_native_function(njs_array_prototype_last_index_of, 0, + NJS_OBJECT_ARG, NJS_SKIP_ARG, NJS_INTEGER_ARG), +}, + +{ +.type = NJS_METHOD, .name = njs_string("forEach"), .value = njs_native_function(njs_array_prototype_for_each, njs_continuation_size(njs_array_iter_t), 0), diff -r bd3464a20ad2 -r 050db82b0d46 njs/njs_vm.c --- a/njs/njs_vm.c Wed Aug 10 11:57:56 2016 +0300 +++ b/njs/njs_vm.c Wed Aug 10 15:52:25 2016 +0300 @@ -82,8 +82,6 @@ static nxt_noinline njs_ret_t njs_values njs_value_t *val2); static nxt_noinline njs_ret_t njs_values_compare(njs_value_t *val1, njs_value_t *val2); -static nxt_noinline nxt_bool_t njs_values_strict_equal(njs_value_t *val1, -njs_value_t *val2); static njs_object_t *njs_function_new_object(njs_vm_t *vm, njs_value_t *value); static njs_ret_t njs_vmcode_continuation(njs_vm_t *vm, njs_value_t *invld1, njs_value_t *invld2); @@ -2006,7 +2004,7 @@ njs_vmcode_strict_not_equal(njs_vm_t *vm } -static nxt_noinline nxt_bool_t +nxt_noinline nxt_bool_t njs_values_strict_equal(njs_value_t *val1, njs_value_t *val2) { size_tsize; diff -r bd3464a20ad2 -r 050db82b0d46 njs/njs_vm.h --- a/njs/njs_vm.h Wed Aug 10 11:57:56 2016 +0300 +++ b/njs/njs_vm.h Wed Aug 10 15:52:25 2016 +0300 @@ -958,6 +958,8 @@ njs_ret_t njs_vmcode_catch(njs_vm_t *vm, njs_ret_t njs_vmcode_finally(njs_vm_t *vm, njs_value_t *invld, njs_value_t *retval); +nxt_bool_t njs_values_strict_equal(njs_value_t *val1, njs_value_t *val2); + njs_ret_t njs_normalize_args(njs_vm_t *vm, njs_value_t *args, uint8_t *args_types, nxt_uint_t nargs); diff -r bd3464a20ad2 -r 050db82b0d46 njs/test/njs_unit_test.c --- a/njs/test/njs_unit_test.c Wed Aug 10 11:57:56 2016 +0300 +++ b/njs/test/njs_unit_test.c Wed Aug 10 15:52:25 2016 +0300 @@ -2271,6 +2271,36
[njs] Array.sort() function.
details: http://hg.nginx.org/njs/rev/18ac628bcb6c branches: changeset: 152:18ac628bcb6c user: Igor Sysoev date: Thu Aug 11 10:58:29 2016 +0300 description: Array.sort() function. diffstat: njs/njs_array.c | 159 +++ njs/test/njs_unit_test.c | 31 + 2 files changed, 190 insertions(+), 0 deletions(-) diffs (231 lines): diff -r 3dc4385c805c -r 18ac628bcb6c njs/njs_array.c --- a/njs/njs_array.c Wed Aug 10 18:03:54 2016 +0300 +++ b/njs/njs_array.c Thu Aug 11 10:58:29 2016 +0300 @@ -51,6 +51,23 @@ typedef struct { } njs_array_iter_t; +typedef struct { +union { +njs_continuation_t cont; +u_char padding[NJS_CONTINUATION_SIZE]; +} u; +/* + * This retval value must be aligned so the continuation is padded + * to aligned size. + */ +njs_value_t retval; + +njs_function_t *function; +int32_t index; +uint32_tcurrent; +} njs_array_sort_t; + + static njs_ret_t njs_array_prototype_to_string_continuation(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t retval); @@ -81,6 +98,8 @@ static nxt_noinline uint32_t njs_array_i static nxt_noinline njs_ret_t njs_array_iterator_apply(njs_vm_t *vm, njs_array_iter_t *iter, njs_value_t *args, nxt_uint_t nargs); static uint32_t njs_array_reduce_right_next(njs_array_t *array, int32_t n); +static njs_ret_t njs_array_prototype_sort_cont(njs_vm_t *vm, njs_value_t *args, +nxt_uint_t nargs, njs_index_t unused); nxt_noinline njs_array_t * @@ -1477,6 +1496,139 @@ njs_array_reduce_right_next(njs_array_t } +static njs_ret_t +njs_array_string_sort(njs_vm_t *vm, njs_value_t *args, +nxt_uint_t nargs, njs_index_t unused) +{ +nxt_int_t ret; +nxt_uint_t i; + +for (i = 1; i < nargs; i++) { +if (!njs_is_string(&args[i])) { +vm->frame->trap_scratch.data.u.value = &args[i]; +return NJS_TRAP_STRING_ARG; +} +} + +ret = njs_string_cmp(&args[1], &args[2]); + +njs_number_set(&vm->retval, ret); + +return NXT_OK; +} + + +static const njs_function_t njs_array_string_sort_function = { +.object.shared = 1, +.native = 1, +.continuation_size = NJS_CONTINUATION_SIZE, +.args_types = { NJS_SKIP_ARG, NJS_STRING_ARG, NJS_STRING_ARG }, +.args_offset = 1, +.u.native = njs_array_string_sort, +}; + + +static njs_ret_t +njs_array_prototype_sort(njs_vm_t *vm, njs_value_t *args, +nxt_uint_t nargs, njs_index_t unused) +{ +njs_array_sort_t *sort; + +if (njs_is_array(&args[0]) && args[0].data.u.array->length > 1) { + +sort = njs_continuation(vm->frame); +sort->u.cont.function = njs_array_prototype_sort_cont; +sort->current = 0; +sort->retval = njs_value_zero; + +if (nargs > 1 && njs_is_function(&args[1])) { +sort->function = args[1].data.u.function; + +} else { +sort->function = (njs_function_t *) &njs_array_string_sort_function; +} + +return njs_array_prototype_sort_cont(vm, args, nargs, unused); +} + +vm->retval = args[0]; + +return NXT_OK; +} + + +static njs_ret_t +njs_array_prototype_sort_cont(njs_vm_t *vm, njs_value_t *args, +nxt_uint_t nargs, njs_index_t unused) +{ +nxt_int_t n; +njs_array_t *array; +njs_value_t value, *start, arguments[3]; +njs_array_sort_t *sort; + +array = args[0].data.u.array; +start = array->start; + +sort = njs_continuation(vm->frame); + +if (njs_is_number(&sort->retval)) { + +/* + * The sort function is impelemented with the insertion sort algorithm. + * Its worst and average computational complexity is O^2. This point + * should be considired as return point from comparison function so + * "goto next" moves control to the appropriate step of the algorithm. + * The first iteration also goes there because sort->retval is zero. + */ +if (sort->retval.data.u.number <= 0) { +goto next; +} + +n = sort->index; + +swap: + +value = start[n]; +start[n] = start[n - 1]; +n--; +start[n] = value; + +do { +if (n > 0) { + +if (njs_is_valid(&start[n]) && njs_is_valid(&start[n - 1])) { +arguments[0] = njs_value_void; + +/* GC: array elt, array */ +arguments[1] = start[n - 1]; +arguments[2] = start[n]; + +sort->index = n; + +return njs_function_apply(vm, sort->function, arguments, 3, + (njs_index_t) &sort->retval); +} + +if (!njs_is_valid(&start[n - 1]) && njs_is_valid(&start[n])) { +/* Move invalid values to the end of array. *
[njs] Array.isArray() function.
details: http://hg.nginx.org/njs/rev/bd3464a20ad2 branches: changeset: 149:bd3464a20ad2 user: Igor Sysoev date: Wed Aug 10 11:57:56 2016 +0300 description: Array.isArray() function. diffstat: njs/njs_array.c | 26 ++ njs/test/njs_unit_test.c | 9 + 2 files changed, 35 insertions(+), 0 deletions(-) diffs (62 lines): diff -r f23c723cf833 -r bd3464a20ad2 njs/njs_array.c --- a/njs/njs_array.c Tue Aug 09 14:10:33 2016 +0300 +++ b/njs/njs_array.c Wed Aug 10 11:57:56 2016 +0300 @@ -257,6 +257,25 @@ njs_array_constructor(njs_vm_t *vm, njs_ } +static njs_ret_t +njs_array_is_array(njs_vm_t *vm, njs_value_t *args, +nxt_uint_t nargs, njs_index_t unused) +{ +const njs_value_t *value; + +if (nargs > 1 && njs_is_array(&args[1])) { +value = &njs_string_true; + +} else { +value = &njs_string_false; +} + +vm->retval = *value; + +return NXT_OK; +} + + static const njs_object_prop_t njs_array_constructor_properties[] = { /* Array.name == "Array". */ @@ -279,6 +298,13 @@ static const njs_object_prop_t njs_arra .name = njs_string("prototype"), .value = njs_native_getter(njs_object_prototype_create), }, + +/* Array.isArray(). */ +{ +.type = NJS_METHOD, +.name = njs_string("isArray"), +.value = njs_native_function(njs_array_is_array, 0, 0), +}, }; diff -r f23c723cf833 -r bd3464a20ad2 njs/test/njs_unit_test.c --- a/njs/test/njs_unit_test.c Tue Aug 09 14:10:33 2016 +0300 +++ b/njs/test/njs_unit_test.c Wed Aug 10 11:57:56 2016 +0300 @@ -2215,6 +2215,15 @@ static njs_unit_test_t njs_test[] = /**/ +{ nxt_string("Array.isArray()"), + nxt_string("false") }, + +{ nxt_string("Array.isArray(1)"), + nxt_string("false") }, + +{ nxt_string("Array.isArray([])"), + nxt_string("true") }, + { nxt_string("a = [1,2,3]; a.concat(4, [5, 6, 7], 8)"), nxt_string("1,2,3,4,5,6,7,8") }, ___ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel
[njs] Array iterator functions optimizations.
details: http://hg.nginx.org/njs/rev/0c9a771b7664 branches: changeset: 154:0c9a771b7664 user: Igor Sysoev date: Thu Aug 11 13:57:36 2016 +0300 description: Array iterator functions optimizations. diffstat: njs/njs_array.c | 126 ++- 1 files changed, 69 insertions(+), 57 deletions(-) diffs (262 lines): diff -r 87df6b787943 -r 0c9a771b7664 njs/njs_array.c --- a/njs/njs_array.c Thu Aug 11 13:21:46 2016 +0300 +++ b/njs/njs_array.c Thu Aug 11 13:57:36 2016 +0300 @@ -43,12 +43,23 @@ typedef struct { */ njs_value_t retval; +uint32_tnext_index; +uint32_tlength; +} njs_array_iter_t; + + +typedef struct { +njs_array_iter_titer; njs_value_t value; njs_array_t *array; -uint32_tnext_index; -uint32_tlength; +} njs_array_filter_t; + + +typedef struct { +njs_array_iter_titer; +njs_array_t *array; uint32_tindex; -} njs_array_iter_t; +} njs_array_map_t; typedef struct { @@ -1137,20 +1148,20 @@ static njs_ret_t njs_array_prototype_filter(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; +nxt_int_t ret; +njs_array_filter_t *filter; ret = njs_array_iterator_args(vm, args, nargs); if (nxt_slow_path(ret != NXT_OK)) { return ret; } -iter = njs_continuation(vm->frame); -iter->u.cont.function = njs_array_prototype_filter_cont; -iter->retval.data.truth = 0; +filter = njs_continuation(vm->frame); +filter->iter.u.cont.function = njs_array_prototype_filter_cont; +filter->iter.retval.data.truth = 0; -iter->array = njs_array_alloc(vm, 0, NJS_ARRAY_SPARE); -if (nxt_slow_path(iter->array == NULL)) { +filter->array = njs_array_alloc(vm, 0, NJS_ARRAY_SPARE); +if (nxt_slow_path(filter->array == NULL)) { return NXT_ERROR; } @@ -1162,27 +1173,33 @@ static njs_ret_t njs_array_prototype_filter_cont(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; +nxt_int_t ret; +njs_array_t *array; +njs_array_filter_t *filter; -iter = njs_continuation(vm->frame); +filter = njs_continuation(vm->frame); -if (njs_is_true(&iter->retval)) { -ret = njs_array_add(vm, iter->array, &iter->value); +if (njs_is_true(&filter->iter.retval)) { +ret = njs_array_add(vm, filter->array, &filter->value); if (nxt_slow_path(ret != NXT_OK)) { return ret; } } -if (iter->next_index >= args[0].data.u.array->length) { -vm->retval.data.u.array = iter->array; +array = args[0].data.u.array; + +if (filter->iter.next_index >= array->length) { +vm->retval.data.u.array = filter->array; vm->retval.type = NJS_ARRAY; vm->retval.data.truth = 1; return NXT_OK; } -return njs_array_iterator_apply(vm, iter, args, nargs); +/* GC: filter->value */ +filter->value = array->start[filter->iter.next_index]; + +return njs_array_iterator_apply(vm, &filter->iter, args, nargs); } @@ -1190,29 +1207,29 @@ static njs_ret_t njs_array_prototype_map(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { -size_tsize; -nxt_int_t ret; -njs_value_t *value; -njs_array_t *array; -njs_array_iter_t *iter; +size_t size; +nxt_int_tret; +njs_value_t *value; +njs_array_t *array; +njs_array_map_t *map; ret = njs_array_iterator_args(vm, args, nargs); if (nxt_slow_path(ret != NXT_OK)) { return ret; } -iter = njs_continuation(vm->frame); -iter->u.cont.function = njs_array_prototype_map_cont; -njs_set_invalid(&iter->retval); +map = njs_continuation(vm->frame); +map->iter.u.cont.function = njs_array_prototype_map_cont; +njs_set_invalid(&map->iter.retval); array = args[0].data.u.array; -iter->array = njs_array_alloc(vm, array->length, 0); -if (nxt_slow_path(iter->array == NULL)) { +map->array = njs_array_alloc(vm, array->length, 0); +if (nxt_slow_path(map->array == NULL)) { return NXT_ERROR; } -value = iter->array->start; +value = map->array->start; size = array->length; while (size != 0) { @@ -1229,23 +1246,25 @@ static njs_ret_t njs_array_prototype_map_cont(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { -njs_array_iter_t *iter; +njs_array_map_t *map; -iter = njs_continuation(vm->frame); +map = njs_continuation(vm->frame); -if (njs_is_valid(&iter->retval)) { -iter->array->start[iter->index] = iter
[njs] Array.join() now treats "null" and "undefined" as empty va...
details: http://hg.nginx.org/njs/rev/87df6b787943 branches: changeset: 153:87df6b787943 user: Igor Sysoev date: Thu Aug 11 13:21:46 2016 +0300 description: Array.join() now treats "null" and "undefined" as empty values. diffstat: njs/njs_array.c | 14 ++ njs/test/njs_unit_test.c | 11 +++ 2 files changed, 21 insertions(+), 4 deletions(-) diffs (66 lines): diff -r 18ac628bcb6c -r 87df6b787943 njs/njs_array.c --- a/njs/njs_array.c Thu Aug 11 10:58:29 2016 +0300 +++ b/njs/njs_array.c Thu Aug 11 13:21:46 2016 +0300 @@ -734,7 +734,10 @@ njs_array_prototype_join(njs_vm_t *vm, n for (i = 0; i < array->length; i++) { value = &array->start[i]; -if (njs_is_valid(value) && !njs_is_string(value)) { +if (!njs_is_string(value) +&& njs_is_valid(value) +&& !njs_is_null_or_void(value)) +{ max++; } } @@ -755,7 +758,10 @@ njs_array_prototype_join(njs_vm_t *vm, n for (i = 0; i < array->length; i++) { value = &array->start[i]; -if (njs_is_valid(value) && !njs_is_string(value)) { +if (!njs_is_string(value) +&& njs_is_valid(value) +&& !njs_is_null_or_void(value)) +{ values[n++] = *value; if (n >= max) { @@ -802,7 +808,7 @@ njs_array_prototype_join_continuation(nj for (i = 0; i < array->length; i++) { value = &array->start[i]; -if (njs_is_valid(value)) { +if (njs_is_valid(value) && !njs_is_null_or_void(value)) { if (!njs_is_string(value)) { value = &values[n++]; @@ -849,7 +855,7 @@ njs_array_prototype_join_continuation(nj for (i = 0; i < array->length; i++) { value = &array->start[i]; -if (njs_is_valid(value)) { +if (njs_is_valid(value) && !njs_is_null_or_void(value)) { if (!njs_is_string(value)) { value = &values[n++]; } diff -r 18ac628bcb6c -r 87df6b787943 njs/test/njs_unit_test.c --- a/njs/test/njs_unit_test.c Thu Aug 11 10:58:29 2016 +0300 +++ b/njs/test/njs_unit_test.c Thu Aug 11 13:21:46 2016 +0300 @@ -2124,6 +2124,17 @@ static njs_unit_test_t njs_test[] = { nxt_string("a = []; a[5] = 5; a.join()"), nxt_string(",5") }, +{ nxt_string("var a = [,null,undefined,false,true,0,1]; a.join()"), + nxt_string(",,,false,true,0,1") }, + +{ nxt_string("var o = { toString: function() { return null } };" + "[o].join()"), + nxt_string("null") }, + +{ nxt_string("var o = { toString: function() { return undefined } };" + "[o].join()"), + nxt_string("undefined") }, + { nxt_string("a = []; a[5] = 5; a"), nxt_string(",5") }, ___ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel
nginx 1.11.3 build, linking openssl 1.1.0 (beta/pre-6) fails @ ‘SSL_R_NO_CIPHERS_PASSED’
I'm testing soon-to-be-released (Aug 25) openssl 1.1 beta openssl version OpenSSL 1.1.0-pre6 (beta) 4 Aug 2016 After an openssl re-build, nginx restart fails Aug 11 08:22:29 dev.loc nginx[23758]: /usr/local/sbin/nginx: symbol lookup error: /usr/local/sbin/nginx: undefined symbol: SSL_CTX_set_alpn_select_cb Rebuild of nginx 1.11.3 from source, linking openssl 1.1.0-pre6' libs, fails at ... /usr/bin/gcc-6 -c -O3 -Wall -fstack-protector -funwind-tables -fasynchronous-unwind-tables -fmessage-length=0 -grecord-gcc-switches -march=native -mtune=native -fPIC -DPIC -D_GNU_SOURCE -fno-strict-aliasing -Wall -fexceptions --param=ssp-buffer-size=4 -I/usr/local/ssl/include -I/usr/local/include -I src/core -I src/event -I src/event/modules -I src/os/unix -I src/http/modules/perl -I /usr/local/src/ngx_devel_kit/objs -I objs/addon/ndk -I /usr/local/src/ngx_devel_kit/src -I /usr/local/src/ngx_devel_kit/objs -I objs/addon/ndk -I objs -I src/http -I src/http/modules -I src/http/v2 -I /usr/local/src/ngx_devel_kit/src \ -o objs/src/http/ngx_http_core_module.o \ src/http/ngx_http_core_module.c src/event/ngx_event_openssl.c: In function ‘ngx_ssl_connection_error’: src/event/ngx_event_openssl.c:2026:21: error: ‘SSL_R_NO_CIPHERS_PASSED’ undeclared (first use in this function) || n == SSL_R_NO_CIPHERS_PASSED /* 182 */ ^~~ src/event/ngx_event_openssl.c:2026:21: note: each undeclared identifier is reported only once for each function it appears in objs/Makefile:912: recipe for target 'objs/src/event/ngx_event_openssl.o' failed make[1]: *** [objs/src/event/ngx_event_openssl.o] Error 1 make[1]: Leaving directory '/usr/local/src/nginx-1.11.3' Makefile:8: recipe for target 'build' failed make: *** [build] Error 2 Just fyi 4 now ___ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel
Re: nginx 1.11.3 build, linking openssl 1.1.0 (beta/pre-6) fails @ ‘SSL_R_NO_CIPHERS_PASSED’
On Thursday 11 August 2016 08:51:40 pgndev wrote: > I'm testing soon-to-be-released (Aug 25) openssl 1.1 beta > > openssl version > OpenSSL 1.1.0-pre6 (beta) 4 Aug 2016 > > After an openssl re-build, nginx restart fails > > Aug 11 08:22:29 dev.loc nginx[23758]: /usr/local/sbin/nginx: > symbol lookup error: /usr/local/sbin/nginx: undefined symbol: > SSL_CTX_set_alpn_select_cb > > Rebuild of nginx 1.11.3 from source, linking openssl 1.1.0-pre6' libs, fails > at > > ... > /usr/bin/gcc-6 -c -O3 -Wall -fstack-protector -funwind-tables > -fasynchronous-unwind-tables -fmessage-length=0 -grecord-gcc-switches > -march=native -mtune=native -fPIC -DPIC -D_GNU_SOURCE > -fno-strict-aliasing -Wall -fexceptions --param=ssp-buffer-size=4 > -I/usr/local/ssl/include -I/usr/local/include -I src/core -I > src/event -I src/event/modules -I src/os/unix -I src/http/modules/perl > -I /usr/local/src/ngx_devel_kit/objs -I objs/addon/ndk -I > /usr/local/src/ngx_devel_kit/src -I /usr/local/src/ngx_devel_kit/objs > -I objs/addon/ndk -I objs -I src/http -I src/http/modules -I > src/http/v2 -I /usr/local/src/ngx_devel_kit/src \ > -o objs/src/http/ngx_http_core_module.o \ > src/http/ngx_http_core_module.c > src/event/ngx_event_openssl.c: In function ‘ngx_ssl_connection_error’: > src/event/ngx_event_openssl.c:2026:21: error: > ‘SSL_R_NO_CIPHERS_PASSED’ undeclared (first use in this function) > || n == SSL_R_NO_CIPHERS_PASSED /* 182 */ > ^~~ > src/event/ngx_event_openssl.c:2026:21: note: each undeclared > identifier is reported only once for each function it appears in > objs/Makefile:912: recipe for target > 'objs/src/event/ngx_event_openssl.o' failed > make[1]: *** [objs/src/event/ngx_event_openssl.o] Error 1 > make[1]: Leaving directory '/usr/local/src/nginx-1.11.3' > Makefile:8: recipe for target 'build' failed > make: *** [build] Error 2 > > Just fyi 4 now > This was already fixed a few days ago. http://hg.nginx.org/nginx/rev/1891b2892b68 wbr, Valentin V. Bartenev ___ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel
Re: nginx 1.11.3 build, linking openssl 1.1.0 (beta/pre-6) fails @ ‘SSL_R_NO_CIPHERS_PASSED’
On 08/11/2016 09:33 AM, Valentin V. Bartenev wrote: On Thursday 11 August 2016 08:51:40 pgndev wrote: This was already fixed a few days ago. http://hg.nginx.org/nginx/rev/1891b2892b68 wbr, Valentin V. Bartenev Didn't see that / Applies cleanly to 1.11.3 release, nginx -V nginx version: nginx/1.11.3 built with OpenSSL 1.1.0-pre6 (beta) 4 Aug 2016 ... & serves up chacha cipher nicely. Thanks. ___ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel