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