[njs] Trailer content after script is optional.
details: http://hg.nginx.org/njs/rev/bef6842774f6 branches: changeset: 386:bef6842774f6 user: Igor Sysoev 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.cFri Jul 07 19:17:26 2017 +0300 +++ b/njs/njscript.cMon 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.hFri Jul 07 19:17:26 2017 +0300 +++ b/njs/njscript.hMon 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") }, /**/ ___ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel
[njs] Initialize njs_vm_opt_t structs to 0 to simplify options adding.
details: http://hg.nginx.org/njs/rev/182d765687ee branches: changeset: 387:182d765687ee user: Dmitry Volyntsev date: Mon Jul 17 15:29:02 2017 +0300 description: Initialize njs_vm_opt_t structs to 0 to simplify options adding. diffstat: nginx/ngx_http_js_module.c | 3 ++- nginx/ngx_stream_js_module.c | 3 ++- njs/test/njs_benchmark.c | 4 ++-- njs/test/njs_unit_test.c | 3 ++- 4 files changed, 8 insertions(+), 5 deletions(-) diffs (57 lines): diff -r bef6842774f6 -r 182d765687ee nginx/ngx_http_js_module.c --- a/nginx/ngx_http_js_module.cMon Jul 17 14:46:35 2017 +0300 +++ b/nginx/ngx_http_js_module.cMon Jul 17 15:29:02 2017 +0300 @@ -1319,8 +1319,9 @@ ngx_http_js_include(ngx_conf_t *cf, ngx_ return NGX_CONF_ERROR; } +ngx_memzero(&options, sizeof(njs_vm_opt_t)); + options.mcp = mcp; -options.shared = NULL; options.externals = &externals; jlcf->vm = njs_vm_create(&options); diff -r bef6842774f6 -r 182d765687ee nginx/ngx_stream_js_module.c --- a/nginx/ngx_stream_js_module.c Mon Jul 17 14:46:35 2017 +0300 +++ b/nginx/ngx_stream_js_module.c Mon Jul 17 15:29:02 2017 +0300 @@ -1029,8 +1029,9 @@ ngx_stream_js_include(ngx_conf_t *cf, ng return NGX_CONF_ERROR; } +ngx_memzero(&options, sizeof(njs_vm_opt_t)); + options.mcp = mcp; -options.shared = NULL; options.externals = &externals; jscf->vm = njs_vm_create(&options); diff -r bef6842774f6 -r 182d765687ee njs/test/njs_benchmark.c --- a/njs/test/njs_benchmark.c Mon Jul 17 14:46:35 2017 +0300 +++ b/njs/test/njs_benchmark.c Mon Jul 17 15:29:02 2017 +0300 @@ -88,9 +88,9 @@ njs_unit_test_benchmark(nxt_str_t *scrip return NXT_ERROR; } +memset(&options, 0, sizeof(njs_vm_opt_t)); + options.mcp = mcp; -options.shared = NULL; -options.externals = NULL; vm = njs_vm_create(&options); if (vm == NULL) { diff -r bef6842774f6 -r 182d765687ee njs/test/njs_unit_test.c --- a/njs/test/njs_unit_test.c Mon Jul 17 14:46:35 2017 +0300 +++ b/njs/test/njs_unit_test.c Mon Jul 17 15:29:02 2017 +0300 @@ -8161,8 +8161,9 @@ njs_unit_test(nxt_bool_t disassemble) (int) njs_test[i].script.length, njs_test[i].script.start); fflush(stdout); +memset(&options, 0, sizeof(njs_vm_opt_t)); + options.mcp = mcp; -options.shared = NULL; options.externals = &externals; vm = njs_vm_create(&options); ___ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel
[nginx] Parenthesized ASCII-related calculations.
details: http://hg.nginx.org/nginx/rev/e3723f2a11b7 branches: changeset: 7067:e3723f2a11b7 user: Valentin Bartenev date: Mon Jul 17 17:23:51 2017 +0300 description: Parenthesized ASCII-related calculations. This also fixes potential undefined behaviour in the range and slice filter modules, caused by local overflows of signed integers in expressions. diffstat: src/core/ngx_parse_time.c | 16 src/core/ngx_string.c | 8 src/event/ngx_event_openssl_stapling.c | 2 +- src/http/modules/ngx_http_range_filter_module.c | 4 ++-- src/http/modules/ngx_http_slice_filter_module.c | 8 src/http/ngx_http_parse.c | 14 +++--- src/http/ngx_http_upstream.c| 6 +++--- 7 files changed, 29 insertions(+), 29 deletions(-) diffs (282 lines): diff -r a27e0c7e198c -r e3723f2a11b7 src/core/ngx_parse_time.c --- a/src/core/ngx_parse_time.c Wed Jul 12 11:34:04 2017 +0300 +++ b/src/core/ngx_parse_time.c Mon Jul 17 17:23:51 2017 +0300 @@ -58,7 +58,7 @@ ngx_parse_http_time(u_char *value, size_ return NGX_ERROR; } -day = (*p - '0') * 10 + *(p + 1) - '0'; +day = (*p - '0') * 10 + (*(p + 1) - '0'); p += 2; if (*p == ' ') { @@ -132,7 +132,7 @@ ngx_parse_http_time(u_char *value, size_ } year = (*p - '0') * 1000 + (*(p + 1) - '0') * 100 - + (*(p + 2) - '0') * 10 + *(p + 3) - '0'; + + (*(p + 2) - '0') * 10 + (*(p + 3) - '0'); p += 4; } else if (fmt == rfc850) { @@ -140,7 +140,7 @@ ngx_parse_http_time(u_char *value, size_ return NGX_ERROR; } -year = (*p - '0') * 10 + *(p + 1) - '0'; +year = (*p - '0') * 10 + (*(p + 1) - '0'); year += (year < 70) ? 2000 : 1900; p += 2; } @@ -161,7 +161,7 @@ ngx_parse_http_time(u_char *value, size_ return NGX_ERROR; } -day = day * 10 + *p++ - '0'; +day = day * 10 + (*p++ - '0'); } if (end - p < 14) { @@ -177,7 +177,7 @@ ngx_parse_http_time(u_char *value, size_ return NGX_ERROR; } -hour = (*p - '0') * 10 + *(p + 1) - '0'; +hour = (*p - '0') * 10 + (*(p + 1) - '0'); p += 2; if (*p++ != ':') { @@ -188,7 +188,7 @@ ngx_parse_http_time(u_char *value, size_ return NGX_ERROR; } -min = (*p - '0') * 10 + *(p + 1) - '0'; +min = (*p - '0') * 10 + (*(p + 1) - '0'); p += 2; if (*p++ != ':') { @@ -199,7 +199,7 @@ ngx_parse_http_time(u_char *value, size_ return NGX_ERROR; } -sec = (*p - '0') * 10 + *(p + 1) - '0'; +sec = (*p - '0') * 10 + (*(p + 1) - '0'); if (fmt == isoc) { p += 2; @@ -216,7 +216,7 @@ ngx_parse_http_time(u_char *value, size_ } year = (*p - '0') * 1000 + (*(p + 1) - '0') * 100 - + (*(p + 2) - '0') * 10 + *(p + 3) - '0'; + + (*(p + 2) - '0') * 10 + (*(p + 3) - '0'); } if (hour > 23 || min > 59 || sec > 59) { diff -r a27e0c7e198c -r e3723f2a11b7 src/core/ngx_string.c --- a/src/core/ngx_string.c Wed Jul 12 11:34:04 2017 +0300 +++ b/src/core/ngx_string.c Mon Jul 17 17:23:51 2017 +0300 @@ -178,7 +178,7 @@ ngx_vslprintf(u_char *buf, u_char *last, slen = (size_t) -1; while (*fmt >= '0' && *fmt <= '9') { -width = width * 10 + *fmt++ - '0'; +width = width * 10 + (*fmt++ - '0'); } @@ -211,7 +211,7 @@ ngx_vslprintf(u_char *buf, u_char *last, fmt++; while (*fmt >= '0' && *fmt <= '9') { -frac_width = frac_width * 10 + *fmt++ - '0'; +frac_width = frac_width * 10 + (*fmt++ - '0'); } break; @@ -1655,7 +1655,7 @@ ngx_unescape_uri(u_char **dst, u_char ** state = sw_usual; if (ch >= '0' && ch <= '9') { -ch = (u_char) ((decoded << 4) + ch - '0'); +ch = (u_char) ((decoded << 4) + (ch - '0')); if (type & NGX_UNESCAPE_REDIRECT) { if (ch > '%' && ch < 0x7f) { @@ -1675,7 +1675,7 @@ ngx_unescape_uri(u_char **dst, u_char ** c = (u_char) (ch | 0x20); if (c >= 'a' && c <= 'f') { -ch = (u_char) ((decoded << 4) + c - 'a' + 10); +ch = (u_char) ((decoded << 4) + (c - 'a') + 10); if (type & NGX_UNESCAPE_URI) { if (ch == '?') { diff -r a27e0c7e198c -r e3723f2a11b7 src/event/ngx_event_openssl_stapling.c --- a/src/event/ngx_event_openssl_stapling.cWed Jul 12 11:34:04 2017 +0300 +++ b/src/event/ngx_event_openssl_stapling.cMon Jul 17 17:23:51 2017 +0300 @@ -1486,7 +1486,7 @@ ngx_ssl_ocsp_parse_status_line(ngx_ssl_o
[njs] Interactive shell.
details: http://hg.nginx.org/njs/rev/f2ecbe1c2261 branches: changeset: 388:f2ecbe1c2261 user: Dmitry Volyntsev date: Mon Jul 17 20:38:00 2017 +0300 description: Interactive shell. diffstat: Makefile| 26 ++ njs/njs.c | 466 njs/njs_array.c |2 + njs/njs_boolean.c |2 + njs/njs_builtin.c | 235 +-- njs/njs_date.c |2 + njs/njs_function.c |3 + njs/njs_lexer_keyword.c |9 +- njs/njs_math.c |1 + njs/njs_number.c|2 + njs/njs_object.c|2 + njs/njs_object.h|1 + njs/njs_parser.c| 45 +++- njs/njs_parser.h| 13 +- njs/njs_regexp.c|2 + njs/njs_string.c|2 + njs/njs_variable.c | 47 ++- njs/njs_vm.h|1 + njs/njscript.c | 43 +++- njs/njscript.h |7 +- njs/test/njs_interactive_test.c | 197 nxt/auto/configure |1 + nxt/auto/editline | 25 ++ 23 files changed, 1071 insertions(+), 63 deletions(-) diffs (truncated from 1569 to 1000 lines): diff -r 182d765687ee -r f2ecbe1c2261 Makefile --- a/Makefile Mon Jul 17 15:29:02 2017 +0300 +++ b/Makefile Mon Jul 17 20:38:00 2017 +0300 @@ -74,11 +74,15 @@ NXT_BUILDDIR = build all: test lib_test +njs: $(NXT_BUILDDIR)/njs + test: \ $(NXT_BUILDDIR)/njs_unit_test \ + $(NXT_BUILDDIR)/njs_interactive_test \ $(NXT_BUILDDIR)/njs_benchmark \ $(NXT_BUILDDIR)/njs_unit_test d + $(NXT_BUILDDIR)/njs_interactive_test clean: rm -rf $(NXT_BUILDDIR) @@ -386,6 +390,17 @@ dist: -I$(NXT_LIB) -Injs \ njs/njs_disassembler.c +$(NXT_BUILDDIR)/njs: \ + $(NXT_BUILDDIR)/libnxt.a \ + $(NXT_BUILDDIR)/libnjs.a \ + njs/njs.c \ + + $(NXT_CC) -o $(NXT_BUILDDIR)/njs $(NXT_CFLAGS) \ + -I$(NXT_LIB) -Injs \ + njs/njs.c \ + $(NXT_BUILDDIR)/libnjs.a \ + -lm $(NXT_PCRE_LIB) $(NXT_EDITLINE_LIB) + $(NXT_BUILDDIR)/njs_unit_test: \ $(NXT_BUILDDIR)/libnxt.a \ $(NXT_BUILDDIR)/libnjs.a \ @@ -397,6 +412,17 @@ dist: $(NXT_BUILDDIR)/libnjs.a \ -lm $(NXT_PCRE_LIB) +$(NXT_BUILDDIR)/njs_interactive_test: \ + $(NXT_BUILDDIR)/libnxt.a \ + $(NXT_BUILDDIR)/libnjs.a \ + njs/test/njs_interactive_test.c \ + + $(NXT_CC) -o $(NXT_BUILDDIR)/njs_interactive_test $(NXT_CFLAGS) \ + -I$(NXT_LIB) -Injs \ + njs/test/njs_interactive_test.c \ + $(NXT_BUILDDIR)/libnjs.a \ + -lm $(NXT_PCRE_LIB) + $(NXT_BUILDDIR)/njs_benchmark: \ $(NXT_BUILDDIR)/libnxt.a \ $(NXT_BUILDDIR)/libnjs.a \ diff -r 182d765687ee -r f2ecbe1c2261 njs/njs.c --- /dev/null Thu Jan 01 00:00:00 1970 + +++ b/njs/njs.c Mon Jul 17 20:38:00 2017 +0300 @@ -0,0 +1,466 @@ + +/* + * Copyright (C) Dmitry Volyntsev + * Copyright (C) NGINX, Inc. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +typedef enum { +NJS_COMPLETION_GLOBAL = 0, +NJS_COMPLETION_SUFFIX, +} njs_completion_phase_t; + + +typedef struct { +char*file; +nxt_int_t disassemble; +nxt_int_t interactive; +} njs_opts_t; + + +typedef struct { +size_t index; +size_t length; +njs_vm_t*vm; +const char **completions; +nxt_lvlhsh_each_t lhe; +njs_completion_phase_t phase; +} njs_completion_t; + + +static nxt_int_t njs_get_options(njs_opts_t *opts, int argc, char **argv); +static nxt_int_t njs_interactive_shell(njs_opts_t *opts, +njs_vm_opt_t *vm_options); +static nxt_int_t njs_process_file(njs_opts_t *opts, njs_vm_opt_t *vm_options); +static nxt_int_t njs_process_script(njs_vm_t *vm, njs_opts_t *opts, +const nxt_str_t *script, nxt_str_t *out); +static nxt_int_t njs_editline_init(njs_vm_t *vm); +static char **njs_completion_handler(const char *text, int start, int end); +static char *njs_completion_generator(const char *text, int state); + + +static njs_completion_t njs_completion; + + +int +main(int argc, char **argv) +{ +nxt_int_t ret; +njs_opts_topts; +njs_vm_opt_t vm_options; +nxt_mem_cache_pool_t *mcp; + +memset(&opts, 0, sizeof(njs_opts_t)); +opts.interactive = 1; + +ret = njs_get_options(&opts, argc, argv); +if (ret != NXT_OK) { +return (ret == NXT_DONE