diff options
author | David Mitchell <davem@iabyn.com> | 2011-04-28 16:33:35 +0100 |
---|---|---|
committer | David Mitchell <davem@iabyn.com> | 2011-05-19 14:49:42 +0100 |
commit | f8d50d94322d5861315980980d36590a8caca5c6 (patch) | |
tree | 94fd91f4f0dae3deaeae0e6e34dcd79dcad2c0cc /hv.c | |
parent | afbbf215a9f8470ac637c1eddc1d4f0eaa8ab090 (diff) | |
download | perl-f8d50d94322d5861315980980d36590a8caca5c6.tar.gz |
unify PERL_HASH and PERL_HASH_INTERNAL
Those two macros expand into two large, almost identical chunks of code.
The only difference between the two is the source of the hash seed.
So parameterize this into a new PERL_HASH_INTERNAL_() macro.
Also, there are a couple of places in hv.c that do the rough equivalent of
if (HvREHASH(hv))
key = PERL_HASH_INTERNAL(...)
else
key = PERL_HASH(...)
which incorporates two complete macro expansions into the code.
Reorganise them to be
key = PERL_HASH_INTERNAL_(..., HvREHASH(hv))
Diffstat (limited to 'hv.c')
-rw-r--r-- | hv.c | 38 |
1 files changed, 15 insertions, 23 deletions
@@ -604,21 +604,18 @@ Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, } } - if (HvREHASH(hv)) { - PERL_HASH_INTERNAL(hash, key, klen); - /* We don't have a pointer to the hv, so we have to replicate the - flag into every HEK, so that hv_iterkeysv can see it. */ - /* And yes, you do need this even though you are not "storing" because - you can flip the flags below if doing an lval lookup. (And that - was put in to give the semantics Andreas was expecting.) */ + if (HvREHASH(hv) || (!hash && !(keysv && (SvIsCOW_shared_hash(keysv))))) + PERL_HASH_INTERNAL_(hash, key, klen, HvREHASH(hv)); + else if (!hash) + hash = SvSHARED_HASH(keysv); + + /* We don't have a pointer to the hv, so we have to replicate the + flag into every HEK, so that hv_iterkeysv can see it. + And yes, you do need this even though you are not "storing" because + you can flip the flags below if doing an lval lookup. (And that + was put in to give the semantics Andreas was expecting.) */ + if (HvREHASH(hv)) flags |= HVhek_REHASH; - } else if (!hash) { - if (keysv && (SvIsCOW_shared_hash(keysv))) { - hash = SvSHARED_HASH(keysv); - } else { - PERL_HASH(hash, key, klen); - } - } masked_flags = (flags & HVhek_MASK); @@ -970,15 +967,10 @@ S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, HvHASKFLAGS_on(MUTABLE_SV(hv)); } - if (HvREHASH(hv)) { - PERL_HASH_INTERNAL(hash, key, klen); - } else if (!hash) { - if (keysv && (SvIsCOW_shared_hash(keysv))) { - hash = SvSHARED_HASH(keysv); - } else { - PERL_HASH(hash, key, klen); - } - } + if (HvREHASH(hv) || (!hash && !(keysv && (SvIsCOW_shared_hash(keysv))))) + PERL_HASH_INTERNAL_(hash, key, klen, HvREHASH(hv)); + else if (!hash) + hash = SvSHARED_HASH(keysv); masked_flags = (k_flags & HVhek_MASK); |