This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
provide SvPV_nolen(sv) to avoid use of PL_na
[perl5.git] / sv.c
diff --git a/sv.c b/sv.c
index ec224a3..eede077 100644 (file)
--- a/sv.c
+++ b/sv.c
 #endif
 #endif
 
-#if defined(USE_STDIO_PTR) && defined(STDIO_PTR_LVALUE) && defined(STDIO_CNT_LVALUE) && !defined(__QNX__)
-#  define FAST_SV_GETS
-#endif
-
 #ifdef PERL_OBJECT
 #define FCALL this->*f
 #define VTBL this->*vtbl
@@ -607,7 +603,7 @@ more_xpv(void)
 
 #ifdef PURIFY
 #  define my_safemalloc(s) safemalloc(s)
-#  define my_safefree(s) free(s)
+#  define my_safefree(s) safefree(s)
 #else
 STATIC void* 
 my_safemalloc(MEM_SIZE size)
@@ -698,7 +694,7 @@ sv_upgrade(register SV *sv, U32 mt)
        cur     = 0;
        len     = 0;
        nv      = SvNVX(sv);
-       iv      = (IV)nv;
+       iv      = I_V(nv);
        magic   = 0;
        stash   = 0;
        del_XNV(SvANY(sv));
@@ -926,156 +922,6 @@ sv_upgrade(register SV *sv, U32 mt)
     return TRUE;
 }
 
-char *
-sv_peek(SV *sv)
-{
-#ifdef DEBUGGING
-    SV *t = sv_newmortal();
-    STRLEN prevlen;
-    int unref = 0;
-
-    sv_setpvn(t, "", 0);
-  retry:
-    if (!sv) {
-       sv_catpv(t, "VOID");
-       goto finish;
-    }
-    else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
-       sv_catpv(t, "WILD");
-       goto finish;
-    }
-    else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes) {
-       if (sv == &PL_sv_undef) {
-           sv_catpv(t, "SV_UNDEF");
-           if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
-                                SVs_GMG|SVs_SMG|SVs_RMG)) &&
-               SvREADONLY(sv))
-               goto finish;
-       }
-       else if (sv == &PL_sv_no) {
-           sv_catpv(t, "SV_NO");
-           if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
-                                SVs_GMG|SVs_SMG|SVs_RMG)) &&
-               !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
-                                 SVp_POK|SVp_NOK)) &&
-               SvCUR(sv) == 0 &&
-               SvNVX(sv) == 0.0)
-               goto finish;
-       }
-       else {
-           sv_catpv(t, "SV_YES");
-           if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
-                                SVs_GMG|SVs_SMG|SVs_RMG)) &&
-               !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
-                                 SVp_POK|SVp_NOK)) &&
-               SvCUR(sv) == 1 &&
-               SvPVX(sv) && *SvPVX(sv) == '1' &&
-               SvNVX(sv) == 1.0)
-               goto finish;
-       }
-       sv_catpv(t, ":");
-    }
-    else if (SvREFCNT(sv) == 0) {
-       sv_catpv(t, "(");
-       unref++;
-    }
-    if (SvROK(sv)) {
-       sv_catpv(t, "\\");
-       if (SvCUR(t) + unref > 10) {
-           SvCUR(t) = unref + 3;
-           *SvEND(t) = '\0';
-           sv_catpv(t, "...");
-           goto finish;
-       }
-       sv = (SV*)SvRV(sv);
-       goto retry;
-    }
-    switch (SvTYPE(sv)) {
-    default:
-       sv_catpv(t, "FREED");
-       goto finish;
-
-    case SVt_NULL:
-       sv_catpv(t, "UNDEF");
-       goto finish;
-    case SVt_IV:
-       sv_catpv(t, "IV");
-       break;
-    case SVt_NV:
-       sv_catpv(t, "NV");
-       break;
-    case SVt_RV:
-       sv_catpv(t, "RV");
-       break;
-    case SVt_PV:
-       sv_catpv(t, "PV");
-       break;
-    case SVt_PVIV:
-       sv_catpv(t, "PVIV");
-       break;
-    case SVt_PVNV:
-       sv_catpv(t, "PVNV");
-       break;
-    case SVt_PVMG:
-       sv_catpv(t, "PVMG");
-       break;
-    case SVt_PVLV:
-       sv_catpv(t, "PVLV");
-       break;
-    case SVt_PVAV:
-       sv_catpv(t, "AV");
-       break;
-    case SVt_PVHV:
-       sv_catpv(t, "HV");
-       break;
-    case SVt_PVCV:
-       if (CvGV(sv))
-           sv_catpvf(t, "CV(%s)", GvNAME(CvGV(sv)));
-       else
-           sv_catpv(t, "CV()");
-       goto finish;
-    case SVt_PVGV:
-       sv_catpv(t, "GV");
-       break;
-    case SVt_PVBM:
-       sv_catpv(t, "BM");
-       break;
-    case SVt_PVFM:
-       sv_catpv(t, "FM");
-       break;
-    case SVt_PVIO:
-       sv_catpv(t, "IO");
-       break;
-    }
-
-    if (SvPOKp(sv)) {
-       if (!SvPVX(sv))
-           sv_catpv(t, "(null)");
-       if (SvOOK(sv))
-           sv_catpvf(t, "(%ld+\"%.127s\")",(long)SvIVX(sv),SvPVX(sv));
-       else
-           sv_catpvf(t, "(\"%.127s\")",SvPVX(sv));
-    }
-    else if (SvNOKp(sv)) {
-       SET_NUMERIC_STANDARD();
-       sv_catpvf(t, "(%g)",SvNVX(sv));
-    }
-    else if (SvIOKp(sv))
-       sv_catpvf(t, "(%ld)",(long)SvIVX(sv));
-    else
-       sv_catpv(t, "()");
-    
-  finish:
-    if (unref) {
-       while (unref--)
-           sv_catpv(t, ")");
-    }
-    return SvPV(t, PL_na);
-#else  /* DEBUGGING */
-    return "";
-#endif /* DEBUGGING */
-}
-
 int
 sv_backoff(register SV *sv)
 {
@@ -1092,11 +938,7 @@ sv_backoff(register SV *sv)
 }
 
 char *
