Skip to content

Commit 1344303

Browse files
Use atom_hash* instead of keywords_hash in the code, atoms not used yet.
1 parent 7efc4f8 commit 1344303

File tree

11 files changed

+106
-165
lines changed

11 files changed

+106
-165
lines changed

auto/sources

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ NJS_LIB_SRCS=" \
2323
src/njs_vm.c \
2424
src/njs_vmcode.c \
2525
src/njs_lexer.c \
26-
src/njs_lexer_keyword.c \
2726
src/njs_parser.c \
2827
src/njs_variable.c \
2928
src/njs_scope.c \

src/njs_builtin.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,14 +126,12 @@ njs_builtin_objects_create(njs_vm_t *vm, njs_vm_t *vm_parent)
126126

127127
vm->shared = shared;
128128

129-
njs_lvlhsh_init(&shared->keywords_hash);
130-
131129
njs_lvlhsh_init(&shared->values_hash);
132130

133131
njs_atom_hash_init();
134132

135133
if (vm_parent == NULL) {
136-
/* njs_lvlhsh_init(&vm->atom_hash_shared); // done by zalign */
134+
/* njs_lvlhsh_init(&vm->atom_hash_shared); done by zalign. */
137135

138136
ret = njs_flathsh_alloc_copy(vm->mem_pool, &vm->atom_hash,
139137
&njs_atom_hash);
@@ -765,14 +763,25 @@ njs_global_this_prop_handler(njs_vm_t *vm, njs_object_prop_t *prop,
765763
lhq.key_hash = njs_djb_hash(lhq.key.start, lhq.key.length);
766764
lhq.proto = &njs_lexer_hash_proto;
767765

768-
ret = njs_lvlhsh_find(&vm->shared->keywords_hash, &lhq);
766+
ret = njs_lvlhsh_find(&vm->atom_hash, &lhq);
769767

770768
if (njs_slow_path(ret != NJS_OK || lhq.value == NULL)) {
771-
return NJS_DECLINED;
769+
ret = njs_lvlhsh_find(&vm->atom_hash_shared, &lhq);
770+
if (njs_slow_path(ret != NJS_OK || lhq.value == NULL)) {
771+
return NJS_DECLINED;
772+
}
772773
}
773774

774775
var_node.key = (uintptr_t) lhq.value;
775776

777+
if (njs_slow_path(lhq.value == &njs_atom.vs_this)) {
778+
return NJS_DECLINED;
779+
}
780+
781+
if (njs_slow_path(vm->global_scope == NULL)) {
782+
return NJS_DECLINED;
783+
}
784+
776785
rb_node = njs_rbtree_find(&vm->global_scope->variables, &var_node.node);
777786
if (rb_node == NULL) {
778787
return NJS_DECLINED;

src/njs_function.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1068,7 +1068,7 @@ njs_function_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
10681068
file = njs_str_value("runtime");
10691069

10701070
ret = njs_parser_init(vm, &parser, NULL, &file, str.start,
1071-
str.start + str.length, 1);
1071+
str.start + str.length);
10721072
if (njs_slow_path(ret != NJS_OK)) {
10731073
return ret;
10741074
}

src/njs_generator.c

Lines changed: 18 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,7 +1066,6 @@ njs_generate_var_statement_after(njs_vm_t *vm, njs_generator_t *generator,
10661066
njs_variable_t *var;
10671067
njs_parser_node_t *lvalue, *expr;
10681068
njs_vmcode_move_t *move;
1069-
const njs_lexer_entry_t *lex_entry;
10701069

10711070
lvalue = node->left;
10721071
expr = node->right;
@@ -1093,19 +1092,17 @@ njs_generate_var_statement_after(njs_vm_t *vm, njs_generator_t *generator,
10931092
node->index = expr->index;
10941093
node->temporary = expr->temporary;
10951094

1096-
if ((expr->token_type == NJS_TOKEN_FUNCTION_EXPRESSION
1095+
if (expr->token_type == NJS_TOKEN_FUNCTION_EXPRESSION
10971096
|| expr->token_type == NJS_TOKEN_ASYNC_FUNCTION_EXPRESSION)
1098-
&& njs_values_same(&expr->u.value.data.u.lambda->name, &njs_atom.vs_))
10991097
{
1100-
lex_entry = njs_lexer_entry(node->left->u.reference.unique_id);
1101-
if (njs_slow_path(lex_entry == NULL)) {
1098+
ret = njs_values_same(&expr->u.value.data.u.lambda->name,
1099+
(njs_value_t *)&njs_atom.vs_); /* empty string */
1100+
if (njs_slow_path(ret < 0)) {
11021101
return NJS_ERROR;
11031102
}
1104-
1105-
ret = njs_string_create(vm, &expr->u.value.data.u.lambda->name,
1106-
lex_entry->name.start, lex_entry->name.length);
1107-
if (njs_slow_path(ret != NJS_OK)) {
1108-
return NJS_ERROR;
1103+
if (ret) {
1104+
expr->u.value.data.u.lambda->name =
1105+
*((njs_value_t *)node->left->u.reference.unique_id);
11091106
}
11101107
}
11111108

@@ -3022,11 +3019,9 @@ static njs_int_t
30223019
njs_generate_global_property_set(njs_vm_t *vm, njs_generator_t *generator,
30233020
njs_parser_node_t *node_dst, njs_parser_node_t *node_src)
30243021
{
3025-
njs_int_t ret;
30263022
njs_value_t property;
30273023
njs_variable_t *var;
30283024
njs_vmcode_prop_set_t *prop_set;
3029-
const njs_lexer_entry_t *lex_entry;
30303025

30313026
var = njs_variable_reference(vm, node_dst);
30323027
if (var == NULL) {
@@ -3036,16 +3031,7 @@ njs_generate_global_property_set(njs_vm_t *vm, njs_generator_t *generator,
30363031
prop_set->value = node_dst->index;
30373032
prop_set->object = njs_scope_global_this_index();
30383033

3039-
lex_entry = njs_lexer_entry(node_dst->u.reference.unique_id);
3040-
if (njs_slow_path(lex_entry == NULL)) {
3041-
return NJS_ERROR;
3042-
}
3043-
3044-
ret = njs_string_create(vm, &property, lex_entry->name.start,
3045-
lex_entry->name.length);
3046-
if (njs_slow_path(ret != NJS_OK)) {
3047-
return NJS_ERROR;
3048-
}
3034+
property = *((njs_value_t *)node_dst->u.reference.unique_id);
30493035

30503036
prop_set->property = njs_scope_global_index(vm, &property,
30513037
generator->runtime);
@@ -3631,7 +3617,8 @@ njs_generate_function_expression(njs_vm_t *vm, njs_generator_t *generator,
36313617
njs_variable_t *var;
36323618
njs_function_lambda_t *lambda;
36333619
njs_vmcode_function_t *function;
3634-
const njs_lexer_entry_t *lex_entry;
3620+
njs_lexer_entry_t lex_entr;
3621+
njs_lexer_entry_t *lex_entry = &lex_entr;
36353622

36363623
var = njs_variable_reference(vm, node->left);
36373624
if (njs_slow_path(var == NULL)) {
@@ -3645,10 +3632,7 @@ njs_generate_function_expression(njs_vm_t *vm, njs_generator_t *generator,
36453632

36463633
lambda = node->u.value.data.u.lambda;
36473634

3648-
lex_entry = njs_lexer_entry(var->unique_id);
3649-
if (njs_slow_path(lex_entry == NULL)) {
3650-
return NJS_ERROR;
3651-
}
3635+
njs_lexer_entry(var->unique_id, lex_entry);
36523636

36533637
ret = njs_generate_function_scope(vm, generator, lambda, node,
36543638
&lex_entry->name);
@@ -4192,7 +4176,8 @@ njs_generate_function_declaration(njs_vm_t *vm, njs_generator_t *generator,
41924176
njs_variable_t *var;
41934177
njs_function_t *function;
41944178
njs_function_lambda_t *lambda;
4195-
const njs_lexer_entry_t *lex_entry;
4179+
njs_lexer_entry_t lex_entr;
4180+
njs_lexer_entry_t *lex_entry = &lex_entr;
41964181

41974182
var = njs_variable_reference(vm, node);
41984183
if (njs_slow_path(var == NULL)) {
@@ -4206,10 +4191,7 @@ njs_generate_function_declaration(njs_vm_t *vm, njs_generator_t *generator,
42064191

42074192
lambda = njs_variable_lambda(var);
42084193

4209-
lex_entry = njs_lexer_entry(node->u.reference.unique_id);
4210-
if (njs_slow_path(lex_entry == NULL)) {
4211-
return NJS_ERROR;
4212-
}
4194+
njs_lexer_entry(node->u.reference.unique_id, lex_entry);
42134195

42144196
ret = njs_string_create(vm, &lambda->name, lex_entry->name.start,
42154197
lex_entry->name.length);
@@ -5387,11 +5369,9 @@ static njs_int_t
53875369
njs_generate_global_reference(njs_vm_t *vm, njs_generator_t *generator,
53885370
njs_parser_node_t *node, njs_bool_t exception)
53895371
{
5390-
njs_int_t ret;
53915372
njs_index_t index;
53925373
njs_value_t property;
53935374
njs_vmcode_prop_get_t *prop_get;
5394-
const njs_lexer_entry_t *lex_entry;
53955375

53965376
index = njs_generate_temp_index_get(vm, generator, node);
53975377
if (njs_slow_path(index == NJS_INDEX_ERROR)) {
@@ -5409,16 +5389,7 @@ njs_generate_global_reference(njs_vm_t *vm, njs_generator_t *generator,
54095389
return NJS_ERROR;
54105390
}
54115391

5412-
lex_entry = njs_lexer_entry(node->u.reference.unique_id);
5413-
if (njs_slow_path(lex_entry == NULL)) {
5414-
return NJS_ERROR;
5415-
}
5416-
5417-
ret = njs_string_create(vm, &property, lex_entry->name.start,
5418-
lex_entry->name.length);
5419-
if (njs_slow_path(ret != NJS_OK)) {
5420-
return NJS_ERROR;
5421-
}
5392+
property = *((njs_value_t *)node->u.reference.unique_id);
54225393

54235394
prop_get->property = njs_scope_global_index(vm, &property,
54245395
generator->runtime);
@@ -5441,7 +5412,8 @@ njs_generate_reference_error(njs_vm_t *vm, njs_generator_t *generator,
54415412
njs_parser_node_t *node)
54425413
{
54435414
njs_vmcode_error_t *ref_err;
5444-
const njs_lexer_entry_t *lex_entry;
5415+
njs_lexer_entry_t lex_entr;
5416+
njs_lexer_entry_t *lex_entry = &lex_entr;
54455417

54465418
if (njs_slow_path(!node->u.reference.not_defined)) {
54475419
njs_internal_error(vm, "variable is not defined but not_defined "
@@ -5453,10 +5425,7 @@ njs_generate_reference_error(njs_vm_t *vm, njs_generator_t *generator,
54535425
NULL);
54545426

54555427
ref_err->type = NJS_OBJ_TYPE_REF_ERROR;
5456-
lex_entry = njs_lexer_entry(node->u.reference.unique_id);
5457-
if (njs_slow_path(lex_entry == NULL)) {
5458-
return NJS_ERROR;
5459-
}
5428+
njs_lexer_entry(node->u.reference.unique_id, lex_entry);
54605429

54615430
return njs_name_copy(vm, &ref_err->u.name, &lex_entry->name);
54625431
}

src/njs_lexer.c

Lines changed: 45 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -290,21 +290,15 @@ static const njs_lexer_multi_t njs_assignment_token[] = {
290290

291291
njs_int_t
292292
njs_lexer_init(njs_vm_t *vm, njs_lexer_t *lexer, njs_str_t *file,
293-
u_char *start, u_char *end, njs_uint_t runtime,
294-
njs_int_t init_lexer_memory)
293+
u_char *start, u_char *end)
295294
{
296-
if (init_lexer_memory) {
297-
njs_memzero(lexer, sizeof(njs_lexer_t));
298-
299-
}
300-
301295
lexer->file = *file;
302296
lexer->start = start;
303297
lexer->end = end;
304298
lexer->line = 1;
305-
lexer->keywords_hash = (runtime) ? &vm->keywords_hash
306-
: &vm->shared->keywords_hash;
307-
lexer->mem_pool = vm->mem_pool;
299+
300+
lexer->mem_pool = vm->atom_hash_mem_pool;
301+
lexer->vm = vm;
308302

309303
njs_queue_init(&lexer->preread);
310304

@@ -712,26 +706,33 @@ njs_lexer_make_token(njs_lexer_t *lexer, njs_lexer_token_t *token)
712706
static njs_int_t
713707
njs_lexer_hash_test(njs_lvlhsh_query_t *lhq, void *data)
714708
{
715-
njs_lexer_entry_t *entry;
709+
u_char *start;
710+
njs_value_t *name;
711+
712+
name = data;
716713

717-
entry = data;
714+
/* string. */
718715

719-
if (entry->name.length == lhq->key.length
720-
&& memcmp(entry->name.start, lhq->key.start, lhq->key.length) == 0)
721-
{
716+
if (lhq->key.length != name->string.data->size) {
717+
return NJS_DECLINED;
718+
}
719+
720+
start = name->string.data->start;
721+
722+
if (memcmp(start, lhq->key.start, lhq->key.length) == 0) {
722723
return NJS_OK;
723724
}
724725

725726
return NJS_DECLINED;
726727
}
727728

728729

729-
static njs_lexer_entry_t *
730-
njs_lexer_keyword_find(njs_lexer_t *lexer, u_char *key, size_t length,
730+
static njs_value_t *
731+
njs_lexer_keyword_find(njs_vm_t *vm, u_char *key, size_t size, size_t length,
731732
uint32_t hash)
732733
{
733734
njs_int_t ret;
734-
njs_lexer_entry_t *entry;
735+
njs_value_t *entry;
735736
njs_lvlhsh_query_t lhq;
736737

737738
lhq.key.start = key;
@@ -740,30 +741,36 @@ njs_lexer_keyword_find(njs_lexer_t *lexer, u_char *key, size_t length,
740741
lhq.key_hash = hash;
741742
lhq.proto = &njs_lexer_hash_proto;
742743

743-
ret = njs_lvlhsh_find(lexer->keywords_hash, &lhq);
744+
ret = njs_lvlhsh_find(&vm->atom_hash, &lhq);
745+
if (ret == NJS_OK) {
746+
return lhq.value;
747+
}
748+
749+
ret = njs_lvlhsh_find(&vm->atom_hash_shared, &lhq);
744750
if (ret == NJS_OK) {
745751
return lhq.value;
746752
}
747753

748-
entry = njs_mp_alloc(lexer->mem_pool, sizeof(njs_lexer_entry_t));
754+
entry = njs_mp_alloc(vm->atom_hash_mem_pool, sizeof(njs_value_t));
749755
if (njs_slow_path(entry == NULL)) {
750756
return NULL;
751757
}
752758

753-
entry->name.start = njs_mp_alloc(lexer->mem_pool, length + 1);
754-
if (njs_slow_path(entry->name.start == NULL)) {
759+
ret = njs_string_create(vm, entry, key, length);
760+
if (njs_slow_path(ret != NJS_OK)) {
755761
return NULL;
756762
}
757763

758-
memcpy(entry->name.start, key, length);
759-
760-
entry->name.start[length] = '\0';
761-
entry->name.length = length;
764+
entry->string.atom_id = vm->atom_hash_atom_id++;
765+
if (entry->string.atom_id == 0) {
766+
return NULL;
767+
}
768+
entry->string.token_type = 0;
762769

763770
lhq.value = entry;
764-
lhq.pool = lexer->mem_pool;
771+
lhq.pool = vm->atom_hash_mem_pool;
765772

766-
ret = njs_lvlhsh_insert(lexer->keywords_hash, &lhq);
773+
ret = njs_lvlhsh_insert(&vm->atom_hash, &lhq);
767774
if (njs_slow_path(ret != NJS_OK)) {
768775
return NULL;
769776
}
@@ -777,8 +784,7 @@ njs_lexer_word(njs_lexer_t *lexer, njs_lexer_token_t *token)
777784
{
778785
u_char *p, c;
779786
uint32_t hash_id;
780-
const njs_lexer_entry_t *entry;
781-
const njs_lexer_keyword_entry_t *key_entry;
787+
const njs_value_t *entry;
782788

783789
/* TODO: UTF-8 */
784790

@@ -817,24 +823,20 @@ njs_lexer_word(njs_lexer_t *lexer, njs_lexer_token_t *token)
817823
token->text.length = p - token->text.start;
818824
lexer->start = p;
819825

820-
key_entry = njs_lexer_keyword(token->text.start, token->text.length);
821-
822-
if (key_entry == NULL) {
823-
entry = njs_lexer_keyword_find(lexer, token->text.start,
824-
token->text.length, hash_id);
825-
if (njs_slow_path(entry == NULL)) {
826-
return NJS_ERROR;
827-
}
826+
entry = njs_lexer_keyword_find(lexer->vm, token->text.start,
827+
token->text.length, token->text.length,
828+
hash_id);
829+
if (njs_slow_path(entry == NULL)) {
830+
return NJS_ERROR;
831+
}
828832

833+
if (entry->string.token_type == 0) {
829834
token->type = NJS_TOKEN_NAME;
830835
token->keyword_type = NJS_KEYWORD_TYPE_UNDEF;
831836

832837
} else {
833-
entry = &key_entry->value->entry;
834-
token->type = key_entry->value->type;
835-
836-
token->keyword_type = NJS_KEYWORD_TYPE_KEYWORD;
837-
token->keyword_type |= key_entry->value->reserved;
838+
token->type = entry->string.token_id;
839+
token->keyword_type = entry->string.token_type;
838840
}
839841

840842
token->unique_id = (uintptr_t) entry;

0 commit comments

Comments
 (0)