]> jfr.im git - solanum.git/commitdiff
make soft asserts better by allowing them to be used in expressions
authorSimon Arlott <sa.me.uk>
Sat, 29 Jul 2017 16:37:53 +0000 (17:37 +0100)
committerSimon Arlott <sa.me.uk>
Sat, 29 Jul 2017 21:39:53 +0000 (22:39 +0100)
include/s_assert.h
librb/include/rb_lib.h

index 74a481984bd4d1b92998cb371fbe55490b551bd1..d64834135c220911a48cd4b041ff1886625c8c4a 100644 (file)
 
 #include "defaults.h"
 
-#ifdef SOFT_ASSERT
-
 #include "logger.h"
 #include "send.h"
 #include "snomask.h"
 
 #ifdef __GNUC__
-#define s_assert(expr) do                                                              \
-                       if(!(expr)) {                                                   \
+#define ss_assert(expr)        (                                                               \
+                       ((expr)) || (                                                   \
                                ilog(L_MAIN,                                            \
                                "file: %s line: %d (%s): Assertion failed: (%s)",       \
-                               __FILE__, __LINE__, __PRETTY_FUNCTION__, #expr);        \
+                               __FILE__, __LINE__, __PRETTY_FUNCTION__, #expr), 0) || (\
                                sendto_realops_snomask(SNO_GENERAL, L_ALL,              \
                                "file: %s line: %d (%s): Assertion failed: (%s)",       \
-                               __FILE__, __LINE__, __PRETTY_FUNCTION__, #expr);        \
-                       }                                                               \
-                       while(0)
+                               __FILE__, __LINE__, __PRETTY_FUNCTION__, #expr), 0)     \
+                       )
 #else
-#define s_assert(expr) do                                                              \
-                       if(!(expr)) {                                                   \
+#define ss_assert(expr)        (                                                               \
+                       ((expr)) || (                                                   \
                                ilog(L_MAIN,                                            \
                                "file: %s line: %d: Assertion failed: (%s)",            \
-                               __FILE__, __LINE__, #expr);                             \
+                               __FILE__, __LINE__, #expr), 0) || (                     \
                                sendto_realops_snomask(SNO_GENERAL, L_ALL,              \
                                "file: %s line: %d: Assertion failed: (%s)"             \
-                               __FILE__, __LINE__, #expr);                             \
-                       }                                                               \
-                       while(0)
+                               __FILE__, __LINE__, #expr), 0)                          \
+                       )
 #endif
+
+/* evaluates to true if assertion fails */
+#ifdef SOFT_ASSERT
+#define s_assert(expr) (!ss_assert(expr))
 #else
-#define s_assert(expr) assert(expr)
+#define s_assert(expr) (assert(ss_assert(expr)), 0)
 #endif
 
 #endif /* INCLUDED_s_assert_h */
index 2a817408b8b11682f2fd7d83a4f6ae16c3e315ec..e8440f54f6f36c07fe020638447aad27895c07a4 100644 (file)
@@ -128,27 +128,26 @@ char *rb_strerror(int error);
 #endif
 
 #ifdef __GNUC__
-#define slrb_assert(expr)      do                                                              \
-                       if(rb_unlikely(!(expr))) {                                                      \
+#define slrb_assert(expr)      (                                                       \
+                       rb_likely((expr)) || (                                          \
                                rb_lib_log(                                             \
                                "file: %s line: %d (%s): Assertion failed: (%s)",       \
-                               __FILE__, __LINE__, __PRETTY_FUNCTION__, #expr);        \
-                       }                                                               \
-                       while(0)
+                               __FILE__, __LINE__, __PRETTY_FUNCTION__, #expr), 0)     \
+                       )
 #else
-#define slrb_assert(expr)      do                                                              \
-                       if(rb_unlikely(!(expr))) {                                                      \
+#define slrb_assert(expr)      (                                                       \
+                       rb_likely((expr)) || (                                          \
                                rb_lib_log(                                             \
                                "file: %s line: %d: Assertion failed: (%s)",            \
-                               __FILE__, __LINE__, #expr);                             \
-                       }                                                               \
-                       while(0)
+                               __FILE__, __LINE__, #expr), 0)                          \
+                       )
 #endif
 
+/* evaluates to true if assertion fails */
 #ifdef SOFT_ASSERT
-#define lrb_assert(expr)       slrb_assert(expr)
+#define lrb_assert(expr)       (!slrb_assert(expr))
 #else
-#define lrb_assert(expr)       do { slrb_assert(expr); assert(expr); } while(0)
+#define lrb_assert(expr)       (assert(slrb_assert(expr)), 0)
 #endif
 
 #ifdef RB_SOCKADDR_HAS_SA_LEN