summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2022-12-20 02:09:09 +0100
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2022-12-20 17:48:21 +0100
commitbc59ed8fba0f171399967e692153e72ac911b7d0 (patch)
treeaa19a78afb11eefe652fa4ede22b918463c270eb
parentcbee90b8a4a0d4de40425f11ba15300db5284b5e (diff)
downloadglib-bc59ed8fba0f171399967e692153e72ac911b7d0.tar.gz
gobject: Avoid the ref/unref dance if assigning the same to a value
g_value_set_object could lead to perform unneeded ref/unref operations in case we were trying to set again an object to a GValue
-rw-r--r--gobject/gobject.c5
-rw-r--r--gobject/tests/value.c1
2 files changed, 5 insertions, 1 deletions
diff --git a/gobject/gobject.c b/gobject/gobject.c
index 8930fde06..5a3b70b5f 100644
--- a/gobject/gobject.c
+++ b/gobject/gobject.c
@@ -4502,8 +4502,11 @@ g_value_set_object (GValue *value,
g_return_if_fail (G_VALUE_HOLDS_OBJECT (value));
+ if G_UNLIKELY (value->data[0].v_pointer == v_object)
+ return;
+
old = value->data[0].v_pointer;
-
+
if (v_object)
{
g_return_if_fail (G_IS_OBJECT (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++)
{