]> git.kaiwu.me - njs.git/commitdiff
Array and object literals did not support assignment expressions.
authorIgor Sysoev <igor@sysoev.ru>
Thu, 8 Dec 2016 14:15:54 +0000 (17:15 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Thu, 8 Dec 2016 14:15:54 +0000 (17:15 +0300)
Thanks to 洪志道 (Hong Zhi Dao).

njs/njs_parser.c
njs/njs_parser.h
njs/njs_parser_expression.c
njs/test/njs_unit_test.c

index c9f06463855add02139dbfd56d289512d01a3839..868da57f6faeb9e8d33af36e02b1b41f66728889 100644 (file)
@@ -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;
         }
index 76d118fa53aa8e9f9aa4edcc7edce251c075cfb6..327d6c6b374fe2d85aaa3f9ea70c13a4cc50b89f 100644 (file)
@@ -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);
index 6de22910a067dc153fad5246ced219ee89ef465d..9100784cfc10e8afecb9d99bcbaf00471a416e24 100644 (file)
@@ -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;
         }
index fff872d81efefc5e412ed2ade0a27a523d4c17ac..dc80130e4387699ed4206393204e5ece51cff74a 100644 (file)
@@ -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") },