[njs] Introduced NJS_VMCODE_PROPERTY_ATOM_GET instruction.

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


details:   https://github.com/nginx/njs/commit/c5679450137ada06d678901c0fe264e5f7f5db56
branches:  master
commit:    c5679450137ada06d678901c0fe264e5f7f5db56
user:      Dmitry Volyntsev <xeioex at nginx.com>
date:      Wed, 26 Mar 2025 00:23:23 -0700
description:
Introduced NJS_VMCODE_PROPERTY_ATOM_GET instruction.


---
 src/njs_disassembler.c |  2 ++
 src/njs_generator.c    | 46 ++++++++++++++++++++++++++++++++++++++++++----
 src/njs_parser.c       |  2 +-
 src/njs_vmcode.c       | 17 +++++++++++++++++
 src/njs_vmcode.h       |  1 +
 5 files changed, 63 insertions(+), 5 deletions(-)

diff --git a/src/njs_disassembler.c b/src/njs_disassembler.c
index 7c645339..d3300443 100644
--- a/src/njs_disassembler.c
+++ b/src/njs_disassembler.c
@@ -35,6 +35,8 @@ static njs_code_name_t  code_names[] = {
 
     { NJS_VMCODE_PROPERTY_GET, sizeof(njs_vmcode_prop_get_t),
           njs_str("PROP GET        ") },
+    { NJS_VMCODE_PROPERTY_ATOM_GET, sizeof(njs_vmcode_prop_get_t),
+          njs_str("PROP ATOM GET   ") },
     { NJS_VMCODE_GLOBAL_GET, sizeof(njs_vmcode_prop_get_t),
           njs_str("GLOBAL GET      ") },
     { NJS_VMCODE_PROPERTY_INIT, sizeof(njs_vmcode_prop_set_t),
diff --git a/src/njs_generator.c b/src/njs_generator.c
index a2cc4b1c..c3f741d3 100644
--- a/src/njs_generator.c
+++ b/src/njs_generator.c
@@ -3395,6 +3395,7 @@ njs_generate_operation_assignment_prop(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_index_t            index, src, prop_index;
+    njs_vmcode_t           opcode;
     njs_parser_node_t      *lvalue, *object, *property;
     njs_vmcode_move_t      *move;
     njs_vmcode_3addr_t     *to_property_key;
@@ -3453,8 +3454,19 @@ njs_generate_operation_assignment_prop(njs_vm_t *vm, njs_generator_t *generator,
         return NJS_ERROR;
     }
 
+    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_GET;
+
+    } else {
+        opcode = NJS_VMCODE_PROPERTY_GET;
+    }
+
     njs_generate_code(generator, njs_vmcode_prop_get_t, prop_get,
-                      NJS_VMCODE_PROPERTY_GET, property);
+                      opcode, property);
+
     prop_get->value = index;
     prop_get->object = object->index;
     prop_get->property = prop_index;
@@ -3874,14 +3886,26 @@ njs_generate_3addr_operation_end(njs_vm_t *vm, njs_generator_t *generator,
     njs_parser_node_t *node)
 {
     njs_bool_t          swap;
+    njs_vmcode_t        opcode;
     njs_parser_node_t   *left, *right;
     njs_vmcode_3addr_t  *code;
 
     left = node->left;
     right = node->right;
 
+    if (node->u.operation == NJS_VMCODE_PROPERTY_GET
+        && (right->token_type == NJS_TOKEN_STRING
+            || (right->token_type == NJS_TOKEN_NUMBER
+                && right->u.value.atom_id != NJS_ATOM_STRING_unknown)))
+    {
+        opcode = NJS_VMCODE_PROPERTY_ATOM_GET;
+
+    } else {
+        opcode = node->u.operation;
+    }
+
     njs_generate_code(generator, njs_vmcode_3addr_t, code,
-                      node->u.operation, node);
+                      opcode, node);
 
     swap = *((njs_bool_t *) generator->context);
 
@@ -4074,7 +4098,8 @@ njs_generate_inc_dec_operation_prop(njs_vm_t *vm, njs_generator_t *generator,
     njs_int_t              ret;
     njs_bool_t             post;
     njs_index_t            index, dest_index, prop_index;
-    njs_parser_node_t      *lvalue;
+    njs_vmcode_t           opcode;
+    njs_parser_node_t      *lvalue, *prop;
     njs_vmcode_3addr_t     *code, *to_property_key;
     njs_vmcode_prop_get_t  *prop_get;
     njs_vmcode_prop_set_t  *prop_set;
@@ -4122,8 +4147,21 @@ found:
         return NJS_ERROR;
     }
 
+    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_GET;
+
+    } else {
+        opcode = NJS_VMCODE_PROPERTY_GET;
+    }
+
     njs_generate_code(generator, njs_vmcode_prop_get_t, prop_get,
-                      NJS_VMCODE_PROPERTY_GET, node);
+                      opcode, node);
+
     prop_get->value = index;
     prop_get->object = lvalue->left->index;
     prop_get->property = prop_index;