-#ifndef DOSISH
-sv_grow(register SV *sv, register I32 newlen)
-#else
-sv_grow(SV* sv, unsigned long newlen)
-#endif
+sv_grow(register SV *sv, register STRLEN newlen)
 {
     register char *s;
 
@@ -1173,7 +1015,7 @@ sv_setiv(register SV *sv, IV i)
        {
            dTHR;
            croak("Can't coerce %s to integer in %s", sv_reftype(sv,0),
-                 op_desc[PL_op->op_type]);
+                 PL_op_desc[PL_op->op_type]);
        }
     }
     (void)SvIOK_only(sv);                      /* validate number */
@@ -1233,7 +1075,7 @@ sv_setnv(register SV *sv, double num)
        {
            dTHR;
            croak("Can't coerce %s to number in %s", sv_reftype(sv,0),
-                 op_name[PL_op->op_type]);
+                 PL_op_name[PL_op->op_type]);
        }
     }
     SvNVX(sv) = num;
@@ -1298,7 +1140,7 @@ not_a_number(SV *sv)
 
     if (PL_op)
        warner(WARN_NUMERIC, "Argument \"%s\" isn't numeric in %s", tmpbuf,
-               op_name[PL_op->op_type]);
+               PL_op_name[PL_op->op_type]);
     else
        warner(WARN_NUMERIC, "Argument \"%s\" isn't numeric", tmpbuf);
 }
@@ -1324,18 +1166,16 @@ sv_2iv(register SV *sv)
            if (!(SvFLAGS(sv) & SVs_PADTMP)) {
                dTHR;
                if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
-                   warner(WARN_UNINITIALIZED, warn_uninit);
+                   warner(WARN_UNINITIALIZED, PL_warn_uninit);
            }
            return 0;
        }
     }
     if (SvTHINKFIRST(sv)) {
        if (SvROK(sv)) {
-#ifdef OVERLOAD
          SV* tmpstr;
          if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
-           return SvIV(tmpstr);
-#endif /* OVERLOAD */
+             return SvIV(tmpstr);
          return (IV)SvRV(sv);
        }
        if (SvREADONLY(sv)) {
@@ -1350,7 +1190,7 @@ sv_2iv(register SV *sv)
            {
                dTHR;
                if (ckWARN(WARN_UNINITIALIZED))
-                   warner(WARN_UNINITIALIZED, warn_uninit);
+                   warner(WARN_UNINITIALIZED, PL_warn_uninit);
            }
            return 0;
        }
@@ -1380,7 +1220,7 @@ sv_2iv(register SV *sv)
     else  {
        dTHR;
        if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
-           warner(WARN_UNINITIALIZED, warn_uninit);
+           warner(WARN_UNINITIALIZED, PL_warn_uninit);
        return 0;
     }
     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2iv(%ld)\n",
@@ -1405,18 +1245,16 @@ sv_2uv(register SV *sv)
            if (!(SvFLAGS(sv) & SVs_PADTMP)) {
                dTHR;
                if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
-                   warner(WARN_UNINITIALIZED, warn_uninit);
+                   warner(WARN_UNINITIALIZED, PL_warn_uninit);
            }
            return 0;
        }
     }
     if (SvTHINKFIRST(sv)) {
        if (SvROK(sv)) {
-#ifdef OVERLOAD
          SV* tmpstr;
          if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
-           return SvUV(tmpstr);
-#endif /* OVERLOAD */
+             return SvUV(tmpstr);
          return (UV)SvRV(sv);
        }
        if (SvREADONLY(sv)) {
@@ -1428,7 +1266,7 @@ sv_2uv(register SV *sv)
            {
                dTHR;
                if (ckWARN(WARN_UNINITIALIZED))
-                   warner(WARN_UNINITIALIZED, warn_uninit);
+                   warner(WARN_UNINITIALIZED, PL_warn_uninit);
            }
            return 0;
        }
@@ -1456,7 +1294,7 @@ sv_2uv(register SV *sv)
        if (!(SvFLAGS(sv) & SVs_PADTMP)) {
            dTHR;
            if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
-               warner(WARN_UNINITIALIZED, warn_uninit);
+               warner(WARN_UNINITIALIZED, PL_warn_uninit);
        }
        return 0;
     }
@@ -1487,18 +1325,16 @@ sv_2nv(register SV *sv)
            if (!(SvFLAGS(sv) & SVs_PADTMP)) {
                dTHR;
                if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
-                   warner(WARN_UNINITIALIZED, warn_uninit);
+                   warner(WARN_UNINITIALIZED, PL_warn_uninit);
            }
             return 0;
         }
     }
     if (SvTHINKFIRST(sv)) {
        if (SvROK(sv)) {
-#ifdef OVERLOAD
          SV* tmpstr;
          if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
-           return SvNV(tmpstr);
-#endif /* OVERLOAD */
+             return SvNV(tmpstr);
          return (double)(unsigned long)SvRV(sv);
        }
        if (SvREADONLY(sv)) {
@@ -1512,7 +1348,7 @@ sv_2nv(register SV *sv)
            if (SvIOKp(sv))
                return (double)SvIVX(sv);
            if (ckWARN(WARN_UNINITIALIZED))
-               warner(WARN_UNINITIALIZED, warn_uninit);
+               warner(WARN_UNINITIALIZED, PL_warn_uninit);
            return 0.0;
        }
     }
@@ -1542,7 +1378,7 @@ sv_2nv(register SV *sv)
     else  {
        dTHR;
        if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
-           warner(WARN_UNINITIALIZED, warn_uninit);
+           warner(WARN_UNINITIALIZED, PL_warn_uninit);
        return 0.0;
     }
     SvNOK_on(sv);
@@ -1671,6 +1507,13 @@ looks_like_number(SV *sv)
 }
 
 char *
