njs_value_t *
-njs_atom_find_or_add(njs_vm_t *vm, u_char *key, size_t size, size_t length,
- uint32_t hash)
+njs_atom_find(njs_vm_t *vm, u_char *key, size_t size, uint32_t hash)
{
njs_int_t ret;
- njs_object_prop_t *prop;
njs_flathsh_query_t fhq;
fhq.key.start = key;
return njs_prop_value(fhq.value);
}
- fhq.pool = vm->mem_pool;
-
- ret = njs_flathsh_insert(vm->atom_hash_current, &fhq);
- if (njs_slow_path(ret != NJS_OK)) {
- return NULL;
- }
-
- prop = fhq.value;
-
- ret = njs_string_create(vm, &prop->u.value, key, size);
- if (njs_slow_path(ret != NJS_OK)) {
- return NULL;
- }
-
- 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;
+ return NULL;
}
-static njs_value_t *
-njs_atom_find_or_add_string(njs_vm_t *vm, njs_value_t *value,
- uint32_t hash)
+njs_value_t *
+njs_atom_add(njs_vm_t *vm, njs_value_t *value, uint32_t hash)
{
njs_int_t ret;
njs_object_prop_t *prop;
fhq.key.length = value->string.data->size;
fhq.key_hash = hash;
fhq.proto = &njs_lexer_hash_proto;
-
- ret = njs_flathsh_find(vm->atom_hash_current, &fhq);
- if (ret == NJS_OK) {
- return njs_prop_value(fhq.value);
- }
-
- ret = njs_flathsh_find(&vm->atom_hash_shared, &fhq);
- if (ret == NJS_OK) {
- return njs_prop_value(fhq.value);;
- }
-
fhq.pool = vm->mem_pool;
ret = njs_flathsh_insert(vm->atom_hash_current, &fhq);
hash_id = njs_djb_hash(value->string.data->start,
value->string.data->size);
- entry = njs_atom_find_or_add_string(vm, value, hash_id);
- if (njs_slow_path(entry == NULL)) {
- return NJS_ERROR;
+ entry = njs_atom_find(vm, value->string.data->start,
+ value->string.data->size, hash_id);
+ if (entry == NULL) {
+ entry = njs_atom_add(vm, value, hash_id);
+ if (njs_slow_path(entry == NULL)) {
+ return NJS_ERROR;
+ }
}
*value = *entry;
hash_id = njs_djb_hash(val_str.string.data->start,
val_str.string.data->size);
- entry = njs_atom_find_or_add(vm, val_str.string.data->start,
- val_str.string.data->size,
- val_str.string.data->length,
- hash_id);
- if (njs_slow_path(entry == NULL)) {
- return NJS_ERROR;
+ entry = njs_atom_find(vm, val_str.string.data->start,
+ val_str.string.data->size,
+ hash_id);
+ if (entry == NULL) {
+ entry = njs_atom_add(vm, &val_str, hash_id);
+ if (njs_slow_path(entry == NULL)) {
+ return NJS_ERROR;
+ }
}
value->atom_id = entry->atom_id;
uint32_t njs_atom_hash_init(njs_vm_t *vm);
njs_int_t njs_atom_symbol_add(njs_vm_t *vm, njs_value_t *value);
-njs_value_t *njs_atom_find_or_add(njs_vm_t *vm, u_char *key, size_t size,
- size_t length, uint32_t hash);
+njs_value_t *njs_atom_find(njs_vm_t *vm, u_char *key, size_t size,
+ uint32_t hash);
+njs_value_t *njs_atom_add(njs_vm_t *vm, njs_value_t *value, uint32_t hash);
njs_inline njs_int_t
{
u_char *p, c;
uint32_t hash_id;
+ njs_int_t ret;
+ njs_value_t value;
const njs_value_t *entry;
/* TODO: UTF-8 */
token->text.length = p - token->text.start;
lexer->start = p;
- entry = njs_atom_find_or_add(lexer->vm, token->text.start,
- token->text.length, token->text.length,
- hash_id);
- if (njs_slow_path(entry == NULL)) {
- return NJS_ERROR;
+ entry = njs_atom_find(lexer->vm, token->text.start, token->text.length,
+ hash_id);
+ if (entry == NULL) {
+ ret = njs_string_create(lexer->vm, &value, token->text.start,
+ token->text.length);
+ if (njs_slow_path(ret != NJS_OK)) {
+ return NJS_ERROR;
+ }
+
+ entry = njs_atom_add(lexer->vm, &value, hash_id);
+ if (njs_slow_path(entry == NULL)) {
+ return NJS_ERROR;
+ }
}
if (entry->string.token_type == NJS_KEYWORD_TYPE_UNDEF) {