From: Igor Sysoev Date: Tue, 3 Jan 2017 16:38:17 +0000 (+0300) Subject: Logical "or" and "and" operations should store result in a X-Git-Tag: 0.1.8~7 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=23d5c23badc723ccb5f80ae4a66b1a9062768475;p=njs.git Logical "or" and "and" operations should store result in a temporary destination because they are actually branch operations. --- diff --git a/njs/njs_generator.c b/njs/njs_generator.c index 85eeb20d..2fe7236e 100644 --- a/njs/njs_generator.c +++ b/njs/njs_generator.c @@ -1666,7 +1666,7 @@ njs_generate_test_jump_expression(njs_vm_t *vm, njs_parser_t *parser, test_jump->code.retval = NJS_VMCODE_RETVAL; test_jump->value = node->left->index; - node->index = njs_generator_dest_index(vm, parser, node); + node->index = njs_generator_node_temp_index_get(vm, parser, node); if (nxt_slow_path(node->index == NJS_INDEX_ERROR)) { return node->index; } @@ -1695,7 +1695,7 @@ njs_generate_test_jump_expression(njs_vm_t *vm, njs_parser_t *parser, test_jump->offset = parser->code_end - (u_char *) test_jump; - return njs_generator_node_index_release(vm, parser, node->right); + return njs_generator_children_indexes_release(vm, parser, node); } diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index b9cf00c0..95363aee 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -568,6 +568,12 @@ static njs_unit_test_t njs_test[] = { nxt_string("var a = 1; 1 || (a = 2); a"), nxt_string("1") }, + { nxt_string("var x; x = 0 || x; x"), + nxt_string("undefined") }, + + { nxt_string("var x; x = 1 && x; x"), + nxt_string("undefined") }, + { nxt_string("1 || 2 || 3"), nxt_string("1") },