summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Withnall <philip@tecnocode.co.uk>2022-12-21 13:12:54 +0000
committerPhilip Withnall <philip@tecnocode.co.uk>2022-12-21 13:12:54 +0000
commit8f213524b932da57be5bcc9c4e584309c091189e (patch)
treeef849d348232b969389f9a5ba0227c7f8ce35f22
parent9e2ad88455e422d9b2b6324388bbadabddbf1489 (diff)
parentcbb9feb6afae66cb3f40fc5009e4124d9aeff32b (diff)
downloadglib-8f213524b932da57be5bcc9c4e584309c091189e.tar.gz
Merge branch 'gobject-value-set-cleanups' into 'main'
gobject: Some GValue setting code cleanups See merge request GNOME/glib!3156
-rw-r--r--gobject/gobject.c36
-rw-r--r--gobject/tests/value.c1
2 files changed, 15 insertions, 22 deletions
diff --git a/gobject/gobject.c b/gobject/gobject.c
index 8930fde06..19ed1a866 100644
--- a/gobject/gobject.c
+++ b/gobject/gobject.c
@@ -4396,18 +4396,15 @@ g_value_object_init (GValue *value)
static void
g_value_object_free_value (GValue *value)
{
- if (value->data[0].v_pointer)
- g_object_unref (value->data[0].v_pointer);
+ g_clear_object ((GObject**) &value->data[0].v_pointer);
}
static void
g_value_object_copy_value (const GValue *src_value,
GValue *dest_value)
{
- if (src_value->data[0].v_pointer)
- dest_value->data[0].v_pointer = g_object_ref (src_value->data[0].v_pointer);
- else
- dest_value->data[0].v_pointer = NULL;
+ g_set_object ((GObject**) &dest_value->data[0].v_pointer,
+ src_value->data[0].v_pointer);
}
static void
@@ -4499,24 +4496,23 @@ g_value_set_object (GValue *value,
gpointer v_object)
{
GObject *old;
-
+
g_return_if_fail (G_VALUE_HOLDS_OBJECT (value));
- old = value->data[0].v_pointer;
-
+ if G_UNLIKELY (value->data[0].v_pointer == v_object)
+ return;
+
+ old = g_steal_pointer (&value->data[0].v_pointer);
+
if (v_object)
{
g_return_if_fail (G_IS_OBJECT (v_object));
g_return_if_fail (g_value_type_compatible (G_OBJECT_TYPE (v_object), G_VALUE_TYPE (value)));
- value->data[0].v_pointer = v_object;
- g_object_ref (value->data[0].v_pointer);
+ value->data[0].v_pointer = g_object_ref (v_object);
}
- else
- value->data[0].v_pointer = NULL;
-
- if (old)
- g_object_unref (old);
+
+ g_clear_object (&old);
}
/**
@@ -4556,18 +4552,14 @@ g_value_take_object (GValue *value,
{
g_return_if_fail (G_VALUE_HOLDS_OBJECT (value));
- if (value->data[0].v_pointer)
- {
- g_object_unref (value->data[0].v_pointer);
- value->data[0].v_pointer = NULL;
- }
+ g_clear_object ((GObject **) &value->data[0].v_pointer);
if (v_object)
{
g_return_if_fail (G_IS_OBJECT (v_object));
g_return_if_fail (g_value_type_compatible (G_OBJECT_TYPE (v_object), G_VALUE_TYPE (value)));
- value->data[0].v_pointer = v_object; /* we take over the reference count */
+ value->data[0].v_pointer = g_steal_pointer (&v_object);
}
}
diff --git a/gobject/tests/value.c b/gobject/tests/value.c
index c294020ed..73a5de650 100644
--- a/gobject/tests/value.c
+++ b/gobject/tests/value.c
@@ -719,6 +719,7 @@ test_value_transform_object (void)
g_value_init (&src, types[s]);
g_value_set_object (&src, object);
+ g_value_set_object (&src, g_value_get_object (&src));
for (d = 0; d < G_N_ELEMENTS (types); d++)
{