summaryrefslogtreecommitdiff
path: root/gobject/gclosure.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2019-11-25 19:56:47 +0100
committerPhilip Withnall <pwithnall@endlessos.org>2020-11-02 17:36:18 +0000
commit3f2a8d53f0277cf5e77c7bfccc4fa51101eb42ef (patch)
treede50507af77c3c94a8f1dfea3ef9c5ee21a09e81 /gobject/gclosure.c
parent98f0a5a7da69d5d7ed2853fb1c58ed2d4aeff809 (diff)
downloadglib-3f2a8d53f0277cf5e77c7bfccc4fa51101eb42ef.tar.gz
closure: Support generic marshals for interface returns
Use the newly added g_type_interface_instantiable_prerequisite() to allow closure return values being interfaces by looking up the instantiable type for the interface and using its GValue accessors.
Diffstat (limited to 'gobject/gclosure.c')
-rw-r--r--gobject/gclosure.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/gobject/gclosure.c b/gobject/gclosure.c
index 7caf9c4e6..1d1f2f48a 100644
--- a/gobject/gclosure.c
+++ b/gobject/gclosure.c
@@ -1258,8 +1258,12 @@ static void
value_from_ffi_type (GValue *gvalue, gpointer *value)
{
ffi_arg *int_val = (ffi_arg*) value;
+ GType type;
- switch (g_type_fundamental (G_VALUE_TYPE (gvalue)))
+ type = G_VALUE_TYPE (gvalue);
+
+restart:
+ switch (g_type_fundamental (type))
{
case G_TYPE_INT:
g_value_set_int (gvalue, (gint) *int_val);
@@ -1318,9 +1322,15 @@ value_from_ffi_type (GValue *gvalue, gpointer *value)
case G_TYPE_VARIANT:
g_value_take_variant (gvalue, *(gpointer*)value);
break;
+ case G_TYPE_INTERFACE:
+ type = g_type_interface_instantiatable_prerequisite (type);
+ if (type)
+ goto restart;
+ G_GNUC_FALLTHROUGH;
default:
- g_warning ("value_from_ffi_type: Unsupported fundamental type: %s",
- g_type_name (g_type_fundamental (G_VALUE_TYPE (gvalue))));
+ g_warning ("value_from_ffi_type: Unsupported fundamental type %s for type %s",
+ g_type_name (g_type_fundamental (G_VALUE_TYPE (gvalue))),
+ g_type_name (G_VALUE_TYPE (gvalue)));
}
}