]> git.kaiwu.me - njs.git/commitdiff
Generator: factor test jump emission.
authorDmitry Volyntsev <xeioex@nginx.com>
Sat, 28 Feb 2026 23:31:47 +0000 (15:31 -0800)
committerDmitry Volyntsev <xeioexception@gmail.com>
Mon, 2 Mar 2026 21:01:04 +0000 (13:01 -0800)
src/njs_generator.c

index 8afb701244a8764763ef715255ca9cb6a037a9eb..38e1b358f2ebe250e310a0a67043a86d19b21c86 100644 (file)
@@ -286,6 +286,9 @@ static njs_int_t njs_generate_template_literal(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
 static njs_int_t njs_generate_template_literal_end(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
+static njs_int_t njs_generate_test_jump(njs_vm_t *vm,
+    njs_generator_t *generator, njs_parser_node_t *node, njs_vmcode_t opcode,
+    njs_index_t value, njs_index_t retval, njs_jump_off_t *jump_offset);
 static njs_int_t njs_generate_test_jump_expression(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node);
 static njs_int_t njs_generate_test_jump_expression_after(njs_vm_t *vm,
@@ -3820,6 +3823,24 @@ njs_generate_template_literal_end(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
+static njs_int_t
+njs_generate_test_jump(njs_vm_t *vm, njs_generator_t *generator,
+    njs_parser_node_t *node, njs_vmcode_t opcode, njs_index_t value,
+    njs_index_t retval, njs_jump_off_t *jump_offset)
+{
+    njs_vmcode_test_jump_t  *test_jump;
+
+    njs_generate_code(generator, njs_vmcode_test_jump_t, test_jump, opcode,
+                      node);
+
+    *jump_offset = njs_code_offset(generator, test_jump);
+    test_jump->value = value;
+    test_jump->retval = retval;
+
+    return NJS_OK;
+}
+
+
 static njs_int_t
 njs_generate_test_jump_expression(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
@@ -3837,20 +3858,20 @@ static njs_int_t
 njs_generate_test_jump_expression_after(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node)
 {
-    njs_jump_off_t          jump_offset;
-    njs_vmcode_test_jump_t  *test_jump;
-
-    njs_generate_code(generator, njs_vmcode_test_jump_t, test_jump,
-                      node->u.operation, node);
-    jump_offset = njs_code_offset(generator, test_jump);
-    test_jump->value = node->left->index;
+    njs_int_t       ret;
+    njs_jump_off_t  jump_offset;
 
     node->index = njs_generate_node_temp_index_get(vm, generator, node);
     if (njs_slow_path(node->index == NJS_INDEX_ERROR)) {
         return node->index;
     }
 
-    test_jump->retval = node->index;
+    ret = njs_generate_test_jump(vm, generator, node, node->u.operation,
+                                 node->left->index, node->index,
+                                 &jump_offset);
+    if (njs_slow_path(ret != NJS_OK)) {
+        return ret;
+    }
 
     njs_generator_next(generator, njs_generate, node->right);