]> git.kaiwu.me - njs.git/commitdiff
Added array length setter.
authorDmitry Volyntsev <xeioex@nginx.com>
Fri, 20 Apr 2018 13:42:12 +0000 (16:42 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Fri, 20 Apr 2018 13:42:12 +0000 (16:42 +0300)
This fixes #1 issue on GitHub.

njs/njs_array.c
njs/test/njs_unit_test.c

index c562ffc401975ee489746d167c423946928d0ed9..5d38910289060565c3860283932e3b93f2b0ccc6 100644 (file)
@@ -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;
 }
 
 
index ec84c9d4ba5d7e9ec81c75adfc64d0a0e4165626..d7c73090e179a4ff8bf963e180d7cbd017b820a9 100644 (file)
@@ -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") },