fix pathological cases
This commit is contained in:
13
pike.c
13
pike.c
@@ -427,10 +427,10 @@ int re_comp(rcode *prog, const char *re, int nsubs)
|
||||
#define _return(state) \
|
||||
{ prog->gen = gen + 1; return state; } \
|
||||
|
||||
#define newsub(init) \
|
||||
#define newsub(init, copy) \
|
||||
s1 = freesub; \
|
||||
if (s1) \
|
||||
freesub = (rsub*)s1->sub[0]; \
|
||||
{ freesub = (rsub*)s1->sub[0]; copy } \
|
||||
else \
|
||||
{ s1 = (rsub*)&nsubs[rsubsize * subidx++]; init } \
|
||||
|
||||
@@ -454,12 +454,11 @@ subs[i++] = sub; \
|
||||
goto next##nn; \
|
||||
|
||||
#define save1() \
|
||||
newsub(for (j = nsubp / 2; j < nsubp; j++) s1->sub[j] = NULL;) \
|
||||
for (j = 0; j < nsubp / 2; j++) \
|
||||
s1->sub[j] = sub->sub[j]; \
|
||||
newsub(for (j = 0; j < nsubp; j++) s1->sub[j] = sub->sub[j];, \
|
||||
for (j = 0; j < nsubp / 2; j++) s1->sub[j] = sub->sub[j];) \
|
||||
|
||||
#define save2() \
|
||||
newsub(/*nop*/) \
|
||||
newsub(/*nop*/, /*nop*/) \
|
||||
for (j = 0; j < nsubp; j++) \
|
||||
s1->sub[j] = sub->sub[j]; \
|
||||
|
||||
@@ -586,7 +585,7 @@ int re_pikevm(rcode *prog, const char *s, const char **subp, int nsubp)
|
||||
nlistidx = 0;
|
||||
if (!matched) {
|
||||
jmp_start:
|
||||
newsub(for (i = 1; i < nsubp; i++) s1->sub[i] = NULL;)
|
||||
newsub(for (i = 1; i < nsubp; i++) s1->sub[i] = NULL;, /*nop*/)
|
||||
s1->ref = 1;
|
||||
s1->sub[0] = _sp;
|
||||
addthread(1, clist, clistidx, insts, s1)
|
||||
|
||||
Reference in New Issue
Block a user