nxt_int_t njs_regexp_create(njs_vm_t *vm, njs_value_t *value, u_char *start, size_t length, njs_regexp_flags_t flags) { njs_regexp_t *regexp; njs_regexp_pattern_t *pattern; if (length != 0) { pattern = njs_regexp_pattern_create(vm, start, length, flags); if (nxt_slow_path(pattern == NULL)) { return NXT_ERROR; } } else { pattern = vm->shared->empty_regexp_pattern; } 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; } return NXT_ERROR; }
njs_ret_t njs_regexp_constructor(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { size_t length; njs_regexp_t *regexp; njs_string_prop_t string; njs_regexp_flags_t flags; njs_regexp_pattern_t *pattern; flags = 0; switch (nargs) { default: length = njs_string_prop(&string, &args[2]); flags = njs_regexp_flags(&string.start, string.start + length, 1); if (nxt_slow_path(flags < 0)) { return NXT_ERROR; } /* Fall through. */ case 2: string.length = njs_string_prop(&string, &args[1]); if (string.length != 0) { break; } /* Fall through. */ case 1: string.start = (u_char *) "(?:)"; string.length = sizeof("(?:)") - 1; break; } pattern = njs_regexp_pattern_create(vm, string.start, string.length, flags); if (nxt_fast_path(pattern != NULL)) { regexp = njs_regexp_alloc(vm, pattern); if (nxt_fast_path(regexp != NULL)) { vm->retval.data.u.regexp = regexp; vm->retval.type = NJS_REGEXP; vm->retval.data.truth = 1; return NXT_OK; } } return NXT_ERROR; }