[njs] Trailer content after script is optional.
Igor Sysoev
igor at sysoev.ru
Mon Jul 17 11:53:56 UTC 2017
details: http://hg.nginx.org/njs/rev/bef6842774f6
branches:
changeset: 386:bef6842774f6
user: Igor Sysoev <igor at sysoev.ru>
date: Mon Jul 17 14:46:35 2017 +0300
description:
Trailer content after script is optional.
diffstat:
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(-)
diffs (110 lines):
diff -r 0ad7f75f9dbf -r bef6842774f6 njs/njs_parser.c
--- a/njs/njs_parser.c Fri Jul 07 19:17:26 2017 +0300
+++ b/njs/njs_parser.c Mon Jul 17 14:46:35 2017 +0300
@@ -115,7 +115,7 @@ njs_parser(njs_vm_t *vm, njs_parser_t *p
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_p
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
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 -r 0ad7f75f9dbf -r bef6842774f6 njs/njs_vm.h
--- a/njs/njs_vm.h Fri Jul 07 19:17:26 2017 +0300
+++ b/njs/njs_vm.h Mon Jul 17 14:46:35 2017 +0300
@@ -902,6 +902,8 @@ struct njs_vm_s {
nxt_trace_t trace;
nxt_random_t random;
+
+ uint8_t trailer; /* 1 bit */
};
diff -r 0ad7f75f9dbf -r bef6842774f6 njs/njscript.c
--- a/njs/njscript.c Fri Jul 07 19:17:26 2017 +0300
+++ b/njs/njscript.c Mon Jul 17 14:46:35 2017 +0300
@@ -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 -r 0ad7f75f9dbf -r bef6842774f6 njs/njscript.h
--- a/njs/njscript.h Fri Jul 07 19:17:26 2017 +0300
+++ b/njs/njscript.h Mon Jul 17 14:46:35 2017 +0300
@@ -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 -r 0ad7f75f9dbf -r bef6842774f6 njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c Fri Jul 07 19:17:26 2017 +0300
+++ b/njs/test/njs_unit_test.c Mon Jul 17 14:46:35 2017 +0300
@@ -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") },
/**/
More information about the nginx-devel
mailing list