]> granicus.if.org Git - vim/commitdiff
patch 8.2.5114: time limit on searchpair() does not work properly v8.2.5114
authorBram Moolenaar <Bram@vim.org>
Thu, 16 Jun 2022 20:20:48 +0000 (21:20 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 16 Jun 2022 20:20:48 +0000 (21:20 +0100)
Problem:    Time limit on searchpair() does not work properly.
Solution:   Set the time limit once instead of for each regexp. (closes #10562)

src/evalfunc.c
src/search.c
src/testdir/test_search.vim
src/version.c

index 6335a6469c9ea0d0af3279a5f805196fee380946..b7d7643ae36d51d80c476b0027368d4ba58b89f0 100644 (file)
@@ -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)
index be7f35a2ac7d35ae3fbb05cd0dc890f51738a1c3..e78e36b1ed9a8b5cf640c79c1aa92a59fd980d06 100644 (file)
@@ -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)
     {
index b354a2f4f8e6be6fdfff595767ee085725edea72..caeddc567a9e380ec08e8e5c9a83aeb50a3c583a 100644 (file)
@@ -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()
index bfa9c5a263b25f4ca2d265da6683a7d60c86aa89..3edd3188328824fc86c3e9d4936b009bcc1645e8 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    5114,
 /**/
     5113,
 /**/