summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-06-16 21:20:48 +0100
committerBram Moolenaar <Bram@vim.org>2022-06-16 21:20:48 +0100
commit5ea38d1e7fd597ffde13b292d43e12747f20e97f (patch)
tree999b0c14e9c516d94b6419693e07e2c4695a2757
parentc72e31dfcc013ae840cd7f8899f2430b7f6812c9 (diff)
downloadvim-git-5ea38d1e7fd597ffde13b292d43e12747f20e97f.tar.gz
patch 8.2.5114: time limit on searchpair() does not work properlyv8.2.5114
Problem: Time limit on searchpair() does not work properly. Solution: Set the time limit once instead of for each regexp. (closes #10562)
-rw-r--r--src/evalfunc.c10
-rw-r--r--src/search.c15
-rw-r--r--src/testdir/test_search.vim26
-rw-r--r--src/version.c2
4 files changed, 42 insertions, 11 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 6335a6469..b7d7643ae 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -8975,6 +8975,10 @@ do_searchpair(
if (skip != NULL)
use_skip = eval_expr_valid_arg(skip);
+#ifdef FEAT_RELTIME
+ if (time_limit > 0)
+ init_regexp_timeout(time_limit);
+#endif
save_cursor = curwin->w_cursor;
pos = curwin->w_cursor;
CLEAR_POS(&firstpos);
@@ -8986,9 +8990,6 @@ do_searchpair(
CLEAR_FIELD(sia);
sia.sa_stop_lnum = lnum_stop;
-#ifdef FEAT_RELTIME
- sia.sa_tm = time_limit;
-#endif
n = searchit(curwin, curbuf, &pos, NULL, dir, pat, 1L,
options, RE_SEARCH, &sia);
if (n == FAIL || (firstpos.lnum != 0 && EQUAL_POS(pos, firstpos)))
@@ -9074,6 +9075,9 @@ do_searchpair(
curwin->w_cursor = save_cursor;
theend:
+#ifdef FEAT_RELTIME
+ disable_regexp_timeout();
+#endif
vim_free(pat2);
vim_free(pat3);
if (p_cpo == empty_option)
diff --git a/src/search.c b/src/search.c
index be7f35a2a..e78e36b1e 100644
--- a/src/search.c
+++ b/src/search.c
@@ -674,10 +674,10 @@ searchit(
stop_lnum = extra_arg->sa_stop_lnum;
#ifdef FEAT_RELTIME
if (extra_arg->sa_tm > 0)
- {
init_regexp_timeout(extra_arg->sa_tm);
- timed_out = &extra_arg->sa_timed_out;
- }
+ // Also set the pointer when sa_tm is zero, the caller may have set the
+ // timeout.
+ timed_out = &extra_arg->sa_timed_out;
#endif
}
@@ -1105,9 +1105,10 @@ searchit(
}
while (--count > 0 && found); // stop after count matches or no match
-# ifdef FEAT_RELTIME
- disable_regexp_timeout();
-# endif
+#ifdef FEAT_RELTIME
+ if (extra_arg != NULL && extra_arg->sa_tm > 0)
+ disable_regexp_timeout();
+#endif
vim_regfree(regmatch.regprog);
if (!found) // did not find it
@@ -4859,7 +4860,7 @@ do_fuzzymatch(typval_T *argvars, typval_T *rettv, int retmatchpos)
// get the fuzzy matches
ret = rettv_list_alloc(rettv);
- if (ret != OK)
+ if (ret == FAIL)
goto done;
if (retmatchpos)
{
diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim
index b354a2f4f..caeddc567 100644
--- a/src/testdir/test_search.vim
+++ b/src/testdir/test_search.vim
@@ -328,7 +328,31 @@ func Test_searchpair()
call assert_equal(3, searchpair('\<if\>', '\<else\>', '\<endif\>', 'W'))
call assert_equal([0, 3, 3, 0], getpos('.'))
- q!
+ bwipe!
+endfunc
+
+func Test_searchpair_timeout()
+ CheckFeature reltime
+
+ func Waitabit()
+ sleep 20m
+ return 1 " skip match
+ endfunc
+
+ new
+ call setline(1, range(100))
+ call setline(1, "(start here")
+ call setline(100, "end here)")
+ let starttime = reltime()
+
+ " A timeout of 100 msec should happen after about five times of 20 msec wait
+ " in Waitabit(). When the timeout applies to each search the elapsed time
+ " will be much longer.
+ call assert_equal(0, searchpair('(', '\d', ')', '', "Waitabit()", 0, 100))
+ let elapsed = reltime(starttime)->reltimefloat()
+ call assert_inrange(0.09, 0.300, elapsed)
+
+ bwipe!
endfunc
func Test_searchpairpos()
diff --git a/src/version.c b/src/version.c
index bfa9c5a26..3edd31883 100644
--- a/src/version.c
+++ b/src/version.c
@@ -735,6 +735,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 5114,
+/**/
5113,
/**/
5112,