]> git.kaiwu.me - njs.git/commitdiff
Fixed handling of unexpected tokens in parser.
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 22 Nov 2018 12:02:19 +0000 (15:02 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 22 Nov 2018 12:02:19 +0000 (15:02 +0300)
This fixes #50 issue on Github.

njs/njs.c
njs/njs_parser.c
njs/test/njs_interactive_test.c
njs/test/njs_unit_test.c

index e687ebdca5dbcf9fc06ae1b58b540333ce3cf8e6..1ac1125afb05924bcb2ce9fb5969a210693210ee 100644 (file)
--- a/njs/njs.c
+++ b/njs/njs.c
@@ -252,6 +252,8 @@ njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end)
         nxt_array_reset(vm->backtrace);
     }
 
+    vm->retval = njs_value_void;
+
     node = njs_parser(vm, parser, prev);
     if (nxt_slow_path(node == NULL)) {
         goto fail;
index dad908748a1c46b07e148b175e34d36df32378f4..f0aaa516e81b046e33d77e907033a896ad82c1a3 100644 (file)
@@ -639,7 +639,7 @@ njs_parser_function_lambda(njs_vm_t *vm, njs_function_lambda_t *lambda,
     while (token != NJS_TOKEN_CLOSE_PARENTHESIS) {
 
         if (nxt_slow_path(token != NJS_TOKEN_NAME)) {
-            return NJS_TOKEN_ERROR;
+            return NJS_TOKEN_ILLEGAL;
         }
 
         arg = njs_variable_add(vm, parser, NJS_VARIABLE_VAR);
@@ -676,7 +676,7 @@ njs_parser_function_lambda(njs_vm_t *vm, njs_function_lambda_t *lambda,
     }
 
     if (nxt_slow_path(token != NJS_TOKEN_OPEN_BRACE)) {
-        return NJS_TOKEN_ERROR;
+        return NJS_TOKEN_ILLEGAL;
     }
 
     token = njs_parser_token(parser);
@@ -1649,7 +1649,7 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser)
         }
 
         if (nxt_slow_path(token != NJS_TOKEN_CLOSE_PARENTHESIS)) {
-            return token;
+            return NJS_TOKEN_ILLEGAL;
         }
 
         token = njs_parser_try_block(vm, parser);
@@ -1689,7 +1689,7 @@ njs_parser_try_statement(njs_vm_t *vm, njs_parser_t *parser)
 
     if (try->right == NULL) {
         njs_parser_syntax_error(vm, parser,
-                                "Missing catch or finally after try", NULL);
+                                "Missing catch or finally after try");
 
         return NJS_TOKEN_ILLEGAL;
     }
index 6ee9773a073548944ceaf21aa795bb5fb9a9bd0e..e83c08c35c2a262c5f2cad0e2f63ef6c77d81b49 100644 (file)
@@ -106,6 +106,10 @@ static njs_interactive_test_t  njs_test[] =
                  "f({})" ENTER),
       nxt_string("1") },
 
+    { nxt_string("arguments" ENTER
+                 "function(){}()" ENTER),
+      nxt_string("SyntaxError: Unexpected token \"(\" in 1") },
+
     /* Backtraces */
 
     { nxt_string("function ff(o) {return o.a.a}" ENTER
index ccd793be46a5651f50858eb918a1577c13dcd4fd..4c2e5ec93963675bb5461df4d07cb4af73f44870 100644 (file)
@@ -6356,6 +6356,9 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("try {}"),
       nxt_string("SyntaxError: Missing catch or finally after try in 1") },
 
+    { nxt_string("try{}catch(a[]"),
+      nxt_string("SyntaxError: Unexpected token \"[\" in 1") },
+
     { nxt_string("function f(a) {return a;}; "
                  "function thrower() {throw TypeError('Oops')}; "
                  "f(thrower())"),