diff --git a/src/njs_parser.c b/src/njs_parser.c
index a3564396..50cee672 100644
--- a/src/njs_parser.c
+++ b/src/njs_parser.c
@@ -2295,7 +2295,7 @@ njs_parser_property(njs_parser_t *parser, njs_lexer_token_t *token,
                 return NJS_ERROR;
             }
 
-            node->u.operation = NJS_VMCODE_PROPERTY_GET;
+            node->u.operation = NJS_VMCODE_PROPERTY_ATOM_GET;
             node->token_line = token->line;
 
             prop_node = njs_parser_node_string(parser->vm, token, parser);
diff --git a/src/njs_vmcode.c b/src/njs_vmcode.c
index 07054f67..301a1394 100644
--- a/src/njs_vmcode.c
+++ b/src/njs_vmcode.c
@@ -182,6 +182,7 @@ njs_vmcode_interpreter(njs_vm_t *vm, u_char *pc, njs_value_t *rval,
         NJS_GOTO_ROW(NJS_VMCODE_ASSIGNMENT_ERROR),
         NJS_GOTO_ROW(NJS_VMCODE_ERROR),
         NJS_GOTO_ROW(NJS_VMCODE_MOVE),
+        NJS_GOTO_ROW(NJS_VMCODE_PROPERTY_ATOM_GET),
         NJS_GOTO_ROW(NJS_VMCODE_PROPERTY_GET),
         NJS_GOTO_ROW(NJS_VMCODE_INCREMENT),
         NJS_GOTO_ROW(NJS_VMCODE_POST_INCREMENT),
@@ -249,6 +250,22 @@ NEXT_LBL;
         pc += sizeof(njs_vmcode_move_t);
         NEXT;
 
+    CASE (NJS_VMCODE_PROPERTY_ATOM_GET):
+        njs_vmcode_debug_opcode();
+
+        njs_vmcode_operand(vm, vmcode->operand3, value2);
+        njs_vmcode_operand(vm, vmcode->operand2, value1);
+        get = (njs_vmcode_prop_get_t *) pc;
+        njs_vmcode_operand(vm, get->value, retval);
+
+        ret = njs_value_property(vm, value1, value2->atom_id, retval);
+        if (njs_slow_path(ret == NJS_ERROR)) {
+            goto error;
+        }
+
+        pc += sizeof(njs_vmcode_prop_get_t);
+        NEXT;
+
     CASE (NJS_VMCODE_PROPERTY_GET):
         njs_vmcode_debug_opcode();
 
diff --git a/src/njs_vmcode.h b/src/njs_vmcode.h
index ed9ae1b3..2e56db47 100644
--- a/src/njs_vmcode.h
+++ b/src/njs_vmcode.h
@@ -63,6 +63,7 @@ enum {
     NJS_VMCODE_ASSIGNMENT_ERROR,
     NJS_VMCODE_ERROR,
     NJS_VMCODE_MOVE,
+    NJS_VMCODE_PROPERTY_ATOM_GET,
     NJS_VMCODE_PROPERTY_GET,
     NJS_VMCODE_INCREMENT,
     NJS_VMCODE_POST_INCREMENT,


More information about the nginx-devel mailing list