[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