]> git.kaiwu.me - njs.git/commitdiff
Introduced NJS_VMCODE_PROPERTY_ATOM_GET instruction.
authorDmitry Volyntsev <xeioex@nginx.com>
Wed, 26 Mar 2025 07:23:23 +0000 (00:23 -0700)
committerVadimZhestikov <108960056+VadimZhestikov@users.noreply.github.com>
Wed, 30 Apr 2025 01:49:03 +0000 (18:49 -0700)
src/njs_disassembler.c
src/njs_generator.c
src/njs_parser.c
src/njs_vmcode.c
src/njs_vmcode.h

index 7c645339edd3f7f4844707d4dfe01fbd8168c574..d33004431122a9999fc60927b89c6805f13f860b 100644 (file)
@@ -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),
index a2cc4b1cccb3b19bddc5a6285a1721d968b48da5..c3f741d3e4470f144f2323c4a2aed43842c60d40 100644 (file)
@@ -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;
index a35643963c59f822600bf5dc1d5be87372ed9d31..50cee6726ca1327aacdcc1b24081ee1586035158 100644 (file)
@@ -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);
index 07054f671351bfdfe66bf26d9a37e48b130f6214..301a13942594352bfd078f404fdb5e252840f7ab 100644 (file)
@@ -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();
 
index ed9ae1b3d547047876f13788ae482de4c6c08d64..2e56db479c0bfbcc66dcd11ec36bccc73102c9e4 100644 (file)
@@ -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,