[njs] Improved String.prototype.replaceAll() for readability.

Dmitry Volyntsev xeioex at nginx.com
Thu May 23 00:27:04 UTC 2024


details:   https://hg.nginx.org/njs/rev/077a5b2f30d8
branches:  
changeset: 2336:077a5b2f30d8
user:      Dmitry Volyntsev <xeioex at 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)) {


More information about the nginx-devel mailing list