[njs] Trailer content after script is optional.

2017-07-17 Thread Igor Sysoev
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.

2017-07-17 Thread Dmitry Volyntsev
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.

2017-07-17 Thread Valentin Bartenev
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.

2017-07-17 Thread Dmitry Volyntsev
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