Zero entries were skipped, fix from Adrian Goalby
[p5sagit/p5-mst-13.2.git] / dump.c
diff --git a/dump.c b/dump.c
index 569dc8c..1570a91 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -370,7 +370,6 @@ void
 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, OP *o)
 {
     dTHR;
-    STRLEN n_a;
     Perl_dump_indent(aTHX_ level, file, "{\n");
     level++;
     if (o->op_seq)
@@ -430,9 +429,15 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, OP *o)
     }
     if (o->op_private) {
        SV *tmpsv = newSVpvn("", 0);
+       if (PL_opargs[o->op_type] & OA_TARGLEX) {
+           if (o->op_private & OPpTARGET_MY)
+               sv_catpv(tmpsv, ",TARGET_MY");
+       }
        if (o->op_type == OP_AASSIGN) {
            if (o->op_private & OPpASSIGN_COMMON)
                sv_catpv(tmpsv, ",COMMON");
+           if (o->op_private & OPpASSIGN_HASH)
+               sv_catpv(tmpsv, ",HASH");
        }
        else if (o->op_type == OP_SASSIGN) {
            if (o->op_private & OPpASSIGN_BACKWARDS)
@@ -522,6 +527,7 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, OP *o)
 #else
        if (cSVOPo->op_sv) {
            SV *tmpsv = NEWSV(0,0);
+           STRLEN n_a;
            ENTER;
            SAVEFREESV(tmpsv);
            gv_fullname3(tmpsv, (GV*)cSVOPo->op_sv, Nullch);
@@ -533,8 +539,6 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, OP *o)
 #endif
        break;
     case OP_CONST:
-       Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cSVOPo_sv));
-       break;
     case OP_METHOD_NAMED:
        Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cSVOPo->op_sv));
        break;
@@ -765,7 +769,7 @@ void
 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
 {
     dTHR;
-    SV *d = sv_newmortal();
+    SV *d;
     char *s;
     U32 flags;
     U32 type;
@@ -779,7 +783,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
     flags = SvFLAGS(sv);
     type = SvTYPE(sv);
 
-    Perl_sv_setpvf(aTHX_ d,
+    d = Perl_newSVpvf(aTHX_
                   "(0x%"UVxf") at 0x%"UVxf"\n%*s  REFCNT = %"IVdf"\n%*s  FLAGS = (",
                   PTR2UV(SvANY(sv)), PTR2UV(sv),
                   (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
@@ -863,6 +867,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
     switch (type) {
     case SVt_NULL:
        PerlIO_printf(file, "NULL%s\n", s);
+       SvREFCNT_dec(d);
        return;
     case SVt_IV:
        PerlIO_printf(file, "IV%s\n", s);
@@ -911,6 +916,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
        break;
     default:
        PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
+       SvREFCNT_dec(d);
        return;
     }
     if (type >= SVt_PVIV || type == SVt_IV) {
@@ -936,10 +942,13 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
        Perl_dump_indent(aTHX_ level, file, "  RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
        if (nest < maxnest)
            do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
+       SvREFCNT_dec(d);
        return;
     }
-    if (type < SVt_PV)
+    if (type < SVt_PV) {
+       SvREFCNT_dec(d);
        return;
+    }
     if (type <= SVt_PVLV) {
        if (SvPVX(sv)) {
            Perl_dump_indent(aTHX_ level, file,"  PV = 0x%"UVxf" ", PTR2UV(SvPVX(sv)));
@@ -1032,7 +1041,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
            for (i = max; i > 0; i--) { /* Precision: count down. */
                sum += freq[i] * i * i;
             }
-           while (keys = keys >> 1)
+           while ((keys = keys >> 1))
                pow2 = pow2 << 1;
            /* Approximate by Poisson distribution */
            theoret = HvKEYS(sv);
@@ -1174,6 +1183,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
        Perl_dump_indent(aTHX_ level, file, "  FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
        break;
     }
+    SvREFCNT_dec(d);
 }
 
 void