diff options
author | Alan Burlison <Alan.Burlison@uk.sun.com> | 2003-11-20 10:34:30 +0000 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2003-11-20 12:04:46 +0000 |
commit | 3540d4cee8e95432ee25b1c5b90430e9473f2e95 (patch) | |
tree | a889cfa37f37207490972888ed020784c590f535 /universal.c | |
parent | 2baadb76de5602fd6919cac96dea41124e89d11a (diff) | |
download | perl-3540d4cee8e95432ee25b1c5b90430e9473f2e95.tar.gz |
promote hv_clear_placeholders to perl API
Message-ID: <3FBC98B6.6090909@sun.com>
p4raw-id: //depot/perl@21756
Diffstat (limited to 'universal.c')
-rw-r--r-- | universal.c | 46 |
1 files changed, 3 insertions, 43 deletions
diff --git a/universal.c b/universal.c index 83df6c5007..a6c1c41ba7 100644 --- a/universal.c +++ b/universal.c @@ -732,53 +732,13 @@ XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */ XSRETURN_UNDEF; /* Can't happen. */ } -/* Maybe this should return the number of placeholders found in scalar context, - and a list of them in list context. */ XS(XS_Internals_hv_clear_placehold) { dXSARGS; HV *hv = (HV *) SvRV(ST(0)); - - /* I don't care how many parameters were passed in, but I want to avoid - the unused variable warning. */ - - items = (I32)HvPLACEHOLDERS(hv); - - if (items) { - HE *entry; - I32 riter = HvRITER(hv); - HE *eiter = HvEITER(hv); - hv_iterinit(hv); - /* This may look suboptimal with the items *after* the iternext, but - it's quite deliberate. We only get here with items==0 if we've - just deleted the last placeholder in the hash. If we've just done - that then it means that the hash is in lazy delete mode, and the - HE is now only referenced in our iterator. If we just quit the loop - and discarded our iterator then the HE leaks. So we do the && the - other way to ensure iternext is called just one more time, which - has the side effect of triggering the lazy delete. */ - while ((entry = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS)) - && items) { - SV *val = hv_iterval(hv, entry); - - if (val == &PL_sv_placeholder) { - - /* It seems that I have to go back in the front of the hash - API to delete a hash, even though I have a HE structure - pointing to the very entry I want to delete, and could hold - onto the previous HE that points to it. And it's easier to - go in with SVs as I can then specify the precomputed hash, - and don't have fun and games with utf8 keys. */ - SV *key = hv_iterkeysv(entry); - - hv_delete_ent (hv, key, G_DISCARD, HeHASH(entry)); - items--; - } - } - HvRITER(hv) = riter; - HvEITER(hv) = eiter; - } - + if (items != 1) + Perl_croak(aTHX_ "Usage: UNIVERSAL::hv_clear_placeholders(hv)"); + hv_clear_placeholders(hv); XSRETURN(0); } |