forked from aniani/vim
patch 8.2.5028: syntax regexp matching can be slow
Problem: Syntax regexp matching can be slow. Solution: Adjust the counters for checking the timeout to check about once per msec. (closes #10487, closes #2712)
This commit is contained in:
parent
bf79a4e48d
commit
02e8d4e4ff
@ -3271,8 +3271,10 @@ regmatch(
|
||||
break;
|
||||
}
|
||||
#ifdef FEAT_RELTIME
|
||||
// Check for timeout once in a 100 times to avoid overhead.
|
||||
if (tm != NULL && ++tm_count == 100)
|
||||
// Check for timeout once in 250 times to avoid excessive overhead from
|
||||
// reading the clock. The value has been picked to check about once
|
||||
// per msec on a modern CPU.
|
||||
if (tm != NULL && ++tm_count == 250)
|
||||
{
|
||||
tm_count = 0;
|
||||
if (profile_passed_limit(tm))
|
||||
@ -3313,7 +3315,7 @@ regmatch(
|
||||
op = OP(scan);
|
||||
// Check for character class with NL added.
|
||||
if (!rex.reg_line_lbr && WITH_NL(op) && REG_MULTI
|
||||
&& *rex.input == NUL && rex.lnum <= rex.reg_maxline)
|
||||
&& *rex.input == NUL && rex.lnum <= rex.reg_maxline)
|
||||
{
|
||||
reg_nextline();
|
||||
}
|
||||
@ -4990,8 +4992,10 @@ bt_regexec_both(
|
||||
else
|
||||
++col;
|
||||
#ifdef FEAT_RELTIME
|
||||
// Check for timeout once in a twenty times to avoid overhead.
|
||||
if (tm != NULL && ++tm_count == 20)
|
||||
// Check for timeout once in 500 times to avoid excessive overhead
|
||||
// from reading the clock. The value has been picked to check
|
||||
// about once per msec on a modern CPU.
|
||||
if (tm != NULL && ++tm_count == 500)
|
||||
{
|
||||
tm_count = 0;
|
||||
if (profile_passed_limit(tm))
|
||||
|
@ -5649,11 +5649,27 @@ find_match_text(colnr_T startcol, int regstart, char_u *match_text)
|
||||
static int
|
||||
nfa_did_time_out()
|
||||
{
|
||||
if (nfa_time_limit != NULL && profile_passed_limit(nfa_time_limit))
|
||||
static int tm_count = 0;
|
||||
|
||||
// Check for timeout once in 800 times to avoid excessive overhead from
|
||||
// reading the clock. The value has been picked to check about once per
|
||||
// msec on a modern CPU.
|
||||
if (nfa_time_limit != NULL)
|
||||
{
|
||||
if (nfa_timed_out != NULL)
|
||||
*nfa_timed_out = TRUE;
|
||||
return TRUE;
|
||||
if (tm_count == 800)
|
||||
{
|
||||
if (profile_passed_limit(nfa_time_limit))
|
||||
{
|
||||
if (nfa_timed_out != NULL)
|
||||
*nfa_timed_out = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
// Only reset the count when not timed out, so that when it did
|
||||
// timeout it keeps timing out until the time limit is changed.
|
||||
tm_count = 0;
|
||||
}
|
||||
else
|
||||
++tm_count;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -734,6 +734,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
5028,
|
||||
/**/
|
||||
5027,
|
||||
/**/
|
||||
|
Loading…
x
Reference in New Issue
Block a user