X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=hv.c;h=6fd6f2f3b03b572663b318556e62c30883be6f61;hb=e91177edb0beae74fd07fb1ec08a528ab1fb63c2;hp=cd410eb1af51863c6423f12ba3fa93a849efe0c6;hpb=8c52afecd5252bed5ed8df3a63a6cd9affde4ab4;p=p5sagit%2Fp5-mst-13.2.git diff --git a/hv.c b/hv.c index cd410eb..6fd6f2f 100644 --- a/hv.c +++ b/hv.c @@ -14,12 +14,14 @@ #include "EXTERN.h" #include "perl.h" +static void hv_magic_check _((HV *hv, bool *needs_copy, bool *needs_store)); +#ifndef PERL_OBJECT static void hsplit _((HV *hv)); static void hfreeentries _((HV *hv)); -static void hv_magic_check _((HV *hv, bool *needs_copy, bool *needs_store)); static HE* more_he _((void)); +#endif -static HE* +STATIC HE* new_he(void) { HE* he; @@ -31,14 +33,14 @@ new_he(void) return more_he(); } -static void +STATIC void del_he(HE *p) { HeNEXT(p) = (HE*)he_root; he_root = p; } -static HE* +STATIC HE* more_he(void) { register HE* he; @@ -54,7 +56,7 @@ more_he(void) return new_he(); } -static HEK * +STATIC HEK * save_hek(char *str, I32 len, U32 hash) { char *k; @@ -94,8 +96,8 @@ hv_fetch(HV *hv, char *key, U32 klen, I32 lval) dTHR; sv = sv_newmortal(); mg_copy((SV*)hv, sv, key, klen); - Sv = sv; - return &Sv; + hv_fetch_sv = sv; + return &hv_fetch_sv; } #ifdef ENV_IS_CASELESS else if (mg_find((SV*)hv,'E')) { @@ -140,7 +142,7 @@ hv_fetch(HV *hv, char *key, U32 klen, I32 lval) if (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME)) { char *gotenv; - if ((gotenv = ENV_getenv(key)) != Nullch) { + if ((gotenv = PerlEnv_getenv(key)) != Nullch) { sv = newSVpv(gotenv,strlen(gotenv)); SvTAINTED_on(sv); return hv_store(hv,key,klen,sv,hash); @@ -170,19 +172,18 @@ hv_fetch_ent(HV *hv, SV *keysv, I32 lval, register U32 hash) if (SvRMAGICAL(hv)) { if (mg_find((SV*)hv,'P')) { - static HE mh; - + dTHR; sv = sv_newmortal(); keysv = sv_2mortal(newSVsv(keysv)); mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY); - if (!HeKEY_hek(&mh)) { + if (!HeKEY_hek(&hv_fetch_ent_mh)) { char *k; New(54, k, HEK_BASESIZE + sizeof(SV*), char); - HeKEY_hek(&mh) = (HEK*)k; + HeKEY_hek(&hv_fetch_ent_mh) = (HEK*)k; } - HeSVKEY_set(&mh, keysv); - HeVAL(&mh) = sv; - return &mh; + HeSVKEY_set(&hv_fetch_ent_mh, keysv); + HeVAL(&hv_fetch_ent_mh) = sv; + return &hv_fetch_ent_mh; } #ifdef ENV_IS_CASELESS else if (mg_find((SV*)hv,'E')) { @@ -232,7 +233,7 @@ hv_fetch_ent(HV *hv, SV *keysv, I32 lval, register U32 hash) if (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME)) { char *gotenv; - if ((gotenv = ENV_getenv(key)) != Nullch) { + if ((gotenv = PerlEnv_getenv(key)) != Nullch) { sv = newSVpv(gotenv,strlen(gotenv)); SvTAINTED_on(sv); return hv_store_ent(hv,keysv,sv,hash); @@ -657,7 +658,7 @@ hv_exists_ent(HV *hv, SV *keysv, U32 hash) return FALSE; } -static void +STATIC void hsplit(HV *hv) { register XPVHV* xhv = (XPVHV*)SvANY(hv); @@ -676,6 +677,10 @@ hsplit(HV *hv) nomemok = TRUE; #ifdef STRANGE_MALLOC Renew(a, newsize, HE*); + if (!a) { + nomemok = FALSE; + return; + } #else i = newsize * sizeof(HE*); #define MALLOC_OVERHEAD 16 @@ -686,6 +691,10 @@ hsplit(HV *hv) tmp /= sizeof(HE*); assert(tmp >= newsize); New(2,a, tmp, HE*); + if (!a) { + nomemok = FALSE; + return; + } Copy(xhv->xhv_array, a, oldsize, HE*); if (oldsize >= 64) { offer_nice_chunk(xhv->xhv_array, @@ -749,6 +758,10 @@ hv_ksplit(HV *hv, IV newmax) nomemok = TRUE; #ifdef STRANGE_MALLOC Renew(a, newsize, HE*); + if (!a) { + nomemok = FALSE; + return; + } #else i = newsize * sizeof(HE*); j = MALLOC_OVERHEAD; @@ -758,6 +771,10 @@ hv_ksplit(HV *hv, IV newmax) j /= sizeof(HE*); assert(j >= newsize); New(2, a, j, HE*); + if (!a) { + nomemok = FALSE; + return; + } Copy(xhv->xhv_array, a, oldsize, HE*); if (oldsize >= 64) { offer_nice_chunk(xhv->xhv_array, @@ -821,11 +838,14 @@ newHV(void) void hv_free_ent(HV *hv, register HE *entry) { + SV *val; + if (!entry) return; - if (isGV(HeVAL(entry)) && GvCVu(HeVAL(entry)) && HvNAME(hv)) + val = HeVAL(entry); + if (val && isGV(val) && GvCVu(val) && HvNAME(hv)) sub_generation++; /* may be deletion of method from stash */ - SvREFCNT_dec(HeVAL(entry)); + SvREFCNT_dec(val); if (HeKLEN(entry) == HEf_SVKEY) { SvREFCNT_dec(HeKEY_sv(entry)); Safefree(HeKEY_hek(entry)); @@ -873,7 +893,7 @@ hv_clear(HV *hv) mg_clear((SV*)hv); } -static void +STATIC void hfreeentries(HV *hv) { register HE **array; @@ -948,7 +968,7 @@ hv_iterinit(HV *hv) } xhv->xhv_riter = -1; xhv->xhv_eiter = Null(HE*); - return xhv->xhv_fill; /* should be xhv->xhv_keys? May change later */ + return xhv->xhv_keys; /* used to be xhv->xhv_fill before 5.004_65 */ } HE *