diff options
author | Nicholas Clark <nick@ccl4.org> | 2003-11-01 14:38:22 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2003-11-01 14:38:22 +0000 |
commit | cdeba5a71c8f7df583f01fd11d8f579fdd77a4f5 (patch) | |
tree | f573d648c6beb3e1ee396acff70033e6cd31954e | |
parent | 28b33b3b968993bb6b291960f16c7d0ebea56aa3 (diff) | |
download | perl-cdeba5a71c8f7df583f01fd11d8f579fdd77a4f5.tar.gz |
Integrate:
[ 21604]
Add Internals::HvREHASH to expose the rehashing flag
t/op/hash.t tests that pathological data triggers rehashing
p4raw-link: @21604 on //depot/perl: 05619474c45b1f1e16eb70c1d9f8b991a7ad459a
p4raw-id: //depot/maint-5.8/perl@21605
p4raw-branched: from //depot/perl@21603 'branch in' t/op/hash.t
p4raw-integrated: from //depot/perl@21603 'merge in' universal.c
(@21441..)
-rw-r--r-- | t/op/hash.t | 27 | ||||
-rw-r--r-- | universal.c | 16 |
2 files changed, 43 insertions, 0 deletions
diff --git a/t/op/hash.t b/t/op/hash.t new file mode 100644 index 0000000000..3beae8432a --- /dev/null +++ b/t/op/hash.t @@ -0,0 +1,27 @@ +#!./perl -w + +BEGIN { + chdir 't' if -d 't'; + @INC = '../lib'; + require './test.pl'; +} + +use strict; + +plan tests => 3; + +my %h; + +ok (!Internals::HvREHASH(%h), "hash doesn't start with rehash flag on"); + +foreach (1..10) { + $h{"\0"x$_}++; +} + +ok (!Internals::HvREHASH(%h), "10 entries doesn't trigger rehash"); + +foreach (11..20) { + $h{"\0"x$_}++; +} + +ok (Internals::HvREHASH(%h), "20 entries triggers rehash"); diff --git a/universal.c b/universal.c index ab3fd1ccf9..96f4906206 100644 --- a/universal.c +++ b/universal.c @@ -181,6 +181,7 @@ XS(XS_Internals_hv_clear_placehold); XS(XS_PerlIO_get_layers); XS(XS_Regexp_DESTROY); XS(XS_Internals_hash_seed); +XS(XS_Internals_HvREHASH); void Perl_boot_core_UNIVERSAL(pTHX) @@ -206,6 +207,7 @@ Perl_boot_core_UNIVERSAL(pTHX) XS_PerlIO_get_layers, file, "*;@"); newXS("Regexp::DESTROY", XS_Regexp_DESTROY, file); newXSproto("Internals::hash_seed",XS_Internals_hash_seed, file, ""); + newXSproto("Internals::HvREHASH", XS_Internals_HvREHASH, file, "\\%"); } @@ -726,3 +728,17 @@ XS(XS_Internals_hash_seed) XSRETURN_UV(PERL_HASH_SEED); } +XS(XS_Internals_HvREHASH) /* Subject to change */ +{ + dXSARGS; + if (SvROK(ST(0))) { + HV *hv = (HV *) SvRV(ST(0)); + if (items == 1 && SvTYPE(hv) == SVt_PVHV) { + if (HvREHASH(hv)) + XSRETURN_YES; + else + XSRETURN_NO; + } + } + Perl_croak(aTHX_ "Internals::HvREHASH $hashref"); +} |