X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/48e43a1c700ace3659171c485ae9e0dc0b547a33..9a089a51dfdd5e97da27c26fc8f4b6089cd8d22d:/mg.c diff --git a/mg.c b/mg.c index 816b4b8..0225ca4 100644 --- a/mg.c +++ b/mg.c @@ -27,9 +27,11 @@ #endif #define TAINT_FROM_REGEX(sv,rx) \ - if ((rx)->exec_tainted) \ - SvTAINTED_on(sv); \ - else \ + if ((rx)->exec_tainted) { \ + TAINT; \ + SvTAINTED_on(sv); \ + } \ + else \ SvTAINTED_off(sv); /* @@ -287,10 +289,8 @@ MAGIC *mg; (t = rx->endp[paren])) { i = t - s; - if (i >= 0) { - TAINT_IF(rx->exec_tainted); + if (i >= 0) return i; - } } } return 0; @@ -308,10 +308,8 @@ MAGIC *mg; if (curpm && (rx = curpm->op_pmregexp)) { if ((s = rx->subbeg)) { i = rx->startp[0] - s; - if (i >= 0) { - TAINT_IF(rx->exec_tainted); + if (i >= 0) return i; - } } } return 0; @@ -1005,6 +1003,7 @@ MAGIC* mg; else if (pos > len) pos = len; mg->mg_len = pos; + mg->mg_flags &= ~MGf_MINMATCH; return 0; } @@ -1101,6 +1100,65 @@ MAGIC* mg; } int +magic_getitervar(sv,mg) +SV* sv; +MAGIC* mg; +{ + SV *targ = Nullsv; + if (LvTARGLEN(sv)) { + AV* av = (AV*)LvTARG(sv); + if (LvTARGOFF(sv) <= AvFILL(av)) + targ = AvARRAY(av)[LvTARGOFF(sv)]; + } + else + targ = LvTARG(sv); + sv_setsv(sv, targ ? targ : &sv_undef); + return 0; +} + +int +magic_setitervar(sv,mg) +SV* sv; +MAGIC* mg; +{ + if (LvTARGLEN(sv)) + vivify_itervar(sv); + if (LvTARG(sv)) + sv_setsv(LvTARG(sv), sv); + return 0; +} + +int +magic_freeitervar(sv,mg) +SV* sv; +MAGIC* mg; +{ + SvREFCNT_dec(LvTARG(sv)); + return 0; +} + +void +vivify_itervar(sv) +SV* sv; +{ + AV* av; + + if (!LvTARGLEN(sv)) + return; + av = (AV*)LvTARG(sv); + if (LvTARGOFF(sv) <= AvFILL(av)) { + SV** svp = AvARRAY(av) + LvTARGOFF(sv); + LvTARG(sv) = newSVsv(*svp); + SvREFCNT_dec(*svp); + *svp = SvREFCNT_inc(LvTARG(sv)); + } + else + LvTARG(sv) = Nullsv; + SvREFCNT_dec(av); + LvTARGLEN(sv) = 0; +} + +int magic_setmglob(sv,mg) SV* sv; MAGIC* mg;