From: Igor Sysoev Date: Thu, 8 Dec 2016 14:15:54 +0000 (+0300) Subject: Array and object literals did not support assignment expressions. X-Git-Tag: 0.1.6~5 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=5a7ad9b6fe01839500788c90b26bc5ba903a6101;p=njs.git Array and object literals did not support assignment expressions. Thanks to 洪志道 (Hong Zhi Dao). --- diff --git a/njs/njs_parser.c b/njs/njs_parser.c index c9f06463..868da57f 100644 --- a/njs/njs_parser.c +++ b/njs/njs_parser.c @@ -1829,7 +1829,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj) return token; } - token = njs_parser_conditional_expression(vm, parser, token); + token = njs_parser_assignment_expression(vm, parser, token); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -1924,7 +1924,7 @@ njs_parser_array(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj) propref->right = node; parser->code_size += sizeof(njs_vmcode_3addr_t); - token = njs_parser_conditional_expression(vm, parser, token); + token = njs_parser_assignment_expression(vm, parser, token); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } diff --git a/njs/njs_parser.h b/njs/njs_parser.h index 76d118fa..327d6c6b 100644 --- a/njs/njs_parser.h +++ b/njs/njs_parser.h @@ -334,7 +334,7 @@ njs_token_t njs_parser_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token); njs_token_t njs_parser_var_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token); -njs_token_t njs_parser_conditional_expression(njs_vm_t *vm, +njs_token_t njs_parser_assignment_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token); njs_token_t njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token); diff --git a/njs/njs_parser_expression.c b/njs/njs_parser_expression.c index 6de22910..9100784c 100644 --- a/njs/njs_parser_expression.c +++ b/njs/njs_parser_expression.c @@ -55,9 +55,11 @@ struct njs_parser_expression_s { }; -static njs_token_t njs_parser_assignment_expression(njs_vm_t *vm, +static njs_token_t njs_parser_any_expression(njs_vm_t *vm, njs_parser_t *parser, const njs_parser_expression_t *expr, njs_token_t token); +static njs_token_t njs_parser_conditional_expression(njs_vm_t *vm, + njs_parser_t *parser, njs_token_t token); static njs_token_t njs_parser_binary_expression(njs_vm_t *vm, njs_parser_t *parser, const njs_parser_expression_t *expr, njs_token_t token); @@ -227,7 +229,7 @@ static const njs_parser_expression_t static const njs_parser_expression_t njs_parser_comma_expression = { - njs_parser_assignment_expression, + njs_parser_any_expression, NULL, 1, { { NJS_TOKEN_COMMA, NULL, 0 }, @@ -346,8 +348,16 @@ njs_parser_var_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token) static njs_token_t -njs_parser_assignment_expression(njs_vm_t *vm, njs_parser_t *parser, +njs_parser_any_expression(njs_vm_t *vm, njs_parser_t *parser, const njs_parser_expression_t *expr, njs_token_t token) +{ + return njs_parser_assignment_expression(vm, parser, token); +} + + +njs_token_t +njs_parser_assignment_expression(njs_vm_t *vm, njs_parser_t *parser, + njs_token_t token) { size_t size; njs_parser_node_t *node, *pending; @@ -475,7 +485,7 @@ njs_parser_assignment_expression(njs_vm_t *vm, njs_parser_t *parser, return token; } - token = njs_parser_assignment_expression(vm, parser, NULL, token); + token = njs_parser_assignment_expression(vm, parser, token); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -568,7 +578,7 @@ njs_parser_conditional_expression(njs_vm_t *vm, njs_parser_t *parser, cond->right = node; node->token = NJS_TOKEN_BRANCHING; - token = njs_parser_assignment_expression(vm, parser, NULL, token); + token = njs_parser_assignment_expression(vm, parser, token); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -585,7 +595,7 @@ njs_parser_conditional_expression(njs_vm_t *vm, njs_parser_t *parser, return token; } - token = njs_parser_assignment_expression(vm, parser, NULL, token); + token = njs_parser_assignment_expression(vm, parser, token); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -1210,7 +1220,7 @@ njs_parser_arguments(njs_vm_t *vm, njs_parser_t *parser, break; } - token = njs_parser_assignment_expression(vm, parser, NULL, token); + token = njs_parser_assignment_expression(vm, parser, token); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index fff872d8..dc80130e 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -1906,6 +1906,9 @@ static njs_unit_test_t njs_test[] = { nxt_string("a = 1; a.b++; a.b"), nxt_string("TypeError") }, + { nxt_string("var n = 1, o = { p: n += 1 }; o.p"), + nxt_string("2") }, + { nxt_string("a = {}; a.b = {}; a.b.c = 1; a.b['c']"), nxt_string("1") }, @@ -2073,6 +2076,9 @@ static njs_unit_test_t njs_test[] = { nxt_string("a = [ 1, 2, 3 ]; a[0] + a[1] + a[2]"), nxt_string("6") }, + { nxt_string("var n = 1, a = [ n += 1 ]; a"), + nxt_string("2") }, + { nxt_string("a = [ 1, 2; 3 ]; a[0] + a[1] + a[2]"), nxt_string("SyntaxError: Unexpected token \";\" in 1") },