+sv_2pv_nolen(register SV *sv)
+{
+    STRLEN n_a;
+    return sv_2pv(sv, &n_a);
+}
+
+char *
 sv_2pv(register SV *sv, STRLEN *lp)
 {
     register char *s;
@@ -1703,7 +1546,7 @@ sv_2pv(register SV *sv, STRLEN *lp)
            if (!(SvFLAGS(sv) & SVs_PADTMP)) {
                dTHR;
                if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
-                   warner(WARN_UNINITIALIZED, warn_uninit);
+                   warner(WARN_UNINITIALIZED, PL_warn_uninit);
            }
             *lp = 0;
             return "";
@@ -1711,11 +1554,9 @@ sv_2pv(register SV *sv, STRLEN *lp)
     }
     if (SvTHINKFIRST(sv)) {
        if (SvROK(sv)) {
-#ifdef OVERLOAD
            SV* tmpstr;
            if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
-             return SvPV(tmpstr,*lp);
-#endif /* OVERLOAD */
+               return SvPV(tmpstr,*lp);
            sv = (SV*)SvRV(sv);
            if (!sv)
                s = "NULLREF";
@@ -1811,7 +1652,7 @@ sv_2pv(register SV *sv, STRLEN *lp)
            {
                dTHR;
                if (ckWARN(WARN_UNINITIALIZED))
-                   warner(WARN_UNINITIALIZED, warn_uninit);
+                   warner(WARN_UNINITIALIZED, PL_warn_uninit);
            }
            *lp = 0;
            return "";
@@ -1860,7 +1701,7 @@ sv_2pv(register SV *sv, STRLEN *lp)
     else {
        dTHR;
        if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
-           warner(WARN_UNINITIALIZED, warn_uninit);
+           warner(WARN_UNINITIALIZED, PL_warn_uninit);
        *lp = 0;
        return "";
     }
@@ -1920,14 +1761,10 @@ sv_2bool(register SV *sv)
     if (!SvOK(sv))
        return 0;
     if (SvROK(sv)) {
-#ifdef OVERLOAD
-      {
        dTHR;
        SV* tmpsv;
        if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
-         return SvTRUE(tmpsv);
-      }
-#endif /* OVERLOAD */
+           return SvTRUE(tmpsv);
       return SvRV(sv) != 0;
     }
     if (SvPOKp(sv)) {
@@ -1980,9 +1817,8 @@ sv_setsv(SV *dstr, register SV *sstr)
         dtype = SvTYPE(dstr);
     }
 
-#ifdef OVERLOAD
     SvAMAGIC_off(dstr);
-#endif /* OVERLOAD */
+
     /* There's a lot of redundancy below but we're going for speed here */
 
     switch (stype) {
@@ -2068,7 +1904,7 @@ sv_setsv(SV *dstr, register SV *sstr)
     case SVt_PVIO:
        if (PL_op)
            croak("Bizarre copy of %s in %s", sv_reftype(sstr, 0),
-               op_name[PL_op->op_type]);
+               PL_op_name[PL_op->op_type]);
        else
            croak("Bizarre copy of %s", sv_reftype(sstr, 0));
        break;
@@ -2251,11 +2087,9 @@ sv_setsv(SV *dstr, register SV *sstr)
            (void)SvIOK_on(dstr);
            SvIVX(dstr) = SvIVX(sstr);
        }
-#ifdef OVERLOAD
        if (SvAMAGIC(sstr)) {
            SvAMAGIC_on(dstr);
        }
-#endif /* OVERLOAD */
     }
     else if (sflags & SVp_POK) {
 
@@ -2438,7 +2272,7 @@ sv_check_thinkfirst(register SV *sv)
     if (SvREADONLY(sv)) {
        dTHR;
        if (PL_curcop != &PL_compiling)
-           croak(no_modify);
+           croak(PL_no_modify);
     }
     if (SvROK(sv))
        sv_unref(sv);
@@ -2564,7 +2398,7 @@ sv_magic(register SV *sv, SV *obj, int how, char *name, I32 namlen)
     if (SvREADONLY(sv)) {
        dTHR;
        if (PL_curcop != &PL_compiling && !strchr("gBf", how))
-           croak(no_modify);
+           croak(PL_no_modify);
     }
     if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
        if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
@@ -2597,106 +2431,104 @@ sv_magic(register SV *sv, SV *obj, int how, char *name, I32 namlen)
     
     switch (how) {
     case 0:
-       mg->mg_virtual = &vtbl_sv;
+       mg->mg_virtual = &PL_vtbl_sv;
        break;
-#ifdef OVERLOAD
     case 'A':
-        mg->mg_virtual = &vtbl_amagic;
+        mg->mg_virtual = &PL_vtbl_amagic;
         break;
     case 'a':
-        mg->mg_virtual = &vtbl_amagicelem;
+        mg->mg_virtual = &PL_vtbl_amagicelem;
         break;
     case 'c':
         mg->mg_virtual = 0;
         break;
-#endif /* OVERLOAD */
     case 'B':
-       mg->mg_virtual = &vtbl_bm;
+       mg->mg_virtual = &PL_vtbl_bm;
        break;
     case 'D':
-       mg->mg_virtual = &vtbl_regdata;
+       mg->mg_virtual = &PL_vtbl_regdata;
        break;
     case 'd':
-       mg->mg_virtual = &vtbl_regdatum;
+       mg->mg_virtual = &PL_vtbl_regdatum;
        break;
     case 'E':
-       mg->mg_virtual = &vtbl_env;
+       mg->mg_virtual = &PL_vtbl_env;
        break;
     case 'f':
-       mg->mg_virtual = &vtbl_fm;
+       mg->mg_virtual = &PL_vtbl_fm;
        break;
     case 'e':
-       mg->mg_virtual = &vtbl_envelem;
+       mg->mg_virtual = &PL_vtbl_envelem;
        break;
     case 'g':
-       mg->mg_virtual = &vtbl_mglob;
+       mg->mg_virtual = &PL_vtbl_mglob;
        break;
     case 'I':
-       mg->mg_virtual = &vtbl_isa;
+       mg->mg_virtual = &PL_vtbl_isa;
        break;
     case 'i':
-       mg->mg_virtual = &vtbl_isaelem;
+       mg->mg_virtual = &PL_vtbl_isaelem;
        break;
     case 'k':
-       mg->mg_virtual = &vtbl_nkeys;
+       mg->mg_virtual = &PL_vtbl_nkeys;
        break;
     case 'L':
        SvRMAGICAL_on(sv);
        mg->mg_virtual = 0;
        break;
     case 'l':
-       mg->mg_virtual = &vtbl_dbline;
+       mg->mg_virtual = &PL_vtbl_dbline;
        break;
 #ifdef USE_THREADS
     case 'm':
-       mg->mg_virtual = &vtbl_mutex;
+       mg->mg_virtual = &PL_vtbl_mutex;
        break;
 #endif /* USE_THREADS */
 #ifdef USE_LOCALE_COLLATE
     case 'o':
-        mg->mg_virtual = &vtbl_collxfrm;
+        mg->mg_virtual = &PL_vtbl_collxfrm;
         break;
 #endif /* USE_LOCALE_COLLATE */
     case 'P':
-       mg->mg_virtual = &vtbl_pack;
+       mg->mg_virtual = &PL_vtbl_pack;
        break;
     case 'p':
     case 'q':
-       mg->mg_virtual = &vtbl_packelem;
+       mg->mg_virtual = &PL_vtbl_packelem;
        break;
     case 'r':
-       mg->mg_virtual = &vtbl_regexp;
+       mg->mg_virtual = &PL_vtbl_regexp;
        break;
     case 'S':
-       mg->mg_virtual = &vtbl_sig;
+       mg->mg_virtual = &PL_vtbl_sig;
        break;
     case 's':
-       mg->mg_virtual = &vtbl_sigelem;
+       mg->mg_virtual = &PL_vtbl_sigelem;
        break;
     case 't':
-       mg->mg_virtual = &vtbl_taint;
+       mg->mg_virtual = &PL_vtbl_taint;
        mg->mg_len = 1;
        break;
     case 'U':
-       mg->mg_virtual = &vtbl_uvar;
+       mg->mg_virtual = &PL_vtbl_uvar;
        break;
     case 'v':
-       mg->mg_virtual = &vtbl_vec;
+       mg->mg_virtual = &PL_vtbl_vec;
        break;
     case 'x':
-       mg->mg_virtual = &vtbl_substr;
+       mg->mg_virtual = &PL_vtbl_substr;
        break;
     case 'y':
-       mg->mg_virtual = &vtbl_defelem;
+       mg->mg_virtual = &PL_vtbl_defelem;
        break;
     case '*':
-       mg->mg_virtual = &vtbl_glob;
+       mg->mg_virtual = &PL_vtbl_glob;
        break;
     case '#':
-       mg->mg_virtual = &vtbl_arylen;
+       mg->mg_virtual = &PL_vtbl_arylen;
        break;
     case '.':
-       mg->mg_virtual = &vtbl_pos;
+       mg->mg_virtual = &PL_vtbl_pos;
        break;
     case '~':  /* Reserved for use by extensions not perl internals.   */
        /* Useful for attaching extension internal data to perl vars.   */
@@ -2892,6 +2724,7 @@ sv_clear(register SV *sv)
                                 G_DISCARD|G_EVAL|G_KEEPERR);
                    SvREFCNT(sv)--;
                    POPSTACK;
+                   SPAGAIN;
                    LEAVE;
                }
            } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
