]> git.kaiwu.me - njs.git/commitdiff
Fixed RegExp.prototype.split().
authorDmitry Volyntsev <xeioex@nginx.com>
Fri, 6 Oct 2023 23:49:59 +0000 (16:49 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Fri, 6 Oct 2023 23:49:59 +0000 (16:49 -0700)
The issue was introduced in c0aad58cfadb.

src/njs_regexp.c
src/test/njs_unit_test.c

index b6c86dbac370fc7b60986b7f1375f685de3c8578..839fc8de95dca045d4a8b9a5f660d23b3f6a5f15 100644 (file)
@@ -1625,7 +1625,7 @@ njs_regexp_prototype_symbol_split(njs_vm_t *vm, njs_value_t *args,
     njs_value_t        r, z, this, s_lvalue, setval, constructor;
     njs_object_t       *object;
     const u_char       *start, *end;
-    njs_string_prop_t  s;
+    njs_string_prop_t  s, sv;
     njs_value_t        arguments[2];
 
     static const njs_value_t  string_lindex = njs_string("lastIndex");
@@ -1815,14 +1815,17 @@ njs_regexp_prototype_symbol_split(njs_vm_t *vm, njs_value_t *args,
         ncaptures = njs_max(ncaptures - 1, 0);
 
         for (i = 1; i <= ncaptures; i++) {
-            value = njs_array_push(vm, array);
-            if (njs_slow_path(value == NULL)) {
+            ret = njs_value_property_i64(vm, &z, i, retval);
+            if (njs_slow_path(ret == NJS_ERROR)) {
                 return NJS_ERROR;
             }
 
-            ret = njs_value_property_i64(vm, &z, i, value);
-            if (njs_slow_path(ret == NJS_ERROR)) {
-                return NJS_ERROR;
+            (void) njs_string_prop(&sv, retval);
+
+            ret = njs_array_string_add(vm, array, sv.start, sv.size,
+                                       sv.length);
+            if (njs_slow_path(ret != NJS_OK)) {
+                return ret;
             }
 
             if (array->length == limit) {
index 1854120466836ff667215d324cbe15d83fb42a88..fbe9043eb54888397bbc0f47010773606699308d 100644 (file)
@@ -9734,6 +9734,9 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("'мояВерблюжьяСтрока'.split(/(?=[А-Я])/)"),
       njs_str("моя,Верблюжья,Строка") },
 
+    { njs_str("`aaaaaaaaaaaaaaaaa`.split(/(.*)/)"),
+      njs_str(",aaaaaaaaaaaaaaaaa,") },
+
     { njs_str("'Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand '.split( /\\s*(?:;|$)\\s*/)"),
       njs_str("Harry Trump,Fred Barney,Helen Rigby,Bill Abel,Chris Hand,") },