This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Use static inline functions for SvREFCNT_inc
authorFather Chrysostomos <sprout@cpan.org>
Sat, 18 Aug 2012 19:34:33 +0000 (12:34 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 21 Aug 2012 23:38:35 +0000 (16:38 -0700)
This avoids the need to repeat the macros in GCC and non-GCC versions.
For non-GCC compilers capable of inlining, this should speed things up
slightly, too, as PL_Sv is no longer needed.

inline.h
sv.h

index 608f6c4..cdcaf04 100644 (file)
--- a/inline.h
+++ b/inline.h
  *
  * Each section names the header file that the functions "belong" to.
  */
+
+/* ------------------------------- sv.h ------------------------------- */
+
+PERL_STATIC_INLINE SV *
+S_SvREFCNT_inc(SV *sv)
+{
+    if (sv)
+       SvREFCNT(sv)++;
+    return sv;
+}
+PERL_STATIC_INLINE SV *
+S_SvREFCNT_inc_NN(SV *sv)
+{
+    SvREFCNT(sv)++;
+    return sv;
+}
+PERL_STATIC_INLINE void
+S_SvREFCNT_inc_void(SV *sv)
+{
+    if (sv)
+       SvREFCNT(sv)++;
+}
diff --git a/sv.h b/sv.h
index ef2b1ae..970d03e 100644 (file)
--- a/sv.h
+++ b/sv.h
@@ -224,42 +224,10 @@ perform the upgrade if necessary.  See C<svtype>.
 #define SvFLAGS(sv)    (sv)->sv_flags
 #define SvREFCNT(sv)   (sv)->sv_refcnt
 
-#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
-#  define SvREFCNT_inc(sv)             \
-    ({                                 \
-       SV * const _sv = MUTABLE_SV(sv);        \
-       if (_sv)                        \
-            (SvREFCNT(_sv))++;         \
-       _sv;                            \
-    })
-#  define SvREFCNT_inc_simple(sv)      \
-    ({                                 \
-       if (sv)                         \
-            (SvREFCNT(sv))++;          \
-       MUTABLE_SV(sv);                         \
-    })
-#  define SvREFCNT_inc_NN(sv)          \
-    ({                                 \
-       SV * const _sv = MUTABLE_SV(sv);        \
-       SvREFCNT(_sv)++;                \
-       _sv;                            \
-    })
-#  define SvREFCNT_inc_void(sv)                \
-    ({                                 \
-       SV * const _sv = MUTABLE_SV(sv);        \
-       if (_sv)                        \
-           (void)(SvREFCNT(_sv)++);    \
-    })
-#else
-#  define SvREFCNT_inc(sv)     \
-       ((PL_Sv=MUTABLE_SV(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL)
-#  define SvREFCNT_inc_simple(sv) \
-       ((sv) ? (SvREFCNT(sv)++,MUTABLE_SV(sv)) : NULL)
-#  define SvREFCNT_inc_NN(sv) \
-       (PL_Sv=MUTABLE_SV(sv),++(SvREFCNT(PL_Sv)),PL_Sv)
-#  define SvREFCNT_inc_void(sv) \
-       (void)((PL_Sv=MUTABLE_SV(sv)) ? ++(SvREFCNT(PL_Sv)) : 0)
-#endif
+#define SvREFCNT_inc(sv)               S_SvREFCNT_inc(MUTABLE_SV(sv))
+#define SvREFCNT_inc_simple(sv)                SvREFCNT_inc(sv)
+#define SvREFCNT_inc_NN(sv)            S_SvREFCNT_inc_NN(MUTABLE_SV(sv))
+#define SvREFCNT_inc_void(sv)          S_SvREFCNT_inc_void(MUTABLE_SV(sv))
 
 /* These guys don't need the curly blocks */
 #define SvREFCNT_inc_simple_void(sv)   STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END