1
0
forked from aniani/vim

updated for version 7.3.1145

Problem:    New regexp engine: addstate() is called very often.
Solution:   Optimize adding the start state.
This commit is contained in:
Bram Moolenaar
2013-06-07 22:39:40 +02:00
parent 2358403363
commit f96d109827
2 changed files with 37 additions and 6 deletions

View File

@@ -4335,6 +4335,7 @@ nfa_regmatch(prog, start, submatch, m)
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,9 +4379,25 @@ 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;
/* 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) \
@@ -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,6 +5415,18 @@ nfa_regmatch(prog, start, submatch, m)
#ifdef ENABLE_LOG
fprintf(log_fd, "(---) STARTSTATE\n");
#endif
/* 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);
}

View File

@@ -728,6 +728,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1145,
/**/
1144,
/**/