improve how Devel::Peek::Dump handles iterator information
authorYves Orton <demerphq@gmail.com>
Sun, 24 Mar 2013 10:48:12 +0000 (11:48 +0100)
committerYves Orton <demerphq@gmail.com>
Sun, 24 Mar 2013 10:50:18 +0000 (11:50 +0100)
* If the hash is not OOK omit any iterator status information
  instead of showing -1/NULL
* If the hash is OOK then add the RAND value from the iterator
  and if the LASTRAND is not the same show it too
* Tweak tests to test the above.

dump.c
ext/Devel-Peek/t/Peek.t
hv.h

diff --git a/dump.c b/dump.c
index fcc63fc..dd0e305 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -1801,8 +1801,16 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
        Perl_dump_indent(aTHX_ level, file, "  KEYS = %"IVdf"\n", (IV)HvUSEDKEYS(sv));
        Perl_dump_indent(aTHX_ level, file, "  FILL = %"IVdf"\n", (IV)HvFILL(sv));
        Perl_dump_indent(aTHX_ level, file, "  MAX = %"IVdf"\n", (IV)HvMAX(sv));
-       Perl_dump_indent(aTHX_ level, file, "  RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
-       Perl_dump_indent(aTHX_ level, file, "  EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
+        if (SvOOK(sv)) {
+           Perl_dump_indent(aTHX_ level, file, "  RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
+           Perl_dump_indent(aTHX_ level, file, "  EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
+           Perl_dump_indent(aTHX_ level, file, "  RAND = 0x%"UVxf, (UV)HvRAND_get(sv));
+            if (HvRAND_get(sv) != HvLASTRAND_get(sv) && HvRITER_get(sv) != -1 ) {
+               PerlIO_printf(file, " (LAST = 0x%"UVxf")\n", (UV)HvLASTRAND_get(sv));
+            } else {
+               PerlIO_putc(file, '\n');
+            }
+        }
        {
            MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
            if (mg && mg->mg_obj) {
index 912bf8c..1debcb5 100644 (file)
@@ -250,8 +250,6 @@ do_test('reference to hash',
     KEYS = 1
     FILL = 1
     MAX = 7
-    RITER = -1
-    EITER = 0x0
     Elt "123" HASH = $ADDR' . $c_pattern,
        '',
        $] > 5.009 && $] < 5.015
@@ -400,9 +398,7 @@ do_test('reference to blessed hash',
     ARRAY = 0x0
     KEYS = 0
     FILL = 0
-    MAX = 7
-    RITER = -1
-    EITER = 0x0', '',
+    MAX = 7', '',
        $] > 5.009
        ? $] >= 5.015
             ? 0
@@ -477,8 +473,6 @@ do_test('reference to hash containing Unicode',
     KEYS = 1
     FILL = 1
     MAX = 7
-    RITER = -1
-    EITER = $ADDR
     Elt "\\\214\\\101" \[UTF8 "\\\x\{100\}"\] HASH = $ADDR
     SV = PV\\($ADDR\\) at $ADDR
       REFCNT = 1
@@ -508,8 +502,6 @@ do_test('reference to hash containing Unicode',
     KEYS = 1
     FILL = 1
     MAX = 7
-    RITER = -1
-    EITER = $ADDR
     Elt "\\\304\\\200" \[UTF8 "\\\x\{100\}"\] HASH = $ADDR
     SV = PV\\($ADDR\\) at $ADDR
       REFCNT = 1
@@ -723,9 +715,7 @@ do_test('blessing to a class with embedded NUL characters',
     ARRAY = $ADDR
     KEYS = 0
     FILL = 0
-    MAX = 7
-    RITER = -1
-    EITER = 0x0', '',
+    MAX = 7', '',
        $] > 5.009
        ? $] >= 5.015
            ?  0
@@ -749,6 +739,7 @@ do_test('ENAME on a stash',
     MAX = 7
     RITER = -1
     EITER = 0x0
+    RAND = $ADDR
     NAME = "RWOM"
     ENAME = "RWOM"                             # $] > 5.012
 ');
@@ -772,6 +763,7 @@ do_test('ENAMEs on a stash',
     MAX = 7
     RITER = -1
     EITER = 0x0
+    RAND = $ADDR
     NAME = "RWOM"
     NAMECOUNT = 2                              # $] > 5.012
     ENAME = "RWOM", "KLANK"                    # $] > 5.012
@@ -797,6 +789,7 @@ do_test('ENAMEs on a stash with no NAME',
     MAX = 7
     RITER = -1
     EITER = 0x0
+    RAND = $ADDR
     NAMECOUNT = -3                             # $] > 5.012
     ENAME = "RWOM", "KLANK"                    # $] > 5.012
 ');
diff --git a/hv.h b/hv.h
index e6b9bb8..61bc5bd 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -226,6 +226,9 @@ C<SV*>.
 #define HvEITER_set(hv,e)      Perl_hv_eiter_set(aTHX_ MUTABLE_HV(hv), e)
 #define HvRITER_get(hv)        (SvOOK(hv) ? HvAUX(hv)->xhv_riter : -1)
 #define HvEITER_get(hv)        (SvOOK(hv) ? HvAUX(hv)->xhv_eiter : NULL)
+#define HvRAND_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_rand : 0)
+#define HvLASTRAND_get(hv)     (SvOOK(hv) ? HvAUX(hv)->xhv_last_rand : 0)
+
 #define HvNAME(hv)     HvNAME_get(hv)
 #define HvNAMELEN(hv)   HvNAMELEN_get(hv)
 #define HvENAME(hv)    HvENAME_get(hv)