From 1cf2dd032ba6fcab7f67f63f6794c11dc2cacd98 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Mon, 23 Mar 2020 17:15:46 +0300 Subject: [PATCH] Lexer: fixed handling of no-newline at the end of the script. --- src/njs_lexer.c | 4 +--- src/njs_shell.c | 13 ++++++++++--- src/test/njs_unit_test.c | 22 ++++++++++++++++------ 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/njs_lexer.c b/src/njs_lexer.c index 3045eea1..6f8308f5 100644 --- a/src/njs_lexer.c +++ b/src/njs_lexer.c @@ -903,13 +903,11 @@ njs_lexer_division(njs_lexer_t *lexer, njs_lexer_token_t *token) c = lexer->start[0]; if (c == '/') { - token->type = NJS_TOKEN_END; - lexer->start++; for (p = lexer->start; p < lexer->end; p++) { - if (*p == '\n') { + if (*p == '\n' || (p + 1) == lexer->end) { lexer->start = p + 1; lexer->line++; diff --git a/src/njs_shell.c b/src/njs_shell.c index 2df2c82d..2560c1a2 100644 --- a/src/njs_shell.c +++ b/src/njs_shell.c @@ -801,17 +801,24 @@ static njs_int_t njs_process_script(njs_opts_t *opts, njs_console_t *console, const njs_str_t *script) { - u_char *start; + u_char *start, *end; njs_vm_t *vm; njs_int_t ret; vm = console->vm; start = script->start; + end = start + script->length; - ret = njs_vm_compile(vm, &start, start + script->length); + ret = njs_vm_compile(vm, &start, end); if (ret == NJS_OK) { - ret = njs_vm_start(vm); + if (start == end) { + ret = njs_vm_start(vm); + + } else { + njs_vm_error(vm, "Extra characters at the end of the script"); + ret = NJS_ERROR; + } } njs_output(opts, vm, ret); diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index 492bcbb7..825c332e 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -35,6 +35,9 @@ static njs_unit_test_t njs_test[] = { njs_str("/***/1/*\n**/"), njs_str("1") }, + { njs_str("/***/1// "), + njs_str("1") }, + { njs_str(">"), njs_str("SyntaxError: Unexpected token \">\" in 1") }, @@ -17080,7 +17083,7 @@ static njs_int_t njs_unit_test(njs_unit_test_t tests[], size_t num, const char *name, njs_opts_t *opts, njs_stat_t *stat) { - u_char *start; + u_char *start, *end; njs_vm_t *vm, *nvm; njs_int_t ret; njs_str_t s; @@ -17123,10 +17126,11 @@ njs_unit_test(njs_unit_test_t tests[], size_t num, const char *name, } start = tests[i].script.start; + end = start + tests[i].script.length; - ret = njs_vm_compile(vm, &start, start + tests[i].script.length); + ret = njs_vm_compile(vm, &start, end); - if (ret == NJS_OK) { + if (ret == NJS_OK && start == end) { if (opts->disassemble) { njs_disassembler(vm); } @@ -17160,9 +17164,15 @@ njs_unit_test(njs_unit_test_t tests[], size_t num, const char *name, } } else { - if (njs_vm_retval_string(vm, &s) != NJS_OK) { - njs_printf("njs_vm_retval_string() failed\n"); - goto done; + if (ret != NJS_OK) { + if (njs_vm_retval_string(vm, &s) != NJS_OK) { + njs_printf("njs_vm_retval_string() failed\n"); + goto done; + } + + } else { + s = njs_str_value("Error: " + "Extra characters at the end of the script"); } } -- 2.47.3