make return values from match in a list context, as well as $& et
[p5sagit/p5-mst-13.2.git] / pp_hot.c
index d2eef9b..c888ea5 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -107,7 +107,6 @@ PP(pp_and)
 PP(pp_sassign)
 {
     djSP; dPOPTOPssrl;
-    MAGIC *mg;
 
     if (PL_op->op_private & OPpASSIGN_BACKWARDS) {
        SV *temp;
@@ -335,7 +334,7 @@ PP(pp_print)
        gv = (GV*)*++MARK;
     else
        gv = PL_defoutgv;
-    if (mg = SvTIED_mg((SV*)gv, 'q')) {
+    if ((mg = SvTIED_mg((SV*)gv, 'q'))) {
        if (MARK == ORIGMARK) {
            /* If using default handle then we need to make space to 
             * pass object as 1st arg, so move other args up ...
@@ -626,7 +625,6 @@ S_do_maybe_phash(pTHX_ AV *ary, SV **lelem, SV **firstlelem, SV **relem,
                 SV **lastrelem)
 {
     OP *leftop;
-    SV *tmpstr;
     I32 i;
 
     leftop = ((BINOP*)PL_op)->op_last;
@@ -655,7 +653,7 @@ S_do_maybe_phash(pTHX_ AV *ary, SV **lelem, SV **firstlelem, SV **relem,
            sv_setsv(tmpstr,relem[1]);  /* value */
            relem[1] = tmpstr;
            if (avhv_store_ent(ary,relem[0],tmpstr,0))
-               SvREFCNT_inc(tmpstr);
+               (void)SvREFCNT_inc(tmpstr);
            if (SvMAGICAL(ary) != 0 && SvSMAGICAL(tmpstr))
                mg_set(tmpstr);
            relem += 2;
@@ -689,7 +687,7 @@ S_do_oddball(pTHX_ HV *hash, SV **relem, SV **firstrelem)
            /* pseudohash */
            tmpstr = sv_newmortal();
            if (avhv_store_ent((AV*)hash,*relem,tmpstr,0))
-               SvREFCNT_inc(tmpstr);
+               (void)SvREFCNT_inc(tmpstr);
            if (SvMAGICAL(hash) && SvSMAGICAL(tmpstr))
                mg_set(tmpstr);
        }
@@ -737,7 +735,7 @@ PP(pp_aassign)
        EXTEND_MORTAL(lastrelem - firstrelem + 1);
        for (relem = firstrelem; relem <= lastrelem; relem++) {
            /*SUPPRESS 560*/
-           if (sv = *relem) {
+           if ((sv = *relem)) {
                TAINT_NOT;      /* Each item is independent */
                *relem = sv_mortalcopy(sv);
            }
@@ -979,7 +977,7 @@ PP(pp_match)
     truebase = t = s;
 
     /* XXXX What part of this is needed with true \G-support? */
-    if (global = pm->op_pmflags & PMf_GLOBAL) {
+    if ((global = pm->op_pmflags & PMf_GLOBAL)) {
        rx->startp[0] = -1;
        if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
            MAGIC* mg = mg_find(TARG, 'g');
@@ -1059,6 +1057,10 @@ play_it_again:
                len = rx->endp[i] - rx->startp[i];
                s = rx->startp[i] + truebase;
                sv_setpvn(*SP, s, len);
+               if ((pm->op_pmdynflags & PMdf_UTF8) && !IN_BYTE) {
+                   SvUTF8_on(*SP);
+                   sv_utf8_downgrade(*SP, TRUE);
+               }
            }
        }
        if (global) {
@@ -1157,7 +1159,7 @@ Perl_do_readline(pTHX)
     I32 gimme = GIMME_V;
     MAGIC *mg;
 
-    if (mg = SvTIED_mg((SV*)PL_last_in_gv, 'q')) {
+    if ((mg = SvTIED_mg((SV*)PL_last_in_gv, 'q'))) {
        PUSHMARK(SP);
        XPUSHs(SvTIED_obj((SV*)PL_last_in_gv, mg));
        PUTBACK;
@@ -1659,9 +1661,9 @@ PP(pp_iter)
 
     SvREFCNT_dec(*itersvp);
 
-    if (sv = (SvMAGICAL(av)) 
-           ? *av_fetch(av, ++cx->blk_loop.iterix, FALSE) 
-           : AvARRAY(av)[++cx->blk_loop.iterix])
+    if ((sv = SvMAGICAL(av)
+             ? *av_fetch(av, ++cx->blk_loop.iterix, FALSE) 
+             : AvARRAY(av)[++cx->blk_loop.iterix]))
        SvTEMP_off(sv);
     else
        sv = &PL_sv_undef;
@@ -1712,7 +1714,6 @@ PP(pp_subst)
     STRLEN len;
     int force_on_match = 0;
     I32 oldsave = PL_savestack_ix;
-    I32 update_minmatch = 1;
 
     /* known replacement string? */
     dstr = (pm->op_pmflags & PMf_CONST) ? POPs : Nullsv;
@@ -1818,7 +1819,7 @@ PP(pp_subst)
                SvCUR_set(TARG, m - s);
            }
            /*SUPPRESS 560*/
-           else if (i = m - s) {       /* faster from front */
+           else if ((i = m - s)) {     /* faster from front */
                d -= clen;
                m = d;
                sv_chop(TARG, d-i);
@@ -1847,7 +1848,7 @@ PP(pp_subst)
                rxtainted |= RX_MATCH_TAINTED(rx);
                m = rx->startp[0] + orig;
                /*SUPPRESS 560*/
-               if (i = m - s) {
+               if ((i = m - s)) {
                    if (s != d)
                        Move(s, d, i, char);
                    d += i;
@@ -2015,8 +2016,10 @@ PP(pp_leavesub)
                    sv_2mortal(*MARK);
                }
                else {
+                   sv = SvREFCNT_inc(TOPs);    /* FREETMPS could clobber it */
                    FREETMPS;
-                   *MARK = sv_mortalcopy(TOPs);
+                   *MARK = sv_mortalcopy(sv);
+                   SvREFCNT_dec(sv);
                }
            }
            else
@@ -2145,7 +2148,6 @@ PP(pp_leavesublv)
                        : "an uninitialized value");
                }
                else {
-                   mortalize:
                    /* Can be a localized value subject to deletion. */
                    PL_tmps_stack[++PL_tmps_ix] = *mark;
                    (void)SvREFCNT_inc(*mark);
@@ -2165,8 +2167,10 @@ PP(pp_leavesublv)
                        sv_2mortal(*MARK);
                    }
                    else {
+                       sv = SvREFCNT_inc(TOPs); /* FREETMPS could clobber it */
                        FREETMPS;
-                       *MARK = sv_mortalcopy(TOPs);
+                       *MARK = sv_mortalcopy(sv);
+                       SvREFCNT_dec(sv);
                    }
                }
                else
@@ -2223,8 +2227,8 @@ S_get_db_sub(pTHX_ SV **svp, CV *cv)
        }
     }
     else {
-       SvUPGRADE(dbsv, SVt_PVIV);
-       SvIOK_on(dbsv);
+       (void)SvUPGRADE(dbsv, SVt_PVIV);
+       (void)SvIOK_on(dbsv);
        SAVEIV(SvIVX(dbsv));
        SvIVX(dbsv) = PTR2IV(cv);       /* Do it the quickest way  */
     }
@@ -2795,7 +2799,6 @@ PP(pp_method_named)
 STATIC SV *
 S_method_common(pTHX_ SV* meth, U32* hashp)
 {
-    djSP;
     SV* sv;
     SV* ob;
     GV* gv;