[njs] Introduced NJS_VMCODE_PROPERTY_ATOM_SET instruction.

noreply at nginx.com noreply at nginx.com
Wed Apr 30 01:50:02 UTC 2025


details:   https://github.com/nginx/njs/commit/2d4788c2516b23f8ad66fb0bccc29d6af09b2040
branches:  master
commit:    2d4788c2516b23f8ad66fb0bccc29d6af09b2040
user:      Dmitry Volyntsev <xeioex at nginx.com>
date:      Fri, 21 Mar 2025 22:52:55 -0700
description:
Introduced NJS_VMCODE_PROPERTY_ATOM_SET instruction.


---
 src/njs_disassembler.c |  2 ++
 src/njs_generator.c    | 66 +++++++++++++++++++++++++++++++++++++++++---------
 src/njs_vmcode.c       | 16 ++++++++++++
 src/njs_vmcode.h       |  1 +
 4 files changed, 74 insertions(+), 11 deletions(-)

diff --git a/src/njs_disassembler.c b/src/njs_disassembler.c
index d3300443..c7927bf5 100644
--- a/src/njs_disassembler.c
+++ b/src/njs_disassembler.c
@@ -45,6 +45,8 @@ static njs_code_name_t  code_names[] = {
           njs_str("PROTO INIT      ") },
     { NJS_VMCODE_PROPERTY_SET, sizeof(njs_vmcode_prop_set_t),
           njs_str("PROP SET        ") },
