changeset 6499:bcf9d3a6007f v7.4.577

updated for version 7.4.577 Problem: Matching with a virtual column has a lot of overhead on very long lines. (Issue 310) Solution: Bail out early if there can't be a match. (Christian Brabandt) Also check for CTRL-C at every position.
author Bram Moolenaar <bram@vim.org>
date Wed, 14 Jan 2015 18:40:28 +0100
parents 89eb358464e8
children 58b810ec7d19
files src/regexp_nfa.c src/version.c
diffstat 2 files changed, 24 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -6438,14 +6438,24 @@ nfa_regmatch(prog, start, submatch, m)
 	    case NFA_VCOL:
 	    case NFA_VCOL_GT:
 	    case NFA_VCOL_LT:
-		result = nfa_re_num_cmp(t->state->val, t->state->c - NFA_VCOL,
-		    (long_u)win_linetabsize(
-			    reg_win == NULL ? curwin : reg_win,
-			    regline, (colnr_T)(reginput - regline)) + 1);
-		if (result)
 		{
-		    add_here = TRUE;
-		    add_state = t->state->out;
+		    int     op = t->state->c - NFA_VCOL;
+		    colnr_T col = (colnr_T)(reginput - regline);
+
+		    /* Bail out quickly when there can't be a match, avoid the
+		     * overhead of win_linetabsize() on long lines. */
+		    if ((col > t->state->val && op != 1)
+			    || (col - 1 > t->state->val && op == 1))
+			break;
+		    result = nfa_re_num_cmp(t->state->val, op,
+			(long_u)win_linetabsize(
+				reg_win == NULL ? curwin : reg_win,
+							   regline, col) + 1);
+		    if (result)
+		    {
+			add_here = TRUE;
+			add_state = t->state->out;
+		    }
 		}
 		break;
 
@@ -6744,6 +6754,11 @@ nextchar:
 	    reg_nextline();
 	else
 	    break;
+
+	/* Allow interrupting with CTRL-C. */
+	fast_breakcheck();
+	if (got_int)
+	    break;
     }
 
 #ifdef ENABLE_LOG
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    577,
+/**/
     576,
 /**/
     575,