]> git.kaiwu.me - njs.git/commitdiff
Parser: reduce variable reference payload
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 3 Sep 2026 00:39:41 +0000 (17:39 -0700)
committerDmitry Volyntsev <xeioexception@gmail.com>
Thu, 10 Sep 2026 03:11:04 +0000 (20:11 -0700)
Store the atom identifier and resolved variable directly in parser nodes and
move the undefined-reference flag into the common node flags.  This removes the
separately allocated reference object and helps reduce parser nodes to the
64-byte memory-pool class.

src/njs_generator.c
src/njs_parser.c
src/njs_parser.h
src/njs_variable.c
src/njs_variable.h

index 54e3eca4a91d8e172ec9c96ec0c88e1a314b751c..dd6b7111ead37c75178bd19e247f38aa824ddd81 100644 (file)
@@ -6360,7 +6360,9 @@ njs_generate_reference_error(njs_vm_t *vm, njs_generator_t *generator,
     njs_str_t           entry;
     njs_vmcode_error_t  *ref_err;
 
-    if (njs_slow_path(!node->u.reference.not_defined)) {
+    entry = njs_str_value("unknown");
+
+    if (njs_slow_path(!node->not_defined)) {
         njs_internal_error(vm, "variable is not defined but not_defined "
                                "is not set");
         return NJS_ERROR;
index 66d105e9cbfb4adba27bcead86b618bf7bfee2a9..a278824b5729bef2559427a2e3acfa47fd685548 100644 (file)
@@ -3696,10 +3696,6 @@ njs_parser_unary_expression_next(njs_parser_t *parser,
         }
     }
 
-    if (type == NJS_TOKEN_TYPEOF && node->token_type == NJS_TOKEN_NAME) {
-        node->u.reference.type = NJS_TYPEOF;
-    }
-
     parser->target->left = parser->node;
     parser->target->left->dest = parser->target;
     parser->node = parser->target;
@@ -8986,7 +8982,6 @@ njs_parser_variable_reference(njs_parser_t *parser, njs_parser_scope_t *scope,
     vr = &node->u.reference;
 
     vr->atom_id = atom_id;
-    vr->type = type;
 
     parse_node.key = atom_id;
 
index 1a5cd013530dc8a912d4ca2941a92e4b93572226..da52dfb2717958c8b50171647d5501b32e1c5104 100644 (file)
@@ -40,6 +40,7 @@ struct njs_parser_node_s {
     uint8_t                         ctor:1;
     uint8_t                         hoist:1;
     uint8_t                         array_flat:1;
+    uint8_t                         not_defined:1;
     uint8_t                         temporary;    /* 1 bit  */
     uint32_t                        token_line;
 
index 7fcaed46272acb51d3066258fa69b2b21fc3e2d2..50b139507ebdd02a07a1686fe12d37e904ea4fd4 100644 (file)
@@ -514,14 +514,13 @@ njs_variable_reference(njs_vm_t *vm, njs_parser_node_t *node)
     if (ref->variable == NULL) {
         ref->variable = njs_variable_resolve(vm, node);
         if (njs_slow_path(ref->variable == NULL)) {
-            ref->not_defined = 1;
+            node->not_defined = 1;
 
             return NULL;
         }
     }
 
     closure = njs_variable_closure_test(node->scope, ref->variable->scope);
-    ref->scope = node->scope;
 
     ref_node.key = ref->atom_id;
 
index db40de752d0a00d4af52e5e2d185811324b4f6c8..be1eec68eb9b734c9b70fa0e7bdb71c6066e39d6 100644 (file)
@@ -43,11 +43,8 @@ typedef enum {
 
 
 typedef struct {
-    njs_reference_type_t  type;
     uintptr_t             atom_id;
     njs_variable_t        *variable;
-    njs_parser_scope_t    *scope;
-    njs_bool_t            not_defined;
 } njs_variable_reference_t;