better sub init

This commit is contained in:
Kyryl Melekhin
2021-08-23 02:07:37 +00:00
parent 158a03c4be
commit 695f6b1f56

14
pike.c
View File

@@ -424,12 +424,12 @@ int re_comp(rcode *prog, const char *re)
#define _return(state) \ #define _return(state) \
{ prog->gen = gen + 1; return state; } \ { prog->gen = gen + 1; return state; } \
#define newsub() \ #define newsub(init) \
s1 = freesub; \ s1 = freesub; \
if (s1) \ if (s1) \
freesub = (rsub*)s1->sub[0]; \ freesub = (rsub*)s1->sub[0]; \
else \ else \
s1 = (rsub*)&nsubs[rsubsize * subidx++]; \ { s1 = (rsub*)&nsubs[rsubsize * subidx++]; init }\
#define decref(csub) \ #define decref(csub) \
if (--csub->ref == 0) { \ if (--csub->ref == 0) { \
@@ -491,7 +491,7 @@ goto next##nn; \
case SAVE: \ case SAVE: \
if (sub->ref > 1) { \ if (sub->ref > 1) { \
sub->ref--; \ sub->ref--; \
newsub() \ newsub(/*nop*/) \
for (j = 0; j < nsubp; j++) \ for (j = 0; j < nsubp; j++) \
s1->sub[j] = sub->sub[j]; \ s1->sub[j] = sub->sub[j]; \
sub = s1; \ sub = s1; \
@@ -575,10 +575,8 @@ int re_pikevm(rcode *prog, const char *s, const char **subp, int nsubp)
nlistidx = 0; nlistidx = 0;
if (!matched) { if (!matched) {
jmp_start: jmp_start:
newsub() newsub(for(i = 1; i < nsubp; i++) s1->sub[i] = NULL;)
s1->ref = 1; s1->ref = 1;
for (i = 1; i < nsubp; i++)
s1->sub[i] = NULL;
s1->sub[0] = _sp; s1->sub[0] = _sp;
addthread(1, clist, clistidx, insts, s1) addthread(1, clist, clistidx, insts, s1)
} else if (!clistidx) } else if (!clistidx)
@@ -625,12 +623,12 @@ int main(int argc, char *argv[])
break; break;
for (int l=0; l<sub_els; l+=2) { for (int l=0; l<sub_els; l+=2) {
printf("("); printf("(");
if (sub[l] == NULL) if (sub[l] == NULL || sub[l+1] == NULL)
printf("?"); printf("?");
else else
printf("%d", (int)(sub[l] - argv[i])); printf("%d", (int)(sub[l] - argv[i]));
printf(","); printf(",");
if (sub[l+1] == NULL) if (sub[l+1] == NULL || sub[l] == NULL)
printf("?"); printf("?");
else else
printf("%d", (int)(sub[l+1] - argv[i])); printf("%d", (int)(sub[l+1] - argv[i]));