Critical 'G_VALUE_HOLDS_BOXED (value)' when emitting signal async
Regression of 4db1b33e.
Marshaller g_cclosure_user_marshal_VOID__POINTER_POINTER
is wrongly created using g_value_get_boxed
instead of g_value_get_pointer
errordomain FooError {
BAD;
}
struct Bar {
public int i;
}
class Foo : GLib.Object {
signal void foo (void* p, Bar bar);
signal void bar (void* p, Error e);
public Foo () {
bar.connect (callback);
bar (null, new FooError.BAD ("bad"));
}
void callback (void* p, Error e) {
assert (p == null);
assert (e.code == FooError.BAD);
}
}
void main() {
var foo = new Foo ();
}
$ ./test
(process:73262): GLib-GObject-CRITICAL **: 08:38:49.910: g_value_get_boxed: assertion 'G_VALUE_HOLDS_BOXED (value)' failed
** (process:73262): CRITICAL **: 08:38:49.910: foo_callback: assertion 'e != NULL' failed
--- test.c
+++ test.c
@@ -1,4 +1,4 @@
-/* test.c generated by valac 0.48.7, the Vala compiler
+/* test.c generated by valac 0.48.2.195-31c25, the Vala compiler
* generated from test.vala, do not modify */
#include <glib.h>
@@ -216,7 +216,7 @@
data2 = closure->data;
}
callback = (GMarshalFunc_VOID__POINTER_POINTER) (marshal_data ? marshal_data : cc->callback);
- callback (data1, g_value_get_pointer (param_values + 1), g_value_get_pointer (param_values + 2), data2);
+ callback (data1, g_value_get_pointer (param_values + 1), g_value_get_boxed (param_values + 2), data2);
}
static void
Edited by Rico Tzschichholz