]> git.kaiwu.me - njs.git/commitdiff
Generator: introduced njs_generator_init().
authorDmitry Volyntsev <xeioex@nginx.com>
Wed, 8 Dec 2021 13:14:58 +0000 (13:14 +0000)
committerDmitry Volyntsev <xeioex@nginx.com>
Wed, 8 Dec 2021 13:14:58 +0000 (13:14 +0000)
src/njs_function.c
src/njs_generator.c
src/njs_generator.h
src/njs_vm.c

index 4b07f3e36e70e2ab308ce826cfcf12c95e44d2c3..0b5b0f8f7edfba2213402c68aa2d14fa54aa32c6 100644 (file)
@@ -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)) {
index 78dca816fa4d0bcaf3393ddbba3b723ecc020861..5005d0a857447d9a5b0a65e54487a9d0798520c3 100644 (file)
@@ -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;
 
index 1d3d2187aff97b8c796c78943fe38bdd5c31fd0d..b5d8db636811eb79c9cb03bb2b9eeb5c83977a43 100644 (file)
@@ -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);
index 16cd2f49fc288fc5643defd14d0ec668a0f33e4b..b7a4fef2353a77491300de9c0d88f4ee11603b76 100644 (file)
@@ -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)) {