}
}
- prop_index = njs_generate_node_temp_index_get(vm, generator, node);
- if (njs_slow_path(prop_index == NJS_INDEX_ERROR)) {
- return NJS_ERROR;
- }
+ prop_index = property->index;
+
+ if (!njs_parser_is_primitive(property)) {
+ prop_index = njs_generate_node_temp_index_get(vm, generator, node);
+ if (njs_slow_path(prop_index == NJS_INDEX_ERROR)) {
+ return NJS_ERROR;
+ }
- njs_generate_code(generator, njs_vmcode_3addr_t, to_property_key,
- NJS_VMCODE_TO_PROPERTY_KEY, 2, property);
+ njs_generate_code(generator, njs_vmcode_3addr_t, to_property_key,
+ NJS_VMCODE_TO_PROPERTY_KEY, 2, property);
- to_property_key->src2 = object->index;
- to_property_key->src1 = property->index;
- to_property_key->dst = prop_index;
+ to_property_key->src2 = object->index;
+ to_property_key->src1 = property->index;
+ to_property_key->dst = prop_index;
+ }
index = njs_generate_node_temp_index_get(vm, generator, node);
if (njs_slow_path(index == NJS_INDEX_ERROR)) {
found:
- prop_index = njs_generate_temp_index_get(vm, generator, node);
- if (njs_slow_path(prop_index == NJS_INDEX_ERROR)) {
- return NJS_ERROR;
- }
+ prop_index = lvalue->right->index;
+
+ if (!njs_parser_is_primitive(lvalue->right)) {
+ prop_index = njs_generate_temp_index_get(vm, generator, node);
+ if (njs_slow_path(prop_index == NJS_INDEX_ERROR)) {
+ return NJS_ERROR;
+ }
- njs_generate_code(generator, njs_vmcode_3addr_t, to_property_key,
- NJS_VMCODE_TO_PROPERTY_KEY, 2, node);
+ njs_generate_code(generator, njs_vmcode_3addr_t, to_property_key,
+ NJS_VMCODE_TO_PROPERTY_KEY, 2, node);
- to_property_key->src2 = lvalue->left->index;
- to_property_key->src1 = lvalue->right->index;
- to_property_key->dst = prop_index;
+ to_property_key->src2 = lvalue->left->index;
+ to_property_key->src1 = lvalue->right->index;
+ to_property_key->dst = prop_index;
+ }
post = *((njs_bool_t *) generator->context);
{ njs_str("var a = 1; var b = { x:2 }; a = b.x += (a = 1)"),
njs_str("3") },
+ { njs_str("var o = {true:1}; o[true] += 1; o.true"),
+ njs_str("2") },
+
+ { njs_str("var o = {false:1}; o[false] += 1; o.false"),
+ njs_str("2") },
+
+ { njs_str("var o = {undefined:1}; o[undefined] += 1; o.undefined"),
+ njs_str("2") },
+
+ { njs_str("var o = {'5':1}; o[5] += 1; o[5]"),
+ njs_str("2") },
+
+ { njs_str("var o = {a:1}; o[{toString:()=>'a'}] += 1; o.a"),
+ njs_str("2") },
+
+ { njs_str("var o = {true:1}; o[true]++; o.true"),
+ njs_str("2") },
+
+ { njs_str("var o = {false:1}; o[false]++; o.false"),
+ njs_str("2") },
+
+ { njs_str("var o = {undefined:1}; o[undefined]++; o.undefined"),
+ njs_str("2") },
+
+ { njs_str("var o = {'5':1}; o[5]++; o[5]"),
+ njs_str("2") },
+
+ { njs_str("var o = {a:1}; o[{toString:()=>'a'}]++; o.a"),
+ njs_str("2") },
+
{ njs_str("var a = undefined; a.b++; a.b"),
njs_str("TypeError: cannot get property \"b\" of undefined") },