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