expr->index, node);
}
- njs_code_set_jump_offset(generator, njs_vmcode_test_jump_t,
- ctx->jump_offset);
-
if (ctx->prop_index == NJS_INDEX_NONE) {
ret = njs_generate_global_property_set(vm, generator, lvalue, expr);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
+ njs_code_set_jump_offset(generator, njs_vmcode_test_jump_t,
+ ctx->jump_offset);
+
node->index = lvalue->index;
ret = njs_generate_node_index_release(vm, generator, expr);
return ret;
}
+ njs_code_set_jump_offset(generator, njs_vmcode_test_jump_t,
+ ctx->jump_offset);
+
ret = njs_generate_children_indexes_release(vm, generator, lvalue);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
"log"),
njs_str("gs") },
+ /* Logical assignment: short-circuit with non-writable property. */
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'x', {value: 0, writable: false});"
+ "o.x &&= 1"),
+ njs_str("0") },
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'x', {value: 2, writable: false});"
+ "o.x ||= 1"),
+ njs_str("2") },
+
+ /* Logical assignment: short-circuit with getter-only property. */
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'x',"
+ " {get: function() {return 0}, set: undefined});"
+ "o.x &&= 1"),
+ njs_str("0") },
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'x',"
+ " {get: function() {return 2}, set: undefined});"
+ "o.x ||= 1"),
+ njs_str("2") },
+
+ /* Logical assignment: short-circuit with non-extensible object. */
+
+ { njs_str("var o = {};"
+ "Object.preventExtensions(o);"
+ "o.prop &&= 1;"
+ "o.prop"),
+ njs_str("undefined") },
+
/* Logical assignment: non-lvalue error */
{ njs_str("1 ||= 2"),
"log"),
njs_str("gs") },
+ /* ??= short-circuit with non-writable property. */
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'x', {value: 0, writable: false});"
+ "o.x ?\?= 1"),
+ njs_str("0") },
+
+ /* ??= short-circuit with getter-only property. */
+
+ { njs_str("var o = {};"
+ "Object.defineProperty(o, 'x',"
+ " {get: function() {return 0}, set: undefined});"
+ "o.x ?\?= 1"),
+ njs_str("0") },
+
/* ??= non-lvalue error */
{ njs_str("1 ?\?= 2"),