Patch 8.0.0646
Problem: The hlsearch test fails on fast systems.
Solution: Make the search pattern slower. Fix that the old regexp engine
doesn't timeout properly.
Files: src/regexp.c, src/testdir/test_hlsearch.vim
*** ../vim-8.0.0645/src/regexp.c 2017-06-17 20:08:16.312896717 +0200
--- src/regexp.c 2017-06-17 20:43:07.997399263 +0200
***************
*** 3492,3498 ****
static char_u *reg_getline(linenr_T lnum);
static long bt_regexec_both(char_u *line, colnr_T col, proftime_T *tm, int
*timed_out);
! static long regtry(bt_regprog_T *prog, colnr_T col);
static void cleanup_subexpr(void);
#ifdef FEAT_SYN_HL
static void cleanup_zsubexpr(void);
--- 3492,3498 ----
static char_u *reg_getline(linenr_T lnum);
static long bt_regexec_both(char_u *line, colnr_T col, proftime_T *tm, int
*timed_out);
! static long regtry(bt_regprog_T *prog, colnr_T col, proftime_T *tm, int
*timed_out);
static void cleanup_subexpr(void);
#ifdef FEAT_SYN_HL
static void cleanup_zsubexpr(void);
***************
*** 3519,3525 ****
static int re_num_cmp(long_u val, char_u *scan);
static int match_with_backref(linenr_T start_lnum, colnr_T start_col,
linenr_T end_lnum, colnr_T end_col, int *bytelen);
! static int regmatch(char_u *prog);
static int regrepeat(char_u *p, long maxcount);
#ifdef DEBUG
--- 3519,3525 ----
static int re_num_cmp(long_u val, char_u *scan);
static int match_with_backref(linenr_T start_lnum, colnr_T start_col,
linenr_T end_lnum, colnr_T end_col, int *bytelen);
! static int regmatch(char_u *prog, proftime_T *tm, int *timed_out);
static int regrepeat(char_u *p, long maxcount);
#ifdef DEBUG
***************
*** 3780,3787 ****
bt_regexec_both(
char_u *line,
colnr_T col, /* column to start looking for match */
! proftime_T *tm UNUSED, /* timeout limit or NULL */
! int *timed_out UNUSED) /* flag set on timeout or NULL
*/
{
bt_regprog_T *prog;
char_u *s;
--- 3780,3787 ----
bt_regexec_both(
char_u *line,
colnr_T col, /* column to start looking for match */
! proftime_T *tm, /* timeout limit or NULL */
! int *timed_out) /* flag set on timeout or NULL */
{
bt_regprog_T *prog;
char_u *s;
***************
*** 3919,3925 ****
|| (c < 255 && prog->regstart < 255 &&
#endif
MB_TOLOWER(prog->regstart) == MB_TOLOWER(c)))))
! retval = regtry(prog, col);
else
retval = 0;
}
--- 3919,3925 ----
|| (c < 255 && prog->regstart < 255 &&
#endif
MB_TOLOWER(prog->regstart) == MB_TOLOWER(c)))))
! retval = regtry(prog, col, tm, timed_out);
else
retval = 0;
}
***************
*** 3958,3964 ****
break;
}
! retval = regtry(prog, col);
if (retval > 0)
break;
--- 3958,3964 ----
break;
}
! retval = regtry(prog, col, tm, timed_out);
if (retval > 0)
break;
***************
*** 4059,4065 ****
* Returns 0 for failure, number of lines contained in the match otherwise.
*/
static long
! regtry(bt_regprog_T *prog, colnr_T col)
{
reginput = regline + col;
need_clear_subexpr = TRUE;
--- 4059,4069 ----
* Returns 0 for failure, number of lines contained in the match otherwise.
*/
static long
! regtry(
! bt_regprog_T *prog,
! colnr_T col,
! proftime_T *tm, /* timeout limit or NULL */
! int *timed_out) /* flag set on timeout or NULL
*/
{
reginput = regline + col;
need_clear_subexpr = TRUE;
***************
*** 4069,4075 ****
need_clear_zsubexpr = TRUE;
#endif
! if (regmatch(prog->program + 1) == 0)
return 0;
cleanup_subexpr();
--- 4073,4079 ----
need_clear_zsubexpr = TRUE;
#endif
! if (regmatch(prog->program + 1, tm, timed_out) == 0)
return 0;
cleanup_subexpr();
***************
*** 4253,4259 ****
*/
static int
regmatch(
! char_u *scan) /* Current node. */
{
char_u *next; /* Next node. */
int op;
--- 4257,4265 ----
*/
static int
regmatch(
! char_u *scan, /* Current node. */
! proftime_T *tm UNUSED, /* timeout limit or NULL */
! int *timed_out UNUSED) /* flag set on timeout or NULL */
{
char_u *next; /* Next node. */
int op;
***************
*** 4266,4271 ****
--- 4272,4280 ----
#define RA_BREAK 3 /* break inner loop */
#define RA_MATCH 4 /* successful match */
#define RA_NOMATCH 5 /* didn't match */
+ #ifdef FEAT_RELTIME
+ int tm_count = 0;
+ #endif
/* Make "regstack" and "backpos" empty. They are allocated and freed in
* bt_regexec_both() to reduce malloc()/free() calls. */
***************
*** 4300,4305 ****
--- 4309,4328 ----
status = RA_FAIL;
break;
}
+ #ifdef FEAT_RELTIME
+ /* Check for timeout once in a 100 times to avoid overhead. */
+ if (tm != NULL && ++tm_count == 100)
+ {
+ tm_count = 0;
+ if (profile_passed_limit(tm))
+ {
+ if (timed_out != NULL)
+ *timed_out = TRUE;
+ status = RA_FAIL;
+ break;
+ }
+ }
+ #endif
status = RA_CONT;
#ifdef DEBUG
*** ../vim-8.0.0645/src/testdir/test_hlsearch.vim 2017-06-17
20:08:16.312896717 +0200
--- src/testdir/test_hlsearch.vim 2017-06-17 20:28:35.815901559 +0200
***************
*** 39,45 ****
endif
" This pattern takes a long time to match, it should timeout.
! help
let start = reltime()
set hlsearch nolazyredraw redrawtime=101
let @/ = '\%#=1a*.*X\@<=b*'
--- 39,46 ----
endif
" This pattern takes a long time to match, it should timeout.
! new
! call setline(1, ['aaa', repeat('abc ', 1000), 'ccc'])
let start = reltime()
set hlsearch nolazyredraw redrawtime=101
let @/ = '\%#=1a*.*X\@<=b*'
***************
*** 48,52 ****
call assert_true(elapsed > 0.1)
call assert_true(elapsed < 1.0)
set nohlsearch redrawtime&
! quit
endfunc
--- 49,53 ----
call assert_true(elapsed > 0.1)
call assert_true(elapsed < 1.0)
set nohlsearch redrawtime&
! bwipe!
endfunc
*** ../vim-8.0.0645/src/version.c 2017-06-17 20:08:16.316896687 +0200
--- src/version.c 2017-06-17 20:46:14.975996328 +0200
***************
*** 766,767 ****
--- 766,769 ----
{ /* Add new patch number below this line */
+ /**/
+ 646,
/**/
--
Don't read everything you believe.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.