X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pp.c;h=3d7638e5dbcb88214b2cbbea86b8b70fdc1fb991;hb=c73bb82c00a639630ef310b1ac1d896f5afcedab;hp=a0949a1defb7b0e80d12087b5a81a78b76cc124b;hpb=d4217c7e457268e98e8711256888e15d5de11f46;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pp.c b/pp.c index a0949a1..3d7638e 100644 --- a/pp.c +++ b/pp.c @@ -1795,7 +1795,6 @@ PP(pp_substr) djSP; dTARGET; SV *sv; I32 len; - I32 len_ok = 0; STRLEN curlen; I32 pos; I32 rem; @@ -1807,21 +1806,13 @@ PP(pp_substr) STRLEN repl_len; SvTAINTED_off(TARG); /* decontaminate */ - if (MAXARG > 3) { - /* pop off replacement string */ - sv = POPs; - repl = SvPV(sv, repl_len); - /* pop off length */ - sv = POPs; - if (SvOK(sv)) { - len = SvIV(sv); - len_ok++; + if (MAXARG > 2) { + if (MAXARG > 3) { + sv = POPs; + repl = SvPV(sv, repl_len); } - } else if (MAXARG == 3) { len = POPi; - len_ok++; - } - + } pos = POPi; sv = POPs; PUTBACK; @@ -1830,34 +1821,34 @@ PP(pp_substr) pos -= arybase; rem = curlen-pos; fail = rem; - if (len_ok) { - if (len < 0) { - rem += len; - if (rem < 0) - rem = 0; - } - else if (rem > len) - rem = len; - } + if (MAXARG > 2) { + if (len < 0) { + rem += len; + if (rem < 0) + rem = 0; + } + else if (rem > len) + rem = len; + } } else { - pos += curlen; - if (!len_ok) - rem = curlen; - else if (len >= 0) { - rem = pos+len; - if (rem > (I32)curlen) - rem = curlen; - } - else { - rem = curlen+len; - if (rem < pos) - rem = pos; - } - if (pos < 0) - pos = 0; - fail = rem; - rem -= pos; + pos += curlen; + if (MAXARG < 3) + rem = curlen; + else if (len >= 0) { + rem = pos+len; + if (rem > (I32)curlen) + rem = curlen; + } + else { + rem = curlen+len; + if (rem < pos) + rem = pos; + } + if (pos < 0) + pos = 0; + fail = rem; + rem -= pos; } if (fail < 0) { if (dowarn || lvalue || repl) @@ -1894,7 +1885,7 @@ PP(pp_substr) LvTARGOFF(TARG) = pos; LvTARGLEN(TARG) = rem; } - else if (repl) + else if (repl) sv_insert(sv, pos, rem, repl, repl_len); } SPAGAIN; @@ -2589,8 +2580,11 @@ PP(pp_splice) DIE(no_aelem, i); if (++MARK < SP) { length = SvIVx(*MARK++); - if (length < 0) - length = 0; + if (length < 0) { + length += AvFILLp(ary) - offset + 1; + if (length < 0) + length = 0; + } } else length = AvMAX(ary) + 1; /* close enough to infinity */