]> git.kaiwu.me - njs.git/commitdiff
Improved String.prototype.match() function.
authorAlexander Borisov <alexander.borisov@nginx.com>
Wed, 24 Apr 2019 16:04:23 +0000 (19:04 +0300)
committerAlexander Borisov <alexander.borisov@nginx.com>
Wed, 24 Apr 2019 16:04:23 +0000 (19:04 +0300)
njs/njs_string.c

index 9a815b0b2f0053b8592a4ebfb799e15bfe8a1d28..e20a9207ccbad70a3b8c4f9bca929c3f20b33fd0 100644 (file)
@@ -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;