summaryrefslogtreecommitdiff
path: root/gi/pygi-property.c
diff options
context:
space:
mode:
Diffstat (limited to 'gi/pygi-property.c')
-rw-r--r--gi/pygi-property.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/gi/pygi-property.c b/gi/pygi-property.c
index e7afc6b..ae49f08 100644
--- a/gi/pygi-property.c
+++ b/gi/pygi-property.c
@@ -95,6 +95,15 @@ _pygi_lookup_property_from_g_type (GType g_type, const gchar *attr_name)
return ret;
}
+static inline gpointer
+g_value_get_or_dup_boxed (const GValue *value, GITransfer transfer)
+{
+ if (transfer == GI_TRANSFER_EVERYTHING)
+ return g_value_dup_boxed (value);
+ else
+ return g_value_get_boxed (value);
+}
+
PyObject *
pygi_get_property_value_real (PyGObject *instance, GParamSpec *pspec)
{
@@ -194,7 +203,7 @@ pygi_get_property_value_real (PyGObject *instance, GParamSpec *pspec)
case GI_INFO_TYPE_UNION:
if (g_type_is_a (type, G_TYPE_BOXED)) {
- arg.v_pointer = g_value_get_boxed (&value);
+ arg.v_pointer = g_value_dup_boxed (&value);
} else if (g_type_is_a (type, G_TYPE_POINTER)) {
arg.v_pointer = g_value_get_pointer (&value);
} else if (g_type_is_a (type, G_TYPE_VARIANT)) {
@@ -214,12 +223,12 @@ pygi_get_property_value_real (PyGObject *instance, GParamSpec *pspec)
break;
}
case GI_TYPE_TAG_GHASH:
- arg.v_pointer = g_value_get_boxed (&value);
+ arg.v_pointer = g_value_get_or_dup_boxed (&value, transfer);
break;
case GI_TYPE_TAG_GLIST:
case GI_TYPE_TAG_GSLIST:
if (G_VALUE_HOLDS_BOXED(&value))
- arg.v_pointer = g_value_get_boxed (&value);
+ arg.v_pointer = g_value_get_or_dup_boxed (&value, transfer);
else
arg.v_pointer = g_value_get_pointer (&value);
break;
@@ -229,7 +238,7 @@ pygi_get_property_value_real (PyGObject *instance, GParamSpec *pspec)
GArray *arg_items;
int i;
- strings = g_value_get_boxed (&value);
+ strings = g_value_get_or_dup_boxed (&value, transfer);
if (strings == NULL)
arg.v_pointer = NULL;
else {
@@ -250,6 +259,7 @@ pygi_get_property_value_real (PyGObject *instance, GParamSpec *pspec)
}
py_value = _pygi_argument_to_object (&arg, type_info, transfer);
+ g_value_unset (&value);
out:
if (property_info != NULL)
@@ -410,7 +420,7 @@ pygi_set_property_value_real (PyGObject *instance,
strings[i] = g_array_index (arg_items, GIArgument, i).v_string;
}
strings[arg_items->len] = NULL;
- g_value_set_boxed (&value, strings);
+ g_value_take_boxed (&value, strings);
g_array_free (arg_items, TRUE);
break;
}
@@ -422,6 +432,7 @@ pygi_set_property_value_real (PyGObject *instance,
}
g_object_set_property (instance->obj, pspec->name, &value);
+ g_value_unset (&value);
ret_value = 0;