@@ -2296,18 +2296,30 @@ static njs_int_t
2296
2296
njs_generate_for_in_set_prop_block (njs_vm_t * vm , njs_generator_t * generator ,
2297
2297
njs_parser_node_t * node )
2298
2298
{
2299
- njs_parser_node_t * foreach ;
2300
- njs_vmcode_prop_set_t * prop_set ;
2301
- njs_generator_loop_ctx_t * ctx ;
2299
+ njs_vmcode_t opcode ;
2300
+ njs_parser_node_t * foreach , * prop ;
2301
+ njs_vmcode_prop_set_t * prop_set ;
2302
+ njs_generator_loop_ctx_t * ctx ;
2302
2303
2303
2304
ctx = generator -> context ;
2304
2305
2305
2306
foreach = node -> left ;
2307
+ prop = foreach -> left -> right ;
2308
+
2309
+ if (prop -> token_type == NJS_TOKEN_STRING
2310
+ || (prop -> token_type == NJS_TOKEN_NUMBER
2311
+ && prop -> u .value .atom_id != NJS_ATOM_STRING_unknown ))
2312
+ {
2313
+ opcode = NJS_VMCODE_PROPERTY_ATOM_SET ;
2314
+
2315
+ } else {
2316
+ opcode = NJS_VMCODE_PROPERTY_SET ;
2317
+ }
2306
2318
2307
2319
njs_generate_code (generator , njs_vmcode_prop_set_t , prop_set ,
2308
- NJS_VMCODE_PROPERTY_SET , foreach );
2320
+ opcode , foreach );
2309
2321
prop_set -> object = foreach -> left -> left -> index ;
2310
- prop_set -> property = foreach -> left -> right -> index ;
2322
+ prop_set -> property = prop -> index ;
2311
2323
prop_set -> value = ctx -> index_next_value ;
2312
2324
2313
2325
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,
3024
3036
var = njs_variable_reference (vm , node_dst );
3025
3037
if (var == NULL ) {
3026
3038
njs_generate_code (generator , njs_vmcode_prop_set_t , prop_set ,
3027
- NJS_VMCODE_PROPERTY_SET , node_src );
3039
+ NJS_VMCODE_PROPERTY_ATOM_SET , node_src );
3028
3040
3029
3041
prop_set -> value = node_dst -> index ;
3030
3042
prop_set -> object = njs_scope_global_this_index ();
@@ -3190,6 +3202,7 @@ njs_generate_assignment_end(njs_vm_t *vm, njs_generator_t *generator,
3190
3202
{
3191
3203
njs_int_t ret ;
3192
3204
njs_index_t prop_index ;
3205
+ njs_vmcode_t opcode ;
3193
3206
njs_parser_node_t * lvalue , * expr , * object , * property ;
3194
3207
njs_vmcode_2addr_t * set_function , * to_prop_key ;
3195
3208
njs_vmcode_prop_set_t * prop_set ;
@@ -3246,9 +3259,18 @@ njs_generate_assignment_end(njs_vm_t *vm, njs_generator_t *generator,
3246
3259
break ;
3247
3260
3248
3261
default :
3249
- /* NJS_VMCODE_PROPERTY_SET */
3262
+ if (property -> token_type == NJS_TOKEN_STRING
3263
+ || (property -> token_type == NJS_TOKEN_NUMBER
3264
+ && property -> u .value .atom_id != NJS_ATOM_STRING_unknown ))
3265
+ {
3266
+ opcode = NJS_VMCODE_PROPERTY_ATOM_SET ;
3267
+
3268
+ } else {
3269
+ opcode = NJS_VMCODE_PROPERTY_SET ;
3270
+ }
3271
+
3250
3272
njs_generate_code (generator , njs_vmcode_prop_set_t , prop_set ,
3251
- NJS_VMCODE_PROPERTY_SET , expr );
3273
+ opcode , expr );
3252
3274
}
3253
3275
3254
3276
prop_set -> value = expr -> index ;
@@ -3486,7 +3508,8 @@ njs_generate_operation_assignment_end(njs_vm_t *vm, njs_generator_t *generator,
3486
3508
{
3487
3509
njs_int_t ret ;
3488
3510
njs_index_t prop_index ;
3489
- njs_parser_node_t * lvalue , * expr ;
3511
+ njs_vmcode_t opcode ;
3512
+ njs_parser_node_t * lvalue , * expr , * prop ;
3490
3513
njs_vmcode_3addr_t * code ;
3491
3514
njs_vmcode_prop_set_t * prop_set ;
3492
3515
@@ -3501,8 +3524,21 @@ njs_generate_operation_assignment_end(njs_vm_t *vm, njs_generator_t *generator,
3501
3524
code -> src1 = node -> index ;
3502
3525
code -> src2 = expr -> index ;
3503
3526
3527
+ prop = lvalue -> right ;
3528
+
3529
+ if (prop -> token_type == NJS_TOKEN_STRING
3530
+ || (prop -> token_type == NJS_TOKEN_NUMBER
3531
+ && prop -> u .value .atom_id != NJS_ATOM_STRING_unknown ))
3532
+ {
3533
+ opcode = NJS_VMCODE_PROPERTY_ATOM_SET ;
3534
+
3535
+ } else {
3536
+ opcode = NJS_VMCODE_PROPERTY_SET ;
3537
+ }
3538
+
3504
3539
njs_generate_code (generator , njs_vmcode_prop_set_t , prop_set ,
3505
- NJS_VMCODE_PROPERTY_SET , expr );
3540
+ opcode , expr );
3541
+
3506
3542
prop_set -> value = node -> index ;
3507
3543
prop_set -> object = lvalue -> left -> index ;
3508
3544
prop_set -> property = prop_index ;
@@ -4172,8 +4208,16 @@ njs_generate_inc_dec_operation_prop(njs_vm_t *vm, njs_generator_t *generator,
4172
4208
code -> src1 = index ;
4173
4209
code -> src2 = index ;
4174
4210
4211
+ if (opcode == NJS_VMCODE_PROPERTY_ATOM_GET ) {
4212
+ opcode = NJS_VMCODE_PROPERTY_ATOM_SET ;
4213
+
4214
+ } else {
4215
+ opcode = NJS_VMCODE_PROPERTY_SET ;
4216
+ }
4217
+
4175
4218
njs_generate_code (generator , njs_vmcode_prop_set_t , prop_set ,
4176
- NJS_VMCODE_PROPERTY_SET , node );
4219
+ opcode , node );
4220
+
4177
4221
prop_set -> value = index ;
4178
4222
prop_set -> object = lvalue -> left -> index ;
4179
4223
prop_set -> property = prop_index ;
0 commit comments