From bcf4d178abef9336709b53516fbf0164ce5ebe09 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 10 Jun 2013 16:35:18 +0200 Subject: [PATCH] updated for version 7.3.1157 Problem: New regexp engine fails on "\(\state->out1->out->c; + int directly = FALSE; - /* Do it directly when what follows is possibly end of - * match (closing paren). - * Do it directly if there already is a PIM. - * Postpone when it is \@<= or \@= NFA_MCLOSE && cout <= NFA_MCLOSE9) -#ifdef FEAT_SYN_HL - || (cout >= NFA_ZCLOSE && cout <= NFA_ZCLOSE9) +#ifdef ENABLE_LOG + fprintf(log_fd, "Failure chance invisible: %d, what follows: %d\n", + failure_chance(t->state->out, 0), + failure_chance(t->state->out1->out, 0)); #endif - || t->pim.result != NFA_PIM_UNUSED - || (t->state->c != NFA_START_INVISIBLE_BEFORE - && t->state->c != NFA_START_INVISIBLE_BEFORE_NEG - && failure_chance(t->state->out1->out, 0) - < failure_chance(t->state->out, 0))) + /* Do it directly when what follows is possibly the end of + * the match. + * Do it directly if there already is a PIM. + * Postpone when the invisible match is expensive or has a + * lower chance of failing. */ + if (match_follows(t->state->out1->out, 0) + || t->pim.result != NFA_PIM_UNUSED) + directly = TRUE; + else + { + int ch_invisible = failure_chance(t->state->out, 0); + int ch_follows = failure_chance(t->state->out1->out, 0); + + if (t->state->c == NFA_START_INVISIBLE_BEFORE + || t->state->c == NFA_START_INVISIBLE_BEFORE_NEG) + { + /* "before" matches are very expensive when + * unbounded, always prefer what follows then, + * unless what follows will always match. + * Otherwise strongly prefer what follows. */ + if (t->state->val <= 0 && ch_follows > 0) + directly = FALSE; + else + directly = ch_follows * 10 < ch_invisible; + } + else + { + /* normal invisible, first do the one with the + * highest failure chance */ + directly = ch_follows < ch_invisible; + } + } + if (directly) { /* * First try matching the invisible match, then what diff --git a/src/testdir/test64.in b/src/testdir/test64.in index 42703c2e2..8100436f1 100644 --- a/src/testdir/test64.in +++ b/src/testdir/test64.in @@ -392,6 +392,7 @@ STARTTEST :call add(tl, [2, '\v\C%(', 'foobar']) :call add(tl, [2, '\(foo\)\@<=\>', 'barfoo', '', 'foo']) +:call add(tl, [2, '\(foo\)\@<=.*', 'foobar', 'bar', 'foo']) :" :""""" \@> :call add(tl, [2, '\(a*\)\@>a', 'aaaa']) diff --git a/src/testdir/test64.ok b/src/testdir/test64.ok index 0e25737dd..8e90cb8f8 100644 --- a/src/testdir/test64.ok +++ b/src/testdir/test64.ok @@ -890,6 +890,9 @@ OK 2 - \(foo\)\@<=\> OK 0 - \(foo\)\@<=\> OK 1 - \(foo\)\@<=\> OK 2 - \(foo\)\@<=\> +OK 0 - \(foo\)\@<=.* +OK 1 - \(foo\)\@<=.* +OK 2 - \(foo\)\@<=.* OK 0 - \(a*\)\@>a OK 1 - \(a*\)\@>a OK 2 - \(a*\)\@>a diff --git a/src/version.c b/src/version.c index 3b2fc8340..4ec8b3ef8 100644 --- a/src/version.c +++ b/src/version.c @@ -728,6 +728,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1157, /**/ 1156, /**/ -- 2.50.1