[njs] Array and object literals did not support assignment expressions.

Igor Sysoev igor at sysoev.ru
Thu Dec 8 14:46:34 UTC 2016


details:   http://hg.nginx.org/njs/rev/0315d62a78c2
branches:  
changeset: 277:0315d62a78c2
user:      Igor Sysoev <igor at sysoev.ru>
date:      Thu Dec 08 17:15:54 2016 +0300
description:
Array and object literals did not support assignment expressions.

Thanks to ??? (Hong Zhi Dao).

diffstat:

 njs/njs_parser.c            |   4 ++--
 njs/njs_parser.h            |   2 +-
 njs/njs_parser_expression.c |  24 +++++++++++++++++-------
 njs/test/njs_unit_test.c    |   6 ++++++
 4 files changed, 26 insertions(+), 10 deletions(-)

diffs (135 lines):

diff -r 2380d725ec7b -r 0315d62a78c2 njs/njs_parser.c
--- a/njs/njs_parser.c	Wed Dec 07 19:34:48 2016 +0300
+++ b/njs/njs_parser.c	Thu Dec 08 17:15:54 2016 +0300
@@ -1829,7 +1829,7 @@ njs_parser_object(njs_vm_t *vm, njs_pars
             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_parse
         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 -r 2380d725ec7b -r 0315d62a78c2 njs/njs_parser.h
--- a/njs/njs_parser.h	Wed Dec 07 19:34:48 2016 +0300
+++ b/njs/njs_parser.h	Thu Dec 08 17:15:54 2016 +0300
@@ -334,7 +334,7 @@ njs_token_t njs_parser_expression(njs_vm
     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 -r 2380d725ec7b -r 0315d62a78c2 njs/njs_parser_expression.c
--- a/njs/njs_parser_expression.c	Wed Dec 07 19:34:48 2016 +0300
+++ b/njs/njs_parser_expression.c	Thu Dec 08 17:15:54 2016 +0300
@@ -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, 
 
 
 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)
+{
+    return njs_parser_assignment_expression(vm, parser, token);
+}
+
+
+njs_token_t
 njs_parser_assignment_expression(njs_vm_t *vm, njs_parser_t *parser,
-    const njs_parser_expression_t *expr, njs_token_t token)
+    njs_token_t token)
 {
     size_t                  size;
     njs_parser_node_t       *node, *pending;
@@ -475,7 +485,7 @@ njs_parser_assignment_expression(njs_vm_
             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
         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
             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_p
             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 -r 2380d725ec7b -r 0315d62a78c2 njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c	Wed Dec 07 19:34:48 2016 +0300
+++ b/njs/test/njs_unit_test.c	Thu Dec 08 17:15:54 2016 +0300
@@ -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") },
 


More information about the nginx-devel mailing list