summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2003-11-01 14:38:22 +0000
committerNicholas Clark <nick@ccl4.org>2003-11-01 14:38:22 +0000
commitcdeba5a71c8f7df583f01fd11d8f579fdd77a4f5 (patch)
treef573d648c6beb3e1ee396acff70033e6cd31954e
parent28b33b3b968993bb6b291960f16c7d0ebea56aa3 (diff)
downloadperl-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.t27
-rw-r--r--universal.c16
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");
+}