# HG changeset patch # User Bram Moolenaar # Date 1370637580 -7200 # Node ID a30e3762957d61966152040315d160f860433576 # Parent 43d36ff069496b4e90a58fe9a450a34b3d02a43d updated for version 7.3.1145 Problem: New regexp engine: addstate() is called very often. Solution: Optimize adding the start state. diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c --- 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 --- 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,