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.

Reply via email to