[njs] Array.splice() function.

2016-08-11 Thread Igor Sysoev
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.

2016-08-11 Thread Igor Sysoev
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.

2016-08-11 Thread Igor Sysoev
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.

2016-08-11 Thread Igor Sysoev
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.

2016-08-11 Thread Igor Sysoev
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...

2016-08-11 Thread Igor Sysoev
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’

2016-08-11 Thread pgndev
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’

2016-08-11 Thread Valentin V. Bartenev
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’

2016-08-11 Thread PGNet Dev

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