From: Nicholas Clark <nick@ccl4.org>
Date: Tue, 28 Oct 2008 22:14:26 +0000 (+0000)
Subject: Every remaining (HV *) cast in *.c
X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=85fbaab29c398adbb5b4445d3ed41e0a96364ce4;p=p5sagit%2Fp5-mst-13.2.git

Every remaining (HV *) cast in *.c

p4raw-id: //depot/perl@34629
---

diff --git a/doop.c b/doop.c
index 84816ec..ffc20a9 100644
--- a/doop.c
+++ b/doop.c
@@ -318,7 +318,7 @@ S_do_trans_simple_utf8(pTHX_ SV * const sv)
 #else
 		    (SV*)cSVOP->op_sv;
 #endif
-    HV* const  hv = (HV*)SvRV(rv);
+    HV* const  hv = MUTABLE_HV(SvRV(rv));
     SV* const * svp = hv_fetchs(hv, "NONE", FALSE);
     const UV none = svp ? SvUV(*svp) : 0x7fffffff;
     const UV extra = none + 1;
@@ -420,7 +420,7 @@ S_do_trans_count_utf8(pTHX_ SV * const sv)
 #else
 		    (SV*)cSVOP->op_sv;
 #endif
-    HV* const hv = (HV*)SvRV(rv);
+    HV* const hv = MUTABLE_HV(SvRV(rv));
     SV* const * const svp = hv_fetchs(hv, "NONE", FALSE);
     const UV none = svp ? SvUV(*svp) : 0x7fffffff;
     const UV extra = none + 1;
@@ -471,7 +471,7 @@ S_do_trans_complex_utf8(pTHX_ SV * const sv)
 #else
 		    (SV*)cSVOP->op_sv;
 #endif
-    HV * const hv = (HV*)SvRV(rv);
+    HV * const hv = MUTABLE_HV(SvRV(rv));
     SV * const *svp = hv_fetchs(hv, "NONE", FALSE);
     const UV none = svp ? SvUV(*svp) : 0x7fffffff;
     const UV extra = none + 1;
@@ -1009,7 +1009,7 @@ Perl_do_chop(pTHX_ register SV *astr, register SV *sv)
         return;
     }
     else if (SvTYPE(sv) == SVt_PVHV) {
-	HV* const hv = (HV*)sv;
+	HV* const hv = MUTABLE_HV(sv);
 	HE* entry;
         (void)hv_iterinit(hv);
         while ((entry = hv_iternext(hv)))
@@ -1095,7 +1095,7 @@ Perl_do_chomp(pTHX_ register SV *sv)
         return count;
     }
     else if (SvTYPE(sv) == SVt_PVHV) {
-	HV* const hv = (HV*)sv;
+	HV* const hv = MUTABLE_HV(sv);
 	HE* entry;
         (void)hv_iterinit(hv);
         while ((entry = hv_iternext(hv)))
@@ -1431,7 +1431,7 @@ Perl_do_kv(pTHX)
 {
     dVAR;
     dSP;
-    HV * const hv = (HV*)POPs;
+    HV * const hv = MUTABLE_HV(POPs);
     HV *keys;
     register HE *entry;
     const I32 gimme = GIMME_V;
diff --git a/dump.c b/dump.c
index e59fa21..7e48ae7 100644
--- a/dump.c
+++ b/dump.c
@@ -1753,7 +1753,8 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
 		Perl_dump_indent(aTHX_ level, file, "  NAME = \"%s\"\n", hvname);
 	}
 	if (SvOOK(sv)) {
-	    const AV * const backrefs = *Perl_hv_backreferences_p(aTHX_ (HV*)sv);
+	    const AV * const backrefs
+		= *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
 	    if (backrefs) {
 		Perl_dump_indent(aTHX_ level, file, "  BACKREFS = 0x%"UVxf"\n",
 				 PTR2UV(backrefs));
@@ -1763,7 +1764,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
 	}
 	if (nest < maxnest && !HvEITER_get(sv)) { /* Try to preserve iterator */
 	    HE *he;
-	    HV * const hv = (HV*)sv;
+	    HV * const hv = MUTABLE_HV(sv);
 	    int count = maxnest - nest;
 
 	    hv_iterinit(hv);
diff --git a/gv.c b/gv.c
index 0c8c2a5..9d37308 100644
--- a/gv.c
+++ b/gv.c
@@ -1511,7 +1511,7 @@ Perl_newIO(pTHX)
     /* unless exists($main::{FileHandle}) and defined(%main::FileHandle::) */
     if (!(iogv && GvHV(iogv) && HvARRAY(GvHV(iogv))))
       iogv = gv_fetchpvs("IO::Handle::", GV_ADD, SVt_PVHV);
-    SvSTASH_set(io, (HV*)SvREFCNT_inc(GvHV(iogv)));
+    SvSTASH_set(io, MUTABLE_HV(SvREFCNT_inc(GvHV(iogv))));
     return io;
 }
 
@@ -1922,7 +1922,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
 		   Hence we can't use SvAMAGIC_on()
 		*/
 		SvFLAGS(newref) |= SVf_AMAGIC;
-		SvSTASH_set(newref, (HV*)SvREFCNT_inc(SvSTASH(tmpRef)));
+		SvSTASH_set(newref, MUTABLE_HV(SvREFCNT_inc(SvSTASH(tmpRef))));
 		return newref;
 	     }
 	   }
