From: Alexander Borisov Date: Wed, 24 Apr 2019 16:04:23 +0000 (+0300) Subject: Improved String.prototype.match() function. X-Git-Tag: 0.3.2~49 X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=836458617e55924a7499d8a51b1c86d8cd668219;p=njs.git Improved String.prototype.match() function. --- diff --git a/njs/njs_string.c b/njs/njs_string.c index 9a815b0b..e20a9207 100644 --- a/njs/njs_string.c +++ b/njs/njs_string.c @@ -2660,65 +2660,64 @@ njs_string_match_multiple(njs_vm_t *vm, njs_value_t *args, } if (nxt_regex_is_valid(&pattern->regex[type])) { - array = NULL; + + array = njs_array_alloc(vm, 0, NJS_ARRAY_SPARE); + if (nxt_slow_path(array == NULL)) { + return NXT_ERROR; + } + p = string.start; end = p + string.size; do { ret = njs_regexp_match(vm, &pattern->regex[type], p, string.size, vm->single_match_data); - if (ret >= 0) { - if (array != NULL) { - ret = njs_array_expand(vm, array, 0, 1); - if (nxt_slow_path(ret != NXT_OK)) { - return ret; - } - - } else { - array = njs_array_alloc(vm, 0, NJS_ARRAY_SPARE); - if (nxt_slow_path(array == NULL)) { - return NXT_ERROR; - } - - vm->retval.data.u.array = array; - vm->retval.type = NJS_ARRAY; - vm->retval.data.truth = 1; + if (ret < 0) { + if (nxt_fast_path(ret == NXT_REGEX_NOMATCH)) { + break; } - captures = nxt_regex_captures(vm->single_match_data); - start = p + captures[0]; + njs_internal_error(vm, "njs_regexp_match() failed"); - if (captures[1] == 0) { - p = nxt_utf8_next(start, end); - string.size = end - p; + return NXT_ERROR; + } - size = 0; - length = 0; + ret = njs_array_expand(vm, array, 0, 1); + if (nxt_slow_path(ret != NXT_OK)) { + return ret; + } - } else { - p += captures[1]; - string.size -= captures[1]; + captures = nxt_regex_captures(vm->single_match_data); + start = p + captures[0]; - size = captures[1] - captures[0]; - length = njs_string_calc_length(utf8, start, size); - } + if (captures[1] == 0) { + p = nxt_utf8_next(start, end); + string.size = end - p; - ret = njs_string_new(vm, &array->start[array->length], - start, size, length); - if (nxt_slow_path(ret != NXT_OK)) { - return ret; - } + size = 0; + length = 0; - array->length++; + } else { + p += captures[1]; + string.size -= captures[1]; - } else if (ret == NXT_REGEX_NOMATCH) { - break; + size = captures[1] - captures[0]; + length = njs_string_calc_length(utf8, start, size); + } - } else { - return NXT_ERROR; + ret = njs_string_new(vm, &array->start[array->length], + start, size, length); + if (nxt_slow_path(ret != NXT_OK)) { + return ret; } + array->length++; + } while (p <= end); + + vm->retval.data.u.array = array; + vm->retval.type = NJS_ARRAY; + vm->retval.data.truth = 1; } return NXT_OK;