Merge branch '488-assert-gobjects-dont-leak' into 'master'

gobject: Add a g_assert_finalize_object() macro

Closes #1780 and #488

See merge request GNOME/glib!859
This commit is contained in:
Philip Withnall 2019-07-25 15:42:39 +00:00
commit 78b1278d44
4 changed files with 37 additions and 12 deletions

View File

@ -322,6 +322,9 @@ g_weak_ref_clear
g_weak_ref_get
g_weak_ref_set
<SUBSECTION Testing>
g_assert_finalize_object
<SUBSECTION Standard>
G_INITIALLY_UNOWNED
G_INITIALLY_UNOWNED_CLASS

View File

@ -77,7 +77,6 @@ test_store_boundaries (void)
store = g_list_store_new (G_TYPE_MENU_ITEM);
item = g_menu_item_new (NULL, NULL);
g_object_add_weak_pointer (G_OBJECT (item), (gpointer *) &item);
/* remove an item from an empty list */
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, "*g_sequence*");
@ -123,8 +122,7 @@ test_store_boundaries (void)
g_assert_cmpuint (g_list_model_get_n_items (G_LIST_MODEL (store)), ==, 1);
g_object_unref (store);
g_object_unref (item);
g_assert_null (item);
g_assert_finalize_object (item);
}
static void

View File

@ -673,18 +673,10 @@ static void
teardown_without_loop (Test *test,
gconstpointer unused)
{
gpointer weak_pointer = test->interaction;
g_object_add_weak_pointer (weak_pointer, &weak_pointer);
g_object_unref (test->connection);
g_object_unref (test->password);
g_object_unref (test->interaction);
g_assert (weak_pointer == NULL);
g_assert_finalize_object (test->interaction);
}
typedef struct {

View File

@ -744,6 +744,38 @@ static inline gboolean
(g_set_object) ((GObject **) (object_ptr), (GObject *) (new_object)) \
)
/**
* g_assert_finalize_object: (skip)
* @object: (transfer full) (type GObject.Object): an object
*
* Assert that @object is non-%NULL, then release one reference to it with
* g_object_unref() and assert that it has been finalized (i.e. that there
* are no more references).
*
* If assertions are disabled via `G_DISABLE_ASSERT`,
* this macro just calls g_object_unref() without any further checks.
*
* This macro should only be used in regression tests.
*
* Since: 2.62
*/
static inline void
(g_assert_finalize_object) (GObject *object)
{
gpointer weak_pointer = object;
g_assert_true (G_IS_OBJECT (weak_pointer));
g_object_add_weak_pointer (object, &weak_pointer);
g_object_unref (weak_pointer);
g_assert_null (weak_pointer);
}
#ifdef G_DISABLE_ASSERT
#define g_assert_finalize_object(object) g_object_unref (object)
#else
#define g_assert_finalize_object(object) (g_assert_finalize_object ((GObject *) object))
#endif
/**
* g_clear_weak_pointer: (skip)
* @weak_pointer_location: The memory address of a pointer