+static gboolean
+test_signal3_accumulator (GSignalInvocationHint *ihint,
+ GValue *return_accu,
+ const GValue *handler_return,
+ gpointer data)
+{
+ GVariant *variant;
+
+ variant = g_value_get_variant (handler_return);
+ g_assert (!g_variant_is_floating (variant));
+
+ g_value_set_variant (return_accu, variant);
+
+ return variant == NULL;
+}
+
+/* To be notified when the variant is finalised, we construct
+ * it from data with a custom GDestroyNotify.
+ */
+
+typedef struct {
+ char *mem;
+ gsize n;
+ gboolean *weak_ptr;
+} VariantData;
+
+static void
+free_data (VariantData *data)
+{
+ *(data->weak_ptr) = TRUE;
+ g_free (data->mem);
+ g_slice_free (VariantData, data);
+}
+
+static GVariant *
+test_object_real_signal3 (TestObject *tobject,
+ gboolean *weak_ptr)
+{
+ GVariant *variant;
+ VariantData *data;
+
+ variant = g_variant_ref_sink (g_variant_new_uint32 (42));
+ data = g_slice_new (VariantData);
+ data->weak_ptr = weak_ptr;
+ data->n = g_variant_get_size (variant);
+ data->mem = g_malloc (data->n);
+ g_variant_store (variant, data->mem);
+ g_variant_unref (variant);
+
+ variant = g_variant_new_from_data (G_VARIANT_TYPE ("u"),
+ data->mem,
+ data->n,
+ TRUE,
+ (GDestroyNotify) free_data,
+ data);
+ return g_variant_ref_sink (variant);
+}
+