+    { NJS_VMCODE_PROPERTY_ATOM_SET, sizeof(njs_vmcode_prop_set_t),
+          njs_str("PROP ATOM SET   ") },
     { NJS_VMCODE_PROPERTY_IN, sizeof(njs_vmcode_3addr_t),
           njs_str("PROP IN         ") },
     { NJS_VMCODE_PROPERTY_DELETE, sizeof(njs_vmcode_3addr_t),
diff --git a/src/njs_generator.c b/src/njs_generator.c
index c3f741d3..a6209cce 100644
--- a/src/njs_generator.c
+++ b/src/njs_generator.c
@@ -2296,18 +2296,30 @@ static njs_int_t
 njs_generate_for_in_set_prop_block(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
-    njs_parser_node_t      *foreach;
-    njs_vmcode_prop_set_t  *prop_set;
-    njs_generator_loop_ctx_t   *ctx;
+    njs_vmcode_t              opcode;
+    njs_parser_node_t         *foreach, *prop;
+    njs_vmcode_prop_set_t     *prop_set;
+    njs_generator_loop_ctx_t  *ctx;
 
     ctx = generator->context;
 
     foreach = node->left;
+    prop = foreach->left->right;
+
+    if (prop->token_type == NJS_TOKEN_STRING
+        || (prop->token_type == NJS_TOKEN_NUMBER
+            && prop->u.value.atom_id != NJS_ATOM_STRING_unknown))
+    {
+        opcode = NJS_VMCODE_PROPERTY_ATOM_SET;
+
+    } else {
+        opcode = NJS_VMCODE_PROPERTY_SET;
+    }
 
     njs_generate_code(generator, njs_vmcode_prop_set_t, prop_set,
-                      NJS_VMCODE_PROPERTY_SET, foreach);
+                      opcode, foreach);
     prop_set->object = foreach->left->left->index;
-    prop_set->property = foreach->left->right->index;
+    prop_set->property = prop->index;
     prop_set->value = ctx->index_next_value;
 
     njs_generator_next(generator, njs_generate, node->right);
@@ -3024,7 +3036,7 @@ njs_generate_global_property_set(njs_vm_t *vm, njs_generator_t *generator,
     var = njs_variable_reference(vm, node_dst);
     if (var == NULL) {
         njs_generate_code(generator, njs_vmcode_prop_set_t, prop_set,
-                          NJS_VMCODE_PROPERTY_SET, node_src);
+                          NJS_VMCODE_PROPERTY_ATOM_SET, node_src);
 
         prop_set->value = node_dst->index;
         prop_set->object = njs_scope_global_this_index();
@@ -3190,6 +3202,7 @@ njs_generate_assignment_end(njs_vm_t *vm, njs_generator_t *generator,
 {
     njs_int_t              ret;
     njs_index_t            prop_index;
+    njs_vmcode_t           opcode;
     njs_parser_node_t      *lvalue, *expr, *object, *property;
     njs_vmcode_2addr_t     *set_function, *to_prop_key;
     njs_vmcode_prop_set_t  *prop_set;
@@ -3246,9 +3259,18 @@ njs_generate_assignment_end(njs_vm_t *vm, njs_generator_t *generator,
         break;
 
     default:
-        /* NJS_VMCODE_PROPERTY_SET */
+        if (property->token_type == NJS_TOKEN_STRING
+            || (property->token_type == NJS_TOKEN_NUMBER
+                && property->u.value.atom_id != NJS_ATOM_STRING_unknown))
+        {
+            opcode = NJS_VMCODE_PROPERTY_ATOM_SET;
+
+        } else {
+            opcode = NJS_VMCODE_PROPERTY_SET;
+        }
+
         njs_generate_code(generator, njs_vmcode_prop_set_t, prop_set,
-                          NJS_VMCODE_PROPERTY_SET, expr);
+                          opcode, expr);
     }
 
     prop_set->value = expr->index;
@@ -3486,7 +3508,8 @@ njs_generate_operation_assignment_end(njs_vm_t *vm, njs_generator_t *generator,
 {
     njs_int_t              ret;
     njs_index_t            prop_index;
-    njs_parser_node_t      *lvalue, *expr;
+    njs_vmcode_t           opcode;
+    njs_parser_node_t      *lvalue, *expr, *prop;
     njs_vmcode_3addr_t     *code;
     njs_vmcode_prop_set_t  *prop_set;
 
@@ -3501,8 +3524,21 @@ njs_generate_operation_assignment_end(njs_vm_t *vm, njs_generator_t *generator,
     code->src1 = node->index;
     code->src2 = expr->index;
 
+    prop = lvalue->right;
+
+    if (prop->token_type == NJS_TOKEN_STRING
+        || (prop->token_type == NJS_TOKEN_NUMBER
+            && prop->u.value.atom_id != NJS_ATOM_STRING_unknown))
+    {
+        opcode = NJS_VMCODE_PROPERTY_ATOM_SET;
+
+    } else {
+        opcode = NJS_VMCODE_PROPERTY_SET;
+    }
+
     njs_generate_code(generator, njs_vmcode_prop_set_t, prop_set,
-                      NJS_VMCODE_PROPERTY_SET, expr);
+                      opcode, expr);
+
     prop_set->value = node->index;
     prop_set->object = lvalue->left->index;
     prop_set->property = prop_index;
@@ -4172,8 +4208,16 @@ found:
     code->src1 = index;
     code->src2 = index;
 
+    if (opcode == NJS_VMCODE_PROPERTY_ATOM_GET) {
+        opcode = NJS_VMCODE_PROPERTY_ATOM_SET;
+
+    } else {
+        opcode = NJS_VMCODE_PROPERTY_SET;
+    }
+
     njs_generate_code(generator, njs_vmcode_prop_set_t, prop_set,
-                      NJS_VMCODE_PROPERTY_SET, node);
+                      opcode, node);
+
     prop_set->value = index;
     prop_set->object = lvalue->left->index;
     prop_set->property = prop_index;
diff --git a/src/njs_vmcode.c b/src/njs_vmcode.c
index 301a1394..3826f9eb 100644
--- a/src/njs_vmcode.c
+++ b/src/njs_vmcode.c
@@ -149,6 +149,7 @@ njs_vmcode_interpreter(njs_vm_t *vm, u_char *pc, njs_value_t *rval,
         NJS_GOTO_ROW(NJS_VMCODE_PUT_ARG),
         NJS_GOTO_ROW(NJS_VMCODE_STOP),
         NJS_GOTO_ROW(NJS_VMCODE_JUMP),
+        NJS_GOTO_ROW(NJS_VMCODE_PROPERTY_ATOM_SET),
         NJS_GOTO_ROW(NJS_VMCODE_PROPERTY_SET),
         NJS_GOTO_ROW(NJS_VMCODE_PROPERTY_ACCESSOR),
         NJS_GOTO_ROW(NJS_VMCODE_IF_TRUE_JUMP),
@@ -1264,6 +1265,21 @@ NEXT_LBL;
         ret = (njs_jump_off_t) vmcode->operand1;
         BREAK;
 
+    CASE (NJS_VMCODE_PROPERTY_ATOM_SET):
+        njs_vmcode_debug_opcode();
+
+        njs_vmcode_operand(vm, vmcode->operand3, value2);
+        njs_vmcode_operand(vm, vmcode->operand2, value1);
+        njs_vmcode_operand(vm, vmcode->operand1, retval);
+
+        ret = njs_value_property_set(vm, value1, value2->atom_id, retval);
+        if (njs_slow_path(ret == NJS_ERROR)) {
+            goto error;
+        }
+
+        ret = sizeof(njs_vmcode_prop_set_t);
+        BREAK;
+
     CASE (NJS_VMCODE_PROPERTY_SET):
         njs_vmcode_debug_opcode();
 
diff --git a/src/njs_vmcode.h b/src/njs_vmcode.h
index 2e56db47..83507f63 100644
--- a/src/njs_vmcode.h
+++ b/src/njs_vmcode.h
@@ -30,6 +30,7 @@ enum {
     NJS_VMCODE_PUT_ARG = 0,
     NJS_VMCODE_STOP,
     NJS_VMCODE_JUMP,
+    NJS_VMCODE_PROPERTY_ATOM_SET,
     NJS_VMCODE_PROPERTY_SET,
     NJS_VMCODE_PROPERTY_ACCESSOR,
     NJS_VMCODE_IF_TRUE_JUMP,


More information about the nginx-devel mailing list