Integrate from ansi branch to mainline.
[p5sagit/p5-mst-13.2.git] / sv.c
diff --git a/sv.c b/sv.c
index 74f7307..9a7f075 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -1042,12 +1042,10 @@ sv_backoff(register SV *sv)
 }
 
 char *
-sv_grow(register SV *sv, register I32 newlen)
-                
 #ifndef DOSISH
-                    
+sv_grow(register SV *sv, register I32 newlen)
 #else
-                     
+sv_grow(SV* sv, unsigned long newlen)
 #endif
 {
     register char *s;
@@ -1086,6 +1084,7 @@ sv_grow(register SV *sv, register I32 newlen)
 void
 sv_setiv(register SV *sv, IV i)
 {
+    dTHR;      /* just for taint */
     sv_check_thinkfirst(sv);
     switch (SvTYPE(sv)) {
     case SVt_NULL:
@@ -1133,6 +1132,7 @@ sv_setuv(register SV *sv, UV u)
 void
 sv_setnv(register SV *sv, double num)
 {
+    dTHR;      /* just for taint */
     sv_check_thinkfirst(sv);
     switch (SvTYPE(sv)) {
     case SVt_NULL:
@@ -2148,6 +2148,7 @@ sv_setsv(SV *dstr, register SV *sstr)
 void
 sv_setpvn(register SV *sv, register const char *ptr, register STRLEN len)
 {
+    dTHR;      /* just for taint */
     assert(len >= 0);  /* STRLEN is probably unsigned, so this may
                          elicit a warning, but it won't hurt. */
     sv_check_thinkfirst(sv);
@@ -2172,6 +2173,7 @@ sv_setpvn(register SV *sv, register const char *ptr, register STRLEN len)
 void
 sv_setpv(register SV *sv, register const char *ptr)
 {
+    dTHR;      /* just for taint */
     register STRLEN len;
 
     sv_check_thinkfirst(sv);
@@ -2196,6 +2198,7 @@ sv_setpv(register SV *sv, register const char *ptr)
 void
 sv_usepvn(register SV *sv, register char *ptr, register STRLEN len)
 {
+    dTHR;      /* just for taint */
     sv_check_thinkfirst(sv);
     if (!SvUPGRADE(sv, SVt_PV))
        return;
@@ -2256,6 +2259,7 @@ sv_chop(register SV *sv, register char *ptr)      /* like set but assuming ptr is in
 void
 sv_catpvn(register SV *sv, register char *ptr, register STRLEN len)
 {
+    dTHR;      /* just for taint */
     STRLEN tlen;
     char *junk;
 
@@ -2284,6 +2288,7 @@ sv_catsv(SV *dstr, register SV *sstr)
 void
 sv_catpv(register SV *sv, register char *ptr)
 {
+    dTHR;      /* just for taint */
     register STRLEN len;
     STRLEN tlen;
     char *junk;
@@ -2350,7 +2355,7 @@ sv_magic(register SV *sv, SV *obj, int how, char *name, I32 namlen)
     mg->mg_moremagic = SvMAGIC(sv);
 
     SvMAGIC(sv) = mg;
-    if (!obj || obj == sv || how == '#')
+    if (!obj || obj == sv || how == '#' || how == 'r')
        mg->mg_obj = obj;
     else {
        dTHR;
@@ -2430,6 +2435,9 @@ sv_magic(register SV *sv, SV *obj, int how, char *name, I32 namlen)
     case 'q':
        mg->mg_virtual = &vtbl_packelem;
        break;
+    case 'r':
+       mg->mg_virtual = &vtbl_regexp;
+       break;
     case 'S':
        mg->mg_virtual = &vtbl_sig;
        break;
@@ -2622,8 +2630,7 @@ sv_clear(register SV *sv)
     if (SvOBJECT(sv)) {
        dTHR;
        if (defstash) {         /* Still have a symbol table? */
-           dTHR;
-           dSP;
+           djSP;
            GV* destructor;
 
            ENTER;
@@ -2980,6 +2987,7 @@ sv_collxfrm(SV *sv, STRLEN *nxp)
 char *
 sv_gets(register SV *sv, register FILE *fp, I32 append)
 {
+    dTHR;
     char *rsptr;
     STRLEN rslen;
     register STDCHAR rslast;
@@ -3211,6 +3219,10 @@ screamer2:
        }
     }
 
+#ifdef WIN32
+    win32_strip_return(sv);
+#endif
+
     return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
 }
 
@@ -3492,9 +3504,10 @@ newRV(SV *ref)
     return sv;
 }
 
-#ifdef CRIPPLED_CC
+
+
 SV *
-newRV_noinc(SV *ref)
+Perl_newRV_noinc(SV *ref)
 {
     register SV *sv;
 
@@ -3502,7 +3515,6 @@ newRV_noinc(SV *ref)
     SvREFCNT_dec(ref);
     return sv;
 }
-#endif /* CRIPPLED_CC */
 
 /* make an exact duplicate of old */
 
@@ -3574,6 +3586,7 @@ sv_reset(register char *s, HV *stash)
                sv = GvSV(gv);
                (void)SvOK_off(sv);
                if (SvTYPE(sv) >= SVt_PV) {
+                   dTHR;       /* just for taint */
                    SvCUR_set(sv, 0);
                    if (SvPVX(sv) != Nullch)
                        *SvPVX(sv) = '\0';
@@ -3687,20 +3700,20 @@ sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
     }
 }
 
-#ifndef SvTRUE
 I32
-SvTRUE(register SV *sv)
+sv_true(register SV *sv)
 {
+    dTHR;
     if (!sv)
        return 0;
     if (SvGMAGICAL(sv))
        mg_get(sv);
     if (SvPOK(sv)) {
-       register XPV* Xpv;
-       if ((Xpv = (XPV*)SvANY(sv)) &&
-               (*Xpv->xpv_pv > '0' ||
-               Xpv->xpv_cur > 1 ||
-               (Xpv->xpv_cur && *Xpv->xpv_pv != '0')))
+       register XPV* tXpv;
+       if ((tXpv = (XPV*)SvANY(sv)) &&
+               (*tXpv->xpv_pv > '0' ||
+               tXpv->xpv_cur > 1 ||
+               (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
            return 1;
        else
            return 0;
@@ -3716,39 +3729,31 @@ SvTRUE(register SV *sv)
        }
     }
 }
-#endif /* !SvTRUE */
 
-#ifndef SvIV
 IV
-SvIV(register SV *sv)
+sv_iv(register SV *sv)
 {
     if (SvIOK(sv))
        return SvIVX(sv);
     return sv_2iv(sv);
 }
-#endif /* !SvIV */
 
-#ifndef SvUV
 UV
-SvUV(register SV *sv)
+sv_uv(register SV *sv)
 {
     if (SvIOK(sv))
        return SvUVX(sv);
     return sv_2uv(sv);
 }
-#endif /* !SvUV */
 
-#ifndef SvNV
 double
-SvNV(register SV *sv)
+sv_nv(register SV *sv)
 {
     if (SvNOK(sv))
        return SvNVX(sv);
     return sv_2nv(sv);
 }
-#endif /* !SvNV */
 
-#ifdef CRIPPLED_CC
 char *
 sv_pvn(SV *sv, STRLEN *lp)
 {
@@ -3758,7 +3763,6 @@ sv_pvn(SV *sv, STRLEN *lp)
     }
     return sv_2pv(sv, lp);
 }
-#endif
 
 char *
 sv_pvn_force(SV *sv, STRLEN *lp)
@@ -3801,6 +3805,7 @@ sv_pvn_force(SV *sv, STRLEN *lp)
            *SvEND(sv) = '\0';
        }
        if (!SvPOK(sv)) {
+           dTHR;       /* just for taint */
            SvPOK_on(sv);               /* validate pointer */
            SvTAINT(sv);
            DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",
@@ -4659,6 +4664,10 @@ sv_dump(SV *sv)
                sv_catpv(d, " ),");
            }
        }
+    case SVt_PVBM:
+       if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
+       if (SvCOMPILED(sv))     sv_catpv(d, "COMPILED,");
+       break;
     }
 
     if (*(SvEND(d) - 1) == ',')
@@ -4854,3 +4863,7 @@ sv_dump(SV *sv)
 {
 }
 #endif
+
+
+
+