This patch makes NIH_{SHOULD,ZERO,MUST} return the values of their 
arguments, so

        NIH_MUST (foo = bar());

becomes

        foo = NIH_MUST (bar());

--CJD


=== modified file 'nih/error.h'
--- nih/error.h 2008-05-18 11:38:29 +0000
+++ nih/error.h 2009-02-17 21:09:01 +0000
@@ -95,18 +95,20 @@


  /* Force a true value, checking for ENOMEM on a false one */
-#define NIH_SHOULD(_e)                                           \
-       while (! (_e)) {                                          \
-               NihError *_nih_should_err;                        \
-                                                                 \
-               _nih_should_err = nih_error_get ();               \
-               if (_nih_should_err->number == ENOMEM) {          \
-                       nih_free (_nih_should_err);               \
-               } else {                                          \
-                       nih_error_raise_again (_nih_should_err);  \
-                       break;                                    \
-               }                                                 \
-       }
+#define NIH_SHOULD(_e) ({                      \
+       typeof (_e) ret;                        \
+       while (! (ret = (_e))) {                \
+               NihError *err;                  \
+                                               \
+               err = nih_error_get ();         \
+               if (err->number != ENOMEM) {    \
+                       nih_free (err);         \
+                       ret = (typeof (ret))0;  \
+               }                               \
+               nih_free (err);                 \
+       }                                       \
+       ret;                                    \
+)}


  NIH_BEGIN_EXTERN

=== modified file 'nih/macros.h'
--- nih/macros.h        2007-03-08 12:07:16 +0000
+++ nih/macros.h        2009-02-17 21:09:16 +0000
@@ -65,10 +65,17 @@
  #define NIH_LIKELY(_e)   __builtin_expect ((_e) ? TRUE : FALSE, TRUE)
  #define NIH_UNLIKELY(_e) __builtin_expect ((_e) ? TRUE : FALSE, FALSE)

-/* Force a true or false value, _e must be an assignment expression */
-#define NIH_MUST(_e) while (! (_e))
-#define NIH_ZERO(_e) while ((_e))
-
+/* Force a true or false value */
+#define NIH_MUST(_e) ({                \
+       typeof (_e) ret;        \
+       while (! (ret = (_e))); \
+       ret;                    \
+})
+#define NIH_ZERO(_e) ({                \
+       typeof (_e) ret;        \
+       while (ret = (_e));     \
+       ret;                    \
+})

  /* Make gettext friendlier */
  #if ENABLE_NLS


-- 
upstart-devel mailing list
upstart-devel@lists.ubuntu.com
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/upstart-devel

Reply via email to