Change 34804 by [EMAIL PROTECTED] on 2008/11/10 19:13:20
Allow lvalue usage of SvRV() and add MUTABLE_SV() check.
Also add new SvRV_const() macro for read-only access.
Affected files ...
... //depot/perl/sv.c#1577 edit
... //depot/perl/sv.h#356 edit
Differences ...
==== //depot/perl/sv.c#1577 (text) ====
Index: perl/sv.c
--- perl/sv.c#1576~34783~ 2008-11-09 05:42:58.000000000 -0800
+++ perl/sv.c 2008-11-10 11:13:20.000000000 -0800
@@ -10562,8 +10562,8 @@
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)) {
==== //depot/perl/sv.h#356 (text) ====
Index: perl/sv.h
--- perl/sv.h#355~34770~ 2008-11-07 14:33:39.000000000 -0800
+++ perl/sv.h 2008-11-10 11:13:20.000000000 -0800
@@ -1048,6 +1048,7 @@
# 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 @@
&(((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 @@
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 @@
# 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
End of Patch.