]> git.kaiwu.me - njs.git/commitdiff
Fixed JSON.stringify() for arrays resizable via getters.
authorAlexander Borisov <alexander.borisov@nginx.com>
Tue, 6 Oct 2020 17:51:56 +0000 (20:51 +0300)
committerAlexander Borisov <alexander.borisov@nginx.com>
Tue, 6 Oct 2020 17:51:56 +0000 (20:51 +0300)
src/njs_json.c
src/test/njs_unit_test.c

index 2a2e4dd87fd2fa21892c490a7f09b1562242e05d..dd88642569bb05378b08ea02eb046ac203aeca80 100644 (file)
@@ -1077,6 +1077,7 @@ njs_json_push_stringify_state(njs_vm_t *vm, njs_json_stringify_t *stringify,
     state->key = NULL;
 
     if (njs_is_fast_array(value)) {
+        state->length = njs_array_len(value);
         state->type = NJS_JSON_ARRAY;
         state->array = 1;
 
@@ -1279,7 +1280,7 @@ njs_json_stringify_iterator(njs_vm_t *vm, njs_json_stringify_t *stringify,
                 njs_json_stringify_indent(stringify, &chain, 0);
             }
 
-            if (state->index >= njs_array_len(&state->value)) {
+            if (state->index >= state->length) {
                 njs_json_stringify_indent(stringify, &chain, -1);
                 njs_chb_append_literal(&chain,"]");
 
index 3cdcf173e61419c27c3da21f2c167d56d212d50a..f79e2b9ed65736c47eb4c6de350c1df50f53b3df 100644 (file)
@@ -16855,6 +16855,10 @@ static njs_unit_test_t  njs_test[] =
               "JSON.stringify(array)"),
       njs_str("[1,{},10]") },
 
+    { njs_str("var array = [1];"
+              "array[1] = {get value() {array[10] = 10}}; JSON.stringify(array)"),
+      njs_str("[1,{}]") },
+
     /* njs.dump(). */
 
     { njs_str("njs.dump({a:1, b:[1,,2,{c:new Boolean(1)}]})"),