X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=regcomp.c;h=0872c2ca8c50ebf44e33a8a1afc29708eecd67c2;hb=2680586ee66b8de4d2b5f26a2013220f2bec9d5f;hp=5d4c0f0dac1eb85ff4275040e169c6780c6c0714;hpb=ce3e6498997f4e021f5bd71c1348f2c333883083;p=p5sagit%2Fp5-mst-13.2.git diff --git a/regcomp.c b/regcomp.c index 5d4c0f0..0872c2c 100644 --- a/regcomp.c +++ b/regcomp.c @@ -172,7 +172,8 @@ typedef struct { } scan_data_t; #endif -static scan_data_t zero_scan_data = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +static scan_data_t zero_scan_data = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 }; #define SF_BEFORE_EOL (SF_BEFORE_SEOL|SF_BEFORE_MEOL) #define SF_BEFORE_SEOL 0x1 @@ -1171,10 +1172,10 @@ reg(I32 paren, I32 *flagp) rop = sv_compile_2op(sv, &sop, "re", &av); - n = add_data(3, "nso"); + n = add_data(3, "nop"); PL_regcomp_rx->data->data[n] = (void*)rop; - PL_regcomp_rx->data->data[n+1] = (void*)av; - PL_regcomp_rx->data->data[n+2] = (void*)sop; + PL_regcomp_rx->data->data[n+1] = (void*)sop; + PL_regcomp_rx->data->data[n+2] = (void*)av; SvREFCNT_dec(sv); } else { /* First pass */ @@ -3123,13 +3124,30 @@ pregfree(struct regexp *r) } if (r->data) { int n = r->data->count; + AV* new_comppad = NULL; + AV* old_comppad; + SV** old_curpad; + while (--n >= 0) { switch (r->data->what[n]) { case 's': SvREFCNT_dec((SV*)r->data->data[n]); break; + case 'p': + new_comppad = (AV*)r->data->data[n]; + break; case 'o': + if (new_comppad == NULL) + croak("panic: pregfree comppad"); + old_comppad = PL_comppad; + old_curpad = PL_curpad; + PL_comppad = new_comppad; + PL_curpad = AvARRAY(new_comppad); op_free((OP_4tree*)r->data->data[n]); + PL_comppad = old_comppad; + PL_curpad = old_curpad; + SvREFCNT_dec((SV*)new_comppad); + new_comppad = NULL; break; case 'n': break;