diff --git a/hv.c b/hv.c
index 6418576..746e829 100644
--- a/hv.c
+++ b/hv.c
@@ -866,7 +866,7 @@ Perl_hv_scalar(pTHX_ HV *hv)
     }
 
     sv = sv_newmortal();
-    if (HvFILL((HV*)hv)) 
+    if (HvFILL((const HV *)hv)) 
         Perl_sv_setpvf(aTHX_ sv, "%ld/%ld",
                 (long)HvFILL(hv), (long)HvMAX(hv) + 1);
     else
diff --git a/mathoms.c b/mathoms.c
index 9761488..de032fe 100644
--- a/mathoms.c
+++ b/mathoms.c
@@ -1455,7 +1455,7 @@ Perl_newAV(pTHX)
 HV *
 Perl_newHV(pTHX)
 {
-    HV * const hv = (HV*)newSV_type(SVt_PVHV);
+    HV * const hv = MUTABLE_HV(newSV_type(SVt_PVHV));
     assert(!SvOK(hv));
 
     return hv;
diff --git a/mg.c b/mg.c
index 643ec7e..e302e0f 100644
--- a/mg.c
+++ b/mg.c
@@ -1197,11 +1197,11 @@ Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
     if (PL_localizing) {
 	HE* entry;
 	my_clearenv();
-	hv_iterinit((HV*)sv);
-	while ((entry = hv_iternext((HV*)sv))) {
+	hv_iterinit(MUTABLE_HV(sv));
+	while ((entry = hv_iternext(MUTABLE_HV(sv)))) {
 	    I32 keylen;
 	    my_setenv(hv_iterkey(entry, &keylen),
-		      SvPV_nolen_const(hv_iterval((HV*)sv, entry)));
+		      SvPV_nolen_const(hv_iterval(MUTABLE_HV(sv), entry)));
 	}
     }
 #endif
@@ -1633,7 +1633,7 @@ Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
 int
 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
 {
-    HV * const hv = (HV*)LvTARG(sv);
+    HV * const hv = MUTABLE_HV(LvTARG(sv));
     I32 i = 0;
 
     PERL_ARGS_ASSERT_MAGIC_GETNKEYS;
@@ -1659,7 +1659,7 @@ Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
     PERL_ARGS_ASSERT_MAGIC_SETNKEYS;
     PERL_UNUSED_ARG(mg);
     if (LvTARG(sv)) {
-	hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
+	hv_ksplit(MUTABLE_HV(LvTARG(sv)), SvIV(sv));
     }
     return 0;
 }
@@ -2159,7 +2159,7 @@ Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
     if (LvTARGLEN(sv)) {
 	if (mg->mg_obj) {
 	    SV * const ahv = LvTARG(sv);
-	    HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
+	    HE * const he = hv_fetch_ent(MUTABLE_HV(ahv), mg->mg_obj, FALSE, 0);
             if (he)
                 targ = HeVAL(he);
 	}
@@ -2211,7 +2211,7 @@ Perl_vivify_defelem(pTHX_ SV *sv)
 	return;
     if (mg->mg_obj) {
 	SV * const ahv = LvTARG(sv);
-	HE * const he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
+	HE * const he = hv_fetch_ent(MUTABLE_HV(ahv), mg->mg_obj, TRUE, 0);
         if (he)
             value = HeVAL(he);
 	if (!value || value == &PL_sv_undef)
diff --git a/mro.c b/mro.c
index 57785e9..97877ac 100644
--- a/mro.c
+++ b/mro.c
@@ -88,10 +88,10 @@ Perl_mro_meta_dup(pTHX_ struct mro_meta* smeta, CLONE_PARAMS* param)
 	    = (AV*) SvREFCNT_inc(sv_dup((SV*)newmeta->mro_linear_c3, param));
     if (newmeta->mro_nextmethod)
 	newmeta->mro_nextmethod
-	    = (HV*) SvREFCNT_inc(sv_dup((SV*)newmeta->mro_nextmethod, param));
+	    = MUTABLE_HV(SvREFCNT_inc(sv_dup((SV*)newmeta->mro_nextmethod, param)));
     if (newmeta->isa)
 	newmeta->isa
-	    = (HV*) SvREFCNT_inc(sv_dup((SV*)newmeta->isa, param));
+	    = MUTABLE_HV(SvREFCNT_inc(sv_dup((SV*)newmeta->isa, param)));
 
     return newmeta;
 }
@@ -197,7 +197,7 @@ S_mro_get_linear_isa_dfs(pTHX_ HV *stash, I32 level)
        It's then retained to be re-used as a fast lookup for ->isa(), by adding
        our own name and "UNIVERSAL" to it.  */
 
-    stored = (HV*)sv_2mortal((SV*)newHV());
+    stored = MUTABLE_HV(sv_2mortal((SV*)newHV()));
 
     if(av && AvFILLp(av) >= 0) {
 
@@ -344,7 +344,7 @@ S_mro_get_linear_isa_c3(pTHX_ HV* stash, I32 level)
     if(isa && AvFILLp(isa) >= 0) {
         SV** seqs_ptr;
         I32 seqs_items;
-        HV* const tails = (HV*)sv_2mortal((SV*)newHV());
+        HV* const tails = MUTABLE_HV(sv_2mortal((SV*)newHV()));
         AV* const seqs = (AV*)sv_2mortal((SV*)newAV());
         I32* heads;
 
@@ -582,7 +582,7 @@ Perl_mro_isa_changed_in(pTHX_ HV* stash)
        is UNIVERSAL or one of its parents */
 
     svp = hv_fetch(PL_isarev, stashname, stashname_len, 0);
-    isarev = svp ? (HV*)*svp : NULL;
+    isarev = svp ? MUTABLE_HV(*svp) : NULL;
 
     if((stashname_len == 9 && strEQ(stashname, "UNIVERSAL"))
         || (isarev && hv_exists(isarev, "UNIVERSAL", 9))) {
@@ -641,7 +641,7 @@ Perl_mro_isa_changed_in(pTHX_ HV* stash)
 	   us, then will need to upgrade it to an HV (which sv_upgrade() can
 	   now do for us. */
 
-        mroisarev = (HV*)HeVAL(he);
+        mroisarev = MUTABLE_HV(HeVAL(he));
 
 	SvUPGRADE((SV*)mroisarev, SVt_PVHV);
 
@@ -700,7 +700,7 @@ Perl_mro_method_changed_in(pTHX_ HV *stash)
     const STRLEN stashname_len = HvNAMELEN_get(stash);
 
     SV ** const svp = hv_fetch(PL_isarev, stashname, stashname_len, 0);
-    HV * const isarev = svp ? (HV*)*svp : NULL;
+    HV * const isarev = svp ? MUTABLE_HV(*svp) : NULL;
 
     PERL_ARGS_ASSERT_MRO_METHOD_CHANGED_IN;
 
@@ -891,7 +891,7 @@ XS(XS_mro_get_isarev)
 
     
     he = hv_fetch_ent(PL_isarev, classname, 0, 0);
-    isarev = he ? (HV*)HeVAL(he) : NULL;
+    isarev = he ? MUTABLE_HV(HeVAL(he)) : NULL;
 
     ret_array = newAV();
     if(isarev) {
@@ -924,7 +924,7 @@ XS(XS_mro_is_universal)
     classname_pv = SvPV(classname,classname_len);
 
     he = hv_fetch_ent(PL_isarev, classname, 0, 0);
-    isarev = he ? (HV*)HeVAL(he) : NULL;
+    isarev = he ? MUTABLE_HV(HeVAL(he)) : NULL;
 
     if((classname_len == 9 && strEQ(classname_pv, "UNIVERSAL"))
         || (isarev && hv_exists(isarev, "UNIVERSAL", 9)))
diff --git a/op.c b/op.c
index 3048a85..15e6522 100644
--- a/op.c
+++ b/op.c
@@ -3361,7 +3361,7 @@ Perl_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
 	SvREFCNT_dec(transv);
 
 	if (!del && havefinal && rlen)
-	    (void)hv_store((HV*)SvRV(swash), "FINAL", 5,
+	    (void)hv_store(MUTABLE_HV(SvRV(swash)), "FINAL", 5,
 			   newSVuv((UV)final), 0);
 
 	if (grows)
diff --git a/pad.c b/pad.c
index 9f6e764..16a539b 100644
--- a/pad.c
+++ b/pad.c
@@ -367,7 +367,7 @@ Perl_pad_add_name(pTHX_ const char *name, HV* typestash, HV* ourstash, bool fake
     if (typestash) {
 	assert(SvTYPE(namesv) == SVt_PVMG);
 	SvPAD_TYPED_on(namesv);
-	SvSTASH_set(namesv, (HV*)SvREFCNT_inc_simple_NN((SV*)typestash));
+	SvSTASH_set(namesv, MUTABLE_HV(SvREFCNT_inc_simple_NN((SV*)typestash)));
     }
     if (ourstash) {
 	SvPAD_OUR_on(namesv);
diff --git a/perl.c b/perl.c
index 8d89f31..11f21be 100644
--- a/perl.c
+++ b/perl.c
@@ -3546,7 +3546,7 @@ S_init_main_stash(pTHX)
        of the SvREFCNT_dec, only to add it again with hv_name_set */
     SvREFCNT_dec(GvHV(gv));
     hv_name_set(PL_defstash, "main", 4, 0);
-    GvHV(gv) = (HV*)SvREFCNT_inc_simple(PL_defstash);
+    GvHV(gv) = MUTABLE_HV(SvREFCNT_inc_simple(PL_defstash));
     SvREADONLY_on(gv);
     PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpvs("INC", GV_ADD|GV_NOTQUAL,
 					     SVt_PVAV)));
diff --git a/pp.c b/pp.c
index 0096c95..d16b095 100644
--- a/pp.c
+++ b/pp.c
@@ -119,7 +119,7 @@ PP(pp_padhv)
 	RETURNOP(do_kv());
     }
     else if (gimme == G_SCALAR) {
-	SV* const sv = Perl_hv_scalar(aTHX_ (HV*)TARG);
+	SV* const sv = Perl_hv_scalar(aTHX_ MUTABLE_HV(TARG));
 	SETs(sv);
     }
     RETURN;
@@ -806,7 +806,7 @@ PP(pp_undef)
 	av_undef((AV*)sv);
 	break;
     case SVt_PVHV:
-	hv_undef((HV*)sv);
+	hv_undef(MUTABLE_HV(sv));
 	break;
     case SVt_PVCV:
 	if (cv_const_sv((CV*)sv) && ckWARN(WARN_MISC))
@@ -4011,7 +4011,7 @@ PP(pp_each)
 {
     dVAR;
     dSP;
-    HV * hash = (HV*)POPs;
+    HV * hash = MUTABLE_HV(POPs);
     HE *entry;
     const I32 gimme = GIMME_V;
 
@@ -4048,7 +4048,7 @@ PP(pp_delete)
 
     if (PL_op->op_private & OPpSLICE) {
 	dMARK; dORIGMARK;
-	HV * const hv = (HV*)POPs;
+	HV * const hv = MUTABLE_HV(POPs);
 	const U32 hvtype = SvTYPE(hv);
 	if (hvtype == SVt_PVHV) {			/* hash element */
 	    while (++MARK <= SP) {
@@ -4079,7 +4079,7 @@ PP(pp_delete)
     }
     else {
 	SV *keysv = POPs;
-	HV * const hv = (HV*)POPs;
+	HV * const hv = MUTABLE_HV(POPs);
 	SV *sv;
 	if (SvTYPE(hv) == SVt_PVHV)
 	    sv = hv_delete_ent(hv, keysv, discard, 0);
@@ -4117,7 +4117,7 @@ PP(pp_exists)
 	RETPUSHNO;
     }
     tmpsv = POPs;
-    hv = (HV*)POPs;
+    hv = MUTABLE_HV(POPs);
     if (SvTYPE(hv) == SVt_PVHV) {
 	if (hv_exists_ent(hv, tmpsv, 0))
 	    RETPUSHYES;
@@ -4137,7 +4137,7 @@ PP(pp_exists)
 PP(pp_hslice)
 {
     dVAR; dSP; dMARK; dORIGMARK;
-    register HV * const hv = (HV*)POPs;
+    register HV * const hv = MUTABLE_HV(POPs);
     register const I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
     const bool localizing = PL_op->op_private & OPpLVAL_INTRO;
     bool other_magic = FALSE;
diff --git a/pp_ctl.c b/pp_ctl.c
index 8ddb2c4..c30d485 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -3208,14 +3208,14 @@ PP(pp_require)
 		I32 first = 0;
 		AV *lav;
 		SV * const req = SvRV(sv);
-		SV * const pv = *hv_fetchs((HV*)req, "original", FALSE);
+		SV * const pv = *hv_fetchs(MUTABLE_HV(req), "original", FALSE);
 
 		/* get the left hand term */
-		lav = (AV *)SvRV(*hv_fetchs((HV*)req, "version", FALSE));
+		lav = (AV *)SvRV(*hv_fetchs(MUTABLE_HV(req), "version", FALSE));
 
 		first  = SvIV(*av_fetch(lav,0,0));
 		if (   first > (int)PERL_REVISION    /* probably 'use 6.0' */
-		    || hv_exists((HV*)req, "qv", 2 ) /* qv style */
+		    || hv_exists(MUTABLE_HV(req), "qv", 2 ) /* qv style */
 		    || av_len(lav) > 1               /* FP with > 3 digits */
 		    || strstr(SvPVX(pv),".0")        /* FP with leading 0 */
 		   ) {
@@ -3639,7 +3639,7 @@ PP(pp_hintseval)
 {
     dVAR;
     dSP;
-    mXPUSHs((SV*)Perl_hv_copy_hints_hv(aTHX_ (HV*)cSVOP_sv));
+    mXPUSHs((SV*)Perl_hv_copy_hints_hv(aTHX_ MUTABLE_HV(cSVOP_sv)));
     RETURN;
 }
 
@@ -3663,7 +3663,7 @@ PP(pp_entereval)
     const int fakelen = 9 + 1;
     
     if (PL_op->op_private & OPpEVAL_HAS_HH) {
-	saved_hh = (HV*) SvREFCNT_inc(POPs);
+	saved_hh = MUTABLE_HV(SvREFCNT_inc(POPs));
     }
     sv = POPs;
 
@@ -4108,7 +4108,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
 	if (SM_OTHER_REF(PVHV)) {
 	    /* Check that the key-sets are identical */
 	    HE *he;
-	    HV *other_hv = (HV *) SvRV(Other);
+	    HV *other_hv = MUTABLE_HV(SvRV(Other));
 	    bool tied = FALSE;
 	    bool other_tied = FALSE;
 	    U32 this_key_count  = 0,
@@ -4120,27 +4120,27 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
 	    }
 	    else if (SvTIED_mg((SV *) other_hv, PERL_MAGIC_tied)) {
 		HV * const temp = other_hv;
-		other_hv = (HV *) This;
+		other_hv = MUTABLE_HV(This);
 		This  = (SV *) temp;
 		tied = TRUE;
 	    }
 	    if (SvTIED_mg((SV *) other_hv, PERL_MAGIC_tied))
 		other_tied = TRUE;
 	    
-	    if (!tied && HvUSEDKEYS((HV *) This) != HvUSEDKEYS(other_hv))
+	    if (!tied && HvUSEDKEYS((const HV *) This) != HvUSEDKEYS(other_hv))
 	    	RETPUSHNO;
 
 	    /* The hashes have the same number of keys, so it suffices
 	       to check that one is a subset of the other. */
-	    (void) hv_iterinit((HV *) This);
-	    while ( (he = hv_iternext((HV *) This)) ) {
+	    (void) hv_iterinit(MUTABLE_HV(This));
+	    while ( (he = hv_iternext(MUTABLE_HV(This))) ) {
 	    	I32 key_len;
 		char * const key = hv_iterkey(he, &key_len);
 	    	
 	    	++ this_key_count;
 	    	
 	    	if(!hv_exists(other_hv, key, key_len)) {
-	    	    (void) hv_iterinit((HV *) This);	/* reset iterator */
+	    	    (void) hv_iterinit(MUTABLE_HV(This));	/* reset iterator */
 		    RETPUSHNO;
 	    	}
 	    }
@@ -4170,7 +4170,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
 
 		if (svp) {	/* ??? When can this not happen? */
 		    key = SvPV(*svp, key_len);
-		    if (hv_exists((HV *) This, key, key_len))
+		    if (hv_exists(MUTABLE_HV(This), key, key_len))
 		        RETPUSHYES;
 		}
 	    }
@@ -4180,10 +4180,10 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
 	    PMOP * const matcher = make_matcher(other_regex);
 	    HE *he;
 
-	    (void) hv_iterinit((HV *) This);
-	    while ( (he = hv_iternext((HV *) This)) ) {
+	    (void) hv_iterinit(MUTABLE_HV(This));
+	    while ( (he = hv_iternext(MUTABLE_HV(This))) ) {
 		if (matcher_matches_sv(matcher, hv_iterkeysv(he))) {
-		    (void) hv_iterinit((HV *) This);
+		    (void) hv_iterinit(MUTABLE_HV(This));
 		    destroy_matcher(matcher);
 		    RETPUSHYES;
 		}
@@ -4192,7 +4192,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
 	    RETPUSHNO;
 	}
 	else {
-	    if (hv_exists_ent((HV *) This, Other, 0))
+	    if (hv_exists_ent(MUTABLE_HV(This), Other, 0))
 		RETPUSHYES;
 	    else
 		RETPUSHNO;
diff --git a/pp_hot.c b/pp_hot.c
index a65e625..44ded8a 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -910,7 +910,7 @@ PP(pp_rv2av)
     }
     else if (gimme == G_SCALAR) {
 	dTARGET;
-    TARG = Perl_hv_scalar(aTHX_ (HV*)sv);
+    TARG = Perl_hv_scalar(aTHX_ MUTABLE_HV(sv));
 	SPAGAIN;
 	SETTARG;
     }
@@ -1039,7 +1039,7 @@ PP(pp_aassign)
 	case SVt_PVHV: {				/* normal hash */
 		SV *tmpstr;
 
-		hash = (HV*)sv;
+		hash = MUTABLE_HV(sv);
 		magic = SvMAGICAL(hash) != 0;
 		hv_clear(hash);
 		firsthashrelem = relem;
@@ -1769,7 +1769,7 @@ PP(pp_helem)
     HE* he;
     SV **svp;
     SV * const keysv = POPs;
-    HV * const hv = (HV*)POPs;
+    HV * const hv = MUTABLE_HV(POPs);
     const U32 lval = PL_op->op_flags & OPf_MOD || LVRET;
     const U32 defer = PL_op->op_private & OPpLVAL_DEFER;
     SV *sv;
@@ -3105,7 +3105,7 @@ S_method_common(pTHX_ SV* meth, U32* hashp)
 	}
     }
 
-    gv = gv_fetchmethod_flags(stash ? stash : (HV*)packsv, name,
+    gv = gv_fetchmethod_flags(stash ? stash : MUTABLE_HV(packsv), name,
 			      GV_AUTOLOAD | GV_CROAK);
 
     assert(gv);
diff --git a/pp_sys.c b/pp_sys.c
index 96df28d..7122499 100644
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -800,7 +800,7 @@ PP(pp_tie)
     switch(SvTYPE(varsv)) {
 	case SVt_PVHV:
 	    methname = "TIEHASH";
-	    HvEITER_set((HV *)varsv, 0);
+	    HvEITER_set(MUTABLE_HV(varsv), 0);
 	    break;
 	case SVt_PVAV:
 	    methname = "TIEARRAY";
@@ -944,7 +944,7 @@ PP(pp_dbmopen)
     HV* stash;
     GV *gv;
 
-    HV * const hv = (HV*)POPs;
+    HV * const hv = MUTABLE_HV(POPs);
     SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
     stash = gv_stashsv(sv, 0);
     if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
diff --git a/regcomp.c b/regcomp.c
index 4645cb3..fa5b8ef 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -4839,7 +4839,7 @@ reStudy:
     if (RExC_seen & REG_SEEN_CUTGROUP)
 	r->intflags |= PREGf_CUTGROUP_SEEN;
     if (RExC_paren_names)
-        RXp_PAREN_NAMES(r) = (HV*)SvREFCNT_inc(RExC_paren_names);
+        RXp_PAREN_NAMES(r) = MUTABLE_HV(SvREFCNT_inc(RExC_paren_names));
     else
         RXp_PAREN_NAMES(r) = NULL;
 
@@ -9509,7 +9509,7 @@ Perl_regfree_internal(pTHX_ REGEXP * const rx)
 
 #define sv_dup_inc(s,t)	SvREFCNT_inc(sv_dup(s,t))
 #define av_dup_inc(s,t)	(AV*)SvREFCNT_inc(sv_dup((const SV *)s,t))
-#define hv_dup_inc(s,t)	(HV*)SvREFCNT_inc(sv_dup((const SV *)s,t))
+#define hv_dup_inc(s,t)	MUTABLE_HV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
 #define SAVEPVN(p,n)	((p) ? savepvn(p,n) : NULL)
 
 /* 
diff --git a/regexec.c b/regexec.c
index 068d2e3..94bace1 100644
--- a/regexec.c
+++ b/regexec.c
@@ -1516,7 +1516,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
         	    = (reg_ac_data*)progi->data->data[ ARG( c ) ];
         	reg_trie_data *trie
 		    = (reg_trie_data*)progi->data->data[ aho->trie ];
-		HV *widecharmap = (HV*) progi->data->data[ aho->trie + 1 ];
+		HV *widecharmap = MUTABLE_HV(progi->data->data[ aho->trie + 1 ]);
 
 		const char *last_start = strend - trie->minlen;
 #ifdef DEBUGGING
@@ -2942,7 +2942,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, regnode *prog)
                 /* what trie are we using right now */
 		reg_trie_data * const trie
         	    = (reg_trie_data*)rexi->data->data[ ARG( scan ) ];
-		HV * widecharmap = (HV *)rexi->data->data[ ARG( scan ) + 1 ];
+		HV * widecharmap = MUTABLE_HV(rexi->data->data[ ARG( scan ) + 1 ]);
                 U32 state = trie->startstate;
 
         	if (trie->bitmap && trie_type != trie_utf8_fold &&
diff --git a/scope.c b/scope.c
index 9c56266..87a0ee3 100644
--- a/scope.c
+++ b/scope.c
@@ -766,7 +766,7 @@ Perl_leave_scope(pTHX_ I32 base)
 	    }
 	    break;
 	case SAVEt_HV:				/* hash reference */
-	    hv = (HV*)SSPOPPTR;
+	    hv = MUTABLE_HV(SSPOPPTR);
 	    gv = (GV*)SSPOPPTR;
 	    if (GvHV(gv)) {
 		SvREFCNT_dec(GvHV(gv));
@@ -809,7 +809,7 @@ Perl_leave_scope(pTHX_ I32 base)
 	    break;
 	case SAVEt_HPTR:			/* HV* reference */
 	    ptr = SSPOPPTR;
-	    *(HV**)ptr = (HV*)SSPOPPTR;
+	    *(HV**)ptr = MUTABLE_HV(SSPOPPTR);
 	    break;
 	case SAVEt_APTR:			/* AV* reference */
 	    ptr = SSPOPPTR;
@@ -875,7 +875,7 @@ Perl_leave_scope(pTHX_ I32 base)
 		    av_clear((AV*)sv);
 		    break;
 		case SVt_PVHV:
-		    hv_clear((HV*)sv);
+		    hv_clear(MUTABLE_HV(sv));
 		    break;
 		case SVt_PVCV:
 		    Perl_croak(aTHX_ "panic: leave_scope pad code");
@@ -900,7 +900,7 @@ Perl_leave_scope(pTHX_ I32 base)
 	    break;
 	case SAVEt_DELETE:
 	    ptr = SSPOPPTR;
-	    hv = (HV*)ptr;
+	    hv = MUTABLE_HV(ptr);
 	    ptr = SSPOPPTR;
 	    (void)hv_delete(hv, (char*)ptr, (I32)SSPOPINT, G_DISCARD);
 	    SvREFCNT_dec(hv);
@@ -944,7 +944,7 @@ Perl_leave_scope(pTHX_ I32 base)
 	case SAVEt_HELEM:		/* hash element */
 	    value = (SV*)SSPOPPTR;
 	    sv = (SV*)SSPOPPTR;
-	    hv = (HV*)SSPOPPTR;
+	    hv = MUTABLE_HV(SSPOPPTR);
 	    ptr = hv_fetch_ent(hv, sv, 1, 0);
 	    if (ptr) {
 		const SV * const oval = HeVAL((HE*)ptr);
@@ -974,7 +974,7 @@ Perl_leave_scope(pTHX_ I32 base)
 	    PL_compiling.cop_hints_hash = (struct refcounted_he *) SSPOPPTR;
 	    if (PL_hints & HINT_LOCALIZE_HH) {
 		SvREFCNT_dec((SV*)GvHV(PL_hintgv));
-		GvHV(PL_hintgv) = (HV*)SSPOPPTR;
+		GvHV(PL_hintgv) = MUTABLE_HV(SSPOPPTR);
 		assert(GvHV(PL_hintgv));
 	    } else if (!GvHV(PL_hintgv)) {
 		/* Need to add a new one manually, else gv_fetchpv() can
diff --git a/sv.c b/sv.c
index d61ff9f..c388113 100644
--- a/sv.c
+++ b/sv.c
@@ -5067,7 +5067,7 @@ Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv)
     PERL_ARGS_ASSERT_SV_ADD_BACKREF;
 
     if (SvTYPE(tsv) == SVt_PVHV) {
-	AV **const avp = Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
+	AV **const avp = Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
 
 	av = *avp;
 	if (!av) {
@@ -5123,7 +5123,7 @@ S_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
     PERL_ARGS_ASSERT_SV_DEL_BACKREF;
 
     if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
-	av = *Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
+	av = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
 	/* We mustn't attempt to "fix up" the hash here by moving the
 	   backreference array back to the hv_aux structure, as that is stored
 	   in the main HvARRAY(), and hfreentries assumes that no-one
@@ -5513,8 +5513,8 @@ Perl_sv_clear(pTHX_ register SV *const sv)
 	if (PL_last_swash_hv == (const HV *)sv) {
 	    PL_last_swash_hv = NULL;
 	}
-	Perl_hv_kill_backrefs(aTHX_ (HV*)sv);
-	hv_undef((HV*)sv);
+	Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
+	hv_undef(MUTABLE_HV(sv));
 	break;
     case SVt_PVAV:
 	if (PL_comppad == (AV*)sv) {
@@ -8477,7 +8477,7 @@ Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
     if (SvTYPE(tmpRef) != SVt_PVIO)
 	++PL_sv_objcount;
     SvUPGRADE(tmpRef, SVt_PVMG);
-    SvSTASH_set(tmpRef, (HV*)SvREFCNT_inc_simple(stash));
+    SvSTASH_set(tmpRef, MUTABLE_HV(SvREFCNT_inc_simple(stash)));
 
     if (Gv_AMG(stash))
 	SvAMAGIC_on(sv);
@@ -9307,7 +9307,7 @@ Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
 		 */
 		if (sv_derived_from(vecsv, "version")) {
 		    char *version = savesvpv(vecsv);
-		    if ( hv_exists((HV*)SvRV(vecsv), "alpha", 5 ) ) {
+		    if ( hv_exists(MUTABLE_HV(SvRV(vecsv)), "alpha", 5 ) ) {
 			Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
 			"vector argument not supported with alpha versions");
 			goto unknown;
@@ -10084,8 +10084,8 @@ ptr_table_* functions.
 #define sv_dup_inc_NN(s,t)	SvREFCNT_inc_NN(sv_dup(s,t))
 #define av_dup(s,t)	(AV*)sv_dup((const SV *)s,t)
 #define av_dup_inc(s,t)	(AV*)SvREFCNT_inc(sv_dup((const SV *)s,t))
-#define hv_dup(s,t)	(HV*)sv_dup((const SV *)s,t)
-#define hv_dup_inc(s,t)	(HV*)SvREFCNT_inc(sv_dup((const SV *)s,t))
+#define hv_dup(s,t)	MUTABLE_HV(sv_dup((const SV *)s,t))
+#define hv_dup_inc(s,t)	MUTABLE_HV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
 #define cv_dup(s,t)	(CV*)sv_dup((SV*)s,t)
 #define cv_dup_inc(s,t)	(CV*)SvREFCNT_inc(sv_dup((const SV *)s,t))
 #define io_dup(s,t)	(IO*)sv_dup((SV*)s,t)
@@ -10851,7 +10851,7 @@ Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
 		    }
 		}
 		else
-		    HvARRAY((HV*)dstr) = NULL;
+		    HvARRAY(MUTABLE_HV(dstr)) = NULL;
 		break;
 	    case SVt_PVCV:
 		if (!(param->flags & CLONEf_COPY_STACKS)) {
@@ -11384,7 +11384,7 @@ do_mark_cloneable_stash(pTHX_ SV *const sv)
 {
     const HEK * const hvname = HvNAME_HEK((const HV *)sv);
     if (hvname) {
-	GV* const cloner = gv_fetchmethod_autoload((HV*)sv, "CLONE_SKIP", 0);
+	GV* const cloner = gv_fetchmethod_autoload(MUTABLE_HV(sv), "CLONE_SKIP", 0);
 	SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
 	if (cloner && GvCV(cloner)) {
 	    dSP;
@@ -12128,7 +12128,7 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
        identified by sv_dup() above.
     */
     while(av_len(param->stashes) != -1) {
-	HV* const stash = (HV*) av_shift(param->stashes);
+	HV* const stash = MUTABLE_HV(av_shift(param->stashes));
 	GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
 	if (cloner && GvCV(cloner)) {
 	    dSP;
@@ -12478,7 +12478,7 @@ S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
 
 	/* attempt to find a match within the aggregate */
 	if (hash) {
-	    keysv = find_hash_subscript((HV*)sv, uninit_sv);
+	    keysv = find_hash_subscript((const HV*)sv, uninit_sv);
 	    if (keysv)
 		subscript_type = FUV_SUBSCRIPT_HASH;
 	}
@@ -12578,7 +12578,7 @@ S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
 		if (SvMAGICAL(sv))
 		    break;
 		if (obase->op_type == OP_HELEM) {
-		    HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
+		    HE* he = hv_fetch_ent(MUTABLE_HV(sv), cSVOPx_sv(kid), 0, 0);
 		    if (!he || HeVAL(he) != uninit_sv)
 			break;
 		}
@@ -12599,7 +12599,7 @@ S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
 	    /* index is an expression;
 	     * attempt to find a match within the aggregate */
 	    if (obase->op_type == OP_HELEM) {
-		SV * const keysv = find_hash_subscript((HV*)sv, uninit_sv);
+		SV * const keysv = find_hash_subscript((const HV*)sv, uninit_sv);
 		if (keysv)
 		    return varname(gv, '%', o->op_targ,
 						keysv, 0, FUV_SUBSCRIPT_HASH);