aboutsummaryrefslogtreecommitdiff
path: root/src/njs_atom.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/njs_atom.c')
-rw-r--r--src/njs_atom.c78
1 files changed, 60 insertions, 18 deletions
diff --git a/src/njs_atom.c b/src/njs_atom.c
index 24e6dc17..dc66f886 100644
--- a/src/njs_atom.c
+++ b/src/njs_atom.c
@@ -82,7 +82,7 @@ njs_atom_find_or_add(njs_vm_t *vm, u_char *key, size_t size, size_t length,
uint32_t hash)
{
njs_int_t ret;
- njs_value_t *entry;
+ njs_object_prop_t *prop;
njs_lvlhsh_query_t lhq;
lhq.key.start = key;
@@ -92,33 +92,65 @@ njs_atom_find_or_add(njs_vm_t *vm, u_char *key, size_t size, size_t length,
ret = njs_lvlhsh_find(vm->atom_hash_current, &lhq);
if (ret == NJS_OK) {
- return lhq.value;
+ return njs_prop_value(lhq.value);
}
ret = njs_lvlhsh_find(&vm->atom_hash_shared, &lhq);
if (ret == NJS_OK) {
- return lhq.value;
+ return njs_prop_value(lhq.value);
}
- entry = njs_mp_alloc(vm->mem_pool, sizeof(njs_value_t));
- if (njs_slow_path(entry == NULL)) {
+ lhq.pool = vm->mem_pool;
+
+ ret = njs_lvlhsh_insert(vm->atom_hash_current, &lhq);
+ if (njs_slow_path(ret != NJS_OK)) {
return NULL;
}
- ret = njs_string_create(vm, entry, key, size);
+ prop = lhq.value;
+
+ ret = njs_string_create(vm, &prop->u.value, key, size);
if (njs_slow_path(ret != NJS_OK)) {
return NULL;
}
- entry->string.atom_id = vm->atom_id_generator++;
- if (njs_atom_is_number(entry->string.atom_id)) {
+ prop->u.value.string.atom_id = vm->atom_id_generator++;
+ if (njs_atom_is_number(prop->u.value.string.atom_id)) {
njs_internal_error(vm, "too many atoms");
return NULL;
}
- entry->string.token_type = NJS_KEYWORD_TYPE_UNDEF;
+ prop->u.value.string.token_type = NJS_KEYWORD_TYPE_UNDEF;
+
+ return &prop->u.value;
+}
+
+
+static njs_value_t *
+njs_atom_find_or_add_string(njs_vm_t *vm, njs_value_t *value,
+ uint32_t hash)
+{
+ njs_int_t ret;
+ njs_object_prop_t *prop;
+ njs_lvlhsh_query_t lhq;
+
+ njs_assert(njs_is_string(value));
+
+ lhq.key.start = value->string.data->start;
+ lhq.key.length = value->string.data->size;
+ lhq.key_hash = hash;
+ lhq.proto = &njs_lexer_hash_proto;
+
+ ret = njs_lvlhsh_find(vm->atom_hash_current, &lhq);
+ if (ret == NJS_OK) {
+ return njs_prop_value(lhq.value);
+ }
+
+ ret = njs_lvlhsh_find(&vm->atom_hash_shared, &lhq);
+ if (ret == NJS_OK) {
+ return njs_prop_value(lhq.value);
+ }
- lhq.value = entry;
lhq.pool = vm->mem_pool;
ret = njs_lvlhsh_insert(vm->atom_hash_current, &lhq);
@@ -126,7 +158,19 @@ njs_atom_find_or_add(njs_vm_t *vm, u_char *key, size_t size, size_t length,
return NULL;
}
- return entry;
+ prop = lhq.value;
+
+ prop->u.value = *value;
+
+ prop->u.value.string.atom_id = vm->atom_id_generator++;
+ if (njs_atom_is_number(prop->u.value.string.atom_id)) {
+ njs_internal_error(vm, "too many atoms");
+ return NULL;
+ }
+
+ prop->u.value.string.token_type = NJS_KEYWORD_TYPE_UNDEF;
+
+ return &prop->u.value;
}
@@ -190,7 +234,6 @@ njs_atom_hash_init(njs_vm_t *vm)
if (value->type == NJS_SYMBOL) {
lhq.key_hash = value->string.atom_id;
- lhq.value = (void *) value;
ret = njs_flathsh_insert(&vm->atom_hash_shared, &lhq);
if (njs_slow_path(ret != NJS_OK)) {
@@ -206,7 +249,6 @@ njs_atom_hash_init(njs_vm_t *vm)
lhq.key_hash = njs_djb_hash(start, len);
lhq.key.length = len;
lhq.key.start = start;
- lhq.value = (void *) value;
ret = njs_flathsh_insert(&vm->atom_hash_shared, &lhq);
if (njs_slow_path(ret != NJS_OK)) {
@@ -214,6 +256,8 @@ njs_atom_hash_init(njs_vm_t *vm)
return 0xffffffff;
}
}
+
+ *njs_prop_value(lhq.value) = *value;
}
vm->atom_hash_current = &vm->atom_hash_shared;
@@ -247,10 +291,7 @@ njs_atom_atomize_key(njs_vm_t *vm, njs_value_t *value)
hash_id = njs_djb_hash(value->string.data->start,
value->string.data->size);
- entry = njs_atom_find_or_add(vm, value->string.data->start,
- value->string.data->size,
- value->string.data->length,
- hash_id);
+ entry = njs_atom_find_or_add_string(vm, value, hash_id);
if (njs_slow_path(entry == NULL)) {
return NJS_ERROR;
}
@@ -320,13 +361,14 @@ njs_atom_symbol_add(njs_vm_t *vm, njs_value_t *value)
if (value->type == NJS_SYMBOL) {
lhq.key_hash = value->atom_id;
- lhq.value = (void *) value;
ret = njs_flathsh_insert(vm->atom_hash_current, &lhq);
if (njs_slow_path(ret != NJS_OK)) {
njs_internal_error(vm, "flathsh insert/replace failed");
return NJS_ERROR;
}
+
+ *njs_prop_value(lhq.value) = *value;
}
return NJS_OK;