Assert that GvSTASH is only called on PVGVs and PVLVs.
Nicholas Clark [Fri, 24 Feb 2006 11:52:53 +0000 (11:52 +0000)]
p4raw-id: //depot/perl@27307

gv.h

diff --git a/gv.h b/gv.h
index 250c7b9..da9da4a 100644 (file)
--- a/gv.h
+++ b/gv.h
@@ -38,9 +38,17 @@ struct gp {
 
 #define GvNAME(gv)     (GvXPVGV(gv)->xgv_name)
 #define GvNAMELEN(gv)  (GvXPVGV(gv)->xgv_namelen)
-#define GvSTASH(gv)    (GvXPVGV(gv)->xgv_stash)
 #define GvFLAGS(gv)    (GvXPVGV(gv)->xgv_flags)
 
+#if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#  define GvSTASH(gv)                                                  \
+       (*({ GV *_gv = (GV *) gv;                                       \
+           assert(SvTYPE(_gv) == SVt_PVGV || SvTYPE(_gv) >= SVt_PVLV); \
+           &(GvXPVGV(_gv)->xgv_stash);                                 \
+        }))
+#else
+#define GvSTASH(gv)    (GvXPVGV(gv)->xgv_stash)
+#endif
 /*
 =head1 GV Functions