diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-06-07 22:39:40 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-06-07 22:39:40 +0200 |
commit | f96d109827062fb9a361aa592f207d6c0a7f2ed1 (patch) | |
tree | 356822459fa60212dc8fcfa305ea90070f70aeac /src | |
parent | 235840336312c73d72d30f38b2e628f98b62f353 (diff) | |
download | vim-f96d109827062fb9a361aa592f207d6c0a7f2ed1.zip |
updated for version 7.3.1145
Problem: New regexp engine: addstate() is called very often.
Solution: Optimize adding the start state.
Diffstat (limited to 'src')
-rw-r--r-- | src/regexp_nfa.c | 41 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 37 insertions, 6 deletions
diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c index ef4f88f68..8fdbb3e5c 100644 --- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -4332,9 +4332,10 @@ nfa_regmatch(prog, start, submatch, m) nfa_list_T *nextlist; int *listids = NULL; nfa_state_T *add_state; - int add_count; - int add_off; + int add_count; + int add_off; garray_T pimlist; + int toplevel = start->c == NFA_MOPEN; #ifdef NFA_REGEXP_DEBUG_LOG FILE *debug = fopen(NFA_REGEXP_DEBUG_LOG, "a"); @@ -4378,10 +4379,26 @@ nfa_regmatch(prog, start, submatch, m) nextlist = &list[1]; nextlist->n = 0; #ifdef ENABLE_LOG - fprintf(log_fd, "(---) STARTSTATE\n"); + fprintf(log_fd, "(---) STARTSTATE first\n"); #endif thislist->id = nfa_listid + 1; - addstate(thislist, start, m, 0); + + /* Inline optimized code for addstate(thislist, start, m, 0) if we know + * it's the first MOPEN. */ + if (toplevel) + { + if (REG_MULTI) + { + m->norm.list.multi[0].start.lnum = reglnum; + m->norm.list.multi[0].start.col = (colnr_T)(reginput - regline); + } + else + m->norm.list.line[0].start = reginput; + m->norm.in_use = 1; + addstate(thislist, start->out, m, 0); + } + else + addstate(thislist, start, m, 0); #define ADD_STATE_IF_MATCH(state) \ if (result) { \ @@ -5382,7 +5399,7 @@ nfa_regmatch(prog, start, submatch, m) * Unless "nfa_endp" is not NULL, then we match the end position. * Also don't start a match past the first line. */ if (nfa_match == FALSE - && ((start->c == NFA_MOPEN + && ((toplevel && reglnum == 0 && clen != 0 && (ireg_maxcol == 0 @@ -5398,7 +5415,19 @@ nfa_regmatch(prog, start, submatch, m) #ifdef ENABLE_LOG fprintf(log_fd, "(---) STARTSTATE\n"); #endif - addstate(nextlist, start, m, clen); + /* Inline optimized code for addstate() if we know the state is + * the first MOPEN. */ + if (toplevel) + { + if (REG_MULTI) + m->norm.list.multi[0].start.col = + (colnr_T)(reginput - regline) + clen; + else + m->norm.list.line[0].start = reginput + clen; + addstate(nextlist, start->out, m, clen); + } + else + addstate(nextlist, start, m, clen); } #ifdef ENABLE_LOG diff --git a/src/version.c b/src/version.c index 4e6a8f857..715c02868 100644 --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1145, +/**/ 1144, /**/ 1143, |