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;
}
{ 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") },