From: Dmitry Volyntsev Date: Tue, 30 Jun 2020 15:33:58 +0000 (+0000) Subject: Adding Symbol support for backtraces. X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=4eb8dc164e49f13f9422dc2946994abaf9b27dfa;p=njs.git Adding Symbol support for backtraces. --- diff --git a/src/njs_builtin.c b/src/njs_builtin.c index 931094b1..3bf758ad 100644 --- a/src/njs_builtin.c +++ b/src/njs_builtin.c @@ -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) { diff --git a/src/njs_json.c b/src/njs_json.c index 34bd9495..68d32525 100644 --- a/src/njs_json.c +++ b/src/njs_json.c @@ -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; } diff --git a/src/njs_object.h b/src/njs_object.h index 75511f88..76ed32d0 100644 --- a/src/njs_object.h +++ b/src/njs_object.h @@ -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; } diff --git a/src/njs_string.c b/src/njs_string.c index 7e431a2d..c57b278d 100644 --- a/src/njs_string.c +++ b/src/njs_string.c @@ -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); diff --git a/src/njs_symbol.c b/src/njs_symbol.c index 8cc0764a..9b704cc2 100644 --- a/src/njs_symbol.c +++ b/src/njs_symbol.c @@ -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); } diff --git a/src/njs_symbol.h b/src/njs_symbol.h index 8e532549..3b338b94 100644 --- a/src/njs_symbol.h +++ b/src/njs_symbol.h @@ -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;