diff options
Diffstat (limited to 'src/njs_json.c')
-rw-r--r-- | src/njs_json.c | 70 |
1 files changed, 37 insertions, 33 deletions
diff --git a/src/njs_json.c b/src/njs_json.c index e79b1eb4..d77befdd 100644 --- a/src/njs_json.c +++ b/src/njs_json.c @@ -339,7 +339,7 @@ njs_json_parse_object(njs_json_parse_ctx_t *ctx, njs_value_t *value, njs_object_t *object; njs_value_t prop_name, prop_value; njs_object_prop_t *prop; - njs_flathsh_query_t lhq; + njs_flathsh_query_t fhq; if (njs_slow_path(--ctx->depth == 0)) { njs_json_parse_exception(ctx, "Nested too deep", p); @@ -394,23 +394,25 @@ njs_json_parse_object(njs_json_parse_ctx_t *ctx, njs_value_t *value, return NULL; } - prop = njs_object_prop_alloc(ctx->vm, &prop_value, 1); - if (njs_slow_path(prop == NULL)) { - goto memory_error; - } - - lhq.value = prop; - lhq.key_hash = prop_name.atom_id; - lhq.replace = 1; - lhq.pool = ctx->pool; - lhq.proto = &njs_object_hash_proto; + fhq.key_hash = prop_name.atom_id; + fhq.replace = 1; + fhq.pool = ctx->pool; + fhq.proto = &njs_object_hash_proto; - ret = njs_flathsh_unique_insert(&object->hash, &lhq); + ret = njs_flathsh_unique_insert(&object->hash, &fhq); if (njs_slow_path(ret != NJS_OK)) { - njs_internal_error(ctx->vm, "lvlhsh insert/replace failed"); + njs_internal_error(ctx->vm, "flathsh insert/replace failed"); return NULL; } + prop = fhq.value; + + prop->type = NJS_PROPERTY; + prop->enumerable = 1; + prop->configurable = 1; + prop->writable = 1; + prop->u.value = prop_value; + p = njs_json_skip_space(p, ctx->end); if (njs_slow_path(p == ctx->end)) { goto error_end; @@ -1233,13 +1235,13 @@ njs_object_to_json_function(njs_vm_t *vm, njs_value_t *value) { njs_int_t ret; njs_value_t retval; - njs_flathsh_query_t lhq; + njs_flathsh_query_t fhq; if (njs_is_object(value)) { - lhq.proto = &njs_object_hash_proto; - lhq.key_hash = NJS_ATOM_STRING_toJSON; + fhq.proto = &njs_object_hash_proto; + fhq.key_hash = NJS_ATOM_STRING_toJSON; - ret = njs_object_property(vm, njs_object(value), &lhq, &retval); + ret = njs_object_property(vm, njs_object(value), &fhq, &retval); if (njs_slow_path(ret == NJS_ERROR)) { return NULL; @@ -1599,7 +1601,7 @@ njs_json_wrap_value(njs_vm_t *vm, njs_value_t *wrapper, { njs_int_t ret; njs_object_prop_t *prop; - njs_flathsh_query_t lhq; + njs_flathsh_query_t fhq; wrapper->data.u.object = njs_object_alloc(vm); if (njs_slow_path(njs_object(wrapper) == NULL)) { @@ -1609,22 +1611,24 @@ njs_json_wrap_value(njs_vm_t *vm, njs_value_t *wrapper, wrapper->type = NJS_OBJECT; wrapper->data.truth = 1; - prop = njs_object_prop_alloc(vm, value, 1); - if (njs_slow_path(prop == NULL)) { - return NULL; - } - - lhq.value = prop; - lhq.key_hash = NJS_ATOM_STRING_empty; - lhq.replace = 0; - lhq.pool = vm->mem_pool; - lhq.proto = &njs_object_hash_proto; + fhq.key_hash = NJS_ATOM_STRING_empty; + fhq.replace = 0; + fhq.pool = vm->mem_pool; + fhq.proto = &njs_object_hash_proto; - ret = njs_flathsh_unique_insert(njs_object_hash(wrapper), &lhq); + ret = njs_flathsh_unique_insert(njs_object_hash(wrapper), &fhq); if (njs_slow_path(ret != NJS_OK)) { return NULL; } + prop = fhq.value; + + prop->type = NJS_PROPERTY; + prop->enumerable = 1; + prop->configurable = 1; + prop->writable = 1; + prop->u.value = *value; + return wrapper->data.u.object; } @@ -2047,7 +2051,7 @@ njs_vm_value_dump(njs_vm_t *vm, njs_str_t *retval, njs_value_t *value, goto exception; } - prop = pq.lhq.value; + prop = pq.fhq.value; if (prop->type == NJS_WHITEOUT || !prop->enumerable) { if (!state->array) { @@ -2065,8 +2069,8 @@ njs_vm_value_dump(njs_vm_t *vm, njs_str_t *retval, njs_value_t *value, njs_dump_empty(stringify, state, &chain, 1); if (!state->array || isnan(njs_key_to_index(key))) { - njs_atom_string_get(vm, key->atom_id, &pq.lhq.key); - njs_chb_append(&chain, pq.lhq.key.start, pq.lhq.key.length); + njs_atom_string_get(vm, key->atom_id, &pq.fhq.key); + njs_chb_append(&chain, pq.fhq.key.start, pq.fhq.key.length); njs_chb_append_literal(&chain, ":"); if (stringify->space.length != 0) { njs_chb_append_literal(&chain, " "); @@ -2078,7 +2082,7 @@ njs_vm_value_dump(njs_vm_t *vm, njs_str_t *retval, njs_value_t *value, if (prop->type == NJS_PROPERTY_HANDLER) { pq.scratch = *prop; prop = &pq.scratch; - ret = njs_prop_handler(prop)(vm, prop, pq.lhq.key_hash, + ret = njs_prop_handler(prop)(vm, prop, pq.fhq.key_hash, &state->value, NULL, njs_prop_value(prop)); |