diff options
author | Benjamin Otte <otte@redhat.com> | 2019-11-25 19:56:47 +0100 |
---|---|---|
committer | Philip Withnall <pwithnall@endlessos.org> | 2020-11-02 17:36:18 +0000 |
commit | 3f2a8d53f0277cf5e77c7bfccc4fa51101eb42ef (patch) | |
tree | de50507af77c3c94a8f1dfea3ef9c5ee21a09e81 /gobject/gclosure.c | |
parent | 98f0a5a7da69d5d7ed2853fb1c58ed2d4aeff809 (diff) | |
download | glib-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.c | 16 |
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))); } } |