Skip to content

Commit d658657

Browse files
xeioexVadimZhestikov
authored andcommitted
Introduced NJS_VMCODE_PROPERTY_ATOM_SET instruction.
1 parent ce8eb56 commit d658657

File tree

4 files changed

+74
-11
lines changed

4 files changed

+74
-11
lines changed

src/njs_disassembler.c

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ static njs_code_name_t code_names[] = {
4545
njs_str("PROTO INIT ") },
4646
{ NJS_VMCODE_PROPERTY_SET, sizeof(njs_vmcode_prop_set_t),
4747
njs_str("PROP SET ") },
48+
{ NJS_VMCODE_PROPERTY_ATOM_SET, sizeof(njs_vmcode_prop_set_t),
49+
njs_str("PROP ATOM SET ") },
4850
{ NJS_VMCODE_PROPERTY_IN, sizeof(njs_vmcode_3addr_t),
4951
njs_str("PROP IN ") },
5052
{ NJS_VMCODE_PROPERTY_DELETE, sizeof(njs_vmcode_3addr_t),

src/njs_generator.c

+55-11
Original file line numberDiff line numberDiff line change
@@ -2296,18 +2296,30 @@ static njs_int_t
22962296
njs_generate_for_in_set_prop_block(njs_vm_t *vm, njs_generator_t *generator,
22972297
njs_parser_node_t *node)
22982298
{
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;
23022303

23032304
ctx = generator->context;
23042305

23052306
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+
}
23062318

23072319
njs_generate_code(generator, njs_vmcode_prop_set_t, prop_set,
2308-
NJS_VMCODE_PROPERTY_SET, foreach);
2320+
opcode, foreach);
23092321
prop_set->object = foreach->left->left->index;
2310-
prop_set->property = foreach->left->right->index;
2322+
prop_set->property = prop->index;
23112323
prop_set->value = ctx->index_next_value;
23122324

23132325
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,
30243036
var = njs_variable_reference(vm, node_dst);
30253037
if (var == NULL) {
30263038
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);
30283040

30293041
prop_set->value = node_dst->index;
30303042
prop_set->object = njs_scope_global_this_index();
@@ -3190,6 +3202,7 @@ njs_generate_assignment_end(njs_vm_t *vm, njs_generator_t *generator,
31903202
{
31913203
njs_int_t ret;
31923204
njs_index_t prop_index;
3205+
njs_vmcode_t opcode;
31933206
njs_parser_node_t *lvalue, *expr, *object, *property;
31943207
njs_vmcode_2addr_t *set_function, *to_prop_key;
31953208
njs_vmcode_prop_set_t *prop_set;
@@ -3246,9 +3259,18 @@ njs_generate_assignment_end(njs_vm_t *vm, njs_generator_t *generator,
32463259
break;
32473260

32483261
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+
32503272
njs_generate_code(generator, njs_vmcode_prop_set_t, prop_set,
3251-
NJS_VMCODE_PROPERTY_SET, expr);
3273+
opcode, expr);
32523274
}
32533275

32543276
prop_set->value = expr->index;
@@ -3486,7 +3508,8 @@ njs_generate_operation_assignment_end(njs_vm_t *vm, njs_generator_t *generator,
34863508
{
34873509
njs_int_t ret;
34883510
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;
34903513
njs_vmcode_3addr_t *code;
34913514
njs_vmcode_prop_set_t *prop_set;
34923515

@@ -3501,8 +3524,21 @@ njs_generate_operation_assignment_end(njs_vm_t *vm, njs_generator_t *generator,
35013524
code->src1 = node->index;
35023525
code->src2 = expr->index;
35033526

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+
35043539
njs_generate_code(generator, njs_vmcode_prop_set_t, prop_set,
3505-
NJS_VMCODE_PROPERTY_SET, expr);
3540+
opcode, expr);
3541+
35063542
prop_set->value = node->index;
35073543
prop_set->object = lvalue->left->index;
35083544
prop_set->property = prop_index;
@@ -4172,8 +4208,16 @@ njs_generate_inc_dec_operation_prop(njs_vm_t *vm, njs_generator_t *generator,
41724208
code->src1 = index;
41734209
code->src2 = index;
41744210

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+
41754218
njs_generate_code(generator, njs_vmcode_prop_set_t, prop_set,
4176-
NJS_VMCODE_PROPERTY_SET, node);
4219+
opcode, node);
4220+
41774221
prop_set->value = index;
41784222
prop_set->object = lvalue->left->index;
41794223
prop_set->property = prop_index;

src/njs_vmcode.c

+16
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ njs_vmcode_interpreter(njs_vm_t *vm, u_char *pc, njs_value_t *rval,
149149
NJS_GOTO_ROW(NJS_VMCODE_PUT_ARG),
150150
NJS_GOTO_ROW(NJS_VMCODE_STOP),
151151
NJS_GOTO_ROW(NJS_VMCODE_JUMP),
152+
NJS_GOTO_ROW(NJS_VMCODE_PROPERTY_ATOM_SET),
152153
NJS_GOTO_ROW(NJS_VMCODE_PROPERTY_SET),
153154
NJS_GOTO_ROW(NJS_VMCODE_PROPERTY_ACCESSOR),
154155
NJS_GOTO_ROW(NJS_VMCODE_IF_TRUE_JUMP),
@@ -1264,6 +1265,21 @@ NEXT_LBL;
12641265
ret = (njs_jump_off_t) vmcode->operand1;
12651266
BREAK;
12661267

1268+
CASE (NJS_VMCODE_PROPERTY_ATOM_SET):
1269+
njs_vmcode_debug_opcode();
1270+
1271+
njs_vmcode_operand(vm, vmcode->operand3, value2);
1272+
njs_vmcode_operand(vm, vmcode->operand2, value1);
1273+
njs_vmcode_operand(vm, vmcode->operand1, retval);
1274+
1275+
ret = njs_value_property_set(vm, value1, value2->atom_id, retval);
1276+
if (njs_slow_path(ret == NJS_ERROR)) {
1277+
goto error;
1278+
}
1279+
1280+
ret = sizeof(njs_vmcode_prop_set_t);
1281+
BREAK;
1282+
12671283
CASE (NJS_VMCODE_PROPERTY_SET):
12681284
njs_vmcode_debug_opcode();
12691285

src/njs_vmcode.h

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ enum {
3030
NJS_VMCODE_PUT_ARG = 0,
3131
NJS_VMCODE_STOP,
3232
NJS_VMCODE_JUMP,
33+
NJS_VMCODE_PROPERTY_ATOM_SET,
3334
NJS_VMCODE_PROPERTY_SET,
3435
NJS_VMCODE_PROPERTY_ACCESSOR,
3536
NJS_VMCODE_IF_TRUE_JUMP,

0 commit comments

Comments
 (0)