diff -up pygobject-3.8.2/gi/pygi-marshal-cleanup.c.gvalue-memory-leak pygobject-3.8.2/gi/pygi-marshal-cleanup.c --- pygobject-3.8.2/gi/pygi-marshal-cleanup.c.gvalue-memory-leak 2013-03-04 04:19:22.000000000 -0500 +++ pygobject-3.8.2/gi/pygi-marshal-cleanup.c 2014-09-26 09:04:12.780688672 -0400 @@ -29,16 +29,17 @@ _cleanup_caller_allocates (PyGIInvokeSta { PyGIInterfaceCache *iface_cache = (PyGIInterfaceCache *)cache; - if (g_type_is_a (iface_cache->g_type, G_TYPE_BOXED)) { + /* check GValue first because GValue is also a boxed sub-type */ + if (g_type_is_a (iface_cache->g_type, G_TYPE_VALUE)) { + if (was_processed) + g_value_unset (data); + g_slice_free (GValue, data); + } else if (g_type_is_a (iface_cache->g_type, G_TYPE_BOXED)) { gsize size; if (was_processed) return; /* will be cleaned up at deallocation */ size = g_struct_info_get_size (iface_cache->interface_info); g_slice_free1 (size, data); - } else if (iface_cache->g_type == G_TYPE_VALUE) { - if (was_processed) - g_value_unset (data); - g_slice_free (GValue, data); } else if (iface_cache->is_foreign) { if (was_processed) return; /* will be cleaned up at deallocation */