]> git.kaiwu.me - njs.git/commitdiff
Generator: factor property lvalue setup.
authorDmitry Volyntsev <xeioex@nginx.com>
Sun, 1 Mar 2026 00:16:22 +0000 (16:16 -0800)
committerDmitry Volyntsev <xeioexception@gmail.com>
Mon, 2 Mar 2026 21:01:04 +0000 (13:01 -0800)
src/njs_generator.c

index ceafb62ea457ee8f0029f4b684f23bc528e6f0f4..d651a99674666ba2dc94a6b9befe6384fb4199b4 100644 (file)
@@ -238,6 +238,9 @@ static njs_int_t njs_generate_comma_expression_end(njs_vm_t *vm,
 static njs_int_t njs_generate_global_property_set(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *node_dst,
     njs_parser_node_t *node_src);
+static njs_int_t njs_generate_property_lvalue(njs_vm_t *vm,
+    njs_generator_t *generator, njs_parser_node_t *node,
+    njs_generator_state_func_t after, void *ctx, size_t ctx_size);
 static njs_int_t njs_generate_preserve_property_lvalue(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *lvalue,
     njs_parser_node_t *expr);
@@ -3059,6 +3062,35 @@ njs_generate_global_property_set(njs_vm_t *vm, njs_generator_t *generator,
 }
 
 
+static njs_int_t
+njs_generate_property_lvalue(njs_vm_t *vm, njs_generator_t *generator,
+    njs_parser_node_t *node, njs_generator_state_func_t after, void *ctx,
+    size_t ctx_size)
+{
+    njs_int_t          ret;
+    njs_parser_node_t  *lvalue;
+
+    lvalue = node->left;
+
+    /* Object. */
+
+    njs_generator_next(generator, njs_generate, lvalue->left);
+
+    ret = njs_generator_after(vm, generator,
+                              njs_queue_first(&generator->stack), node,
+                              after, ctx, ctx_size);
+    if (njs_slow_path(ret != NJS_OK)) {
+        return ret;
+    }
+
+    /* Property. */
+
+    return njs_generator_after(vm, generator,
+                               njs_queue_first(&generator->stack),
+                               lvalue->right, njs_generate, NULL, 0);
+}
+
+
 static njs_int_t
 njs_generate_preserve_property_lvalue(njs_vm_t *vm,
     njs_generator_t *generator, njs_parser_node_t *lvalue,
@@ -3278,22 +3310,9 @@ njs_generate_assignment(njs_vm_t *vm, njs_generator_t *generator,
 
     /* lvalue->token == NJS_TOKEN_PROPERTY(_INIT) */
 
-    /* Object. */
-
-    njs_generator_next(generator, njs_generate, lvalue->left);
-
-    ret = njs_generator_after(vm, generator,
-                              njs_queue_first(&generator->stack), node,
-                              njs_generate_assignment_prop, NULL, 0);
-    if (njs_slow_path(ret != NJS_OK)) {
-        return ret;
-    }
-
-    /* Property. */
-
-    return njs_generator_after(vm, generator,
-                               njs_queue_first(&generator->stack),
-                               lvalue->right, njs_generate, NULL, 0);
+    return njs_generate_property_lvalue(vm, generator, node,
+                                        njs_generate_assignment_prop,
+                                        NULL, 0);
 }
 
 
@@ -3500,22 +3519,9 @@ njs_generate_operation_assignment(njs_vm_t *vm, njs_generator_t *generator,
 
     /* lvalue->token == NJS_TOKEN_PROPERTY */
 
-    /* Object. */
-
-    njs_generator_next(generator, njs_generate, lvalue->left);
-
-    ret = njs_generator_after(vm, generator,
-                              njs_queue_first(&generator->stack), node,
-                              njs_generate_operation_assignment_prop, NULL, 0);
-    if (njs_slow_path(ret != NJS_OK)) {
-        return ret;
-    }
-
-    /* Property. */
-
-    return njs_generator_after(vm, generator,
-                               njs_queue_first(&generator->stack),
-                               lvalue->right, njs_generate, NULL, 0);
+    return njs_generate_property_lvalue(vm, generator, node,
+                                        njs_generate_operation_assignment_prop,
+                                        NULL, 0);
 }
 
 
@@ -4189,23 +4195,9 @@ njs_generate_inc_dec_operation(njs_vm_t *vm, njs_generator_t *generator,
 
     /* lvalue->token == NJS_TOKEN_PROPERTY */
 
-    /* Object. */
-
-    njs_generator_next(generator, njs_generate, lvalue->left);
-
-    ret = njs_generator_after(vm, generator,
-                              njs_queue_first(&generator->stack), node,
-                              njs_generate_inc_dec_operation_prop,
-                              &post, sizeof(njs_bool_t));
-    if (njs_slow_path(ret != NJS_OK)) {
-        return ret;
-    }
-
-    /* Property. */
-
-    return njs_generator_after(vm, generator,
-                               njs_queue_first(&generator->stack),
-                               lvalue->right, njs_generate, NULL, 0);
+    return njs_generate_property_lvalue(vm, generator, node,
+                                        njs_generate_inc_dec_operation_prop,
+                                        &post, sizeof(njs_bool_t));
 }