@@ -82,7 +82,7 @@ njs_atom_find_or_add(njs_vm_t *vm, u_char *key, size_t size, size_t length,
8282 uint32_t hash )
8383{
8484 njs_int_t ret ;
85- njs_value_t * entry ;
85+ njs_object_prop_t * prop ;
8686 njs_lvlhsh_query_t lhq ;
8787
8888 lhq .key .start = key ;
@@ -92,41 +92,85 @@ njs_atom_find_or_add(njs_vm_t *vm, u_char *key, size_t size, size_t length,
9292
9393 ret = njs_lvlhsh_find (vm -> atom_hash_current , & lhq );
9494 if (ret == NJS_OK ) {
95- return lhq .value ;
95+ return njs_prop_value ( lhq .value ) ;
9696 }
9797
9898 ret = njs_lvlhsh_find (& vm -> atom_hash_shared , & lhq );
9999 if (ret == NJS_OK ) {
100- return lhq .value ;
100+ return njs_prop_value ( lhq .value ) ;
101101 }
102102
103- entry = njs_mp_alloc (vm -> mem_pool , sizeof (njs_value_t ));
104- if (njs_slow_path (entry == NULL )) {
103+ lhq .pool = vm -> mem_pool ;
104+
105+ ret = njs_lvlhsh_insert (vm -> atom_hash_current , & lhq );
106+ if (njs_slow_path (ret != NJS_OK )) {
105107 return NULL ;
106108 }
107109
108- ret = njs_string_create (vm , entry , key , size );
110+ prop = lhq .value ;
111+
112+ ret = njs_string_create (vm , & prop -> u .value , key , size );
109113 if (njs_slow_path (ret != NJS_OK )) {
110114 return NULL ;
111115 }
112116
113- entry -> string .atom_id = vm -> atom_id_generator ++ ;
114- if (njs_atom_is_number (entry -> string .atom_id )) {
117+ prop -> u . value . string .atom_id = vm -> atom_id_generator ++ ;
118+ if (njs_atom_is_number (prop -> u . value . string .atom_id )) {
115119 njs_internal_error (vm , "too many atoms" );
116120 return NULL ;
117121 }
118122
119- entry -> string .token_type = NJS_KEYWORD_TYPE_UNDEF ;
123+ prop -> u .value .string .token_type = NJS_KEYWORD_TYPE_UNDEF ;
124+
125+ return & prop -> u .value ;
126+ }
127+
128+
129+ static njs_value_t *
130+ njs_atom_find_or_add_string (njs_vm_t * vm , njs_value_t * value ,
131+ uint32_t hash )
132+ {
133+ njs_int_t ret ;
134+ njs_object_prop_t * prop ;
135+ njs_lvlhsh_query_t lhq ;
136+
137+ njs_assert (njs_is_string (value ));
138+
139+ lhq .key .start = value -> string .data -> start ;
140+ lhq .key .length = value -> string .data -> size ;
141+ lhq .key_hash = hash ;
142+ lhq .proto = & njs_lexer_hash_proto ;
143+
144+ ret = njs_lvlhsh_find (vm -> atom_hash_current , & lhq );
145+ if (ret == NJS_OK ) {
146+ return njs_prop_value (lhq .value );
147+ }
148+
149+ ret = njs_lvlhsh_find (& vm -> atom_hash_shared , & lhq );
150+ if (ret == NJS_OK ) {
151+ return njs_prop_value (lhq .value );
152+ }
120153
121- lhq .value = entry ;
122154 lhq .pool = vm -> mem_pool ;
123155
124156 ret = njs_lvlhsh_insert (vm -> atom_hash_current , & lhq );
125157 if (njs_slow_path (ret != NJS_OK )) {
126158 return NULL ;
127159 }
128160
129- return entry ;
161+ prop = lhq .value ;
162+
163+ prop -> u .value = * value ;
164+
165+ prop -> u .value .string .atom_id = vm -> atom_id_generator ++ ;
166+ if (njs_atom_is_number (prop -> u .value .string .atom_id )) {
167+ njs_internal_error (vm , "too many atoms" );
168+ return NULL ;
169+ }
170+
171+ prop -> u .value .string .token_type = NJS_KEYWORD_TYPE_UNDEF ;
172+
173+ return & prop -> u .value ;
130174}
131175
132176
@@ -190,7 +234,6 @@ njs_atom_hash_init(njs_vm_t *vm)
190234
191235 if (value -> type == NJS_SYMBOL ) {
192236 lhq .key_hash = value -> string .atom_id ;
193- lhq .value = (void * ) value ;
194237
195238 ret = njs_flathsh_insert (& vm -> atom_hash_shared , & lhq );
196239 if (njs_slow_path (ret != NJS_OK )) {
@@ -206,14 +249,15 @@ njs_atom_hash_init(njs_vm_t *vm)
206249 lhq .key_hash = njs_djb_hash (start , len );
207250 lhq .key .length = len ;
208251 lhq .key .start = start ;
209- lhq .value = (void * ) value ;
210252
211253 ret = njs_flathsh_insert (& vm -> atom_hash_shared , & lhq );
212254 if (njs_slow_path (ret != NJS_OK )) {
213255 njs_internal_error (vm , "flathsh insert/replace failed" );
214256 return 0xffffffff ;
215257 }
216258 }
259+
260+ * njs_prop_value (lhq .value ) = * value ;
217261 }
218262
219263 vm -> atom_hash_current = & vm -> atom_hash_shared ;
@@ -247,10 +291,7 @@ njs_atom_atomize_key(njs_vm_t *vm, njs_value_t *value)
247291 hash_id = njs_djb_hash (value -> string .data -> start ,
248292 value -> string .data -> size );
249293
250- entry = njs_atom_find_or_add (vm , value -> string .data -> start ,
251- value -> string .data -> size ,
252- value -> string .data -> length ,
253- hash_id );
294+ entry = njs_atom_find_or_add_string (vm , value , hash_id );
254295 if (njs_slow_path (entry == NULL )) {
255296 return NJS_ERROR ;
256297 }
@@ -320,13 +361,14 @@ njs_atom_symbol_add(njs_vm_t *vm, njs_value_t *value)
320361
321362 if (value -> type == NJS_SYMBOL ) {
322363 lhq .key_hash = value -> atom_id ;
323- lhq .value = (void * ) value ;
324364
325365 ret = njs_flathsh_insert (vm -> atom_hash_current , & lhq );
326366 if (njs_slow_path (ret != NJS_OK )) {
327367 njs_internal_error (vm , "flathsh insert/replace failed" );
328368 return NJS_ERROR ;
329369 }
370+
371+ * njs_prop_value (lhq .value ) = * value ;
330372 }
331373
332374 return NJS_OK ;
0 commit comments