-#define RX_PRELEN(prog) (RX_WRAPLEN(prog) - ((struct regexp *)SvANY(prog))->pre_prefix - 1)
-#define RX_WRAPPED(prog) SvPVX(prog)
-#define RX_WRAPPED_const(prog) SvPVX_const(prog)
-#define RX_WRAPLEN(prog) SvCUR(prog)
-#define RX_CHECK_SUBSTR(prog) (((struct regexp *)SvANY(prog))->check_substr)
-#define RX_REFCNT(prog) SvREFCNT(prog)
-#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
-# define RX_EXTFLAGS(prog) \
- (*({ \
- const REGEXP *const _rx_extflags = (prog); \
- assert(SvTYPE(_rx_extflags) == SVt_REGEXP); \
- &RXp_EXTFLAGS(SvANY(_rx_extflags)); \
- }))
-# define RX_ENGINE(prog) \
- (*({ \
- const REGEXP *const _rx_engine = (prog); \
- assert(SvTYPE(_rx_engine) == SVt_REGEXP); \
- &SvANY(_rx_engine)->engine; \
- }))
-# define RX_SUBBEG(prog) \
- (*({ \
- const REGEXP *const _rx_subbeg = (prog); \
- assert(SvTYPE(_rx_subbeg) == SVt_REGEXP); \
- &SvANY(_rx_subbeg)->subbeg; \
- }))
-# define RX_SUBOFFSET(prog) \
- (*({ \
- const REGEXP *const _rx_suboffset = (prog); \
- assert(SvTYPE(_rx_suboffset) == SVt_REGEXP); \
- &SvANY(_rx_suboffset)->suboffset; \
- }))
-# define RX_SUBCOFFSET(prog) \
- (*({ \
- const REGEXP *const _rx_subcoffset = (prog); \
- assert(SvTYPE(_rx_subcoffset) == SVt_REGEXP); \
- &SvANY(_rx_subcoffset)->subcoffset; \
- }))
-# define RX_OFFS(prog) \
- (*({ \
- const REGEXP *const _rx_offs = (prog); \
- assert(SvTYPE(_rx_offs) == SVt_REGEXP); \
- &SvANY(_rx_offs)->offs; \
- }))
-# define RX_NPARENS(prog) \
- (*({ \
- const REGEXP *const _rx_nparens = (prog); \
- assert(SvTYPE(_rx_nparens) == SVt_REGEXP); \
- &SvANY(_rx_nparens)->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_SUBOFFSET(prog) (((struct regexp *)SvANY(prog))->suboffset)
-# define RX_SUBCOFFSET(prog) (((struct regexp *)SvANY(prog))->subcoffset)
-# 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_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)
-#define RX_LASTPAREN(prog) (((struct regexp *)SvANY(prog))->lastparen)
-#define RX_LASTCLOSEPAREN(prog) (((struct regexp *)SvANY(prog))->lastcloseparen)
-#define RX_SAVED_COPY(prog) (((struct regexp *)SvANY(prog))->saved_copy)
+#define RX_PRELEN(rx_sv) (RX_WRAPLEN(rx_sv) \
+ - ReANY(rx_sv)->pre_prefix - 1)
+
+#define RX_WRAPPED(rx_sv) SvPVX(rx_sv)
+#define RX_WRAPPED_const(rx_sv) SvPVX_const(rx_sv)
+#define RX_WRAPLEN(rx_sv) SvCUR(rx_sv)
+#define RX_CHECK_SUBSTR(rx_sv) (ReANY(rx_sv)->check_substr)
+#define RX_REFCNT(rx_sv) SvREFCNT(rx_sv)
+#define RX_EXTFLAGS(rx_sv) RXp_EXTFLAGS(ReANY(rx_sv))
+#define RX_COMPFLAGS(rx_sv) RXp_COMPFLAGS(ReANY(rx_sv))
+#define RXp_ENGINE(prog) ((prog)->engine)
+#define RX_ENGINE(rx_sv) (RXp_ENGINE(ReANY(rx_sv)))
+#define RXp_SUBBEG(prog) (prog->subbeg)
+#define RX_SUBBEG(rx_sv) (RXp_SUBBEG(ReANY(rx_sv)))
+#define RXp_SUBOFFSET(prog) (prog->suboffset)
+#define RX_SUBOFFSET(rx_sv) (RXp_SUBOFFSET(ReANY(rx_sv)))
+#define RX_SUBCOFFSET(rx_sv) (ReANY(rx_sv)->subcoffset)
+#define RXp_OFFS(prog) (prog->offs)
+#define RX_OFFS(rx_sv) (RXp_OFFS(ReANY(rx_sv)))
+#define RXp_NPARENS(prog) (prog->nparens)
+#define RX_NPARENS(rx_sv) (RXp_NPARENS(ReANY(rx_sv)))
+#define RX_SUBLEN(rx_sv) (ReANY(rx_sv)->sublen)
+#define RXp_MINLEN(prog) (prog->minlen)
+#define RX_MINLEN(rx_sv) (RXp_MINLEN(ReANY(rx_sv)))
+#define RXp_MINLENRET(prog) (prog->minlenret)
+#define RX_MINLENRET(rx_sv) (RXp_MINLENRET(ReANY(rx_sv)))
+#define RXp_GOFS(prog) (prog->gofs)
+#define RX_GOFS(rx_sv) (RXp_GOFS(ReANY(rx_sv)))
+#define RX_LASTPAREN(rx_sv) (ReANY(rx_sv)->lastparen)
+#define RX_LASTCLOSEPAREN(rx_sv) (ReANY(rx_sv)->lastcloseparen)
+#define RXp_SAVED_COPY(prog) (prog->saved_copy)
+#define RX_SAVED_COPY(rx_sv) (RXp_SAVED_COPY(ReANY(rx_sv)))
+/* last match was zero-length */
+#define RXp_ZERO_LEN(prog) \
+ (RXp_OFFS(prog)[0].start + (SSize_t)RXp_GOFS(prog) \
+ == RXp_OFFS(prog)[0].end)
+#define RX_ZERO_LEN(rx_sv) (RXp_ZERO_LEN(ReANY(rx_sv)))