0
0
mirror of https://github.com/vim/vim.git synced 2025-10-06 05:44:14 -04:00

updated for version 7.4a.039

Problem:    New regexp engine doesn't match pattern. (Ingo Karkat)
Solution:   When adding a state also check for different PIM if the list of
            states has any state with a PIM.
This commit is contained in:
Bram Moolenaar
2013-07-21 18:59:24 +02:00
parent 9d48895e4c
commit 196ed14d15
4 changed files with 14 additions and 1 deletions

View File

@@ -3464,6 +3464,7 @@ typedef struct
int n; /* nr of states currently in "t" */ int n; /* nr of states currently in "t" */
int len; /* max nr of states in "t" */ int len; /* max nr of states in "t" */
int id; /* ID of the list */ int id; /* ID of the list */
int has_pim; /* TRUE when any state has a PIM */
} nfa_list_T; } nfa_list_T;
#ifdef ENABLE_LOG #ifdef ENABLE_LOG
@@ -3966,7 +3967,7 @@ addstate(l, state, subs_arg, pim, off)
/* This state is already in the list, don't add it again, /* This state is already in the list, don't add it again,
* unless it is an MOPEN that is used for a backreference or * unless it is an MOPEN that is used for a backreference or
* when there is a PIM. */ * when there is a PIM. */
if (!nfa_has_backref && pim == NULL) if (!nfa_has_backref && pim == NULL && !l->has_pim)
{ {
skip_add: skip_add:
#ifdef ENABLE_LOG #ifdef ENABLE_LOG
@@ -4012,7 +4013,10 @@ skip_add:
if (pim == NULL) if (pim == NULL)
thread->pim.result = NFA_PIM_UNUSED; thread->pim.result = NFA_PIM_UNUSED;
else else
{
copy_pim(&thread->pim, pim); copy_pim(&thread->pim, pim);
l->has_pim = TRUE;
}
copy_sub(&thread->subs.norm, &subs->norm); copy_sub(&thread->subs.norm, &subs->norm);
#ifdef FEAT_SYN_HL #ifdef FEAT_SYN_HL
if (nfa_has_zsubexpr) if (nfa_has_zsubexpr)
@@ -5060,8 +5064,10 @@ nfa_regmatch(prog, start, submatch, m)
thislist = &list[0]; thislist = &list[0];
thislist->n = 0; thislist->n = 0;
thislist->has_pim = FALSE;
nextlist = &list[1]; nextlist = &list[1];
nextlist->n = 0; nextlist->n = 0;
nextlist->has_pim = FALSE;
#ifdef ENABLE_LOG #ifdef ENABLE_LOG
fprintf(log_fd, "(---) STARTSTATE first\n"); fprintf(log_fd, "(---) STARTSTATE first\n");
#endif #endif
@@ -5120,6 +5126,7 @@ nfa_regmatch(prog, start, submatch, m)
thislist = &list[flag]; thislist = &list[flag];
nextlist = &list[flag ^= 1]; nextlist = &list[flag ^= 1];
nextlist->n = 0; /* clear nextlist */ nextlist->n = 0; /* clear nextlist */
nextlist->has_pim = FALSE;
++nfa_listid; ++nfa_listid;
thislist->id = nfa_listid; thislist->id = nfa_listid;
nextlist->id = nfa_listid + 1; nextlist->id = nfa_listid + 1;

View File

@@ -341,6 +341,7 @@ STARTTEST
:call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo xxx ', 'foo']) :call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo xxx ', 'foo'])
:call add(tl, [2, '[ ]\@!\p\%([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:']) :call add(tl, [2, '[ ]\@!\p\%([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:'])
:call add(tl, [2, 'm\k\+_\@=\%(_\@!\k\)\@<=\k\+e', 'mx__xe', 'mx__xe']) :call add(tl, [2, 'm\k\+_\@=\%(_\@!\k\)\@<=\k\+e', 'mx__xe', 'mx__xe'])
:call add(tl, [2, '\%(\U\@<=S\k*\|S\l\)R', 'SuR', 'SuR'])
:" :"
:"""" Combining different tests and features :"""" Combining different tests and features
:call add(tl, [2, '[[:alpha:]]\{-2,6}', '787abcdiuhsasiuhb4', 'ab']) :call add(tl, [2, '[[:alpha:]]\{-2,6}', '787abcdiuhsasiuhb4', 'ab'])

View File

@@ -779,6 +779,9 @@ OK 2 - [ ]\@!\p\%([ ]\@!\p\)*:
OK 0 - m\k\+_\@=\%(_\@!\k\)\@<=\k\+e OK 0 - m\k\+_\@=\%(_\@!\k\)\@<=\k\+e
OK 1 - m\k\+_\@=\%(_\@!\k\)\@<=\k\+e OK 1 - m\k\+_\@=\%(_\@!\k\)\@<=\k\+e
OK 2 - m\k\+_\@=\%(_\@!\k\)\@<=\k\+e OK 2 - m\k\+_\@=\%(_\@!\k\)\@<=\k\+e
OK 0 - \%(\U\@<=S\k*\|S\l\)R
OK 1 - \%(\U\@<=S\k*\|S\l\)R
OK 2 - \%(\U\@<=S\k*\|S\l\)R
OK 0 - [[:alpha:]]\{-2,6} OK 0 - [[:alpha:]]\{-2,6}
OK 1 - [[:alpha:]]\{-2,6} OK 1 - [[:alpha:]]\{-2,6}
OK 2 - [[:alpha:]]\{-2,6} OK 2 - [[:alpha:]]\{-2,6}

View File

@@ -727,6 +727,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
39,
/**/ /**/
38, 38,
/**/ /**/