[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