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.
This commit is contained in:
Benjamin Otte 2019-11-25 19:56:47 +01:00 committed by Philip Withnall
parent 98f0a5a7da
commit 3f2a8d53f0

View File

@ -1258,8 +1258,12 @@ static void
value_from_ffi_type (GValue *gvalue, gpointer *value) value_from_ffi_type (GValue *gvalue, gpointer *value)
{ {
ffi_arg *int_val = (ffi_arg*) 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: case G_TYPE_INT:
g_value_set_int (gvalue, (gint) *int_val); g_value_set_int (gvalue, (gint) *int_val);
@ -1318,9 +1322,15 @@ value_from_ffi_type (GValue *gvalue, gpointer *value)
case G_TYPE_VARIANT: case G_TYPE_VARIANT:
g_value_take_variant (gvalue, *(gpointer*)value); g_value_take_variant (gvalue, *(gpointer*)value);
break; break;
case G_TYPE_INTERFACE:
type = g_type_interface_instantiatable_prerequisite (type);
if (type)
goto restart;
G_GNUC_FALLTHROUGH;
default: default:
g_warning ("value_from_ffi_type: Unsupported fundamental type: %s", 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_type_fundamental (G_VALUE_TYPE (gvalue))),
g_type_name (G_VALUE_TYPE (gvalue)));
} }
} }