]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.4.577 v7.4.577
authorBram Moolenaar <Bram@vim.org>
Wed, 14 Jan 2015 17:40:28 +0000 (18:40 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 14 Jan 2015 17:40:28 +0000 (18:40 +0100)
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.

src/regexp_nfa.c
src/version.c

index 8e069f35198fd8e95b19cb24b9fdada1c565955b..369d96f9f0c2034037d136e4a2be8ffe3c4d4095 100644 (file)
@@ -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
index 4f310058d696c982b2ce8ecbe618e02c99e14b4a..1367621f4ef933fc9b20aa1894164746adee65cf 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    577,
 /**/
     576,
 /**/