default signal closure via bindingset



The program below gets two errors

    GLib-CRITICAL **: g_hash_table_lookup: assertion `hash_table != NULL' failed at 
/home/gg/bug/glib-sig-ret-undef/foo.pl line 44.
    [gperl_value_from_sv] FIXME: unhandled type - 0 ((null) fundamental for (null))

I think the first is gperl_fundamental_wrapper_class_from_type() called
when "wrapper_class_by_type" is NULL.  Is that supposed to be at least
possible?  Maybe when _gperl_sv_from_value_internal() gets a signal's
return value which is a new fundamental type from some C code, when
neither that new type nor anything else has ever yet told to
gperl_register_fundamental_full()?

I think the second is because gperl_signal_class_closure_marshal() tries
to gperl_value_from_sv() into a GValue which is G_TYPE_NONE.  Dunno if a
return_value location like that is supposed to be allowed, but
gtk_binding_entry_activate() calls g_signal_emitv() that way.

I guess gperl_signal_class_closure_marshal() should do the same as
gperl_closure_marshal() does and don't store the sv to return_value if
the latter is G_TYPE_NONE.  (gperl_closure_marshal() is of course what
you get if you specify a class_closure instead of the default name
"do_mysig".)

I suppose the alternative is to look at the signal info and do nothing
at all if the return_type is NONE, no matter what return_value arg the
caller tried to ask for.  But I'm not up with what the duties of a
marshaller are supposed to be.

Incidentally there's only a problem if a do_mysig() like this returns a
non-undef value.  But there's no requirement for handlers or class
handlers to explicitly return undef if the handler is spec'ed as
return_type G_TYPE_NONE, is there?


Attachment: foo.pl
Description: Text Data

Attachment: GType.xs.do-signame.diff
Description: Text Data



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]