summaryrefslogtreecommitdiff
path: root/gobject/gclosure.c
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2021-10-29 10:31:18 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2021-10-29 10:31:18 +0900
commitc56d78b101fcc361d6cd5467c59aed4ec78c44af (patch)
tree60f4ffe43fd8b282f67f344c75648e53387695f6 /gobject/gclosure.c
parent12500068fcfd930af96d75506201fda8d829220b (diff)
downloadglib-c56d78b101fcc361d6cd5467c59aed4ec78c44af.tar.gz
glib-c56d78b101fcc361d6cd5467c59aed4ec78c44af.tar.bz2
glib-c56d78b101fcc361d6cd5467c59aed4ec78c44af.zip
Imported Upstream version 2.67.1upstream/2.67.1
Diffstat (limited to 'gobject/gclosure.c')
-rw-r--r--gobject/gclosure.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/gobject/gclosure.c b/gobject/gclosure.c
index 7caf9c4e6..6d41e6d8a 100644
--- a/gobject/gclosure.c
+++ b/gobject/gclosure.c
@@ -98,7 +98,7 @@
typedef union {
GClosure closure;
- volatile gint vint;
+ gint vint;
} ClosureInt;
#define CHANGE_FIELD(_closure, _field, _OP, _value, _must_set, _SET_OLD, _SET_NEW) \
@@ -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)));
}
}