diff options
author | Kjell Ahlstedt <kjellahlstedt@gmail.com> | 2023-03-31 15:24:13 +0200 |
---|---|---|
committer | Kjell Ahlstedt <kjellahlstedt@gmail.com> | 2023-03-31 15:24:13 +0200 |
commit | 98f3b67b5c1bd71d0e7b41193fb4683fc957e321 (patch) | |
tree | 1fa8a4cf1bf9a93a79bfe08be83426bb15da01e9 /glib/glibmm/class.cc | |
parent | b7ad9b86d70003c065606c563578cc66dcd2ce0a (diff) | |
download | glibmm-2-76.tar.gz |
Glib: Use callback functions with C linkageglibmm-2-76
* gio/src/cancellable.ccg: Add TODO comment.
* glib/glibmm/class.cc: Call custom_class_base_finalize_function() and
custom_class_init_function() via local functions with C linkage.
* glib/glibmm/extraclassinit.h: Point out in the class documentation that
the class init and instance init functions shall have C linkage.
* glib/glibmm/main.[cc|h]: Call prepare_vfunc(), check_vfunc() and
dispatch_vfunc() via local functions with C linkage.
* glib/glibmm/objectbase.cc: Call destroy_notify_callback()
via a local function with C linkage.
* glib/glibmm/propertyproxy_base.cc: Call PropertyProxyConnectionNode::
callback() and destroy_notify_handler() via local functions with C linkage.
* glib/glibmm/signalproxy.cc: Call SignalProxyNormal::slot0_void_callback()
and SignalProxyConnectionNode::destroy_notify_handler() via local functions
with C linkage.
* glib/src/binding.ccg: Add extern "C".
* glib/src/bytearray.ccg: Add a TODO comment.
* glib/src/markup.ccg: Call functions in the vfunc table via local
functions with C linkage.
* glib/src/optioncontext.ccg: Add extern "C".
* glib/src/optiongroup.ccg: Call post_parse_callback() and
option_arg_callback() via local functions with C linkage.
Part of issue #1
Diffstat (limited to 'glib/glibmm/class.cc')
-rw-r--r-- | glib/glibmm/class.cc | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/glib/glibmm/class.cc b/glib/glibmm/class.cc index 31f92c61..5344f381 100644 --- a/glib/glibmm/class.cc +++ b/glib/glibmm/class.cc @@ -21,6 +21,30 @@ #include <glibmm/interface.h> #include <glibmm/private/interface_p.h> +namespace +{ +// C++ linkage +using BaseFinalizeFuncType = void (*)(void*); +using ClassInitFuncType = void (*)(void*, void*); + +BaseFinalizeFuncType p_custom_class_base_finalize_function; +ClassInitFuncType p_custom_class_init_function; + +extern "C" +{ +// From functions with C linkage, to private static member functions with C++ linkage +static void Class_custom_class_base_finalize_function(void* g_class) +{ + p_custom_class_base_finalize_function(g_class); +} + +static void Class_custom_class_init_function(void* g_class, void* class_data) +{ + p_custom_class_init_function(g_class, class_data); +} +} // extern "C" +} // anonymous namespace + namespace Glib { @@ -128,11 +152,14 @@ Class::clone_custom_type( all_class_init_funcs->insert(all_class_init_funcs->end(), class_init_funcs->begin(), class_init_funcs->end()); + p_custom_class_base_finalize_function = &Class::custom_class_base_finalize_function; + p_custom_class_init_function = &Class::custom_class_init_function; + const GTypeInfo derived_info = { class_size, nullptr, // base_init - &Class::custom_class_base_finalize_function, // base_finalize - &Class::custom_class_init_function, + &Class_custom_class_base_finalize_function, // base_finalize + &Class_custom_class_init_function, nullptr, // class_finalize all_class_init_funcs, // class_data instance_size, |