From: Dmitry Volyntsev Date: Wed, 8 Dec 2021 13:14:58 +0000 (+0000) Subject: Generator: introduced njs_generator_init(). X-Git-Tag: 0.7.1~28 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=c90e06ba91a1af274939f24e568c2fec1c055da3;p=njs.git Generator: introduced njs_generator_init(). --- diff --git a/src/njs_function.c b/src/njs_function.c index 4b07f3e3..0b5b0f8f 100644 --- a/src/njs_function.c +++ b/src/njs_function.c @@ -1220,8 +1220,11 @@ njs_function_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, return ret; } - njs_memzero(&generator, sizeof(njs_generator_t)); - generator.runtime = 1; + ret = njs_generator_init(&generator, 0, 1); + if (njs_slow_path(ret != NJS_OK)) { + njs_internal_error(vm, "njs_generator_init() failed"); + return NJS_ERROR; + } code = njs_generate_scope(vm, &generator, scope, &njs_entry_anonymous); if (njs_slow_path(code == NULL)) { diff --git a/src/njs_generator.c b/src/njs_generator.c index 78dca816..5005d0a8 100644 --- a/src/njs_generator.c +++ b/src/njs_generator.c @@ -437,6 +437,21 @@ static const njs_str_t return_label = njs_str("@return"); static const njs_str_t undef_label = { 0xffffffff, (u_char *) "" }; +njs_int_t +njs_generator_init(njs_generator_t *generator, njs_int_t depth, + njs_bool_t runtime) +{ + njs_memzero(generator, sizeof(njs_generator_t)); + + njs_queue_init(&generator->stack); + + generator->depth = depth; + generator->runtime = runtime; + + return NJS_OK; +} + + njs_inline void njs_generator_next(njs_generator_t *generator, njs_generator_state_func_t state, njs_parser_node_t *node) @@ -3617,6 +3632,7 @@ njs_generate_function_scope(njs_vm_t *vm, njs_generator_t *prev, njs_function_lambda_t *lambda, njs_parser_node_t *node, const njs_str_t *name) { + njs_int_t ret; njs_arr_t *arr; njs_bool_t module; njs_uint_t depth; @@ -3631,9 +3647,11 @@ njs_generate_function_scope(njs_vm_t *vm, njs_generator_t *prev, return NJS_ERROR; } - njs_memzero(&generator, sizeof(njs_generator_t)); - generator.depth = depth; - generator.runtime = prev->runtime; + ret = njs_generator_init(&generator, depth, prev->runtime); + if (njs_slow_path(ret != NJS_OK)) { + njs_internal_error(vm, "njs_generator_init() failed"); + return NJS_ERROR; + } node = node->right; diff --git a/src/njs_generator.h b/src/njs_generator.h index 1d3d2187..b5d8db63 100644 --- a/src/njs_generator.h +++ b/src/njs_generator.h @@ -40,6 +40,8 @@ struct njs_generator_s { }; +njs_int_t njs_generator_init(njs_generator_t *generator, njs_int_t depth, + njs_bool_t runtime); njs_vm_code_t *njs_generate_scope(njs_vm_t *vm, njs_generator_t *generator, njs_parser_scope_t *scope, const njs_str_t *name); uint32_t njs_lookup_line(njs_vm_code_t *code, uint32_t offset); diff --git a/src/njs_vm.c b/src/njs_vm.c index 16cd2f49..b7a4fef2 100644 --- a/src/njs_vm.c +++ b/src/njs_vm.c @@ -170,7 +170,11 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end) *start = lexer.start; scope = parser.scope; - njs_memzero(&generator, sizeof(njs_generator_t)); + ret = njs_generator_init(&generator, 0, 0); + if (njs_slow_path(ret != NJS_OK)) { + njs_internal_error(vm, "njs_generator_init() failed"); + return NJS_ERROR; + } code = njs_generate_scope(vm, &generator, scope, &njs_entry_main); if (njs_slow_path(code == NULL)) {