|
|
diff --git a/src/spellsuggest.c b/src/spellsuggest.c |
|
|
index 3de9ff2..5462583 100644 |
|
|
--- a/src/spellsuggest.c |
|
|
+++ b/src/spellsuggest.c |
|
|
@@ -1200,7 +1200,7 @@ suggest_try_change(suginfo_T *su) |
|
|
|
|
|
// Check the maximum score, if we go over it we won't try this change. |
|
|
#define TRY_DEEPER(su, stack, depth, add) \ |
|
|
- (stack[depth].ts_score + (add) < su->su_maxscore) |
|
|
+ (depth < MAXWLEN - 1 && stack[depth].ts_score + (add) < su->su_maxscore) |
|
|
|
|
|
/* |
|
|
* Try finding suggestions by adding/removing/swapping letters. |
|
|
@@ -1272,6 +1272,9 @@ suggest_trie_walk( |
|
|
char_u changename[MAXWLEN][80]; |
|
|
#endif |
|
|
int breakcheckcount = 1000; |
|
|
+#ifdef FEAT_RELTIME |
|
|
+ proftime_T time_limit; |
|
|
+#endif |
|
|
int compound_ok; |
|
|
|
|
|
// Go through the whole case-fold tree, try changes at each node. |
|
|
@@ -1316,6 +1319,11 @@ suggest_trie_walk( |
|
|
sp->ts_state = STATE_START; |
|
|
} |
|
|
} |
|
|
+#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); |
|
|
+#endif |
|
|
|
|
|
// Loop to find all suggestions. At each round we either: |
|
|
// - For the current state try one operation, advance "ts_curi", |
|
|
@@ -1350,7 +1358,8 @@ suggest_trie_walk( |
|
|
|
|
|
// At end of a prefix or at start of prefixtree: check for |
|
|
// following word. |
|
|
- if (byts[arridx] == 0 || n == (int)STATE_NOPREFIX) |
|
|
+ if (depth < MAXWLEN - 1 |
|
|
+ && (byts[arridx] == 0 || n == (int)STATE_NOPREFIX)) |
|
|
{ |
|
|
// Set su->su_badflags to the caps type at this position. |
|
|
// Use the caps type until here for the prefix itself. |
|
|
@@ -2644,6 +2653,10 @@ suggest_trie_walk( |
|
|
{ |
|
|
ui_breakcheck(); |
|
|
breakcheckcount = 1000; |
|
|
+#ifdef FEAT_RELTIME |
|
|
+ if (profile_passed_limit(&time_limit)) |
|
|
+ got_int = TRUE; |
|
|
+#endif |
|
|
} |
|
|
} |
|
|
} |
|
|
diff --git a/src/testdir/test_spell.vim b/src/testdir/test_spell.vim |
|
|
index a3a9621..35035a2 100644 |
|
|
--- a/src/testdir/test_spell.vim |
|
|
+++ b/src/testdir/test_spell.vim |
|
|
@@ -768,6 +768,14 @@ func Test_spell_long_word() |
|
|
set nospell |
|
|
endfunc |
|
|
|
|
|
+func Test_spellsuggest_too_deep() |
|
|
+ " This was incrementing "depth" over MAXWLEN. |
|
|
+ new |
|
|
+ norm s000G00<EFBFBD>000000000000 |
|
|
+ sil norm ..vzG................vvzG0 v z= |
|
|
+ bwipe! |
|
|
+endfunc |
|
|
+ |
|
|
func LoadAffAndDic(aff_contents, dic_contents) |
|
|
set enc=latin1 |
|
|
set spellfile=
|
|
|
|