details: https://github.com/nginx/njs/commit/2d4788c2516b23f8ad66fb0bccc29d6af09b2040 branches: master commit: 2d4788c2516b23f8ad66fb0bccc29d6af09b2040 user: Dmitry Volyntsev <xei...@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, _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel