Mercurial > vim
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