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;
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;
}
+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)
{
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;
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,
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;
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);