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 usings its GValue accessors.
This commit is contained in:
Benjamin Otte 2019-11-25 19:56:47 +01:00
parent eb20dec144
commit e994d45352

View File

@ -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_instantiable_prerequisite (G_VALUE_TYPE (gvalue));
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)));
}
}