details: https://hg.nginx.org/njs/rev/239f3511397b branches: changeset: 1118:239f3511397b user: Dmitry Volyntsev <xei...@nginx.com> date: Thu Aug 08 14:19:56 2019 +0300 description: Added support for accessor properties in JSON.stringify().
This closes #203 issue on Github. diffstat: src/njs_json.c | 27 ++++++++++++++++++++++----- src/test/njs_unit_test.c | 8 ++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) diffs (62 lines): diff -r fd09c657f97d -r 239f3511397b src/njs_json.c --- a/src/njs_json.c Thu Aug 08 14:19:55 2019 +0300 +++ b/src/njs_json.c Thu Aug 08 14:19:56 2019 +0300 @@ -1214,7 +1214,7 @@ njs_json_stringify_iterator(njs_vm_t *vm njs_value_t *key, *value; njs_function_t *to_json; njs_json_state_t *state; - njs_object_prop_t *prop; + njs_object_prop_t *prop, scratch; njs_lvlhsh_query_t lhq; start: @@ -1255,10 +1255,27 @@ start: prop = lhq.value; - if (!prop->enumerable - || njs_is_undefined(&prop->value) - || !njs_is_valid(&prop->value) - || njs_is_function(&prop->value)) + if (!prop->enumerable) { + break; + } + + if (njs_is_accessor_descriptor(prop) + && njs_is_function(&prop->getter)) + { + scratch = *prop; + prop = &scratch; + + ret = njs_function_apply(vm, njs_function(&prop->getter), + &state->value, 1, &prop->value); + + if (njs_slow_path(ret != NJS_OK)) { + return ret; + } + } + + if (njs_is_undefined(&prop->value) + || njs_is_function(&prop->value) + || !njs_is_valid(&prop->value)) { break; } diff -r fd09c657f97d -r 239f3511397b src/test/njs_unit_test.c --- a/src/test/njs_unit_test.c Thu Aug 08 14:19:55 2019 +0300 +++ b/src/test/njs_unit_test.c Thu Aug 08 14:19:56 2019 +0300 @@ -12766,6 +12766,14 @@ static njs_unit_test_t njs_test[] = { njs_str("JSON.stringify([{a:1,b:{c:2}},1], undefined, new Date())"), njs_str("[{\"a\":1,\"b\":{\"c\":2}},1]") }, + { njs_str("var o = Object.defineProperty({}, 'a', { get() { return ()=> 1}, enumerable: true });" + "JSON.stringify(o)"), + njs_str("{}") }, + + { njs_str("var o = Object.defineProperty({}, 'a', { get: () => ({b:1, c:2}), enumerable: true });" + "JSON.stringify(o)"), + njs_str("{\"a\":{\"b\":1,\"c\":2}}") }, + { njs_str("JSON.stringify({toJSON:function(k){}})"), njs_str("undefined") }, _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel