diff options
author | Marcus Holland-Moritz <mhx-perl@gmx.net> | 2008-11-10 19:13:20 +0000 |
---|---|---|
committer | Marcus Holland-Moritz <mhx-perl@gmx.net> | 2008-11-10 19:13:20 +0000 |
commit | f19a12a3a65a1b840e4df1373a12eab6e50a8d5c (patch) | |
tree | b98d3d9b290f7be9238f1852d9b01ed08b487139 | |
parent | b538b56a2e21f8e5395db8c0b000b85588d3f585 (diff) | |
download | perl-f19a12a3a65a1b840e4df1373a12eab6e50a8d5c.tar.gz |
Allow lvalue usage of SvRV() and add MUTABLE_SV() check.
Also add new SvRV_const() macro for read-only access.
p4raw-id: //depot/perl@34804
-rw-r--r-- | sv.c | 4 | ||||
-rw-r--r-- | sv.h | 14 |
2 files changed, 15 insertions, 3 deletions
@@ -10562,8 +10562,8 @@ Perl_rvpv_dup(pTHX_ SV *const dstr, const SV *const sstr, CLONE_PARAMS *const pa if (SvROK(sstr)) { SvRV_set(dstr, SvWEAKREF(sstr) - ? sv_dup(SvRV(sstr), param) - : sv_dup_inc(SvRV(sstr), param)); + ? sv_dup(SvRV_const(sstr), param) + : sv_dup_inc(SvRV_const(sstr), param)); } else if (SvPVX_const(sstr)) { @@ -1048,6 +1048,7 @@ the scalar's value cannot change unless written to. # define SvUVX(sv) (0 + ((XPVUV*) SvANY(sv))->xuv_uv) # define SvNVX(sv) (-0.0 + ((XPVNV*) SvANY(sv))->xnv_u.xnv_nv) # define SvRV(sv) (0 + (sv)->sv_u.svu_rv) +# define SvRV_const(sv) (0 + (sv)->sv_u.svu_rv) /* Don't test the core XS code yet. */ # if defined (PERL_CORE) && PERL_DEBUG_COW > 1 # define SvPVX(sv) (0 + (assert(!SvREADONLY(sv)), (sv)->sv_u.svu_pv)) @@ -1119,7 +1120,7 @@ the scalar's value cannot change unless written to. &(((XPVNV*) MUTABLE_PTR(SvANY(_svnvx)))->xnv_u.xnv_nv); \ })) # define SvRV(sv) \ - (*({ const SV *const _svrv = (const SV *)(sv); \ + (*({ SV *const _svrv = MUTABLE_SV(sv); \ assert(SvTYPE(_svrv) >= SVt_PV || SvTYPE(_svrv) == SVt_IV); \ assert(SvTYPE(_svrv) != SVt_PVAV); \ assert(SvTYPE(_svrv) != SVt_PVHV); \ @@ -1128,6 +1129,16 @@ the scalar's value cannot change unless written to. assert(!isGV_with_GP(_svrv)); \ &((_svrv)->sv_u.svu_rv); \ })) +# define SvRV_const(sv) \ + ({ const SV *const _svrv = (const SV *)(sv); \ + assert(SvTYPE(_svrv) >= SVt_PV || SvTYPE(_svrv) == SVt_IV); \ + assert(SvTYPE(_svrv) != SVt_PVAV); \ + assert(SvTYPE(_svrv) != SVt_PVHV); \ + assert(SvTYPE(_svrv) != SVt_PVCV); \ + assert(SvTYPE(_svrv) != SVt_PVFM); \ + assert(!isGV_with_GP(_svrv)); \ + (_svrv)->sv_u.svu_rv; \ + }) # define SvMAGIC(sv) \ (*({ const SV *const _svmagic = (const SV *)(sv); \ assert(SvTYPE(_svmagic) >= SVt_PVMG); \ @@ -1147,6 +1158,7 @@ the scalar's value cannot change unless written to. # define SvUVX(sv) ((XPVUV*) SvANY(sv))->xuv_uv # define SvNVX(sv) ((XPVNV*) SvANY(sv))->xnv_u.xnv_nv # define SvRV(sv) ((sv)->sv_u.svu_rv) +# define SvRV_const(sv) (0 + (sv)->sv_u.svu_rv) # define SvMAGIC(sv) ((XPVMG*) SvANY(sv))->xmg_u.xmg_magic # define SvSTASH(sv) ((XPVMG*) SvANY(sv))->xmg_stash # endif |