patch 9.1.0479: fuzzy_match_str_with_pos() does unnecessary list operations

Commit: 
https://github.com/vim/vim/commit/2f95ca9fcef8495d60e298ac2cd6d702b90bfb18
Author: zeertzjq <zeert...@outlook.com>
Date:   Thu Jun 13 17:14:27 2024 +0200

    patch 9.1.0479: fuzzy_match_str_with_pos() does unnecessary list operations
    
    Problem:  fuzzy_match_str_with_pos() does unnecessary list operations.
    Solution: Use fuzzy_match() directly (zeertzjq).
    
    closes: #14987
    
    Signed-off-by: zeertzjq <zeert...@outlook.com>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt
index eb1dd7856..7ec47bd83 100644
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -1,4 +1,4 @@
-*syntax.txt*   For Vim version 9.1.  Last change: 2024 Jun 11
+*syntax.txt*   For Vim version 9.1.  Last change: 2024 Jun 13
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -5688,7 +5688,6 @@ PmenuThumb        Popup menu: Thumb of the scrollbar.
 PmenuMatch     Popup menu: Matched text in normal item
                                                        *hl-PmenuMatchSel*
 PmenuMatchSel  Popup menu: Matched text in selected item
-
                                                        *hl-PopupNotification*
 PopupNotification
                Popup window created with |popup_notification()|.  If not
diff --git a/src/popupmenu.c b/src/popupmenu.c
index 00b000618..dd1a6ec99 100644
--- a/src/popupmenu.c
+++ b/src/popupmenu.c
@@ -463,8 +463,8 @@ pum_screen_put_with_attr(int row, int col, char_u *text, 
int textlen, int attr)
             // Handle fuzzy matching
             for (i = 0; i < ga->ga_len; i++)
             {
-                int *match_pos = ((int *)ga->ga_data) + i;
-                int actual_char_pos = 0;
+                int_u *match_pos = ((int_u *)ga->ga_data) + i;
+                int_u actual_char_pos = 0;
                 char_u *temp_ptr = text;
                 while (temp_ptr < ptr)
                 {
diff --git a/src/search.c b/src/search.c
index 20bf399b2..0b39d90b0 100644
--- a/src/search.c
+++ b/src/search.c
@@ -5101,115 +5101,39 @@ fuzzy_match_str_with_pos(char_u *str UNUSED, char_u 
*pat UNUSED)
 {
 #ifdef FEAT_SEARCH_EXTRA
     int                    score = 0;
-    garray_T       *match_positions = ALLOC_ONE(garray_T);
-    typval_T       tv_str;
-    list_T         *l = NULL;
-    list_T         *retlist = NULL;
-    list_T         *match_str_list = NULL;
-    list_T         *match_pos_list = NULL;
-    list_T         *match_score_list = NULL;
-    listitem_T     *score_item = NULL;
-    listitem_T     *positions_item = NULL;
-    list_T         *positions_outer_list = NULL;
-    listitem_T     *outer_li = NULL;
-    list_T         *positions_inner_list = NULL;
+    garray_T       *match_positions = NULL;
+    int_u          matches[MAX_FUZZY_MATCHES];
+    int                    j = 0;
 
-    if (match_positions == NULL)
-        return NULL;
-    ga_init2(match_positions, sizeof(int), 10);
     if (str == NULL || pat == NULL)
-    {
-        ga_clear(match_positions);
         return NULL;
-    }
-    l = list_alloc();
-    if (l == NULL)
-    {
-        ga_clear(match_positions);
-        return NULL;
-    }
-
-    tv_str.v_type = VAR_STRING;
-    tv_str.vval.v_string = vim_strsave(str);
-    if (tv_str.vval.v_string == NULL || list_append_tv(l, &tv_str) == FAIL)
-        goto cleanup;
-
-    retlist = list_alloc();
-    if (retlist == NULL)
-        goto cleanup;
 
-    match_str_list = list_alloc();
-    match_pos_list = list_alloc();
-    match_score_list = list_alloc();
-    if (match_str_list == NULL || match_pos_list == NULL || match_score_list 
== NULL)
-        goto cleanup;
-
-    list_append_list(retlist, match_str_list);
-    list_append_list(retlist, match_pos_list);
-    list_append_list(retlist, match_score_list);
-
-    fuzzy_match_in_list(l, pat, FALSE, NULL, NULL, TRUE, retlist, 1);
-
-    if (retlist->lv_len != 3)
-        goto cleanup;
+    match_positions = ALLOC_ONE(garray_T);
+    if (match_positions == NULL)
+        return NULL;
+    ga_init2(match_positions, sizeof(int_u), 10);
 
-    score_item = list_find(retlist, 2);
-    if (score_item != NULL && score_item->li_tv.v_type == VAR_LIST)
+    if (!fuzzy_match(str, pat, FALSE, &score, matches, MAX_FUZZY_MATCHES)
+           || score == 0)
     {
-        list_T *score_list = score_item->li_tv.vval.v_list;
-        if (score_list->lv_len > 0)
-        {
-            listitem_T *first_score_item = score_list->lv_first;
-            if (first_score_item != NULL && first_score_item->li_tv.v_type == 
VAR_NUMBER)
-                score = first_score_item->li_tv.vval.v_number;
-        }
+       ga_clear(match_positions);
+       vim_free(match_positions);
+       return NULL;
     }
-    if (score == 0)
-        goto cleanup;
 
-    positions_item = list_find(retlist, 1);
-    if (positions_item != NULL && positions_item->li_tv.v_type == VAR_LIST)
+    for (char_u *p = pat; *p != NUL; MB_PTR_ADV(p))
     {
-        positions_outer_list = positions_item->li_tv.vval.v_list;
-        if (positions_outer_list->lv_len > 0)
-        {
-            outer_li = positions_outer_list->lv_first;
-            if (outer_li != NULL && outer_li->li_tv.v_type == VAR_LIST)
-            {
-                positions_inner_list = outer_li->li_tv.vval.v_list;
-                for (listitem_T *li = positions_inner_list->lv_first; li != 
NULL; li = li->li_next)
-                {
-                    if (li->li_tv.v_type == VAR_NUMBER)
-                    {
-                        int pos = li->li_tv.vval.v_number;
-                        ga_grow(match_positions, 1);
-                        ((int 
*)match_positions->ga_data)[match_positions->ga_len] = pos;
-                        match_positions->ga_len++;
-                    }
-                }
-            }
-        }
+       if (!VIM_ISWHITE(PTR2CHAR(p)))
+       {
+           ga_grow(match_positions, 1);
+           ((int_u *)match_positions->ga_data)[match_positions->ga_len] =
+                                                                   matches[j];
+           match_positions->ga_len++;
+           j++;
+       }
     }
 
-    vim_free(tv_str.vval.v_string);
-    list_free(retlist);
-    list_free(l);
     return match_positions;
-
-cleanup:
-    vim_free(tv_str.vval.v_string);
-    if (match_str_list != NULL)
-        list_free(match_str_list);
-    if (match_pos_list != NULL)
-        list_free(match_pos_list);
-    if (match_score_list != NULL)
-        list_free(match_score_list);
-    if (retlist != NULL)
-        list_free(retlist);
-    if (l != NULL)
-        list_free(l);
-    ga_clear(match_positions);
-    return NULL;
 #else
     return NULL;
 #endif
diff --git a/src/version.c b/src/version.c
index 4b695c01e..5addf1a8d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    479,
 /**/
     478,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1sHmOp-00Aecy-VC%40256bit.org.

Raspunde prin e-mail lui