]> git.kaiwu.me - njs.git/commitdiff
Refactored atom hash into orthogonal find and add operations.
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 17 Feb 2026 00:16:12 +0000 (16:16 -0800)
committerDmitry Volyntsev <xeioexception@gmail.com>
Tue, 24 Feb 2026 16:16:21 +0000 (08:16 -0800)
Previously, njs_atom_find_or_add() and njs_atom_find_or_add_string()
duplicated the lookup logic and coupled find with insert. Splitting
them into njs_atom_find() and njs_atom_add() separates concerns:
find does a pure lookup with raw bytes, add inserts a pre-built value.

src/njs_atom.c
src/njs_atom.h
src/njs_lexer.c

index 45733f45589470103aab857cd4a28ba5b06a1085..c84410d282357aebc6a902330bcb740b4157d71a 100644 (file)
@@ -76,11 +76,9 @@ njs_lexer_hash_test(njs_flathsh_query_t *fhq, void *data)
 
 
 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;
@@ -98,35 +96,12 @@ njs_atom_find_or_add(njs_vm_t *vm, u_char *key, size_t size, size_t length,
         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;
@@ -138,17 +113,6 @@ njs_atom_find_or_add_string(njs_vm_t *vm, njs_value_t *value,
     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);
@@ -289,9 +253,13 @@ 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_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;
@@ -316,12 +284,14 @@ njs_atom_atomize_key(njs_vm_t *vm, njs_value_t *value)
                 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;
index 12bb0e54e92b42ab63b920ab0534fc9cf7646418..33b57cf651d38a71194d68311e035c62dfd04513 100644 (file)
@@ -21,8 +21,9 @@ enum {
 
 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
index 932f701ed3264b183be9ea27464e9c173fccda66..7827aa0cade4ebe97a951ff5f8f01537f8791a99 100644 (file)
@@ -695,6 +695,8 @@ njs_lexer_word(njs_lexer_t *lexer, njs_lexer_token_t *token)
 {
     u_char             *p, c;
     uint32_t           hash_id;
+    njs_int_t          ret;
+    njs_value_t        value;
     const njs_value_t  *entry;
 
     /* TODO: UTF-8 */
@@ -734,11 +736,19 @@ njs_lexer_word(njs_lexer_t *lexer, njs_lexer_token_t *token)
     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) {