[asperl] integrate latest win32 branch
[p5sagit/p5-mst-13.2.git] / pp_hot.c
index 0462886..b52b5b0 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;
 }
@@ -297,6 +300,9 @@ PP(pp_print)
        gv = defoutgv;
     if (SvRMAGICAL(gv) && (mg = mg_find((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 ...
+            */
            MEXTEND(SP, 1);
            ++MARK;
            Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
@@ -687,12 +693,12 @@ PP(pp_aassign)
            if (delaymagic & DM_UID) {
                if (uid != euid)
                    DIE("No setreuid available");
-               (void)setuid(uid);
+               (void)PerlProc_setuid(uid);
            }
 #  endif /* HAS_SETREUID */
 #endif /* HAS_SETRESUID */
-           uid = (int)getuid();
-           euid = (int)geteuid();
+           uid = (int)PerlProc_getuid();
+           euid = (int)PerlProc_geteuid();
        }
        if (delaymagic & DM_GID) {
 #ifdef HAS_SETRESGID
@@ -716,12 +722,12 @@ PP(pp_aassign)
            if (delaymagic & DM_GID) {
                if (gid != egid)
                    DIE("No setregid available");
-               (void)setgid(gid);
+               (void)PerlProc_setgid(gid);
            }
 #  endif /* HAS_SETREGID */
 #endif /* HAS_SETRESGID */
-           gid = (int)getgid();
-           egid = (int)getegid();
+           gid = (int)PerlProc_getgid();
+           egid = (int)PerlProc_getegid();
        }
        tainting |= (uid && (euid != uid || egid != gid));
     }
@@ -1053,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;
@@ -1218,7 +1224,7 @@ do_readline(void)
                if (!isALPHA(*tmps) && !isDIGIT(*tmps) &&
                    strchr("$&*(){}[]'\";\\|?<>~`", *tmps))
                        break;
-           if (*tmps && Stat(SvPVX(sv), &statbuf) < 0) {
+           if (*tmps && PerlLIO_stat(SvPVX(sv), &statbuf) < 0) {
                (void)POPs;             /* Unmatched wildcard?  Chuck it... */
                continue;
            }
@@ -1450,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;
@@ -1530,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;
@@ -1585,6 +1594,7 @@ PP(pp_subst)
                sv_chop(TARG, d);
            }
            TAINT_IF(rxtainted);
+           SPAGAIN;
            PUSHs(&sv_yes);
        }
        else {
@@ -1613,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;
@@ -1629,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);
        }
@@ -1671,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;
@@ -1680,7 +1697,8 @@ PP(pp_subst)
 nope:
     ++BmUSEFUL(rx->check_substr);
 
-ret_no:
+ret_no:         
+    SPAGAIN;
     PUSHs(&sv_no);
     LEAVE_SCOPE(oldsave);
     RETURN;
@@ -1768,7 +1786,7 @@ PP(pp_leavesub)
     return pop_return();
 }
 
-static CV *
+STATIC CV *
 get_db_sub(SV **svp, CV *cv)
 {
     dTHR;
@@ -2014,8 +2032,6 @@ PP(pp_entersub)
     }
 #endif /* USE_THREADS */
 
-    gimme = GIMME;
-
     if (CvXSUB(cv)) {
        if (CvOLDSTYLE(cv)) {
            I32 (*fp3)_((int,int,int));
@@ -2067,7 +2083,7 @@ PP(pp_entersub)
                curcopdb = NULL;
            }
            /* Do we need to open block here? XXXX */
-           (void)(*CvXSUB(cv))(cv);
+           (void)(*CvXSUB(cv))(THIS_ cv);
 
            /* Enforce some sanity in scalar context. */
            if (gimme == G_SCALAR && ++markix != stack_sp - stack_base ) {
@@ -2270,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();