]> git.kaiwu.me - njs.git/commitdiff
Introduced njs_parser_init().
authorDmitry Volyntsev <xeioex@nginx.com>
Mon, 14 Feb 2022 14:10:59 +0000 (14:10 +0000)
committerDmitry Volyntsev <xeioex@nginx.com>
Mon, 14 Feb 2022 14:10:59 +0000 (14:10 +0000)
src/njs_function.c
src/njs_parser.c
src/njs_parser.h
src/njs_vm.c

index b891c5f1d95b0664427f16252b97c8ef1609df75..c07f55c4cdf04d1bac0eaa14b52d8bbe6c7b8789 100644 (file)
@@ -1103,7 +1103,6 @@ njs_function_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_int_t               ret;
     njs_str_t               str, file;
     njs_uint_t              i;
-    njs_lexer_t             lexer;
     njs_parser_t            parser;
     njs_vm_code_t           *code;
     njs_function_t          *function;
@@ -1171,16 +1170,12 @@ njs_function_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
 
     file = njs_str_value("runtime");
 
-    ret = njs_lexer_init(vm, &lexer, &file, str.start, str.start + str.length,
-                         1);
+    ret = njs_parser_init(vm, &parser, NULL, &file, str.start,
+                          str.start + str.length, 1);
     if (njs_slow_path(ret != NJS_OK)) {
         return ret;
     }
 
-    njs_memzero(&parser, sizeof(njs_parser_t));
-
-    parser.lexer = &lexer;
-
     ret = njs_parser(vm, &parser);
     if (njs_slow_path(ret != NJS_OK)) {
         return ret;
index 9bfbf24016962d619bf0133668a1deedacbe1334..bfd0e9e71002740568e9bde43cb743967cb9721b 100644 (file)
@@ -518,6 +518,33 @@ njs_parser_reject(njs_parser_t *parser)
 }
 
 
+njs_int_t
+njs_parser_init(njs_vm_t *vm, njs_parser_t *parser, njs_parser_scope_t *scope,
+    njs_str_t *file, u_char *start, u_char *end, njs_uint_t runtime)
+{
+    njs_lexer_t  *lexer;
+
+    njs_memzero(parser, sizeof(njs_parser_t));
+
+    parser->scope = scope;
+
+    lexer = &parser->lexer0;
+    parser->lexer = lexer;
+
+    lexer->file = *file;
+    lexer->start = start;
+    lexer->end = end;
+    lexer->line = 1;
+    lexer->keywords_hash = (runtime) ? &vm->keywords_hash
+                                     : &vm->shared->keywords_hash;
+    lexer->mem_pool = vm->mem_pool;
+
+    njs_queue_init(&lexer->preread);
+
+    return NJS_OK;
+}
+
+
 njs_int_t
 njs_parser(njs_vm_t *vm, njs_parser_t *parser)
 {
index 2e1f23bcdfe8a701abf434af581ea8a40c1886b1..15c01c7e17352d4baaabcef9a268716d290e7ee4 100644 (file)
@@ -74,6 +74,7 @@ typedef njs_int_t (*njs_parser_state_func_t)(njs_parser_t *parser,
 struct njs_parser_s {
     njs_parser_state_func_t         state;
     njs_queue_t                     stack;
+    njs_lexer_t                     lexer0;
     njs_lexer_t                     *lexer;
     njs_vm_t                        *vm;
     njs_parser_node_t               *node;
@@ -119,6 +120,9 @@ njs_int_t njs_parser_failed_state(njs_parser_t *parser,
 
 intptr_t njs_parser_scope_rbtree_compare(njs_rbtree_node_t *node1,
     njs_rbtree_node_t *node2);
+njs_int_t njs_parser_init(njs_vm_t *vm, njs_parser_t *parser,
+    njs_parser_scope_t *scope, njs_str_t *file, u_char *start, u_char *end,
+    njs_uint_t runtime);
 njs_int_t njs_parser(njs_vm_t *vm, njs_parser_t *parser);
 
 njs_int_t njs_parser_module_lambda(njs_parser_t *parser,
index 0c75fff71d2cccfff9d3d415522beed5e34e0f38..86bce1a86317ec7a5af136e50f091588889c46a7 100644 (file)
@@ -143,27 +143,21 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end)
     njs_str_t           ast;
     njs_chb_t           chain;
     njs_value_t         **global, **new;
-    njs_lexer_t         lexer;
     njs_parser_t        parser;
     njs_vm_code_t       *code;
     njs_generator_t     generator;
     njs_parser_scope_t  *scope;
 
-    njs_memzero(&parser, sizeof(njs_parser_t));
-
-    parser.scope = vm->global_scope;
-
-    if (parser.scope != NULL && vm->modules != NULL) {
+    if (vm->modules != NULL) {
         njs_module_reset(vm);
     }
 
-    ret = njs_lexer_init(vm, &lexer, &vm->options.file, *start, end, 0);
+    ret = njs_parser_init(vm, &parser, vm->global_scope, &vm->options.file,
+                          *start, end, 0);
     if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
     }
 
-    parser.lexer = &lexer;
-
     ret = njs_parser(vm, &parser);
     if (njs_slow_path(ret != NJS_OK)) {
         return NJS_ERROR;
@@ -186,7 +180,7 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end)
         njs_mp_free(vm->mem_pool, ast.start);
     }
 
-    *start = lexer.start;
+    *start = parser.lexer->start;
     scope = parser.scope;
 
     ret = njs_generator_init(&generator, 0, 0);