As suggested by Philip Withnall in dbus!43.
Signed-off-by: Simon McVittie <smcv@collabora.com>
retval = TRUE;
out:
- if (!retval)
- _DBUS_ASSERT_ERROR_IS_SET (error);
- else
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+ _DBUS_ASSERT_ERROR_XOR_BOOL (error, retval);
if (iter != NULL)
_dbus_directory_close (iter);
parser.desktop_file = NULL;
out:
- if (result != NULL)
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
- else
- _DBUS_ASSERT_ERROR_IS_SET (error);
-
+ _DBUS_ASSERT_ERROR_XOR_BOOL (error, result != NULL);
parser_clear (&parser);
return result;
}
ret = TRUE;
out:
- if (ret)
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
- else
- _DBUS_ASSERT_ERROR_IS_SET (error);
+ _DBUS_ASSERT_ERROR_XOR_BOOL (error, ret);
for (iter = _dbus_list_get_first_link (&rules);
iter != NULL;
_dbus_string_free (&tmp_filename);
- if (!retval)
- _DBUS_ASSERT_ERROR_IS_SET (error);
-
+ _DBUS_ASSERT_ERROR_XOR_BOOL (error, retval);
return retval;
}
*/
#define _DBUS_ASSERT_ERROR_IS_SET(error) do { } while (0)
#define _DBUS_ASSERT_ERROR_IS_CLEAR(error) do { } while (0)
+#define _DBUS_ASSERT_ERROR_XOR_BOOL(error, retval) do { } while (0)
#else
static inline void
_dbus_assert_error_is_set (const DBusError *error)
_dbus_assert (error == NULL || !dbus_error_is_set (error));
}
+static inline void
+_dbus_assert_error_xor_bool (const DBusError *error,
+ dbus_bool_t retval)
+{
+ _dbus_assert (error == NULL || dbus_error_is_set (error) == !retval);
+}
+
+/**
+ * Assert that error is set, unless it is NULL in which case we cannot
+ * tell whether it would have been set.
+ */
#define _DBUS_ASSERT_ERROR_IS_SET(error) _dbus_assert_error_is_set(error)
+
+/**
+ * Assert that error is not set, unless it is NULL in which case we cannot
+ * tell whether it would have been set.
+ */
#define _DBUS_ASSERT_ERROR_IS_CLEAR(error) _dbus_assert_error_is_clear(error)
+
+/**
+ * Assert that error is consistent with retval: if error is not NULL,
+ * it must be set if and only if retval is false.
+ *
+ * retval can be a boolean expression like "result != NULL".
+ */
+#define _DBUS_ASSERT_ERROR_XOR_BOOL(error, retval), _dbus_assert_error_xor_bool (error, retval)
#endif
#define _dbus_return_if_error_is_set(error) _dbus_return_if_fail ((error) == NULL || !dbus_error_is_set ((error)))
out:
sigprocmask (SIG_SETMASK, &old_set, NULL);
- if (retval)
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
- else
- _DBUS_ASSERT_ERROR_IS_SET (error);
+ _DBUS_ASSERT_ERROR_XOR_BOOL (error, retval);
if (result_pipe[0] != -1)
close (result_pipe[0]);
}
out:
- if (retval)
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
- else
- _DBUS_ASSERT_ERROR_IS_SET (error);
-
+ _DBUS_ASSERT_ERROR_XOR_BOOL (error, retval);
_dbus_global_unlock (mutex);
_dbus_string_free (&shm_name);
}
result = check_address (_dbus_string_get_const_data (&address), error);
- if (result == NULL)
- _DBUS_ASSERT_ERROR_IS_SET (error);
- else
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+ _DBUS_ASSERT_ERROR_XOR_BOOL (error, result != NULL);
out:
_dbus_string_free (&address);