From: Nicholas Clark Date: Thu, 20 Nov 2003 22:34:00 +0000 (+0000) Subject: Shift negative klen/flags games from hv_fetch_common out to hv_fetch X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=c1fe551028de847f28ddfe87585b2903d87ab037;p=p5sagit%2Fp5-mst-13.2.git Shift negative klen/flags games from hv_fetch_common out to hv_fetch p4raw-id: //depot/perl@21760 --- diff --git a/embed.fnc b/embed.fnc index ce814e3..ee667f2 100644 --- a/embed.fnc +++ b/embed.fnc @@ -1396,7 +1396,7 @@ Apod |void |hv_assert |HV* tb #if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT) sM |SV* |hv_delete_common|HV* tb|SV* key_sv|const char* key|I32 klen|I32 flags|U32 hash sM |bool |hv_exists_common|HV* tb|SV* key_sv|const char* key|I32 klen|U32 hash -sM |HE* |hv_fetch_common|HV* tb|SV* key_sv|const char* key|I32 klen|int flags|int action|U32 hash +sM |HE* |hv_fetch_common|HV* tb|SV* key_sv|const char* key|STRLEN klen|int flags|int action|U32 hash sM |HE* |hv_store_common|HV* tb|SV* key_sv|const char* key|I32 klen|int flags|SV* val|U32 hash #endif diff --git a/hv.c b/hv.c index ece146d..8c345c7 100644 --- a/hv.c +++ b/hv.c @@ -186,11 +186,21 @@ information on how to use this function on tied hashes. #define HV_FETCH_JUST_SV 0x02 SV** -Perl_hv_fetch(pTHX_ HV *hv, const char *key, I32 klen, I32 lval) +Perl_hv_fetch(pTHX_ HV *hv, const char *key, I32 klen_i32, I32 lval) { - HE *hek = hv_fetch_common (hv, NULL, key, klen, 0, - HV_FETCH_JUST_SV | (lval ? HV_FETCH_LVALUE : 0), - 0); + HE *hek; + STRLEN klen; + int flags; + + if (klen_i32 < 0) { + klen = -klen_i32; + flags = HVhek_UTF8; + } else { + klen = klen_i32; + flags = 0; + } + hek = hv_fetch_common (hv, NULL, key, klen, flags, + HV_FETCH_JUST_SV | (lval ? HV_FETCH_LVALUE : 0), 0); return hek ? &HeVAL(hek) : NULL; } @@ -221,11 +231,10 @@ Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, register U32 hash) } HE * -S_hv_fetch_common(pTHX_ HV *hv, SV *keysv, const char *key, I32 klen_i32, +S_hv_fetch_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, int flags, int action, register U32 hash) { register XPVHV* xhv; - STRLEN klen; register HE *entry; SV *sv; bool is_utf8; @@ -237,15 +246,10 @@ S_hv_fetch_common(pTHX_ HV *hv, SV *keysv, const char *key, I32 klen_i32, if (keysv) { key = SvPV(keysv, klen); + flags = 0; is_utf8 = (SvUTF8(keysv) != 0); } else { - if (klen_i32 < 0) { - klen = -klen_i32; - is_utf8 = TRUE; - } else { - klen = klen_i32; - is_utf8 = FALSE; - } + is_utf8 = ((flags & HVhek_UTF8) ? TRUE : FALSE); } keysave = key; @@ -334,7 +338,9 @@ S_hv_fetch_common(pTHX_ HV *hv, SV *keysv, const char *key, I32 klen_i32, int oldflags = flags; key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8); if (is_utf8) - flags = HVhek_UTF8; + flags |= HVhek_UTF8; + else + flags &= ~HVhek_UTF8; if (key != keysave) flags |= HVhek_WASUTF8 | HVhek_FREEKEY; if (oldflags & HVhek_FREEKEY) diff --git a/proto.h b/proto.h index fc50181..ea5219a 100644 --- a/proto.h +++ b/proto.h @@ -1337,7 +1337,7 @@ PERL_CALLCONV void Perl_hv_assert(pTHX_ HV* tb); #if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT) STATIC SV* S_hv_delete_common(pTHX_ HV* tb, SV* key_sv, const char* key, I32 klen, I32 flags, U32 hash); STATIC bool S_hv_exists_common(pTHX_ HV* tb, SV* key_sv, const char* key, I32 klen, U32 hash); -STATIC HE* S_hv_fetch_common(pTHX_ HV* tb, SV* key_sv, const char* key, I32 klen, int flags, int action, U32 hash); +STATIC HE* S_hv_fetch_common(pTHX_ HV* tb, SV* key_sv, const char* key, STRLEN klen, int flags, int action, U32 hash); STATIC HE* S_hv_store_common(pTHX_ HV* tb, SV* key_sv, const char* key, I32 klen, int flags, SV* val, U32 hash); #endif