Skip to content

Commit

Permalink
Improved String.prototype.replaceAll() for readability.
Browse files Browse the repository at this point in the history
  • Loading branch information
xeioex committed May 23, 2024
1 parent 3a5042f commit 09d04c3
Showing 1 changed file with 23 additions and 15 deletions.
38 changes: 23 additions & 15 deletions src/njs_string.c
Original file line number Diff line number Diff line change
Expand Up @@ -3228,15 +3228,15 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
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;
njs_chb_t chain;
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;

Expand Down Expand Up @@ -3331,7 +3331,6 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
}

if (!replaceAll) {

if (func_replace == NULL) {
ret = njs_string_get_substitution(vm, search, this, pos, NULL, 0,
NULL, replace, &value);
Expand All @@ -3356,7 +3355,7 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
}
}

p = njs_string_offset(&string, pos);
end = njs_string_offset(&string, pos);

(void) njs_string_prop(&ret_string, &value);

Expand All @@ -3368,17 +3367,16 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
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) {
Expand All @@ -3405,20 +3403,30 @@ njs_string_prototype_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
}
}

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;
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;
}

pos = njs_string_index_of(&string, &s, end_of_last_match);
} else {
pos = njs_string_index_of(&string, &s, end_of_last_match);
}

} while (pos >= 0 && end_of_last_match <= string.length);
} while (pos >= 0);

njs_chb_append(&chain, p_start, string.start + string.size - p_start);
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)) {
Expand Down

0 comments on commit 09d04c3

Please sign in to comment.