mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:7.4.613
Problem: The NFA engine does not implement the 'redrawtime' time limit.
Solution: Implement the time limit.
70781ee403
This commit is contained in:
parent
ef205c3851
commit
ee9cca892c
@ -3466,7 +3466,8 @@ static char *pim_info(nfa_pim_T *pim)
|
||||
|
||||
/* Used during execution: whether a match has been found. */
|
||||
static int nfa_match;
|
||||
|
||||
static proftime_T *nfa_time_limit;
|
||||
static int nfa_time_count;
|
||||
|
||||
/*
|
||||
* Copy postponed invisible match info from "from" to "to".
|
||||
@ -4853,6 +4854,9 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *subm
|
||||
fast_breakcheck();
|
||||
if (got_int)
|
||||
return FALSE;
|
||||
if (nfa_time_limit != NULL && profile_passed_limit(*nfa_time_limit)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
nfa_match = FALSE;
|
||||
|
||||
@ -6071,10 +6075,17 @@ nextchar:
|
||||
break;
|
||||
|
||||
// Allow interrupting with CTRL-C.
|
||||
fast_breakcheck();
|
||||
line_breakcheck();
|
||||
if (got_int) {
|
||||
break;
|
||||
}
|
||||
// Check for timeout once every twenty times to avoid overhead.
|
||||
if (nfa_time_limit != NULL && ++nfa_time_count == 20) {
|
||||
nfa_time_count = 0;
|
||||
if (profile_passed_limit(*nfa_time_limit)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef REGEXP_DEBUG
|
||||
@ -6100,7 +6111,7 @@ theend:
|
||||
* Try match of "prog" with at regline["col"].
|
||||
* Returns <= 0 for failure, number of lines contained in the match otherwise.
|
||||
*/
|
||||
static long nfa_regtry(nfa_regprog_T *prog, colnr_T col)
|
||||
static long nfa_regtry(nfa_regprog_T *prog, colnr_T col, proftime_T *tm)
|
||||
{
|
||||
int i;
|
||||
regsubs_T subs, m;
|
||||
@ -6110,6 +6121,8 @@ static long nfa_regtry(nfa_regprog_T *prog, colnr_T col)
|
||||
#endif
|
||||
|
||||
reginput = regline + col;
|
||||
nfa_time_limit = tm;
|
||||
nfa_time_count = 0;
|
||||
|
||||
#ifdef REGEXP_DEBUG
|
||||
f = fopen(NFA_REGEXP_RUN_LOG, "a");
|
||||
@ -6207,17 +6220,16 @@ static long nfa_regtry(nfa_regprog_T *prog, colnr_T col)
|
||||
return 1 + reglnum;
|
||||
}
|
||||
|
||||
/*
|
||||
* Match a regexp against a string ("line" points to the string) or multiple
|
||||
* lines ("line" is NULL, use reg_getline()).
|
||||
*
|
||||
* Returns <= 0 for failure, number of lines contained in the match otherwise.
|
||||
*/
|
||||
static long
|
||||
nfa_regexec_both (
|
||||
char_u *line,
|
||||
colnr_T startcol /* column to start looking for match */
|
||||
)
|
||||
/// Match a regexp against a string ("line" points to the string) or multiple
|
||||
/// lines ("line" is NULL, use reg_getline()).
|
||||
///
|
||||
/// @param line String in which to search or NULL
|
||||
/// @param startcol Column to start looking for match
|
||||
/// @param tm Timeout limit or NULL
|
||||
///
|
||||
/// @return <= 0 if there is no match and number of lines contained in the
|
||||
/// match otherwise.
|
||||
static long nfa_regexec_both(char_u *line, colnr_T startcol, proftime_T *tm)
|
||||
{
|
||||
nfa_regprog_T *prog;
|
||||
long retval = 0L;
|
||||
@ -6297,7 +6309,7 @@ nfa_regexec_both (
|
||||
prog->state[i].lastlist[1] = 0;
|
||||
}
|
||||
|
||||
retval = nfa_regtry(prog, col);
|
||||
retval = nfa_regtry(prog, col, tm);
|
||||
|
||||
nfa_regengine.expr = NULL;
|
||||
|
||||
@ -6449,7 +6461,7 @@ nfa_regexec_nl (
|
||||
ireg_ic = rmp->rm_ic;
|
||||
ireg_icombine = FALSE;
|
||||
ireg_maxcol = 0;
|
||||
return nfa_regexec_both(line, col);
|
||||
return nfa_regexec_both(line, col, NULL);
|
||||
}
|
||||
|
||||
/// Matches a regexp against multiple lines.
|
||||
@ -6500,5 +6512,5 @@ static long nfa_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf,
|
||||
ireg_icombine = FALSE;
|
||||
ireg_maxcol = rmp->rmm_maxcol;
|
||||
|
||||
return nfa_regexec_both(NULL, col);
|
||||
return nfa_regexec_both(NULL, col, tm);
|
||||
}
|
||||
|
@ -1064,7 +1064,7 @@ static int included_patches[] = {
|
||||
616,
|
||||
615,
|
||||
614,
|
||||
// 613,
|
||||
613,
|
||||
612,
|
||||
// 611 NA
|
||||
// 610 NA
|
||||
|
Loading…
Reference in New Issue
Block a user