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);
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();
{
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;
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;
{
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;
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;
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;
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),
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();