/* scope.c
*
- * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 by Larry Wall and others
+ * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+ * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
GvAV(gv) = NULL;
av = GvAVn(gv);
if (SvMAGIC(oav))
- mg_localize((SV*)oav, (SV*)av);
+ mg_localize(MUTABLE_SV(oav), MUTABLE_SV(av));
return av;
}
GvHV(gv) = NULL;
hv = GvHVn(gv);
if (SvMAGIC(ohv))
- mg_localize((SV*)ohv, (SV*)hv);
+ mg_localize(MUTABLE_SV(ohv), MUTABLE_SV(hv));
return hv;
}
while (PL_savestack_ix > base) {
switch (SSPOPINT) {
case SAVEt_ITEM: /* normal string */
- value = (SV*)SSPOPPTR;
- sv = (SV*)SSPOPPTR;
+ value = MUTABLE_SV(SSPOPPTR);
+ sv = MUTABLE_SV(SSPOPPTR);
sv_replace(sv,value);
PL_localizing = 2;
SvSETMAGIC(sv);
PL_localizing = 0;
break;
case SAVEt_SV: /* scalar reference */
- value = (SV*)SSPOPPTR;
+ value = MUTABLE_SV(SSPOPPTR);
gv = (GV*)SSPOPPTR;
ptr = &GvSV(gv);
- av = (AV*)gv; /* what to refcnt_dec */
+ av = MUTABLE_AV(gv); /* what to refcnt_dec */
restore_sv:
sv = *(SV**)ptr;
- DEBUG_S(PerlIO_printf(Perl_debug_log,
- "restore svref: %p %p:%s -> %p:%s\n",
- (void*)ptr, (void*)sv, SvPEEK(sv),
- (void*)value, SvPEEK(value)));
*(SV**)ptr = value;
SvREFCNT_dec(sv);
PL_localizing = 2;
}
break;
case SAVEt_GENERIC_SVREF: /* generic sv */
- value = (SV*)SSPOPPTR;
+ value = MUTABLE_SV(SSPOPPTR);
ptr = SSPOPPTR;
sv = *(SV**)ptr;
*(SV**)ptr = value;
SvREFCNT_dec(value);
break;
case SAVEt_AV: /* array reference */
- av = (AV*)SSPOPPTR;
+ av = MUTABLE_AV(SSPOPPTR);
gv = (GV*)SSPOPPTR;
if (GvAV(gv)) {
SvREFCNT_dec(GvAV(gv));
GvAV(gv) = av;
if (SvMAGICAL(av)) {
PL_localizing = 2;
- SvSETMAGIC((SV*)av);
+ SvSETMAGIC(MUTABLE_SV(av));
PL_localizing = 0;
}
break;
case SAVEt_HV: /* hash reference */
- hv = (HV*)SSPOPPTR;
+ hv = MUTABLE_HV(SSPOPPTR);
gv = (GV*)SSPOPPTR;
if (GvHV(gv)) {
SvREFCNT_dec(GvHV(gv));
GvHV(gv) = hv;
if (SvMAGICAL(hv)) {
PL_localizing = 2;
- SvSETMAGIC((SV*)hv);
+ SvSETMAGIC(MUTABLE_SV(hv));
PL_localizing = 0;
}
break;
break;
case SAVEt_SPTR: /* SV* reference */
ptr = SSPOPPTR;
- *(SV**)ptr = (SV*)SSPOPPTR;
+ *(SV**)ptr = MUTABLE_SV(SSPOPPTR);
break;
case SAVEt_VPTR: /* random* reference */
case SAVEt_PPTR: /* char* reference */
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;
- *(AV**)ptr = (AV*)SSPOPPTR;
+ *(AV**)ptr = MUTABLE_AV(SSPOPPTR);
break;
case SAVEt_GP: /* scalar reference */
ptr = SSPOPPTR;
break;
case SAVEt_FREESV:
ptr = SSPOPPTR;
- SvREFCNT_dec((SV*)ptr);
+ SvREFCNT_dec(MUTABLE_SV(ptr));
break;
case SAVEt_MORTALIZESV:
ptr = SSPOPPTR;
- sv_2mortal((SV*)ptr);
+ sv_2mortal(MUTABLE_SV(ptr));
break;
case SAVEt_FREEOP:
ptr = SSPOPPTR;
case SVt_NULL:
break;
case SVt_PVAV:
- av_clear((AV*)sv);
+ av_clear(MUTABLE_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");
else { /* Someone has a claim on this, so abandon it. */
const U32 padflags = SvFLAGS(sv) & (SVs_PADMY|SVs_PADTMP);
switch (SvTYPE(sv)) { /* Console ourselves with a new value */
- case SVt_PVAV: *(SV**)ptr = (SV*)newAV(); break;
- case SVt_PVHV: *(SV**)ptr = (SV*)newHV(); break;
+ case SVt_PVAV: *(SV**)ptr = MUTABLE_SV(newAV()); break;
+ case SVt_PVHV: *(SV**)ptr = MUTABLE_SV(newHV()); break;
default: *(SV**)ptr = newSV(0); break;
}
SvREFCNT_dec(sv); /* Cast current value to the winds. */
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);
cxstack[i].blk_oldsp = SSPOPINT;
break;
case SAVEt_AELEM: /* array element */
- value = (SV*)SSPOPPTR;
+ value = MUTABLE_SV(SSPOPPTR);
i = SSPOPINT;
- av = (AV*)SSPOPPTR;
+ av = MUTABLE_AV(SSPOPPTR);
ptr = av_fetch(av,i,1);
if (!AvREAL(av) && AvREIFY(av)) /* undo reify guard */
SvREFCNT_dec(value);
if (ptr) {
sv = *(SV**)ptr;
if (sv && sv != &PL_sv_undef) {
- if (SvTIED_mg((SV*)av, PERL_MAGIC_tied))
+ if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
SvREFCNT_inc_void_NN(sv);
goto restore_sv;
}
SvREFCNT_dec(value);
break;
case SAVEt_HELEM: /* hash element */
- value = (SV*)SSPOPPTR;
- sv = (SV*)SSPOPPTR;
- hv = (HV*)SSPOPPTR;
+ value = MUTABLE_SV(SSPOPPTR);
+ sv = MUTABLE_SV(SSPOPPTR);
+ hv = MUTABLE_HV(SSPOPPTR);
ptr = hv_fetch_ent(hv, sv, 1, 0);
if (ptr) {
const SV * const oval = HeVAL((HE*)ptr);
if (oval && oval != &PL_sv_undef) {
ptr = &HeVAL((HE*)ptr);
- if (SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
+ if (SvTIED_mg((const SV *)hv, PERL_MAGIC_tied))
SvREFCNT_inc_void(*(SV**)ptr);
SvREFCNT_dec(sv);
- av = (AV*)hv; /* what to refcnt_dec */
+ av = MUTABLE_AV(hv); /* what to refcnt_dec */
goto restore_sv;
}
}
break;
case SAVEt_HINTS:
if ((PL_hints & HINT_LOCALIZE_HH) && GvHV(PL_hintgv)) {
- SvREFCNT_dec((SV*)GvHV(PL_hintgv));
+ SvREFCNT_dec(MUTABLE_SV(GvHV(PL_hintgv)));
GvHV(PL_hintgv) = NULL;
}
*(I32*)&PL_hints = (I32)SSPOPINT;
Perl_refcounted_he_free(aTHX_ PL_compiling.cop_hints_hash);
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;
+ SvREFCNT_dec(MUTABLE_SV(GvHV(PL_hintgv)));
+ 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
But as we have all the information here, we can do it here,
save even having to have itersave in the struct. */
sv_2mortal(*svp);
- *svp = (SV*)SSPOPPTR;
+ *svp = MUTABLE_SV(SSPOPPTR);
}
break;
case SAVEt_SAVESWITCHSTACK:
{
dSP;
- AV* const t = (AV*)SSPOPPTR;
- AV* const f = (AV*)SSPOPPTR;
+ AV *const t = MUTABLE_AV(SSPOPPTR);
+ AV *const f = MUTABLE_AV(SSPOPPTR);
SWITCHSTACK(t,f);
PL_curstackinfo->si_stack = f;
}
{
const U32 val = (U32)SSPOPINT;
const U32 mask = (U32)SSPOPINT;
- sv = (SV*)SSPOPPTR;
+ sv = MUTABLE_SV(SSPOPPTR);
SvFLAGS(sv) &= ~mask;
SvFLAGS(sv) |= val;
}
break;
- /* These are only saved in mathoms.c */
+
+ /* This would be a mathom, but Perl_save_svref() calls a static
+ function, S_save_scalar_at(), so has to stay in this file. */
case SAVEt_SVREF: /* scalar reference */
- value = (SV*)SSPOPPTR;
+ value = MUTABLE_SV(SSPOPPTR);
ptr = SSPOPPTR;
av = NULL; /* what to refcnt_dec */
goto restore_sv;
+
+ /* These are only saved in mathoms.c */
+ case SAVEt_NSTAB:
+ gv = (GV*)SSPOPPTR;
+ (void)sv_clear(MUTABLE_SV(gv));
+ break;
case SAVEt_LONG: /* long reference */
ptr = SSPOPPTR;
*(long*)ptr = (long)SSPOPLONG;
break;
+ case SAVEt_IV: /* IV reference */
+ ptr = SSPOPPTR;
+ *(IV*)ptr = (IV)SSPOPIV;
+ break;
+
case SAVEt_I16: /* I16 reference */
ptr = SSPOPPTR;
*(I16*)ptr = (I16)SSPOPINT;
ptr = SSPOPPTR;
*(I8*)ptr = (I8)SSPOPINT;
break;
- case SAVEt_IV: /* IV reference */
- ptr = SSPOPPTR;
- *(IV*)ptr = (IV)SSPOPIV;
- break;
- case SAVEt_NSTAB:
- gv = (GV*)SSPOPPTR;
- (void)sv_clear((SV*)gv);
- break;
case SAVEt_DESTRUCTOR:
ptr = SSPOPPTR;
(*SSPOPDPTR)(ptr);