10.04.2015, 17:09, "Yuri Myasoedov" <ymyasoe...@yandex.ru>: > I've tried to fix Gtk-3.0.gir and rebuilt it with g-ir-compiler. I added > "allow-none" to vfuncs "signal_changed", "style_set" and then I got a > segfault on method "adjust_size_request". I've attached full backtrace if it > could help to locate the issue. > But I still can't understand, why I need to reimplement methods PARENT_SET, > HIERARCHY_CHANGED, EVENT, otherwise my code fails with an error like "Can't > locate object method "PARENT_SET" via package "MyButton" at > /usr/local/lib/x86_64-linux-gnu/perl/5.20.1/Glib/Object/Introspection.pm line > 58". Something is wrong with that.
I've fixed it. The bug was in Glib::Object::Introspection module. If file perl-Glib-Object-Introspection/gperl-i11n-vfunc-object.c: ... /* If there is no implementation of this vfunc at INIT * time, we assume that the intention is to provide no * implementation and we thus skip setting up the class * struct member. */ HV * stash = gv_stashpv (target_package, 0); GV * slot = gv_fetchmethod (stash, perl_method_name); if (!slot) { dwarn ("skipping vfunc %s.%s because it has no implementation\n", g_base_info_get_name (info), vfunc_name); g_base_info_unref (vfunc_info); g_free (perl_method_name); continue; } } ... But "gv_fetchmethod" is just a macro for "gv_fetchmethod_autoload": #define gv_fetchmethod(stash, name) gv_fetchmethod_autoload(stash, name, TRUE) That doesn't allow us to find non-implemented vfuncs. After replacing "gv_fetchmethod" with "gv_fetchmethod_autoload": GV * slot = gv_fetchmethod_autoload (stash, perl_method_name, FALSE); my code starts to work properly! I don't need to implement HIERARCHY_CHANGED, PARENT_SET and other non-implemented vfuncs. I would like to ask Torsten or Brian to confirm this problem and review my improvement. _______________________________________________ gtk-perl-list mailing list gtk-perl-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtk-perl-list