@@ -3134,12 +2967,16 @@ sv_pos_u2b(register SV *sv, I32* offsetp, I32* lenp)
     send = s + len;
     while (s < send && uoffset--)
        s += UTF8SKIP(s);
+    if (s >= send)
+       s = send;
     *offsetp = s - start;
     if (lenp) {
        I32 ulen = *lenp;
        start = s;
        while (s < send && ulen--)
            s += UTF8SKIP(s);
+       if (s >= send)
+           s = send;
        *lenp = s - start;
     }
     return;
@@ -3596,24 +3433,23 @@ sv_inc(register SV *sv)
 
     if (!sv)
        return;
+    if (SvGMAGICAL(sv))
+       mg_get(sv);
     if (SvTHINKFIRST(sv)) {
        if (SvREADONLY(sv)) {
            dTHR;
            if (PL_curcop != &PL_compiling)
-               croak(no_modify);
+               croak(PL_no_modify);
        }
        if (SvROK(sv)) {
            IV i;
-#ifdef OVERLOAD
-           if (SvAMAGIC(sv) && AMG_CALLun(sv,inc)) return;
-#endif /* OVERLOAD */
+           if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
+               return;
            i = (IV)SvRV(sv);
            sv_unref(sv);
            sv_setiv(sv, i);
        }
     }
