Convert all (CV *) casts to (const CV *). Convert (XPVCV*) casts to add
Nicholas Clark [Mon, 27 Oct 2008 21:43:01 +0000 (21:43 +0000)]
MUTABLE_PTR(), to validate that there is no casting away of const.

p4raw-id: //depot/perl@34610

cop.h
cv.h

diff --git a/cop.h b/cop.h
index 3cd3d69..e64bb76 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -347,9 +347,9 @@ struct block_format {
 
 #define POPSUB(cx,sv)                                                  \
     STMT_START {                                                       \
-       RETURN_PROBE(GvENAME(CvGV((CV*)cx->blk_sub.cv)),                \
-               CopFILE((COP*)CvSTART((CV*)cx->blk_sub.cv)),            \
-               CopLINE((COP*)CvSTART((CV*)cx->blk_sub.cv)));           \
+       RETURN_PROBE(GvENAME(CvGV((const CV*)cx->blk_sub.cv)),          \
+               CopFILE((COP*)CvSTART((const CV*)cx->blk_sub.cv)),      \
+               CopLINE((COP*)CvSTART((const CV*)cx->blk_sub.cv)));     \
                                                                        \
        if (CxHASARGS(cx)) {                                            \
            POP_SAVEARRAY();                                            \
@@ -367,7 +367,7 @@ struct block_format {
            }                                                           \
        }                                                               \
        sv = MUTABLE_SV(cx->blk_sub.cv);                                \
-       if (sv && (CvDEPTH((CV*)sv) = cx->blk_sub.olddepth))            \
+       if (sv && (CvDEPTH((const CV*)sv) = cx->blk_sub.olddepth))      \
            sv = NULL;                                          \
     } STMT_END
 
diff --git a/cv.h b/cv.h
index b5a903a..bd504fd 100644 (file)
--- a/cv.h
+++ b/cv.h
@@ -42,13 +42,13 @@ Returns the stash of the CV.
 #  define Nullcv Null(CV*)
 #endif
 
-#define CvSTASH(sv)    ((XPVCV*)SvANY(sv))->xcv_stash
-#define CvSTART(sv)    ((XPVCV*)SvANY(sv))->xcv_start_u.xcv_start
-#define CvROOT(sv)     ((XPVCV*)SvANY(sv))->xcv_root_u.xcv_root
-#define CvXSUB(sv)     ((XPVCV*)SvANY(sv))->xcv_root_u.xcv_xsub
-#define CvXSUBANY(sv)  ((XPVCV*)SvANY(sv))->xcv_start_u.xcv_xsubany
-#define CvGV(sv)       ((XPVCV*)SvANY(sv))->xcv_gv
-#define CvFILE(sv)     ((XPVCV*)SvANY(sv))->xcv_file
+#define CvSTASH(sv)    ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_stash
+#define CvSTART(sv)    ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_start_u.xcv_start
+#define CvROOT(sv)     ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_root
+#define CvXSUB(sv)     ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_xsub
+#define CvXSUBANY(sv)  ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_start_u.xcv_xsubany
+#define CvGV(sv)       ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_gv
+#define CvFILE(sv)     ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_file
 #ifdef USE_ITHREADS
 #  define CvFILE_set_from_cop(sv, cop) (CvFILE(sv) = savepv(CopFILE(cop)))
 #else
@@ -56,17 +56,17 @@ Returns the stash of the CV.
 #endif
 #define CvFILEGV(sv)   (gv_fetchfile(CvFILE(sv)))
 #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
-#  define CvDEPTH(sv) (*({const CV *_cvdepth = (CV *)sv;         \
+#  define CvDEPTH(sv) (*({const CV *const _cvdepth = (const CV *)sv; \
                          assert(SvTYPE(_cvdepth) == SVt_PVCV);  \
                          &((XPVCV*)SvANY(_cvdepth))->xiv_u.xivu_i32; \
                        }))
 #else
-#  define CvDEPTH(sv)  ((XPVCV*)SvANY(sv))->xiv_u.xivu_i32
+#  define CvDEPTH(sv)  ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xiv_u.xivu_i32
 #endif
-#define CvPADLIST(sv)  ((XPVCV*)SvANY(sv))->xcv_padlist
-#define CvOUTSIDE(sv)  ((XPVCV*)SvANY(sv))->xcv_outside
-#define CvFLAGS(sv)    ((XPVCV*)SvANY(sv))->xcv_flags
-#define CvOUTSIDE_SEQ(sv) ((XPVCV*)SvANY(sv))->xcv_outside_seq
+#define CvPADLIST(sv)  ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_padlist
+#define CvOUTSIDE(sv)  ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_outside
+#define CvFLAGS(sv)    ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_flags
+#define CvOUTSIDE_SEQ(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_outside_seq
 
 #define CVf_METHOD     0x0001  /* CV is explicitly marked as a method */
 #define CVf_LOCKED     0x0002  /* CV locks itself or first arg on entry */