From bace128e63f137b87b30605ef834b363b052216f Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Mon, 17 Jul 2017 14:46:35 +0300 Subject: [PATCH] Trailer content after script is optional. --- njs/njs_parser.c | 16 ++++++++++++---- njs/njs_vm.h | 2 ++ njs/njscript.c | 2 ++ njs/njscript.h | 2 ++ njs/test/njs_unit_test.c | 10 ++++++++-- 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/njs/njs_parser.c b/njs/njs_parser.c index de03722e..85b8bcbe 100644 --- a/njs/njs_parser.c +++ b/njs/njs_parser.c @@ -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; diff --git a/njs/njs_vm.h b/njs/njs_vm.h index 5c6c89b0..06507504 100644 --- a/njs/njs_vm.h +++ b/njs/njs_vm.h @@ -902,6 +902,8 @@ struct njs_vm_s { nxt_trace_t trace; nxt_random_t random; + + uint8_t trailer; /* 1 bit */ }; diff --git a/njs/njscript.c b/njs/njscript.c index 46a5c59e..1871ae7f 100644 --- a/njs/njscript.c +++ b/njs/njscript.c @@ -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; diff --git a/njs/njscript.h b/njs/njscript.h index 437ea5dc..65111d4c 100644 --- a/njs/njscript.h +++ b/njs/njscript.h @@ -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; diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 32dd226c..d589afb3 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -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") }, /**/ -- 2.47.3