-    if (SvGMAGICAL(sv))
-       mg_get(sv);
     flags = SvFLAGS(sv);
     if (flags & SVp_NOK) {
        (void)SvNOK_only(sv);
@@ -3690,24 +3526,23 @@ sv_dec(register SV *sv)
 
     if (!sv)
        return;
+    if (SvGMAGICAL(sv))
+       mg_get(sv);
     if (SvTHINKFIRST(sv)) {
        if (SvREADONLY(sv)) {
            dTHR;
            if (PL_curcop != &PL_compiling)
-               croak(no_modify);
+               croak(PL_no_modify);
        }
        if (SvROK(sv)) {
            IV i;
-#ifdef OVERLOAD
-           if (SvAMAGIC(sv) && AMG_CALLun(sv,dec)) return;
-#endif /* OVERLOAD */
+           if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
+               return;
            i = (IV)SvRV(sv);
            sv_unref(sv);
            sv_setiv(sv, i);
        }
     }
-    if (SvGMAGICAL(sv))
-       mg_get(sv);
     flags = SvFLAGS(sv);
     if (flags & SVp_NOK) {
        SvNVX(sv) -= 1.0;
@@ -3957,12 +3792,18 @@ sv_reset(register char *s, HV *stash)
        }
        for (i = 0; i <= (I32) HvMAX(stash); i++) {
            for (entry = HvARRAY(stash)[i];
-             entry;
-             entry = HeNEXT(entry)) {
+                entry;
+                entry = HeNEXT(entry))
+           {
                if (!todo[(U8)*HeKEY(entry)])
                    continue;
                gv = (GV*)HeVAL(entry);
                sv = GvSV(gv);
+               if (SvTHINKFIRST(sv)) {
+                   if (!SvREADONLY(sv) && SvROK(sv))
+                       sv_unref(sv);
+                   continue;
+               }
                (void)SvOK_off(sv);
                if (SvTYPE(sv) >= SVt_PV) {
                    SvCUR_set(sv, 0);
@@ -3990,6 +3831,7 @@ sv_2io(SV *sv)
 {
     IO* io;
     GV* gv;
+    STRLEN n_a;
 
     switch (SvTYPE(sv)) {
     case SVt_PVIO:
@@ -4003,16 +3845,16 @@ sv_2io(SV *sv)
        break;
     default:
        if (!SvOK(sv))
-           croak(no_usym, "filehandle");
+           croak(PL_no_usym, "filehandle");
        if (SvROK(sv))
            return sv_2io(SvRV(sv));
-       gv = gv_fetchpv(SvPV(sv,PL_na), FALSE, SVt_PVIO);
+       gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
        if (gv)
            io = GvIO(gv);
        else
            io = 0;
        if (!io)
-           croak("Bad filehandle: %s", SvPV(sv,PL_na));
+           croak("Bad filehandle: %s", SvPV(sv,n_a));
        break;
     }
     return io;
@@ -4023,6 +3865,7 @@ sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
 {
     GV *gv;
     CV *cv;
+    STRLEN n_a;
 
     if (!sv)
        return *gvp = Nullgv, Nullcv;
@@ -4045,17 +3888,26 @@ sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
        if (SvGMAGICAL(sv))
            mg_get(sv);
        if (SvROK(sv)) {
-           cv = (CV*)SvRV(sv);
-           if (SvTYPE(cv) != SVt_PVCV)
+           dTHR;
+           SV **sp = &sv;              /* Used in tryAMAGICunDEREF macro. */
+           tryAMAGICunDEREF(to_cv);
+
+           sv = SvRV(sv);
+           if (SvTYPE(sv) == SVt_PVCV) {
+               cv = (CV*)sv;
+               *gvp = Nullgv;
+               *st = CvSTASH(cv);
+               return cv;
+           }
+           else if(isGV(sv))
+               gv = (GV*)sv;
+           else
                croak("Not a subroutine reference");
-           *gvp = Nullgv;
-           *st = CvSTASH(cv);
-           return cv;
        }
-       if (isGV(sv))
+       else if (isGV(sv))
            gv = (GV*)sv;
        else
-           gv = gv_fetchpv(SvPV(sv, PL_na), lref, SVt_PVCV);
+           gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
        *gvp = gv;
        if (!gv)
            return Nullcv;
@@ -4072,7 +3924,7 @@ sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
                   Nullop);
            LEAVE;
            if (!GvCVu(gv))
-               croak("Unable to create sub named \"%s\"", SvPV(sv,PL_na));
+               croak("Unable to create sub named \"%s\"", SvPV(sv,n_a));
        }
        return GvCVu(gv);
     }
@@ -4131,6 +3983,17 @@ sv_nv(register SV *sv)
 }
 
 char *
+sv_pv(SV *sv)
+{
+    STRLEN n_a;
+
+    if (SvPOK(sv))
+       return SvPVX(sv);
+
+    return sv_2pv(sv, &n_a);
+}
+
+char *
 sv_pvn(SV *sv, STRLEN *lp)
 {
     if (SvPOK(sv)) {
@@ -4148,7 +4011,7 @@ sv_pvn_force(SV *sv, STRLEN *lp)
     if (SvREADONLY(sv)) {
        dTHR;
        if (PL_curcop != &PL_compiling)
-           croak(no_modify);
+           croak(PL_no_modify);
     }
     
     if (SvPOK(sv)) {
@@ -4164,7 +4027,7 @@ sv_pvn_force(SV *sv, STRLEN *lp)
            else {
                dTHR;
                croak("Can't coerce %s to string in %s", sv_reftype(sv,0),
-                   op_name[PL_op->op_type]);
+                   PL_op_name[PL_op->op_type]);
            }
        }
        else
@@ -4264,9 +4127,7 @@ newSVrv(SV *rv, char *classname)
     SvFLAGS(sv) = 0;
 
     SV_CHECK_THINKFIRST(rv);
-#ifdef OVERLOAD
     SvAMAGIC_off(rv);
-#endif /* OVERLOAD */
 
     if (SvTYPE(rv) < SVt_RV)
       sv_upgrade(rv, SVt_RV);
@@ -4325,7 +4186,7 @@ sv_bless(SV *sv, HV *stash)
     tmpRef = SvRV(sv);
     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
        if (SvREADONLY(tmpRef))
-           croak(no_modify);
+           croak(PL_no_modify);
        if (SvOBJECT(tmpRef)) {
            if (SvTYPE(tmpRef) != SVt_PVIO)
                --PL_sv_objcount;
@@ -4338,12 +4199,10 @@ sv_bless(SV *sv, HV *stash)
     (void)SvUPGRADE(tmpRef, SVt_PVMG);
     SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
 
-#ifdef OVERLOAD
     if (Gv_AMG(stash))
        SvAMAGIC_on(sv);
     else
        SvAMAGIC_off(sv);
-#endif /* OVERLOAD */
 
     return sv;
 }
@@ -4549,10 +4408,6 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
        char *eptr = Nullch;
        STRLEN elen = 0;
        char ebuf[TYPE_DIGITS(int) * 2 + 16]; /* large enough for "%#.#f" */
-
-       static char *efloatbuf = Nullch;
-       static STRLEN efloatsize = 0;
-
        char c;
        int i;
        unsigned base;
@@ -4781,6 +4636,10 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
            base = 10;
            goto uns_integer;
 
+       case 'b':
+           base = 2;
+           goto uns_integer;
+
        case 'O':
            intsize = 'l';
            /* FALL THROUGH */
@@ -4836,6 +4695,14 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
                if (alt && *eptr != '0')
                    *--eptr = '0';
                break;
+           case 2:
+               do {
+                   dig = uv & 1;
+                   *--eptr = '0' + dig;
+               } while (uv >>= 1);
+               if (alt && *eptr != '0')
+                   *--eptr = '0';
+               break;
            default:            /* it had better be ten or less */
                do {
                    dig = uv % base;
@@ -4882,10 +4749,10 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
                need = width;
 
            need += 20; /* fudge factor */
-           if (efloatsize < need) {
-               Safefree(efloatbuf);
-               efloatsize = need + 20; /* more fudge */
-               New(906, efloatbuf, efloatsize, char);
+           if (PL_efloatsize < need) {
+               Safefree(PL_efloatbuf);
+               PL_efloatsize = need + 20; /* more fudge */
+               New(906, PL_efloatbuf, PL_efloatsize, char);
            }
 
            eptr = ebuf + sizeof ebuf;
@@ -4910,10 +4777,10 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
                *--eptr = '#';
            *--eptr = '%';
 
-           (void)sprintf(efloatbuf, eptr, nv);
+           (void)sprintf(PL_efloatbuf, eptr, nv);
 
-           eptr = efloatbuf;
-           elen = strlen(efloatbuf);
+           eptr = PL_efloatbuf;
+           elen = strlen(PL_efloatbuf);
 
 #ifdef LC_NUMERIC
            /*
@@ -5010,273 +4877,3 @@ sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs,
        SvCUR(sv) = p - SvPVX(sv);
     }
 }
-
-void
-sv_dump(SV *sv)
-{
-#ifdef DEBUGGING
-    SV *d = sv_newmortal();
-    char *s;
-    U32 flags;
-    U32 type;
-
-    if (!sv) {
-       PerlIO_printf(Perl_debug_log, "SV = 0\n");
-       return;
-    }
-    
-    flags = SvFLAGS(sv);
-    type = SvTYPE(sv);
-
-    sv_setpvf(d, "(0x%lx)\n  REFCNT = %ld\n  FLAGS = (",
-             (unsigned long)SvANY(sv), (long)SvREFCNT(sv));
-    if (flags & SVs_PADBUSY)   sv_catpv(d, "PADBUSY,");
-    if (flags & SVs_PADTMP)    sv_catpv(d, "PADTMP,");
-    if (flags & SVs_PADMY)     sv_catpv(d, "PADMY,");
-    if (flags & SVs_TEMP)      sv_catpv(d, "TEMP,");
-    if (flags & SVs_OBJECT)    sv_catpv(d, "OBJECT,");
-    if (flags & SVs_GMG)       sv_catpv(d, "GMG,");
-    if (flags & SVs_SMG)       sv_catpv(d, "SMG,");
-    if (flags & SVs_RMG)       sv_catpv(d, "RMG,");
-
-    if (flags & SVf_IOK)       sv_catpv(d, "IOK,");
-    if (flags & SVf_NOK)       sv_catpv(d, "NOK,");
-    if (flags & SVf_POK)       sv_catpv(d, "POK,");
-    if (flags & SVf_ROK)       sv_catpv(d, "ROK,");
-    if (flags & SVf_OOK)       sv_catpv(d, "OOK,");
-    if (flags & SVf_FAKE)      sv_catpv(d, "FAKE,");
-    if (flags & SVf_READONLY)  sv_catpv(d, "READONLY,");
-
-#ifdef OVERLOAD
-    if (flags & SVf_AMAGIC)    sv_catpv(d, "OVERLOAD,");
-#endif /* OVERLOAD */
-    if (flags & SVp_IOK)       sv_catpv(d, "pIOK,");
-    if (flags & SVp_NOK)       sv_catpv(d, "pNOK,");
-    if (flags & SVp_POK)       sv_catpv(d, "pPOK,");
-    if (flags & SVp_SCREAM)    sv_catpv(d, "SCREAM,");
-
-    switch (type) {
-    case SVt_PVCV:
-    case SVt_PVFM:
-       if (CvANON(sv))         sv_catpv(d, "ANON,");
-       if (CvUNIQUE(sv))       sv_catpv(d, "UNIQUE,");
-       if (CvCLONE(sv))        sv_catpv(d, "CLONE,");
-       if (CvCLONED(sv))       sv_catpv(d, "CLONED,");
-       if (CvNODEBUG(sv))      sv_catpv(d, "NODEBUG,");
-       break;
-    case SVt_PVHV:
-       if (HvSHAREKEYS(sv))    sv_catpv(d, "SHAREKEYS,");
-       if (HvLAZYDEL(sv))      sv_catpv(d, "LAZYDEL,");
-       break;
-    case SVt_PVGV:
-       if (GvINTRO(sv))        sv_catpv(d, "INTRO,");
-       if (GvMULTI(sv))        sv_catpv(d, "MULTI,");
-       if (GvASSUMECV(sv))     sv_catpv(d, "ASSUMECV,");
-       if (GvIMPORTED(sv)) {
-           sv_catpv(d, "IMPORT");
-           if (GvIMPORTED(sv) == GVf_IMPORTED)
-               sv_catpv(d, "ALL,");
-           else {
-               sv_catpv(d, "(");
-               if (GvIMPORTED_SV(sv))  sv_catpv(d, " SV");
-               if (GvIMPORTED_AV(sv))  sv_catpv(d, " AV");
-               if (GvIMPORTED_HV(sv))  sv_catpv(d, " HV");
-               if (GvIMPORTED_CV(sv))  sv_catpv(d, " CV");
-               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) == ',')
-       SvPVX(d)[--SvCUR(d)] = '\0';
-    sv_catpv(d, ")");
-    s = SvPVX(d);
-
-    PerlIO_printf(Perl_debug_log, "SV = ");
-    switch (type) {
-    case SVt_NULL:
-       PerlIO_printf(Perl_debug_log, "NULL%s\n", s);
-       return;
-    case SVt_IV:
-       PerlIO_printf(Perl_debug_log, "IV%s\n", s);
-       break;
-    case SVt_NV:
-       PerlIO_printf(Perl_debug_log, "NV%s\n", s);
-       break;
-    case SVt_RV:
-       PerlIO_printf(Perl_debug_log, "RV%s\n", s);
-       break;
-    case SVt_PV:
-       PerlIO_printf(Perl_debug_log, "PV%s\n", s);
-       break;
-    case SVt_PVIV:
-       PerlIO_printf(Perl_debug_log, "PVIV%s\n", s);
-       break;
-    case SVt_PVNV:
-       PerlIO_printf(Perl_debug_log, "PVNV%s\n", s);
-       break;
-    case SVt_PVBM:
-       PerlIO_printf(Perl_debug_log, "PVBM%s\n", s);
-       break;
-    case SVt_PVMG:
-       PerlIO_printf(Perl_debug_log, "PVMG%s\n", s);
-       break;
-    case SVt_PVLV:
-       PerlIO_printf(Perl_debug_log, "PVLV%s\n", s);
-       break;
-    case SVt_PVAV:
-       PerlIO_printf(Perl_debug_log, "PVAV%s\n", s);
-       break;
-    case SVt_PVHV:
-       PerlIO_printf(Perl_debug_log, "PVHV%s\n", s);
-       break;
-    case SVt_PVCV:
-       PerlIO_printf(Perl_debug_log, "PVCV%s\n", s);
-       break;
-    case SVt_PVGV:
-       PerlIO_printf(Perl_debug_log, "PVGV%s\n", s);
-       break;
-    case SVt_PVFM:
-       PerlIO_printf(Perl_debug_log, "PVFM%s\n", s);
-       break;
-    case SVt_PVIO:
-       PerlIO_printf(Perl_debug_log, "PVIO%s\n", s);
-       break;
-    default:
-       PerlIO_printf(Perl_debug_log, "UNKNOWN%s\n", s);
-       return;
-    }
-    if (type >= SVt_PVIV || type == SVt_IV)
-       PerlIO_printf(Perl_debug_log, "  IV = %ld\n", (long)SvIVX(sv));
-    if (type >= SVt_PVNV || type == SVt_NV) {
-       SET_NUMERIC_STANDARD();
-       PerlIO_printf(Perl_debug_log, "  NV = %.*g\n", DBL_DIG, SvNVX(sv));
-    }
-    if (SvROK(sv)) {
-       PerlIO_printf(Perl_debug_log, "  RV = 0x%lx\n", (long)SvRV(sv));
-       sv_dump(SvRV(sv));
-       return;
-    }
-    if (type < SVt_PV)
-       return;
-    if (type <= SVt_PVLV) {
-       if (SvPVX(sv))
-           PerlIO_printf(Perl_debug_log, "  PV = 0x%lx \"%s\"\n  CUR = %ld\n  LEN = %ld\n",
-               (long)SvPVX(sv), SvPVX(sv), (long)SvCUR(sv), (long)SvLEN(sv));
-       else
-           PerlIO_printf(Perl_debug_log, "  PV = 0\n");
-    }
-    if (type >= SVt_PVMG) {
-       if (SvMAGIC(sv)) {
-           PerlIO_printf(Perl_debug_log, "  MAGIC = 0x%lx\n", (long)SvMAGIC(sv));
-       }
-       if (SvSTASH(sv))
-           PerlIO_printf(Perl_debug_log, "  STASH = \"%s\"\n", HvNAME(SvSTASH(sv)));
-    }
-    switch (type) {
-    case SVt_PVLV:
-       PerlIO_printf(Perl_debug_log, "  TYPE = %c\n", LvTYPE(sv));
-       PerlIO_printf(Perl_debug_log, "  TARGOFF = %ld\n", (long)LvTARGOFF(sv));
-       PerlIO_printf(Perl_debug_log, "  TARGLEN = %ld\n", (long)LvTARGLEN(sv));
-       PerlIO_printf(Perl_debug_log, "  TARG = 0x%lx\n", (long)LvTARG(sv));
-       sv_dump(LvTARG(sv));
-       break;
-    case SVt_PVAV:
-       PerlIO_printf(Perl_debug_log, "  ARRAY = 0x%lx\n", (long)AvARRAY(sv));
-       PerlIO_printf(Perl_debug_log, "  ALLOC = 0x%lx\n", (long)AvALLOC(sv));
-       PerlIO_printf(Perl_debug_log, "  FILL = %ld\n", (long)AvFILLp(sv));
-       PerlIO_printf(Perl_debug_log, "  MAX = %ld\n", (long)AvMAX(sv));
-       PerlIO_printf(Perl_debug_log, "  ARYLEN = 0x%lx\n", (long)AvARYLEN(sv));
-       flags = AvFLAGS(sv);
-       sv_setpv(d, "");
-       if (flags & AVf_REAL)   sv_catpv(d, ",REAL");
-       if (flags & AVf_REIFY)  sv_catpv(d, ",REIFY");
-       if (flags & AVf_REUSED) sv_catpv(d, ",REUSED");
-       PerlIO_printf(Perl_debug_log, "  FLAGS = (%s)\n",
-                     SvCUR(d) ? SvPVX(d) + 1 : "");
-       break;
-    case SVt_PVHV:
-       PerlIO_printf(Perl_debug_log, "  ARRAY = 0x%lx\n",(long)HvARRAY(sv));
-       PerlIO_printf(Perl_debug_log, "  KEYS = %ld\n", (long)HvKEYS(sv));
-       PerlIO_printf(Perl_debug_log, "  FILL = %ld\n", (long)HvFILL(sv));
-       PerlIO_printf(Perl_debug_log, "  MAX = %ld\n", (long)HvMAX(sv));
-       PerlIO_printf(Perl_debug_log, "  RITER = %ld\n", (long)HvRITER(sv));
-       PerlIO_printf(Perl_debug_log, "  EITER = 0x%lx\n",(long) HvEITER(sv));
-       if (HvPMROOT(sv))
-           PerlIO_printf(Perl_debug_log, "  PMROOT = 0x%lx\n",(long)HvPMROOT(sv));
-       if (HvNAME(sv))
-           PerlIO_printf(Perl_debug_log, "  NAME = \"%s\"\n", HvNAME(sv));
-       break;
-    case SVt_PVCV:
-       if (SvPOK(sv))
-           PerlIO_printf(Perl_debug_log, "  PROTOTYPE = \"%s\"\n", SvPV(sv,PL_na));
-       /* FALL THROUGH */
-    case SVt_PVFM:
-       PerlIO_printf(Perl_debug_log, "  STASH = 0x%lx\n", (long)CvSTASH(sv));
-       PerlIO_printf(Perl_debug_log, "  START = 0x%lx\n", (long)CvSTART(sv));
-       PerlIO_printf(Perl_debug_log, "  ROOT = 0x%lx\n", (long)CvROOT(sv));
-       PerlIO_printf(Perl_debug_log, "  XSUB = 0x%lx\n", (long)CvXSUB(sv));
-       PerlIO_printf(Perl_debug_log, "  XSUBANY = %ld\n", (long)CvXSUBANY(sv).any_i32);
-       PerlIO_printf(Perl_debug_log, "  GV = 0x%lx", (long)CvGV(sv));
-       if (CvGV(sv) && GvNAME(CvGV(sv))) {
-           PerlIO_printf(Perl_debug_log, "  \"%s\"\n", GvNAME(CvGV(sv)));
-       } else {
-           PerlIO_printf(Perl_debug_log, "\n");
-       }
-       PerlIO_printf(Perl_debug_log, "  FILEGV = 0x%lx\n", (long)CvFILEGV(sv));
-       PerlIO_printf(Perl_debug_log, "  DEPTH = %ld\n", (long)CvDEPTH(sv));
-       PerlIO_printf(Perl_debug_log, "  PADLIST = 0x%lx\n", (long)CvPADLIST(sv));
-       PerlIO_printf(Perl_debug_log, "  OUTSIDE = 0x%lx\n", (long)CvOUTSIDE(sv));
-#ifdef USE_THREADS
-       PerlIO_printf(Perl_debug_log, "  MUTEXP = 0x%lx\n", (long)CvMUTEXP(sv));
-       PerlIO_printf(Perl_debug_log, "  OWNER = 0x%lx\n", (long)CvOWNER(sv));
-#endif /* USE_THREADS */
-       PerlIO_printf(Perl_debug_log, "  FLAGS = 0x%lx\n",
-                     (unsigned long)CvFLAGS(sv));
-       if (type == SVt_PVFM)
-           PerlIO_printf(Perl_debug_log, "  LINES = %ld\n", (long)FmLINES(sv));
-       break;
-    case SVt_PVGV:
-       PerlIO_printf(Perl_debug_log, "  NAME = \"%s\"\n", GvNAME(sv));
-       PerlIO_printf(Perl_debug_log, "  NAMELEN = %ld\n", (long)GvNAMELEN(sv));
-       PerlIO_printf(Perl_debug_log, "  STASH = \"%s\"\n",
-           SvTYPE(GvSTASH(sv)) == SVt_PVHV ? HvNAME(GvSTASH(sv)) : "(deleted)");
-       PerlIO_printf(Perl_debug_log, "  GP = 0x%lx\n", (long)GvGP(sv));
-       PerlIO_printf(Perl_debug_log, "    SV = 0x%lx\n", (long)GvSV(sv));
-       PerlIO_printf(Perl_debug_log, "    REFCNT = %ld\n", (long)GvREFCNT(sv));
-       PerlIO_printf(Perl_debug_log, "    IO = 0x%lx\n", (long)GvIOp(sv));
-       PerlIO_printf(Perl_debug_log, "    FORM = 0x%lx\n", (long)GvFORM(sv));
-       PerlIO_printf(Perl_debug_log, "    AV = 0x%lx\n", (long)GvAV(sv));
-       PerlIO_printf(Perl_debug_log, "    HV = 0x%lx\n", (long)GvHV(sv));
-       PerlIO_printf(Perl_debug_log, "    CV = 0x%lx\n", (long)GvCV(sv));
-       PerlIO_printf(Perl_debug_log, "    CVGEN = 0x%lx\n", (long)GvCVGEN(sv));
-       PerlIO_printf(Perl_debug_log, "    LASTEXPR = %ld\n", (long)GvLASTEXPR(sv));
-       PerlIO_printf(Perl_debug_log, "    LINE = %ld\n", (long)GvLINE(sv));
-       PerlIO_printf(Perl_debug_log, "    FILEGV = 0x%lx\n", (long)GvFILEGV(sv));
-       PerlIO_printf(Perl_debug_log, "    EGV = 0x%lx\n", (long)GvEGV(sv));
-       break;
-    case SVt_PVIO:
-       PerlIO_printf(Perl_debug_log, "  IFP = 0x%lx\n", (long)IoIFP(sv));
-       PerlIO_printf(Perl_debug_log, "  OFP = 0x%lx\n", (long)IoOFP(sv));
-       PerlIO_printf(Perl_debug_log, "  DIRP = 0x%lx\n", (long)IoDIRP(sv));
-       PerlIO_printf(Perl_debug_log, "  LINES = %ld\n", (long)IoLINES(sv));
-       PerlIO_printf(Perl_debug_log, "  PAGE = %ld\n", (long)IoPAGE(sv));
-       PerlIO_printf(Perl_debug_log, "  PAGE_LEN = %ld\n", (long)IoPAGE_LEN(sv));
-       PerlIO_printf(Perl_debug_log, "  LINES_LEFT = %ld\n", (long)IoLINES_LEFT(sv));
-       PerlIO_printf(Perl_debug_log, "  TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
-       PerlIO_printf(Perl_debug_log, "  TOP_GV = 0x%lx\n", (long)IoTOP_GV(sv));
-       PerlIO_printf(Perl_debug_log, "  FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
-       PerlIO_printf(Perl_debug_log, "  FMT_GV = 0x%lx\n", (long)IoFMT_GV(sv));
-       PerlIO_printf(Perl_debug_log, "  BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
-       PerlIO_printf(Perl_debug_log, "  BOTTOM_GV = 0x%lx\n", (long)IoBOTTOM_GV(sv));
-       PerlIO_printf(Perl_debug_log, "  SUBPROCESS = %ld\n", (long)IoSUBPROCESS(sv));
-       PerlIO_printf(Perl_debug_log, "  TYPE = %c\n", IoTYPE(sv));
-       PerlIO_printf(Perl_debug_log, "  FLAGS = 0x%lx\n", (long)IoFLAGS(sv));
-       break;
-    }
-#endif /* DEBUGGING */
-}