]> git.kaiwu.me - njs.git/commitdiff
Added support for accessor property descriptors in njs.dump().
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 8 Aug 2019 11:19:55 +0000 (14:19 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 8 Aug 2019 11:19:55 +0000 (14:19 +0300)
src/njs_json.c
src/test/njs_unit_test.c

index facf82a5d84ca4094cf519b625aeebce508939be..2092d9534e08ac90cd62ed687682b21c49ba4a7d 100644 (file)
@@ -2381,6 +2381,10 @@ njs_vm_value_dump(njs_vm_t *vm, njs_str_t *retval, const njs_value_t *value,
     njs_lvlhsh_query_t    lhq;
     njs_json_stringify_t  *stringify;
 
+    const njs_value_t  string_get = njs_string("[Getter]");
+    const njs_value_t  string_set = njs_string("[Setter]");
+    const njs_value_t  string_get_set = njs_long_string("[Getter/Setter]");
+
     if (njs_vm_backtrace(vm) != NULL) {
         goto exception;
     }
@@ -2486,6 +2490,19 @@ njs_vm_value_dump(njs_vm_t *vm, njs_str_t *retval, const njs_value_t *value,
                 if (prop->type == NJS_WHITEOUT || !prop->enumerable) {
                     break;
                 }
+
+                if (njs_is_accessor_descriptor(prop)) {
+                    if (njs_is_defined(&prop->getter)) {
+                        if (njs_is_defined(&prop->setter)) {
+                            val = njs_value_arg(&string_get_set);
+                        } else {
+                            val = njs_value_arg(&string_get);
+                        }
+
+                    } else {
+                        val = njs_value_arg(&string_set);
+                    }
+                }
             }
 
             if (state->written) {
index 8b791e5e96b5843510eb80ec7ba5c2e929feaeee..8de40a91d2720beda822e3345c083ea956da50ca 100644 (file)
@@ -12893,6 +12893,15 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("njs.dump(Array.prototype.slice.call({'1':'b', length:2}))"),
       njs_str("[<empty>,'b']") },
 
+    { njs_str("var o = Object.defineProperty({}, 'a', { get: () => 1, enumerable: true }); njs.dump(o)"),
+      njs_str("{a:'[Getter]'}") },
+
+    { njs_str("var o = Object.defineProperty({}, 'a', { get: () => 1, set(){}, enumerable: true }); njs.dump(o)"),
+      njs_str("{a:'[Getter/Setter]'}") },
+
+    { njs_str("var o = Object.defineProperty({}, 'a', { set(){}, enumerable: true }); njs.dump(o)"),
+      njs_str("{a:'[Setter]'}") },
+
     { njs_str("njs.dump($r.props)"),
       njs_str("{a:{type:\"property\",props:[\"getter\"]},b:{type:\"property\",props:[\"getter\"]}}") },