]> git.kaiwu.me - njs.git/commitdiff
Improved njs.dump() with built-in functions.
authorDmitry Volyntsev <xeioex@nginx.com>
Fri, 21 Aug 2020 13:07:54 +0000 (13:07 +0000)
committerDmitry Volyntsev <xeioex@nginx.com>
Fri, 21 Aug 2020 13:07:54 +0000 (13:07 +0000)
src/njs_json.c
src/test/njs_unit_test.c

index 24a18e2a9a1cff1771e759d88ef9678d81e30a8f..80e10cf89421f63258982c6a2e564b5ba997dae4 100644 (file)
@@ -1830,6 +1830,8 @@ njs_dump_terminal(njs_json_stringify_t *stringify, njs_chb_t *chain,
     njs_typed_array_t  *array;
     njs_string_prop_t  string;
 
+    static const njs_value_t  name_string = njs_string("name");
+
     njs_int_t   (*to_string)(njs_vm_t *, njs_value_t *, const njs_value_t *);
 
     switch (value->type) {
@@ -1933,8 +1935,24 @@ njs_dump_terminal(njs_json_stringify_t *stringify, njs_chb_t *chain,
         break;
 
     case NJS_FUNCTION:
-        if (njs_function(value)->native) {
-            njs_chb_append_literal(chain, "[Function: native]");
+        ret = njs_value_property(stringify->vm, value,
+                                 njs_value_arg(&name_string), &tag);
+        if (njs_slow_path(ret == NJS_ERROR)) {
+            return ret;
+        }
+
+        if (njs_is_string(&tag)) {
+            njs_string_get(&tag, &str);
+
+        } else if (njs_function(value)->native) {
+            str = njs_str_value("native");
+
+        } else {
+            str = njs_str_value("");
+        }
+
+        if (str.length != 0) {
+            njs_chb_sprintf(chain, 32 + str.length, "[Function: %V]", &str);
 
         } else {
             njs_chb_append_literal(chain, "[Function]");
index f8ed01a9b00c77c7eb664fd4d01d08edac324e36..eac1e8f8f98f181fbf037f5f8b32b9d6a0fd4465 100644 (file)
@@ -16747,6 +16747,20 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("njs.dump(Object(Symbol.iterator))"),
       njs_str("[Symbol: Symbol(Symbol.iterator)]") },
 
+    { njs_str("njs.dump(decodeURI)"),
+      njs_str("[Function: decodeURI]") },
+
+    { njs_str("delete decodeURI.name; njs.dump(decodeURI)"),
+      njs_str("[Function]") },
+
+    { njs_str("delete decodeURI.name; delete Function.prototype.name; "
+              "decodeURI.name = 1; njs.dump(decodeURI)"),
+      njs_str("[Function: native]") },
+
+    { njs_str("delete decodeURI.name; delete Function.prototype.name; "
+              "decodeURI.name = 'XXX'; njs.dump(decodeURI)"),
+      njs_str("[Function: XXX]") },
+
     /* Built-in methods name. */
 
     { njs_str(