diff options
author | Nicholas Clark <nick@ccl4.org> | 2007-03-24 14:44:28 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2007-03-24 14:44:28 +0000 |
commit | 7b734803d2ca6996dddda574daf78d9957b470cd (patch) | |
tree | 3541e63b0b0a5c99f011f6343332bc978afca5d3 | |
parent | a86a1ca71b6cc69a4a01c17f91f95d556810d9f3 (diff) | |
download | perl-7b734803d2ca6996dddda574daf78d9957b470cd.tar.gz |
startp and endp can allocate their array of I32s from the same block of
memory, and Copy() and free it as one.
Probably these two pointers to array should merge into single pointer
to an array of structs.
p4raw-id: //depot/perl@30745
-rw-r--r-- | regcomp.c | 24 | ||||
-rw-r--r-- | regexec.c | 4 |
2 files changed, 12 insertions, 16 deletions
@@ -4695,8 +4695,8 @@ reStudy: ARG2L_SET( scan, RExC_open_parens[ARG(scan)-1] - scan ); } } - Newxz(r->startp, RExC_npar, I32); - Newxz(r->endp, RExC_npar, I32); + Newxz(r->startp, RExC_npar * 2, I32); + r->endp = r->startp + RExC_npar; /* assume we don't need to swap parens around before we match */ DEBUG_DUMP_r({ @@ -8688,11 +8688,9 @@ Perl_pregfree(pTHX_ struct regexp *r) #endif if (r->swap) { Safefree(r->swap->startp); - Safefree(r->swap->endp); Safefree(r->swap); } Safefree(r->startp); - Safefree(r->endp); Safefree(r); } @@ -8720,10 +8718,9 @@ Perl_reg_temp_copy (pTHX_ struct regexp *r) { (void)ReREFCNT_inc(r); Newx(ret, 1, regexp); StructCopy(r, ret, regexp); - Newx(ret->startp, npar, I32); - Copy(r->startp, ret->startp, npar, I32); - Newx(ret->endp, npar, I32); - Copy(r->endp, ret->endp, npar, I32); + Newx(ret->startp, npar * 2, I32); + Copy(r->startp, ret->startp, npar * 2, I32); + ret->endp = ret->startp + npar; ret->refcnt = 1; if (r->substrs) { struct reg_substr_datum *s; @@ -8914,15 +8911,14 @@ Perl_re_dup(pTHX_ const regexp *r, CLONE_PARAMS *param) npar = r->nparens+1; Newxz(ret, 1, regexp); - Newx(ret->startp, npar, I32); - Copy(r->startp, ret->startp, npar, I32); - Newx(ret->endp, npar, I32); - Copy(r->endp, ret->endp, npar, I32); + Newx(ret->startp, npar * 2, I32); + Copy(r->startp, ret->startp, npar * 2, I32); + ret->endp = ret->startp + npar; if(r->swap) { Newx(ret->swap, 1, regexp_paren_ofs); /* no need to copy these */ - Newx(ret->swap->startp, npar, I32); - Newx(ret->swap->endp, npar, I32); + Newx(ret->swap->startp, npar * 2, I32); + ret->swap->endp = ret->swap->startp + npar; } else { ret->swap = NULL; } @@ -1663,8 +1663,8 @@ S_swap_match_buff (pTHX_ regexp *prog) { */ Newxz(prog->swap, 1, regexp_paren_ofs); /* no need to copy these */ - Newxz(prog->swap->startp, prog->nparens + 1, I32); - Newxz(prog->swap->endp, prog->nparens + 1, I32); + Newxz(prog->swap->startp, 2 * (prog->nparens + 1), I32); + prog->swap->endp = prog->swap->startp + prog->nparens + 1; } t = prog->swap->startp; prog->swap->startp = prog->startp; |