[5.004_61 PATCH] Make incompatible changes to RE engine NOW
[p5sagit/p5-mst-13.2.git] / pp_hot.c
index 5bff1a1..4529f8e 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -183,8 +183,11 @@ PP(pp_padsv)
     if (op->op_flags & OPf_MOD) {
        if (op->op_private & OPpLVAL_INTRO)
            SAVECLEARSV(curpad[op->op_targ]);
-        else if (op->op_private & OPpDEREF)
+        else if (op->op_private & OPpDEREF) {
+           PUTBACK;
            vivify_ref(curpad[op->op_targ], op->op_private & OPpDEREF);
+           SPAGAIN;
+       }
     }
     RETURN;
 }
@@ -1056,7 +1059,7 @@ do_readline(void)
                       ((struct NAM *)((struct FAB *)cxt)->fab$l_nam)->nam$l_fnb
                       but that's unsupported, so I don't want to do it now and
                       have it bite someone in the future. */
-                   strcat(tmpfnam,tmpnam(NULL));
+                   strcat(tmpfnam,PerlLIO_tmpnam(NULL));
                    cp = SvPV(tmpglob,i);
                    for (; i; i--) {
                       if (cp[i] == ';') hasver = 1;
@@ -1307,7 +1310,7 @@ PP(pp_helem)
            if (HvNAME(hv) && isGV(*svp))
                save_gp((GV*)*svp, !(op->op_flags & OPf_SPECIAL));
            else
-               save_svref(svp);
+               save_helem(hv, keysv, svp);
        }
        else if (op->op_private & OPpDEREF)
            vivify_ref(*svp, op->op_private & OPpDEREF);
@@ -1453,11 +1456,13 @@ PP(pp_subst)
     else {
        TARG = DEFSV;
        EXTEND(SP,1);
-    }
+    }                  
     if (SvREADONLY(TARG)
        || (SvTYPE(TARG) > SVt_PVLV
            && !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG))))
        croak(no_modify);
+    PUTBACK;
+
     s = SvPV(TARG, len);
     if (!SvPOKp(TARG) || SvTYPE(TARG) == SVt_PVGV)
        force_on_match = 1;
@@ -1533,6 +1538,7 @@ PP(pp_subst)
     if (c && clen <= rx->minlen && (once || !(safebase & REXEC_COPY_STR))
        && !(rx->reganch & ROPT_LOOKBEHIND_SEEN)) {
        if (!regexec_flags(rx, s, strend, orig, 0, screamer, NULL, safebase)) {
+           SPAGAIN;
            PUSHs(&sv_no);
            LEAVE_SCOPE(oldsave);
            RETURN;
@@ -1588,6 +1594,7 @@ PP(pp_subst)
                sv_chop(TARG, d);
            }
            TAINT_IF(rxtainted);
+           SPAGAIN;
            PUSHs(&sv_yes);
        }
        else {
@@ -1616,10 +1623,15 @@ PP(pp_subst)
                Move(s, d, i+1, char);          /* include the NUL */
            }
            TAINT_IF(rxtainted);
+           SPAGAIN;
            PUSHs(sv_2mortal(newSViv((I32)iters)));
        }
        (void)SvPOK_only(TARG);
-       SvSETMAGIC(TARG);
+       if (SvSMAGICAL(TARG)) {
+           PUTBACK;
+           mg_set(TARG);
+           SPAGAIN;
+       }
        SvTAINT(TARG);
        LEAVE_SCOPE(oldsave);
        RETURN;
@@ -1632,11 +1644,12 @@ PP(pp_subst)
            goto force_it;
        }
        rxtainted = RX_MATCH_TAINTED(rx);
-       dstr = NEWSV(25, sv_len(TARG));
+       dstr = NEWSV(25, len);
        sv_setpvn(dstr, m, s-m);
        curpm = pm;
        if (!c) {
            register PERL_CONTEXT *cx;
+           SPAGAIN;
            PUSHSUBST(cx);
            RETURNOP(cPMOP->op_pmreplroot);
        }
@@ -1674,6 +1687,7 @@ PP(pp_subst)
        (void)SvPOK_only(TARG);
        SvSETMAGIC(TARG);
        SvTAINT(TARG);
+       SPAGAIN;
        PUSHs(sv_2mortal(newSViv((I32)iters)));
        LEAVE_SCOPE(oldsave);
        RETURN;
@@ -1683,7 +1697,8 @@ PP(pp_subst)
 nope:
     ++BmUSEFUL(rx->check_substr);
 
-ret_no:
+ret_no:         
+    SPAGAIN;
     PUSHs(&sv_no);
     LEAVE_SCOPE(oldsave);
     RETURN;
@@ -2017,8 +2032,6 @@ PP(pp_entersub)
     }
 #endif /* USE_THREADS */
 
-    gimme = GIMME;
-
     if (CvXSUB(cv)) {
        if (CvOLDSTYLE(cv)) {
            I32 (*fp3)_((int,int,int));
@@ -2248,7 +2261,7 @@ PP(pp_aelem)
            RETURN;
        }
        if (op->op_private & OPpLVAL_INTRO)
-           save_svref(svp);
+           save_aelem(av, elem, svp);
        else if (op->op_private & OPpDEREF)
            vivify_ref(*svp, op->op_private & OPpDEREF);
     }
@@ -2273,7 +2286,7 @@ vivify_ref(SV *sv, U32 to_what)
        }
        switch (to_what) {
        case OPpDEREF_SV:
-           SvRV(sv) = newSV(0);
+           SvRV(sv) = NEWSV(355,0);
            break;
        case OPpDEREF_AV:
            SvRV(sv) = (SV*)newAV();