summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-01-29 11:22:17 +0000
committerBram Moolenaar <Bram@vim.org>2022-01-29 11:22:17 +0000
commit585ee07cfef307b2fc828537e0d31fdc22d7e79f (patch)
tree7c39c5284f81ce21a3b5919c6ad0c6de3171ecbe
parenta0c4e2f2d7aa164d9d7692702c752ea063bd3a8c (diff)
patch 8.2.4249: the timeout limit for spell suggestions is always 5000v8.2.4249
Problem: The timeout limit for spell suggestions is always 5000 milli seconds. Solution: Add the "timeout" entry to 'spellsuggest'.
-rw-r--r--runtime/doc/options.txt6
-rw-r--r--src/spellsuggest.c21
-rw-r--r--src/testdir/test_spell.vim10
-rw-r--r--src/version.c2
4 files changed, 34 insertions, 5 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 55e3cf8ba5..199c261761 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -7363,6 +7363,12 @@ A jump table for the options with a short description can be found at |Q_op|.
suggestions is never more than the value of 'lines'
minus two.
+ timeout:{millisec} Limit the time searching for suggestions to
+ {millisec} milli seconds. Applies to the following
+ methods. When omitted the limit is 5000. When
+ negative there is no limit. {only works when built
+ with the +reltime feature}
+
file:{filename} Read file {filename}, which must have two columns,
separated by a slash. The first column contains the
bad word, the second column the suggested good word.
diff --git a/src/spellsuggest.c b/src/spellsuggest.c
index e54b6fdc87..3cd45352fc 100644
--- a/src/spellsuggest.c
+++ b/src/spellsuggest.c
@@ -197,6 +197,8 @@ typedef struct trystate_S
#define PFD_PREFIXTREE 0xfe // walking through the prefix tree
#define PFD_NOTSPECIAL 0xfd // highest value that's not special
+static long spell_suggest_timeout = 5000;
+
static void spell_find_suggest(char_u *badptr, int badlen, suginfo_T *su, int maxcount, int banbadword, int need_cap, int interactive);
#ifdef FEAT_EVAL
static void spell_suggest_expr(suginfo_T *su, char_u *expr);
@@ -429,7 +431,10 @@ spell_check_sps(void)
else if (STRCMP(buf, "double") == 0)
f = SPS_DOUBLE;
else if (STRNCMP(buf, "expr:", 5) != 0
- && STRNCMP(buf, "file:", 5) != 0)
+ && STRNCMP(buf, "file:", 5) != 0
+ && (STRNCMP(buf, "timeout:", 8) != 0
+ || (!VIM_ISDIGIT(buf[8])
+ && !(buf[8] == '-' && VIM_ISDIGIT(buf[9])))))
f = -1;
if (f == -1 || (sps_flags != 0 && f != 0))
@@ -842,6 +847,7 @@ spell_find_suggest(
sps_copy = vim_strsave(p_sps);
if (sps_copy == NULL)
return;
+ spell_suggest_timeout = 5000;
// Loop over the items in 'spellsuggest'.
for (p = sps_copy; *p != NUL; )
@@ -864,6 +870,9 @@ spell_find_suggest(
else if (STRNCMP(buf, "file:", 5) == 0)
// Use list of suggestions in a file.
spell_suggest_file(su, buf + 5);
+ else if (STRNCMP(buf, "timeout:", 8) == 0)
+ // Limit the time searching for suggestions.
+ spell_suggest_timeout = atol((char *)buf + 8);
else if (!did_intern)
{
// Use internal method once.
@@ -1325,9 +1334,10 @@ suggest_trie_walk(
}
}
#ifdef FEAT_RELTIME
- // The loop may take an indefinite amount of time. Break out after five
- // sectonds. TODO: add an option for the time limit.
- profile_setlimit(5000, &time_limit);
+ // The loop may take an indefinite amount of time. Break out after some
+ // time.
+ if (spell_suggest_timeout > 0)
+ profile_setlimit(spell_suggest_timeout, &time_limit);
#endif
// Loop to find all suggestions. At each round we either:
@@ -2659,7 +2669,8 @@ suggest_trie_walk(
ui_breakcheck();
breakcheckcount = 1000;
#ifdef FEAT_RELTIME
- if (profile_passed_limit(&time_limit))
+ if (spell_suggest_timeout > 0
+ && profile_passed_limit(&time_limit))
got_int = TRUE;
#endif
}
diff --git a/src/testdir/test_spell.vim b/src/testdir/test_spell.vim
index a5c990ab72..e6f535be14 100644
--- a/src/testdir/test_spell.vim
+++ b/src/testdir/test_spell.vim
@@ -446,6 +446,16 @@ func Test_spellsuggest_expr_errors()
delfunc MySuggest3
endfunc
+func Test_spellsuggest_timeout()
+ set spellsuggest=timeout:30
+ set spellsuggest=timeout:-123
+ set spellsuggest=timeout:999999
+ call assert_fails('set spellsuggest=timeout', 'E474:')
+ call assert_fails('set spellsuggest=timeout:x', 'E474:')
+ call assert_fails('set spellsuggest=timeout:-x', 'E474:')
+ call assert_fails('set spellsuggest=timeout:--9', 'E474:')
+endfunc
+
func Test_spellinfo()
new
let runtime = substitute($VIMRUNTIME, '\\', '/', 'g')
diff --git a/src/version.c b/src/version.c
index 13de4a4347..0e95130664 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4249,
+/**/
4248,
/**/
4247,