From a8b6fa07c4d9143f3bd279ce8fd87e8121da16e1 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Wed, 22 Jan 2025 09:28:27 +0800 Subject: [PATCH] fix(search): avoid quadratic time complexity when computing fuzzy score (#32153) --- src/nvim/search.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/nvim/search.c b/src/nvim/search.c index 5a53122739..6e87b07d06 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -2993,6 +2993,8 @@ static int fuzzy_match_compute_score(const char *const str, const int strSz, FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_PURE { assert(numMatches > 0); // suppress clang "result of operation is garbage" + const char *p = str; + uint32_t sidx = 0; // Initialize score int score = 100; bool is_exact_match = true; @@ -3026,12 +3028,12 @@ static int fuzzy_match_compute_score(const char *const str, const int strSz, // Check for bonuses based on neighbor character value if (currIdx > 0) { // Camel case - const char *p = str; int neighbor = ' '; - for (uint32_t sidx = 0; sidx < currIdx; sidx++) { + while (sidx < currIdx) { neighbor = utf_ptr2char(p); MB_PTR_ADV(p); + sidx++; } const int curr = utf_ptr2char(p);