summaryrefslogtreecommitdiff
path: root/glib/glibmm/class.cc
diff options
context:
space:
mode:
authorKjell Ahlstedt <kjellahlstedt@gmail.com>2023-03-31 15:24:13 +0200
committerKjell Ahlstedt <kjellahlstedt@gmail.com>2023-03-31 15:24:13 +0200
commit98f3b67b5c1bd71d0e7b41193fb4683fc957e321 (patch)
tree1fa8a4cf1bf9a93a79bfe08be83426bb15da01e9 /glib/glibmm/class.cc
parentb7ad9b86d70003c065606c563578cc66dcd2ce0a (diff)
downloadglibmm-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.cc31
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,