From e1a7ec8d453649a65aea34af90c3042a5137191e Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Sun, 24 Mar 2013 11:48:12 +0100 Subject: [PATCH] improve how Devel::Peek::Dump handles iterator information * 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 | 12 ++++++++++-- ext/Devel-Peek/t/Peek.t | 17 +++++------------ hv.h | 3 +++ 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/dump.c b/dump.c index fcc63fc..dd0e305 100644 --- 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) { diff --git a/ext/Devel-Peek/t/Peek.t b/ext/Devel-Peek/t/Peek.t index 912bf8c..1debcb5 100644 --- a/ext/Devel-Peek/t/Peek.t +++ b/ext/Devel-Peek/t/Peek.t @@ -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 --- a/hv.h +++ b/hv.h @@ -226,6 +226,9 @@ C. #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) -- 2.7.4