]> git.kaiwu.me - njs.git/commitdiff
Adding Symbol support for backtraces.
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 30 Jun 2020 15:33:58 +0000 (15:33 +0000)
committerDmitry Volyntsev <xeioex@nginx.com>
Tue, 30 Jun 2020 15:33:58 +0000 (15:33 +0000)
src/njs_builtin.c
src/njs_json.c
src/njs_object.h
src/njs_string.c
src/njs_symbol.c
src/njs_symbol.h

index 931094b1f53b222cfe38e7b2604090767fae1d49..3bf758ad79d20765d5937242ba22097480c69ba8 100644 (file)
@@ -396,6 +396,7 @@ njs_builtin_traverse(njs_vm_t *vm, njs_traverse_t *traverse, void *data)
     u_char                  *p, *start, *end;
     njs_int_t               ret, n;
     njs_str_t               name;
+    njs_value_t             key;
     njs_function_t          *func;
     njs_object_prop_t       *prop;
     njs_lvlhsh_query_t      lhq;
@@ -430,7 +431,21 @@ njs_builtin_traverse(njs_vm_t *vm, njs_traverse_t *traverse, void *data)
     end = buf + sizeof(buf);
 
     do {
-        njs_string_get(&path[n]->prop->name, &name);
+        key = path[n]->prop->name;
+
+        if (njs_slow_path(njs_is_symbol(&key))) {
+            ret = njs_symbol_to_string(vm, &key, &key, 1);
+            if (njs_slow_path(ret != NJS_OK)) {
+                name = njs_str_value("#BROKEN_KEY");
+            }
+
+        } else {
+            if (p != buf) {
+                *p++ = '.';
+            }
+        }
+
+        njs_string_get(&key, &name);
 
         if (njs_slow_path((p + name.length + 1) > end)) {
             njs_type_error(vm, "njs_builtin_traverse() key is too long");
@@ -439,10 +454,6 @@ njs_builtin_traverse(njs_vm_t *vm, njs_traverse_t *traverse, void *data)
 
         p = njs_cpymem(p, name.start, name.length);
 
-        if (n != 0) {
-            *p++ = '.';
-        }
-
     } while (n-- > 0);
 
     if (ctx->type == NJS_BUILTIN_TRAVERSE_MATCH) {
index 34bd94952daa81510ca27d13a5c9275be0794950..68d3252580ebb2691f4b7386a9970def1bfa278e 100644 (file)
@@ -1856,7 +1856,7 @@ njs_dump_terminal(njs_json_stringify_t *stringify, njs_chb_t *chain,
     case NJS_OBJECT_SYMBOL:
         value = njs_object_value(value);
 
-        ret = njs_symbol_to_string(stringify->vm, &str_val, value);
+        ret = njs_symbol_to_string(stringify->vm, &str_val, value, 0);
         if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
@@ -1867,7 +1867,7 @@ njs_dump_terminal(njs_json_stringify_t *stringify, njs_chb_t *chain,
         break;
 
     case NJS_SYMBOL:
-        ret = njs_symbol_to_string(stringify->vm, &str_val, value);
+        ret = njs_symbol_to_string(stringify->vm, &str_val, value, 0);
         if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
index 75511f883d4e3653eef1296212af84b89b015536..76ed32d0d42de90901f0e26631638faf635caf35 100644 (file)
@@ -213,7 +213,7 @@ njs_key_string_get(njs_vm_t *vm, njs_value_t *key, njs_str_t *str)
     njs_int_t  ret;
 
     if (njs_slow_path(njs_is_symbol(key))) {
-        ret = njs_symbol_to_string(vm, key, key);
+        ret = njs_symbol_to_string(vm, key, key, 0);
         if (njs_slow_path(ret != NJS_OK)) {
             return ret;
         }
index 7e431a2d648590f62d23e9ac0d97fd199d295981..c57b278d52724ac6842420921dcf96e3cb89ee95 100644 (file)
@@ -543,7 +543,7 @@ njs_string_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
 
         if (njs_slow_path(!njs_is_string(value))) {
             if (!vm->top_frame->ctor && njs_is_symbol(value)) {
-                return njs_symbol_to_string(vm, &vm->retval, value);
+                return njs_symbol_to_string(vm, &vm->retval, value, 0);
             }
 
             ret = njs_value_to_string(vm, value, value);
index 8cc0764abf62de0dd730060e70a03de9add82ac3..9b704cc22dc03ad6f56099736754d3a3b818cd79 100644 (file)
@@ -55,7 +55,8 @@ static const njs_value_t  *njs_symbol_names[NJS_SYMBOL_KNOWN_MAX] = {
 
 
 njs_int_t
-njs_symbol_to_string(njs_vm_t *vm, njs_value_t *dst, const njs_value_t *value)
+njs_symbol_to_string(njs_vm_t *vm, njs_value_t *dst, const njs_value_t *value,
+    njs_bool_t as_name)
 {
     u_char             *start;
     const njs_value_t  *name;
@@ -78,16 +79,31 @@ njs_symbol_to_string(njs_vm_t *vm, njs_value_t *dst, const njs_value_t *value)
     }
 
     (void) njs_string_prop(&string, name);
-    string.length += njs_length("Symbol()");
 
-    start = njs_string_alloc(vm, dst, string.size + 8, string.length);
-    if (njs_slow_path(start == NULL)) {
-        return NJS_ERROR;
-    }
+    if (as_name) {
+        string.length += njs_length("[]");
+
+        start = njs_string_alloc(vm, dst, string.size + 2, string.length);
+        if (njs_slow_path(start == NULL)) {
+            return NJS_ERROR;
+        }
+
+        start = njs_cpymem(start, "[", 1);
+        start = njs_cpymem(start, string.start, string.size);
+        *start = ']';
 
-    start = njs_cpymem(start, "Symbol(", 7);
-    start = njs_cpymem(start, string.start, string.size);
-    *start = ')';
+    } else {
+        string.length += njs_length("Symbol()");
+
+        start = njs_string_alloc(vm, dst, string.size + 8, string.length);
+        if (njs_slow_path(start == NULL)) {
+            return NJS_ERROR;
+        }
+
+        start = njs_cpymem(start, "Symbol(", 7);
+        start = njs_cpymem(start, string.start, string.size);
+        *start = ')';
+    }
 
     return NJS_OK;
 }
@@ -328,7 +344,7 @@ njs_symbol_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
         return ret;
     }
 
-    return njs_symbol_to_string(vm, &vm->retval, &vm->retval);
+    return njs_symbol_to_string(vm, &vm->retval, &vm->retval, 0);
 }
 
 
index 8e5325494aa721e2f8bd48383048898f532b4d5f..3b338b94b01731b362b817079f672084a12a0ae6 100644 (file)
@@ -8,7 +8,7 @@
 #define _NJS_SYMBOL_H_INCLUDED_
 
 njs_int_t njs_symbol_to_string(njs_vm_t *vm, njs_value_t *dst,
-    const njs_value_t *value);
+    const njs_value_t *value, njs_bool_t as_name);
 
 
 extern const njs_object_type_init_t  njs_symbol_type_init;