mirror of
https://github.com/vim/vim.git
synced 2025-10-14 07:04:10 -04:00
patch 9.1.0409: too many strlen() calls in the regexp engine
Problem: too many strlen() calls in the regexp engine Solution: refactor code to retrieve strlen differently, make use of bsearch() for getting the character class (John Marriott) closes: #14648 Signed-off-by: John Marriott <basilisk@internode.on.net> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
86f6e2c2ee
commit
82792db631
@@ -2564,14 +2564,22 @@ bt_regcomp(char_u *expr, int re_flags)
|
||||
if ((flags & SPSTART || OP(scan) == BOW || OP(scan) == EOW)
|
||||
&& !(flags & HASNL))
|
||||
{
|
||||
size_t scanlen;
|
||||
|
||||
longest = NULL;
|
||||
len = 0;
|
||||
for (; scan != NULL; scan = regnext(scan))
|
||||
if (OP(scan) == EXACTLY && STRLEN(OPERAND(scan)) >= (size_t)len)
|
||||
{
|
||||
if (OP(scan) == EXACTLY)
|
||||
{
|
||||
longest = OPERAND(scan);
|
||||
len = (int)STRLEN(OPERAND(scan));
|
||||
scanlen = STRLEN(OPERAND(scan));
|
||||
if (scanlen >= (size_t)len)
|
||||
{
|
||||
longest = OPERAND(scan);
|
||||
len = (int)scanlen;
|
||||
}
|
||||
}
|
||||
}
|
||||
r->regmust = longest;
|
||||
r->regmlen = len;
|
||||
}
|
||||
@@ -3406,8 +3414,7 @@ regmatch(
|
||||
{
|
||||
colnr_T pos_col = pos->lnum == rex.lnum + rex.reg_firstlnum
|
||||
&& pos->col == MAXCOL
|
||||
? (colnr_T)STRLEN(reg_getline(
|
||||
pos->lnum - rex.reg_firstlnum))
|
||||
? reg_getline_len(pos->lnum - rex.reg_firstlnum)
|
||||
: pos->col;
|
||||
|
||||
if ((pos->lnum == rex.lnum + rex.reg_firstlnum
|
||||
@@ -4695,7 +4702,7 @@ regmatch(
|
||||
// right.
|
||||
if (rex.line == NULL)
|
||||
break;
|
||||
rex.input = rex.line + STRLEN(rex.line);
|
||||
rex.input = rex.line + reg_getline_len(rex.lnum);
|
||||
fast_breakcheck();
|
||||
}
|
||||
else
|
||||
@@ -5249,8 +5256,10 @@ regprop(char_u *op)
|
||||
{
|
||||
char *p;
|
||||
static char buf[50];
|
||||
static size_t buflen = 0;
|
||||
|
||||
STRCPY(buf, ":");
|
||||
buflen = 1;
|
||||
|
||||
switch ((int) OP(op))
|
||||
{
|
||||
@@ -5491,7 +5500,7 @@ regprop(char_u *op)
|
||||
case MOPEN + 7:
|
||||
case MOPEN + 8:
|
||||
case MOPEN + 9:
|
||||
sprintf(buf + STRLEN(buf), "MOPEN%d", OP(op) - MOPEN);
|
||||
buflen += sprintf(buf + buflen, "MOPEN%d", OP(op) - MOPEN);
|
||||
p = NULL;
|
||||
break;
|
||||
case MCLOSE + 0:
|
||||
@@ -5506,7 +5515,7 @@ regprop(char_u *op)
|
||||
case MCLOSE + 7:
|
||||
case MCLOSE + 8:
|
||||
case MCLOSE + 9:
|
||||
sprintf(buf + STRLEN(buf), "MCLOSE%d", OP(op) - MCLOSE);
|
||||
buflen += sprintf(buf + buflen, "MCLOSE%d", OP(op) - MCLOSE);
|
||||
p = NULL;
|
||||
break;
|
||||
case BACKREF + 1:
|
||||
@@ -5518,7 +5527,7 @@ regprop(char_u *op)
|
||||
case BACKREF + 7:
|
||||
case BACKREF + 8:
|
||||
case BACKREF + 9:
|
||||
sprintf(buf + STRLEN(buf), "BACKREF%d", OP(op) - BACKREF);
|
||||
buflen += sprintf(buf + buflen, "BACKREF%d", OP(op) - BACKREF);
|
||||
p = NULL;
|
||||
break;
|
||||
case NOPEN:
|
||||
@@ -5537,7 +5546,7 @@ regprop(char_u *op)
|
||||
case ZOPEN + 7:
|
||||
case ZOPEN + 8:
|
||||
case ZOPEN + 9:
|
||||
sprintf(buf + STRLEN(buf), "ZOPEN%d", OP(op) - ZOPEN);
|
||||
buflen += sprintf(buf + buflen, "ZOPEN%d", OP(op) - ZOPEN);
|
||||
p = NULL;
|
||||
break;
|
||||
case ZCLOSE + 1:
|
||||
@@ -5549,7 +5558,7 @@ regprop(char_u *op)
|
||||
case ZCLOSE + 7:
|
||||
case ZCLOSE + 8:
|
||||
case ZCLOSE + 9:
|
||||
sprintf(buf + STRLEN(buf), "ZCLOSE%d", OP(op) - ZCLOSE);
|
||||
buflen += sprintf(buf + buflen, "ZCLOSE%d", OP(op) - ZCLOSE);
|
||||
p = NULL;
|
||||
break;
|
||||
case ZREF + 1:
|
||||
@@ -5561,7 +5570,7 @@ regprop(char_u *op)
|
||||
case ZREF + 7:
|
||||
case ZREF + 8:
|
||||
case ZREF + 9:
|
||||
sprintf(buf + STRLEN(buf), "ZREF%d", OP(op) - ZREF);
|
||||
bulen += sprintf(buf + buflen, "ZREF%d", OP(op) - ZREF);
|
||||
p = NULL;
|
||||
break;
|
||||
#endif
|
||||
@@ -5602,7 +5611,7 @@ regprop(char_u *op)
|
||||
case BRACE_COMPLEX + 7:
|
||||
case BRACE_COMPLEX + 8:
|
||||
case BRACE_COMPLEX + 9:
|
||||
sprintf(buf + STRLEN(buf), "BRACE_COMPLEX%d", OP(op) - BRACE_COMPLEX);
|
||||
buflen += sprintf(buf + buflen, "BRACE_COMPLEX%d", OP(op) - BRACE_COMPLEX);
|
||||
p = NULL;
|
||||
break;
|
||||
case MULTIBYTECODE:
|
||||
@@ -5612,12 +5621,12 @@ regprop(char_u *op)
|
||||
p = "NEWL";
|
||||
break;
|
||||
default:
|
||||
sprintf(buf + STRLEN(buf), "corrupt %d", OP(op));
|
||||
buflen += sprintf(buf + buflen, "corrupt %d", OP(op));
|
||||
p = NULL;
|
||||
break;
|
||||
}
|
||||
if (p != NULL)
|
||||
STRCAT(buf, p);
|
||||
STRCPY(buf + buflen, p);
|
||||
return (char_u *)buf;
|
||||
}
|
||||
#endif // DEBUG
|
||||
|
Reference in New Issue
Block a user