summaryrefslogtreecommitdiff
path: root/regexp.h
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2008-01-11 19:01:39 +0000
committerNicholas Clark <nick@ccl4.org>2008-01-11 19:01:39 +0000
commit4450b6304425eed02bdbb4c8eaf1732145082409 (patch)
tree8f2686fe2253a383091cb658fec2c4a15c96fa33 /regexp.h
parent895aa832c42328fe103a78a829d7dcfa39731ca7 (diff)
downloadperl-4450b6304425eed02bdbb4c8eaf1732145082409.tar.gz
assert that these are the regexps you were looking for.
(at least for the most commonly used macros). Remove the duplicate definition of RX_SUBBEG(), which I was sure I'd done earlier. p4raw-id: //depot/perl@32961
Diffstat (limited to 'regexp.h')
-rw-r--r--regexp.h45
1 files changed, 39 insertions, 6 deletions
diff --git a/regexp.h b/regexp.h
index 74973aeb5f..9bd4d2d310 100644
--- a/regexp.h
+++ b/regexp.h
@@ -378,14 +378,46 @@ and check for NULL.
#define RX_WRAPPED(prog) SvPVX(prog)
#define RX_WRAPLEN(prog) SvCUR(prog)
#define RX_CHECK_SUBSTR(prog) (((struct regexp *)SvANY(prog))->check_substr)
-#define RX_EXTFLAGS(prog) RXp_EXTFLAGS((struct regexp *)SvANY(prog))
#define RX_REFCNT(prog) SvREFCNT(prog)
-#define RX_ENGINE(prog) (((struct regexp *)SvANY(prog))->engine)
-#define RX_SUBBEG(prog) (((struct regexp *)SvANY(prog))->subbeg)
-#define RX_OFFS(prog) (((struct regexp *)SvANY(prog))->offs)
-#define RX_NPARENS(prog) (((struct regexp *)SvANY(prog))->nparens)
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+# define RX_EXTFLAGS(prog) \
+ (*({ \
+ REGEXP *const thwape = (prog); \
+ assert(SvTYPE(thwape) == SVt_REGEXP); \
+ &RXp_EXTFLAGS(SvANY(thwape)); \
+ }))
+# define RX_ENGINE(prog) \
+ (*({ \
+ REGEXP *const thwape = (prog); \
+ assert(SvTYPE(thwape) == SVt_REGEXP); \
+ &SvANY(thwape)->engine; \
+ }))
+# define RX_SUBBEG(prog) \
+ (*({ \
+ REGEXP *const thwape = (prog); \
+ assert(SvTYPE(thwape) == SVt_REGEXP); \
+ &SvANY(thwape)->subbeg; \
+ }))
+# define RX_SUBBEG(prog) \
+ (*({ \
+ REGEXP *const thwape = (prog); \
+ assert(SvTYPE(thwape) == SVt_REGEXP); \
+ &SvANY(thwape)->subbeg; \
+ }))
+# define RX_NPARENS(prog) \
+ (*({ \
+ REGEXP *const thwape = (prog); \
+ assert(SvTYPE(thwape) == SVt_REGEXP); \
+ &SvANY(thwape)->nparens; \
+ }))
+#else
+# define RX_EXTFLAGS(prog) RXp_EXTFLAGS((struct regexp *)SvANY(prog))
+# define RX_ENGINE(prog) (((struct regexp *)SvANY(prog))->engine)
+# define RX_SUBBEG(prog) (((struct regexp *)SvANY(prog))->subbeg)
+# define RX_OFFS(prog) (((struct regexp *)SvANY(prog))->offs)
+# define RX_NPARENS(prog) (((struct regexp *)SvANY(prog))->nparens)
+#endif
#define RX_SUBLEN(prog) (((struct regexp *)SvANY(prog))->sublen)
-#define RX_SUBBEG(prog) (((struct regexp *)SvANY(prog))->subbeg)
#define RX_MINLEN(prog) (((struct regexp *)SvANY(prog))->minlen)
#define RX_MINLENRET(prog) (((struct regexp *)SvANY(prog))->minlenret)
#define RX_GOFS(prog) (((struct regexp *)SvANY(prog))->gofs)
@@ -437,6 +469,7 @@ and check for NULL.
({ \
/* This is here to generate a casting warning if incorrect. */ \
REGEXP *const zwapp = (re); \
+ assert(SvTYPE(zwapp) == SVt_REGEXP); \
(REGEXP *) SvREFCNT_inc(zwapp); \
})
# define ReREFCNT_dec(re) \