summaryrefslogtreecommitdiff
path: root/sv.h
diff options
context:
space:
mode:
Diffstat (limited to 'sv.h')
-rw-r--r--sv.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/sv.h b/sv.h
index 3ba04fefdf..cf408e88f1 100644
--- a/sv.h
+++ b/sv.h
@@ -138,7 +138,22 @@ perform the upgrade if necessary. See C<svtype>.
((PL_Sv=(SV*)(sv)), (PL_Sv && ++(SvREFCNT(PL_Sv))), (SV*)PL_Sv)
#endif
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+# define SvREFCNT_dec(sv) \
+ ({ \
+ SV *nsv = (SV*)(sv); \
+ if (nsv) { \
+ if (SvREFCNT(nsv)) { \
+ if (--(SvREFCNT(nsv)) == 0) \
+ Perl_sv_free2(aTHX_ nsv); \
+ } else { \
+ sv_free(nsv); \
+ } \
+ } \
+ })
+#else
#define SvREFCNT_dec(sv) sv_free((SV*)(sv))
+#endif
#define SVTYPEMASK 0xff
#define SvTYPE(sv) ((sv)->sv_flags & SVTYPEMASK)