]> git.kaiwu.me - njs.git/commitdiff
Trailer content after script is optional.
authorIgor Sysoev <igor@sysoev.ru>
Mon, 17 Jul 2017 11:46:35 +0000 (14:46 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Mon, 17 Jul 2017 11:46:35 +0000 (14:46 +0300)
njs/njs_parser.c
njs/njs_vm.h
njs/njscript.c
njs/njscript.h
njs/test/njs_unit_test.c

index de03722e8f0590adf9d1b2208a2efaebf9cd3f0a..85b8bcbe4360504c46ec4099fc21b05882f28a0d 100644 (file)
@@ -115,7 +115,7 @@ njs_parser(njs_vm_t *vm, njs_parser_t *parser)
             return NULL;
         }
 
-        if (token == NJS_TOKEN_CLOSE_BRACE) {
+        if (token == NJS_TOKEN_CLOSE_BRACE && vm->trailer) {
             parser->lexer->start--;
             break;
         }
@@ -332,9 +332,13 @@ njs_parser_statement(njs_vm_t *vm, njs_parser_t *parser,
         return njs_parser_block_statement(vm, parser);
 
     case NJS_TOKEN_CLOSE_BRACE:
-        parser->node = NULL;
-        nxt_thread_log_debug("BLOCK END");
-        return token;
+        if (vm->trailer) {
+            parser->node = NULL;
+            nxt_thread_log_debug("BLOCK END");
+            return token;
+        }
+
+        /* Fall through. */
 
     default:
         token = njs_parser_expression(vm, parser, token);
@@ -1043,6 +1047,10 @@ njs_parser_switch_statement(njs_vm_t *vm, njs_parser_t *parser)
 
             parser->node = NULL;
 
+            if (token == NJS_TOKEN_CLOSE_BRACE) {
+                break;
+            }
+
         } else if (branch == NULL) {
             /* The first switch statment is not "case/default" keyword. */
             return NJS_TOKEN_ILLEGAL;
index 5c6c89b018b99f9d6bc1fcd87a7a76822d1fa2fa..06507504743f5bf67581c9c8d5fc1208141df26c 100644 (file)
@@ -902,6 +902,8 @@ struct njs_vm_s {
 
     nxt_trace_t              trace;
     nxt_random_t             random;
+
+    uint8_t                  trailer;  /* 1 bit */
 };
 
 
index 46a5c59ecf6dc4cd978707834f69fea95ba14d02..1871ae7f103cd9ab728259af5be8eb4c5a326510 100644 (file)
@@ -173,6 +173,8 @@ njs_vm_create(njs_vm_opt_t *options)
         vm->trace.size = 2048;
         vm->trace.handler = njs_parser_trace_handler;
         vm->trace.data = vm;
+
+        vm->trailer = options->trailer;
     }
 
     return vm;
index 437ea5dc70d6be3b1f438ab70b383f39b2d291ab..65111d4c84901fbd65cb5ee2d9dd49d7eb9b300c 100644 (file)
@@ -69,6 +69,8 @@ typedef struct {
     nxt_lvlhsh_t                    *externals;
     njs_vm_shared_t                 *shared;
     nxt_mem_cache_pool_t            *mcp;
+
+    uint8_t                         trailer;   /* 1 bit */
 } njs_vm_opt_t;
 
 
index 32dd226cf49a47bab5b81466162a6a5cac64f8b8..d589afb3eea8445923b3a3718d9461a1678c58c4 100644 (file)
@@ -28,6 +28,12 @@ typedef struct {
 
 static njs_unit_test_t  njs_test[] =
 {
+    { nxt_string("}"),
+      nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
+
+    { nxt_string("1}"),
+      nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
+
     /* Variable declarations. */
 
     { nxt_string("var x"),
@@ -1898,7 +1904,7 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("var a = 3; if (true) if (false); else; a = 2; a"),
       nxt_string("2") },
 
-    { nxt_string("var a = [3], b; if (1==1||2==2) { b = '1'+'2'+a[0] }; b }"),
+    { nxt_string("var a = [3], b; if (1==1||2==2) { b = '1'+'2'+a[0] }; b"),
       nxt_string("123") },
 
     { nxt_string("(function(){ if(true) return 1 else return 0; })()"),
@@ -2122,7 +2128,7 @@ static njs_unit_test_t  njs_test[] =
       nxt_string("10") },
 
     { nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
-                 "for (i in a) if (a[i] > 4) break; s += a[i] } s"),
+                 "for (i in a) if (a[i] > 4) break; s += a[i]; s"),
       nxt_string("5") },
 
     /**/