warn about CHECK and INIT blocks encountered at run time
[p5sagit/p5-mst-13.2.git] / pp_hot.c
index beb2cf2..c888ea5 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -653,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;
@@ -687,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);
        }
@@ -1057,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) {
@@ -2012,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
@@ -2161,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