details: https://hg.nginx.org/njs/rev/077a5b2f30d8 branches: changeset: 2336:077a5b2f30d8 user: Dmitry Volyntsev <xei...@nginx.com> date: Wed May 22 17:26:16 2024 -0700 description: Improved String.prototype.replaceAll() for readability.
diffstat: src/njs_string.c | 44 ++++++++++++++++++++++++++------------------ 1 files changed, 26 insertions(+), 18 deletions(-) diffs (100 lines): diff -r e496851c0fe7 -r 077a5b2f30d8 src/njs_string.c --- a/src/njs_string.c Wed May 22 17:26:08 2024 -0700 +++ b/src/njs_string.c Wed May 22 17:26:16 2024 -0700 @@ -3228,7 +3228,7 @@ njs_string_prototype_replace(njs_vm_t *v njs_index_t replaceAll, njs_value_t *retval) { u_char *r; - size_t length, size, increment, end_of_last_match; + size_t length, size, end_of_last_match; int64_t pos; njs_int_t ret; njs_str_t str; @@ -3236,7 +3236,7 @@ njs_string_prototype_replace(njs_vm_t *v njs_value_t *this, *search, *replace; njs_value_t search_lvalue, replace_lvalue, replacer, value, arguments[3]; - const u_char *p, *p_start; + const u_char *start, *end; njs_function_t *func_replace; njs_string_prop_t string, s, ret_string; @@ -3331,7 +3331,6 @@ njs_string_prototype_replace(njs_vm_t *v } if (!replaceAll) { - if (func_replace == NULL) { ret = njs_string_get_substitution(vm, search, this, pos, NULL, 0, NULL, replace, &value); @@ -3356,7 +3355,7 @@ njs_string_prototype_replace(njs_vm_t *v } } - p = njs_string_offset(&string, pos); + end = njs_string_offset(&string, pos); (void) njs_string_prop(&ret_string, &value); @@ -3368,17 +3367,16 @@ njs_string_prototype_replace(njs_vm_t *v return NJS_ERROR; } - r = njs_cpymem(r, string.start, p - string.start); + r = njs_cpymem(r, string.start, end - string.start); r = njs_cpymem(r, ret_string.start, ret_string.size); - memcpy(r, p + s.size, string.size - s.size - (p - string.start)); + memcpy(r, end + s.size, string.size - s.size - (end - string.start)); return NJS_OK; } NJS_CHB_MP_INIT(&chain, vm); - p_start = string.start; - increment = s.length != 0 ? s.length : 1; + start = string.start; do { if (func_replace == NULL) { @@ -3405,20 +3403,30 @@ njs_string_prototype_replace(njs_vm_t *v } } - p = njs_string_offset(&string, pos); + end = njs_string_offset(&string, pos); (void) njs_string_prop(&ret_string, &value); - njs_chb_append(&chain, p_start, p - p_start); + njs_chb_append(&chain, start, end - start); njs_chb_append(&chain, ret_string.start, ret_string.size); - p_start = p + s.size; - end_of_last_match = pos + increment; - - pos = njs_string_index_of(&string, &s, end_of_last_match); - - } while (pos >= 0 && end_of_last_match <= string.length); - - njs_chb_append(&chain, p_start, string.start + string.size - p_start); + start = end + s.size; + end_of_last_match = pos + s.length; + + if (njs_slow_path(s.length == 0)) { + if (end_of_last_match >= string.length) { + pos = -1; + + } else { + pos = end_of_last_match + 1; + } + + } else { + pos = njs_string_index_of(&string, &s, end_of_last_match); + } + + } while (pos >= 0); + + njs_chb_append(&chain, start, string.start + string.size - start); ret = njs_string_create_chb(vm, retval, &chain); if (njs_slow_path(ret != NJS_OK)) { _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel