Welcome! Log In Create A New Profile

Advanced

[njs] Now the empty regexp pattern is created on compile stage only.

November 11, 2016 09:40AM
details: http://hg.nginx.org/njs/rev/9f66db825663
branches:
changeset: 252:9f66db825663
user: Igor Sysoev <igor@sysoev.ru>
date: Fri Nov 11 17:28:47 2016 +0300
description:
Now the empty regexp pattern is created on compile stage only.

This speeds up njs_vm_clone() operation twice.

diffstat:

njs/njs_builtin.c | 2 +-
njs/njs_regexp.c | 31 +++++++++++++++----------------
njs/njs_string.c | 23 ++++++++++++++---------
njs/njs_vm.h | 3 ++-
njs/njscript.c | 13 +++++++++++--
5 files changed, 43 insertions(+), 29 deletions(-)

diffs (164 lines):

diff -r 0939df226d5c -r 9f66db825663 njs/njs_builtin.c
--- a/njs/njs_builtin.c Thu Nov 10 19:09:13 2016 +0300
+++ b/njs/njs_builtin.c Fri Nov 11 17:28:47 2016 +0300
@@ -230,7 +230,7 @@ njs_builtin_objects_create(njs_vm_t *vm)
}

prototypes[NJS_PROTOTYPE_REGEXP].regexp.pattern =
- vm->empty_regexp.data.u.regexp->pattern;
+ vm->shared->empty_regexp_pattern;

constructors = vm->shared->constructors;

diff -r 0939df226d5c -r 9f66db825663 njs/njs_regexp.c
--- a/njs/njs_regexp.c Thu Nov 10 19:09:13 2016 +0300
+++ b/njs/njs_regexp.c Fri Nov 11 17:28:47 2016 +0300
@@ -65,8 +65,7 @@ njs_regexp_init(njs_vm_t *vm)

vm->regex_context->trace = &vm->trace;

- return njs_regexp_create(vm, &vm->empty_regexp, (u_char *) "(?:)",
- sizeof("(?:)") - 1, 0);
+ return NXT_OK;
}


@@ -128,25 +127,25 @@ njs_regexp_create(njs_vm_t *vm, njs_valu

if (length != 0) {
pattern = njs_regexp_pattern_create(vm, start, length, flags);
-
- if (nxt_fast_path(pattern != NULL)) {
- regexp = njs_regexp_alloc(vm, pattern);
-
- if (nxt_fast_path(regexp != NULL)) {
- value->data.u.regexp = regexp;
- value->type = NJS_REGEXP;
- value->data.truth = 1;
-
- return NXT_OK;
- }
+ if (nxt_slow_path(pattern == NULL)) {
+ return NXT_ERROR;
}

- return NXT_ERROR;
+ } else {
+ pattern = vm->shared->empty_regexp_pattern;
}

- *value = vm->empty_regexp;
+ regexp = njs_regexp_alloc(vm, pattern);

- return NXT_OK;
+ if (nxt_fast_path(regexp != NULL)) {
+ value->data.u.regexp = regexp;
+ value->type = NJS_REGEXP;
+ value->data.truth = 1;
+
+ return NXT_OK;
+ }
+
+ return NXT_ERROR;
}


diff -r 0939df226d5c -r 9f66db825663 njs/njs_string.c
--- a/njs/njs_string.c Thu Nov 10 19:09:13 2016 +0300
+++ b/njs/njs_string.c Fri Nov 11 17:28:47 2016 +0300
@@ -1946,9 +1946,11 @@ njs_string_prototype_match(njs_vm_t *vm,
njs_string_prop_t string;
njs_regexp_pattern_t *pattern;

- arguments[0] = vm->empty_regexp;
arguments[1] = args[0];

+ string.start = NULL;
+ string.size = 0;
+
if (nargs > 1) {

if (njs_is_regexp(&args[1])) {
@@ -1964,21 +1966,24 @@ njs_string_prototype_match(njs_vm_t *vm,
*/
arguments[0] = args[1];

- } else if (njs_is_string(&args[1])) {
+ goto match;
+ }
+
+ if (njs_is_string(&args[1])) {
/* string1.match(string2) is the same as /string2/.exec(string1). */
-
(void) njs_string_prop(&string, &args[1]);
-
- ret = njs_regexp_create(vm, &arguments[0], string.start,
- string.size, 0);
- if (nxt_slow_path(ret != NXT_OK)) {
- return ret;
- }
}

/* A void value. */
}

+ ret = njs_regexp_create(vm, &arguments[0], string.start, string.size, 0);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return ret;
+ }
+
+match:
+
return njs_regexp_prototype_exec(vm, arguments, nargs, unused);
}

diff -r 0939df226d5c -r 9f66db825663 njs/njs_vm.h
--- a/njs/njs_vm.h Thu Nov 10 19:09:13 2016 +0300
+++ b/njs/njs_vm.h Fri Nov 11 17:28:47 2016 +0300
@@ -845,7 +845,6 @@ struct njs_vm_s {

nxt_regex_context_t *regex_context;
nxt_regex_match_data_t *single_match_data;
- njs_value_t empty_regexp;

nxt_array_t *code; /* of njs_vm_code_t */

@@ -875,6 +874,8 @@ struct njs_vm_shared_s {
*/
njs_object_prototype_t prototypes[NJS_PROTOTYPE_MAX];
njs_function_t constructors[NJS_CONSTRUCTOR_MAX];
+
+ njs_regexp_pattern_t *empty_regexp_pattern;
};


diff -r 0939df226d5c -r 9f66db825663 njs/njscript.c
--- a/njs/njscript.c Thu Nov 10 19:09:13 2016 +0300
+++ b/njs/njscript.c Fri Nov 11 17:28:47 2016 +0300
@@ -102,8 +102,9 @@ njs_vm_t *
njs_vm_create(nxt_mem_cache_pool_t *mcp, njs_vm_shared_t **shared,
nxt_lvlhsh_t *externals)
{
- njs_vm_t *vm;
- nxt_int_t ret;
+ njs_vm_t *vm;
+ nxt_int_t ret;
+ njs_regexp_pattern_t *pattern;

if (mcp == NULL) {
mcp = nxt_mem_cache_pool_create(&njs_vm_mem_cache_pool_proto, NULL,
@@ -145,6 +146,14 @@ njs_vm_create(nxt_mem_cache_pool_t *mcp,

nxt_lvlhsh_init(&vm->shared->values_hash);

+ pattern = njs_regexp_pattern_create(vm, (u_char *) "(?:)",
+ sizeof("(?:)") - 1, 0);
+ if (nxt_slow_path(pattern == NULL)) {
+ return NULL;
+ }
+
+ vm->shared->empty_regexp_pattern = pattern;
+
ret = njs_builtin_objects_create(vm);
if (nxt_slow_path(ret != NXT_OK)) {
return NULL;

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Now the empty regexp pattern is created on compile stage only.

Igor Sysoev 729 November 11, 2016 09:40AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 60
Record Number of Users: 6 on February 13, 2018
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready