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;
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");
p = njs_cpymem(p, name.start, name.length);
- if (n != 0) {
- *p++ = '.';
- }
-
} while (n-- > 0);
if (ctx->type == NJS_BUILTIN_TRAVERSE_MATCH) {
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;
}
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;
}
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;
}
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);
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;
}
(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;
}
return ret;
}
- return njs_symbol_to_string(vm, &vm->retval, &vm->retval);
+ return njs_symbol_to_string(vm, &vm->retval, &vm->retval, 0);
}
#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;