X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=hv.c;h=032f4c2b4f602cbf38d1a2cf84753419a3862383;hb=dfa4e5d386dd8c5329351699b02085856cdd140e;hp=79702fd98e462fb87647691d692a6a319ae01863;hpb=e1a479c5e0c08fb10925261f03573261c69ca0dc;p=p5sagit%2Fp5-mst-13.2.git diff --git a/hv.c b/hv.c index 79702fd..032f4c2 100644 --- a/hv.c +++ b/hv.c @@ -40,12 +40,9 @@ STATIC void S_more_he(pTHX) { dVAR; - HE* he; - HE* heend; - - he = (HE*) Perl_get_arena(aTHX_ PERL_ARENA_SIZE, HE_SVSLOT); + HE* he = (HE*) Perl_get_arena(aTHX_ PERL_ARENA_SIZE, HE_SVSLOT); + HE * const heend = &he[PERL_ARENA_SIZE / sizeof(HE) - 1]; - heend = &he[PERL_ARENA_SIZE / sizeof(HE) - 1]; PL_body_roots[HE_SVSLOT] = he; while (he < heend) { HeNEXT(he) = (HE*)(he + 1); @@ -216,11 +213,6 @@ S_hv_notallowed(pTHX_ int flags, const char *key, I32 klen, /* (klen == HEf_SVKEY) is special for MAGICAL hv entries, meaning key slot * contains an SV* */ -#define HV_FETCH_ISSTORE 0x01 -#define HV_FETCH_ISEXISTS 0x02 -#define HV_FETCH_LVALUE 0x04 -#define HV_FETCH_JUST_SV 0x08 - /* =for apidoc hv_store @@ -963,7 +955,7 @@ S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, if (keysv) { if (SvSMAGICAL(hv) && SvGMAGICAL(hv)) - keysv = hv_magic_uvar_xkey(hv, keysv, -1); + keysv = hv_magic_uvar_xkey(hv, keysv, HV_DELETE); if (k_flags & HVhek_FREEKEY) Safefree(key); key = SvPV_const(keysv, klen); @@ -1129,7 +1121,7 @@ STATIC void S_hsplit(pTHX_ HV *hv) { dVAR; - register XPVHV* xhv = (XPVHV*)SvANY(hv); + register XPVHV* const xhv = (XPVHV*)SvANY(hv); const I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */ register I32 newsize = oldsize * 2; register I32 i; @@ -1613,6 +1605,8 @@ Perl_hv_clear(pTHX_ HV *hv) HvREHASH_off(hv); reset: if (SvOOK(hv)) { + if(HvNAME_get(hv)) + mro_isa_changed_in(hv); HvEITER_set(hv, NULL); } } @@ -1761,7 +1755,6 @@ S_hfreeentries(pTHX_ HV *hv) if((meta = iter->xhv_mro_meta)) { if(meta->mro_linear_dfs) SvREFCNT_dec(meta->mro_linear_dfs); if(meta->mro_linear_c3) SvREFCNT_dec(meta->mro_linear_c3); - if(meta->mro_isarev) SvREFCNT_dec(meta->mro_isarev); if(meta->mro_nextmethod) SvREFCNT_dec(meta->mro_nextmethod); Safefree(meta); iter->xhv_mro_meta = NULL; @@ -1850,8 +1843,12 @@ Perl_hv_undef(pTHX_ HV *hv) return; DEBUG_A(Perl_hv_assert(aTHX_ hv)); xhv = (XPVHV*)SvANY(hv); + + if ((name = HvNAME_get(hv)) && !PL_dirty) + mro_isa_changed_in(hv); + hfreeentries(hv); - if ((name = HvNAME_get(hv))) { + if (name) { if(PL_stashcache) hv_delete(PL_stashcache, name, HvNAMELEN_get(hv), G_DISCARD); hv_name_set(hv, NULL, 0, 0);