This speeds up njs_vm_clone() operation twice.
}
prototypes[NJS_PROTOTYPE_REGEXP].regexp.pattern =
- vm->empty_regexp.data.u.regexp->pattern;
+ vm->shared->empty_regexp_pattern;
constructors = vm->shared->constructors;
vm->regex_context->trace = &vm->trace;
- return njs_regexp_create(vm, &vm->empty_regexp, (u_char *) "(?:)",
- sizeof("(?:)") - 1, 0);
+ return NXT_OK;
}
if (length != 0) {
pattern = njs_regexp_pattern_create(vm, start, length, flags);
+ if (nxt_slow_path(pattern == NULL)) {
+ return NXT_ERROR;
+ }
- if (nxt_fast_path(pattern != NULL)) {
- regexp = njs_regexp_alloc(vm, pattern);
+ } else {
+ pattern = vm->shared->empty_regexp_pattern;
+ }
- if (nxt_fast_path(regexp != NULL)) {
- value->data.u.regexp = regexp;
- value->type = NJS_REGEXP;
- value->data.truth = 1;
+ 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_ERROR;
+ return NXT_OK;
}
- *value = vm->empty_regexp;
-
- return NXT_OK;
+ return NXT_ERROR;
}
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])) {
*/
arguments[0] = args[1];
- } else if (njs_is_string(&args[1])) {
- /* string1.match(string2) is the same as /string2/.exec(string1). */
+ 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);
}
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 */
*/
njs_object_prototype_t prototypes[NJS_PROTOTYPE_MAX];
njs_function_t constructors[NJS_CONSTRUCTOR_MAX];
+
+ njs_regexp_pattern_t *empty_regexp_pattern;
};
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,
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;