[glib/wip/matthiasc/try-inlining-magic] Work around msvc




commit c2a504cf991ab244bfdd09fcbdf85dfa5eb5e87f
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Oct 2 20:06:58 2022 -0400

    Work around msvc
    
    Just don't bother with inlining for msvc.

 glib/gtestutils.c | 24 ++++++++++++++++++++++++
 glib/gtestutils.h | 16 +++++++++++++++-
 2 files changed, 39 insertions(+), 1 deletion(-)
---
diff --git a/glib/gtestutils.c b/glib/gtestutils.c
index 7730c77c91..b8a850e46f 100644
--- a/glib/gtestutils.c
+++ b/glib/gtestutils.c
@@ -35,9 +35,33 @@
  * Since: 2.16
  */
 
+/* We are providing an inline version of g_strcmp0, as well as a regular,
+ * exported library symbol.
+ *
+ * Our approach to this is following the 'C99 strategy' outlined in
+ * https://www.greenend.org.uk/rjk/tech/inline.html:
+ * Provide an inline definition in the header, and put an extern
+ * declaration into one source file (this one), to force the compiler
+ * to emit an instance of the function in this translation unit.
+ *
+ * Since this does not seem to work with msvc, we arrange things so that
+ * in the msvc case, we provide the usual extern declaration in the header
+ * and not expose the inline definition unless the header is included here,
+ * in which case we are defining away the inline to get a regular instance
+ * of the function.
+ */
+
+#ifdef _MSC_VER
+
+#define GLIB_INLINE
+
+#else
+
 GLIB_AVAILABLE_IN_ALL
 int g_strcmp0 (const char *str1, const char *str2);
 
+#endif
+
 #include "gtestutils.h"
 
 #include "gfileutils.h"
diff --git a/glib/gtestutils.h b/glib/gtestutils.h
index 969c69dda5..96bb5f15f7 100644
--- a/glib/gtestutils.h
+++ b/glib/gtestutils.h
@@ -238,10 +238,22 @@ typedef void (*GTestFixtureFunc) (gpointer      fixture,
                                         } G_STMT_END
 #endif /* !G_DISABLE_ASSERT */
 
+#ifdef _MSC_VER
+
+GLIB_AVAILABLE_IN_ALL
+int g_strcmp0 (const char *str1,
+               const char *str2);
+
+#else
+
 #ifndef GLIB_INLINE
-#define GLIB_INLINE
+#define GLIB_INLINE inline
 #endif
 
+#endif
+
+#ifdef GLIB_INLINE
+
 GLIB_INLINE int
 g_strcmp0 (const char *str1,
            const char *str2)
@@ -253,6 +265,8 @@ g_strcmp0 (const char *str1,
   return strcmp (str1, str2);
 }
 
+#endif
+
 /* report performance results */
 GLIB_AVAILABLE_IN_ALL
 void    g_test_minimized_result         (double          minimized_quantity,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]