[njs] Fixed building by SunC 5.15.

2018-11-12 Thread Sergey Kandaurov
details:   http://hg.nginx.org/njs/rev/81d029f4139c
branches:  
changeset: 649:81d029f4139c
user:  Sergey Kandaurov 
date:  Mon Nov 12 20:08:36 2018 +0300
description:
Fixed building by SunC 5.15.

diffstat:

 njs/njs_shell.c |  2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diffs (12 lines):

diff -r 46364c618468 -r 81d029f4139c njs/njs_shell.c
--- a/njs/njs_shell.c   Mon Nov 12 18:27:05 2018 +0300
+++ b/njs/njs_shell.c   Mon Nov 12 20:08:36 2018 +0300
@@ -227,7 +227,7 @@ njs_externals_init(njs_vm_t *vm)
 njs_value_t *value;
 const njs_extern_t  *proto;
 
-static const nxt_str_t name = nxt_string_value("console");
+static const nxt_str_t name = nxt_string("console");
 
 proto = njs_vm_external_prototype(vm, &njs_externals[0]);
 if (proto == NULL) {
___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel


[njs] Allowing variables and functions to be redeclared.

2018-11-12 Thread Dmitry Volyntsev
details:   http://hg.nginx.org/njs/rev/46364c618468
branches:  
changeset: 648:46364c618468
user:  Dmitry Volyntsev 
date:  Mon Nov 12 18:27:05 2018 +0300
description:
Allowing variables and functions to be redeclared.

diffstat:

 njs/njs_function.c   |   2 +-
 njs/njs_function.h   |   6 ++
 njs/njs_generator.c  |   9 +++--
 njs/njs_parser.c |   6 +++---
 njs/njs_variable.c   |  17 +++--
 njs/test/njs_unit_test.c |  33 -
 6 files changed, 48 insertions(+), 25 deletions(-)

diffs (173 lines):

diff -r f1da98bdd82f -r 46364c618468 njs/njs_function.c
--- a/njs/njs_function.cMon Nov 12 17:22:14 2018 +0300
+++ b/njs/njs_function.cMon Nov 12 18:27:05 2018 +0300
@@ -412,7 +412,7 @@ njs_function_call(njs_vm_t *vm, njs_inde
 frame->return_address = vm->current + advance;
 
 lambda = function->u.lambda;
-vm->current = lambda->u.start;
+vm->current = lambda->start;
 
 #if (NXT_DEBUG)
 vm->scopes[NJS_SCOPE_CALLEE_ARGUMENTS] = NULL;
diff -r f1da98bdd82f -r 46364c618468 njs/njs_function.h
--- a/njs/njs_function.hMon Nov 12 17:22:14 2018 +0300
+++ b/njs/njs_function.hMon Nov 12 18:27:05 2018 +0300
@@ -36,10 +36,8 @@ struct njs_function_lambda_s {
 njs_value_t*local_scope;
 njs_value_t*closure_scope;
 
-union {
-u_char *start;
-njs_parser_t   *parser;
-} u;
+u_char *start;
+njs_parser_t   *parser;
 };
 
 
diff -r f1da98bdd82f -r 46364c618468 njs/njs_generator.c
--- a/njs/njs_generator.c   Mon Nov 12 17:22:14 2018 +0300
+++ b/njs/njs_generator.c   Mon Nov 12 18:27:05 2018 +0300
@@ -2007,6 +2007,11 @@ njs_generate_function_declaration(njs_vm
 return NXT_ERROR;
 }
 
+if (!njs_is_function(&var->value)) {
+/* A variable was declared with the same name. */
+return NXT_OK;
+}
+
 lambda = var->value.data.u.function->u.lambda;
 
 ret = njs_generate_function_scope(vm, lambda, node);
@@ -2032,7 +2037,7 @@ njs_generate_function_scope(njs_vm_t *vm
 nxt_array_t   *closure;
 njs_parser_t  *parser;
 
-parser = lambda->u.parser;
+parser = lambda->parser;
 node = node->right;
 
 parser->code_size += node->scope->argument_closures
@@ -2058,7 +2063,7 @@ njs_generate_function_scope(njs_vm_t *vm
 
 lambda->local_size = parser->scope_size;
 lambda->local_scope = parser->local_scope;
-lambda->u.start = parser->code_start;
+lambda->start = parser->code_start;
 }
 
 return ret;
diff -r f1da98bdd82f -r 46364c618468 njs/njs_parser.c
--- a/njs/njs_parser.c  Mon Nov 12 17:22:14 2018 +0300
+++ b/njs/njs_parser.c  Mon Nov 12 18:27:05 2018 +0300
@@ -496,7 +496,7 @@ njs_parser_function_declaration(njs_vm_t
 return NJS_TOKEN_ERROR;
 }
 
-function->u.lambda->u.parser = parser;
+function->u.lambda->parser = parser;
 
 token = njs_parser_function_lambda(vm, function->u.lambda, token);
 
@@ -578,7 +578,7 @@ njs_parser_function_expression(njs_vm_t 
 }
 
 node->u.value.data.u.lambda = lambda;
-lambda->u.parser = parser;
+lambda->parser = parser;
 
 token = njs_parser_function_lambda(vm, lambda, token);
 
@@ -619,7 +619,7 @@ njs_parser_function_lambda(njs_vm_t *vm,
 njs_variable_t *arg;
 njs_parser_node_t  *node, *body, *last;
 
-parser = lambda->u.parser;
+parser = lambda->parser;
 
 ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_FUNCTION);
 if (nxt_slow_path(ret != NXT_OK)) {
diff -r f1da98bdd82f -r 46364c618468 njs/njs_variable.c
--- a/njs/njs_variable.cMon Nov 12 17:22:14 2018 +0300
+++ b/njs/njs_variable.cMon Nov 12 18:27:05 2018 +0300
@@ -119,12 +119,17 @@ njs_variable_add(njs_vm_t *vm, njs_parse
 }
 }
 
+if (nxt_lvlhsh_find(&scope->variables, &lhq) == NXT_OK) {
+var = lhq.value;
+return var;
+}
+
 var = njs_variable_alloc(vm, &lhq.key, type);
 if (nxt_slow_path(var == NULL)) {
 return var;
 }
 
-lhq.replace = vm->options.accumulative;
+lhq.replace = 0;
 lhq.value = var;
 lhq.pool = vm->mem_cache_pool;
 
@@ -137,15 +142,7 @@ njs_variable_add(njs_vm_t *vm, njs_parse
 nxt_mem_cache_free(vm->mem_cache_pool, var->name.start);
 nxt_mem_cache_free(vm->mem_cache_pool, var);
 
-if (ret == NXT_ERROR) {
-return NULL;
-}
-
-/* ret == NXT_DECLINED. */
-
-njs_parser_syntax_error(vm, parser, "Identifier \"%.*s\" "
-"has already been declared",
-(int) lhq.key.length, lhq.key.start);
+njs_type_error(vm, "lvlhsh insert failed");
 
 return NULL;
 }
diff -r f1da98bdd82f -r 46364c618468 njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c  Mon Nov 12 17:22:14 2018 +0300
+++ b/njs/test/njs_unit_test.c  Mon Nov 12 18:27:05 

[njs] RegExp: fixed a case when lastIndex is greater than string size.

2018-11-12 Thread Valentin Bartenev
details:   http://hg.nginx.org/njs/rev/f1da98bdd82f
branches:  
changeset: 647:f1da98bdd82f
user:  Valentin Bartenev 
date:  Mon Nov 12 17:22:14 2018 +0300
description:
RegExp: fixed a case when lastIndex is greater than string size.

Previously, it resulted in: "InternalError: pcre_exec() failed: -32" due to
negative string size caused by subtraction of last_index.

diffstat:

 njs/njs_regexp.c |  62 ---
 njs/test/njs_unit_test.c |   3 ++
 2 files changed, 35 insertions(+), 30 deletions(-)

diffs (91 lines):

diff -r 7d06ada396d7 -r f1da98bdd82f njs/njs_regexp.c
--- a/njs/njs_regexp.c  Fri Nov 09 18:22:01 2018 +0300
+++ b/njs/njs_regexp.c  Mon Nov 12 17:22:14 2018 +0300
@@ -644,42 +644,44 @@ njs_regexp_prototype_exec(njs_vm_t *vm, 
 
 (void) njs_string_prop(&string, value);
 
-utf8 = NJS_STRING_BYTE;
-type = NJS_REGEXP_BYTE;
-
-if (string.length != 0) {
-utf8 = NJS_STRING_ASCII;
-type = NJS_REGEXP_UTF8;
-
-if (string.length != string.size) {
-utf8 = NJS_STRING_UTF8;
-}
-}
+if (string.size >= regexp->last_index) {
+utf8 = NJS_STRING_BYTE;
+type = NJS_REGEXP_BYTE;
 
-pattern = regexp->pattern;
-
-if (nxt_regex_is_valid(&pattern->regex[type])) {
-string.start += regexp->last_index;
-string.size -= regexp->last_index;
+if (string.length != 0) {
+utf8 = NJS_STRING_ASCII;
+type = NJS_REGEXP_UTF8;
 
-match_data = nxt_regex_match_data(&pattern->regex[type],
-  vm->regex_context);
-if (nxt_slow_path(match_data == NULL)) {
-njs_memory_error(vm);
-return NXT_ERROR;
+if (string.length != string.size) {
+utf8 = NJS_STRING_UTF8;
+}
 }
 
-ret = njs_regexp_match(vm, &pattern->regex[type], string.start,
-   string.size, match_data);
-if (ret >= 0) {
-return njs_regexp_exec_result(vm, regexp, utf8, string.start,
-  match_data);
-}
+pattern = regexp->pattern;
+
+if (nxt_regex_is_valid(&pattern->regex[type])) {
+string.start += regexp->last_index;
+string.size -= regexp->last_index;
+
+match_data = nxt_regex_match_data(&pattern->regex[type],
+  vm->regex_context);
+if (nxt_slow_path(match_data == NULL)) {
+njs_memory_error(vm);
+return NXT_ERROR;
+}
 
-if (nxt_slow_path(ret != NXT_REGEX_NOMATCH)) {
-nxt_regex_match_data_free(match_data, vm->regex_context);
+ret = njs_regexp_match(vm, &pattern->regex[type], string.start,
+   string.size, match_data);
+if (ret >= 0) {
+return njs_regexp_exec_result(vm, regexp, utf8, string.start,
+  match_data);
+}
 
-return NXT_ERROR;
+if (nxt_slow_path(ret != NXT_REGEX_NOMATCH)) {
+nxt_regex_match_data_free(match_data, vm->regex_context);
+
+return NXT_ERROR;
+}
 }
 }
 
diff -r 7d06ada396d7 -r f1da98bdd82f njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c  Fri Nov 09 18:22:01 2018 +0300
+++ b/njs/test/njs_unit_test.c  Mon Nov 12 17:22:14 2018 +0300
@@ -5973,6 +5973,9 @@ static njs_unit_test_t  njs_test[] =
 { nxt_string("var a = /^$/.exec(''); a.length +' '+ a"),
   nxt_string("1 ") },
 
+{ nxt_string("var r = /3/g; r.exec('123') +' '+ r.exec('3')"),
+  nxt_string("3 null") },
+
 { nxt_string("var r = /бв/ig;"
  "var a = r.exec('АБВ');"
  "r.lastIndex +' '+ a +' '+ "
___
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel