From: Dmitry Volyntsev Date: Fri, 20 Apr 2018 13:42:12 +0000 (+0300) Subject: Added array length setter. X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=f910561b6a6764589b707cc28adaeba1ad6e183b;p=njs.git Added array length setter. This fixes #1 issue on GitHub. --- diff --git a/njs/njs_array.c b/njs/njs_array.c index c562ffc4..5d389102 100644 --- a/njs/njs_array.c +++ b/njs/njs_array.c @@ -381,14 +381,51 @@ const njs_object_init_t njs_array_constructor_init = { static njs_ret_t -njs_array_prototype_length(njs_vm_t *vm, njs_value_t *array, +njs_array_prototype_length(njs_vm_t *vm, njs_value_t *value, njs_value_t *setval, njs_value_t *retval) { - njs_value_number_set(retval, array->data.u.array->length); + double num; + int32_t size; + uint32_t length; + njs_ret_t ret; + njs_value_t *val; + njs_array_t *array; - njs_release(vm, array); + array = value->data.u.array; - return NXT_OK; + if (setval != NULL) { + num = setval->data.u.number; + length = (uint32_t) num; + + if ((double) length != num) { + njs_range_error(vm, "Invalid array length", NULL); + return NJS_ERROR; + } + + size = (int32_t) (length - array->length); + + if (size > 0) { + ret = njs_array_expand(vm, array, 0, size); + if (nxt_slow_path(ret != NXT_OK)) { + njs_memory_error(vm); + return NJS_ERROR; + } + + val = &array->start[array->length]; + + do { + njs_set_invalid(val); + val++; + size--; + } while (size != 0); + } + + array->length = length; + } + + njs_value_number_set(retval, array->length); + + return NJS_OK; } diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index ec84c9d4..d7c73090 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -2700,6 +2700,41 @@ static njs_unit_test_t njs_test[] = { nxt_string("var a = [1,2]; a.length"), nxt_string("2") }, + /* Array.length setter */ + + { nxt_string("[].length = {}"), + nxt_string("RangeError: Invalid array length") }, + + { nxt_string("[].length = 2**32"), + nxt_string("RangeError: Invalid array length") }, + + { nxt_string("[].length = -1"), + nxt_string("RangeError: Invalid array length") }, + + { nxt_string("var a = []; a.length = 0; JSON.stringify(a)"), + nxt_string("[]") }, + + { nxt_string("var a = []; a.length = 1; JSON.stringify(a)"), + nxt_string("[null]") }, + + { nxt_string("var a = [1]; a.length = 1; JSON.stringify(a)"), + nxt_string("[1]") }, + + { nxt_string("var a = [1]; a.length = 2; JSON.stringify(a)"), + nxt_string("[1,null]") }, + + { nxt_string("var a = [1]; a.length = 4; a.length = 0; JSON.stringify(a)"), + nxt_string("[]") }, + + { nxt_string("var a = [1,2,3]; a.length = 2; JSON.stringify(a)"), + nxt_string("[1,2]") }, + + { nxt_string("var a = [1,2,3]; a.length = 3; a"), + nxt_string("1,2,3") }, + + { nxt_string("var a = [1,2,3]; a.length = 16; a"), + nxt_string("1,2,3,,,,,,,,,,,,,") }, + { nxt_string("var a = [1,2,3]; a.join()"), nxt_string("1,2,3") },