summaryrefslogtreecommitdiff
path: root/hv.c
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2003-06-28 17:30:52 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2003-06-28 17:30:52 +0000
commit3a676441c258924612d07e12c0faa7606e5bbba2 (patch)
tree76a05d1702e8fc8eab61ad8fa5787dbcb7314435 /hv.c
parent2275acdc2a5e9bfc8338ccf52a5a82e52653b1b0 (diff)
downloadperl-3a676441c258924612d07e12c0faa7606e5bbba2.tar.gz
Retract #19867; the bug was really much simpler:
the < max must be <= max instead. p4raw-id: //depot/perl@19874
Diffstat (limited to 'hv.c')
-rw-r--r--hv.c36
1 files changed, 17 insertions, 19 deletions
diff --git a/hv.c b/hv.c
index 6f6eca1b33..0bbebc6aeb 100644
--- a/hv.c
+++ b/hv.c
@@ -1707,27 +1707,25 @@ Perl_hv_clear(pTHX_ HV *hv)
if (SvREADONLY(hv)) {
/* restricted hash: convert all keys to placeholders */
- HE* he;
-
- hv_iterinit(hv);
- while ((he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))) {
- SV *val;
-
- val = hv_iterval(hv, he);
- if (val != &PL_sv_undef) { /* not already placeholder */
- if (val && SvREADONLY(val)) {
- SV* keysv = hv_iterkeysv(he);
-
- Perl_croak(aTHX_
- "Attempt to delete readonly key '%"SVf"' from a restricted hash",
- keysv);
- }
- SvREFCNT_dec(val);
- HeVAL(he) = &PL_sv_undef;
- xhv->xhv_placeholders++; /* HvPLACEHOLDERS(hv)++ */
+ I32 i;
+ HE* entry;
+ for (i = 0; i <= (I32) xhv->xhv_max; i++) {
+ entry = ((HE**)xhv->xhv_array)[i];
+ for (; entry; entry = HeNEXT(entry)) {
+ /* not already placeholder */
+ if (HeVAL(entry) != &PL_sv_undef) {
+ if (HeVAL(entry) && SvREADONLY(HeVAL(entry))) {
+ SV* keysv = hv_iterkeysv(entry);
+ Perl_croak(aTHX_
+ "Attempt to delete readonly key '%"SVf"' from a restricted hash",
+ keysv);
+ }
+ SvREFCNT_dec(HeVAL(entry));
+ HeVAL(entry) = &PL_sv_undef;
+ xhv->xhv_placeholders++; /* HvPLACEHOLDERS(hv)++ */
+ }
}
}
- hv_iterinit(hv);
return;
}