about summary refs log tree commit diff stats
path: root/src/wrapped/wrappedgobject2.c
diff options
context:
space:
mode:
authorLeslie Zhai <zhaixiang@loongson.cn>2025-08-05 14:22:01 +0800
committerGitHub <noreply@github.com>2025-08-05 08:22:01 +0200
commitdaeff6fc41f7c2e879d9d8d95b9b7a8530e3073a (patch)
tree4eb623e455c8dbef8ee896f0fe30aa38434117a5 /src/wrapped/wrappedgobject2.c
parent368f14b4ce1ae8635f4df2e1295fe745c2db867d (diff)
downloadbox64-daeff6fc41f7c2e879d9d8d95b9b7a8530e3073a.tar.gz
box64-daeff6fc41f7c2e879d9d8d95b9b7a8530e3073a.zip
[WRAPPER] Wrapped g_type_module_use, g_type_module_register_type and g_type_module_add_interface (#2895)
* [WRAPPER] Wrapped g_type_module_use, g_type_module_register_type and g_type_module_add_interface

* [WRAPPER] Removed duplicated my_GInterfaceInfo_t
Diffstat (limited to 'src/wrapped/wrappedgobject2.c')
-rw-r--r--src/wrapped/wrappedgobject2.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/wrapped/wrappedgobject2.c b/src/wrapped/wrappedgobject2.c
index 0a2893c9..1f71cc95 100644
--- a/src/wrapped/wrappedgobject2.c
+++ b/src/wrapped/wrappedgobject2.c
@@ -432,6 +432,50 @@ static void* findcompareFct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for gobject compare callback\n");
     return NULL;
 }
+
+// GTypeModuleClass
+#define GO(A)   \
+static uintptr_t my_load_fct_##A = 0;                         \
+static int my_load_##A(my_GTypeModule_t* module)              \
+{                                                             \
+    return (int)RunFunctionFmt(my_load_fct_##A, "p", module); \
+}
+SUPER()
+#undef GO
+static void* findLoadFct(void* fct)
+{
+    if(!fct) return fct;
+    #define GO(A) if(my_load_fct_##A == (uintptr_t)fct) return my_load_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_load_fct_##A == 0) {my_load_fct_##A = (uintptr_t)fct; return my_load_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for gobject GTypeModuleClass load callback\n");
+    return NULL;
+}
+
+#define GO(A)   \
+static uintptr_t my_unload_fct_##A = 0;                         \
+static int my_unload_##A(my_GTypeModule_t* module)              \
+{                                                             \
+    return (int)RunFunctionFmt(my_unload_fct_##A, "p", module); \
+}
+SUPER()
+#undef GO
+static void* findUnloadFct(void* fct)
+{
+    if(!fct) return fct;
+    #define GO(A) if(my_unload_fct_##A == (uintptr_t)fct) return my_unload_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_unload_fct_##A == 0) {my_unload_fct_##A = (uintptr_t)fct; return my_unload_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for gobject GTypeModuleClass unload callback\n");
+    return NULL;
+}
+
 #undef SUPER
 
 #include "super100.h"
@@ -838,6 +882,33 @@ EXPORT void* my_g_type_value_table_peek(x64emu_t* emu, size_t type)
     return findFreeGTypeValueTable(my->g_type_value_table_peek(type));
 }
 
+EXPORT int my_g_type_module_use(x64emu_t* emu, my_GTypeModule_t* module)
+{
+    my_GTypeModuleClass_t* module_class = (my_GTypeModuleClass_t*)(((my_GTypeInstance_t*)module)->g_class);
+    if (module_class) {
+        module_class->load = findLoadFct(module_class->load);
+        module_class->unload = findUnloadFct(module_class->unload);
+    }
+    return my->g_type_module_use(module);
+}
+
+EXPORT void my_g_type_module_add_interface(x64emu_t* emu, my_GTypeModule_t* module, size_t instance_type, size_t interface_type, my_GInterfaceInfo_t* interface_info)
+{
+    if (interface_info) {
+        interface_info->interface_init = findGInterfaceInitFuncFct(interface_info->interface_init, interface_type);
+        interface_info->interface_finalize = findGInterfaceFinalizeFuncFct(interface_info->interface_finalize);
+    }
+    return my->g_type_module_add_interface(module, instance_type, interface_type, interface_info);
+}
+
+EXPORT size_t my_g_type_module_register_type(x64emu_t* emu, my_GTypeModule_t* module, size_t parent_type, char* type_name, my_GTypeInfo_t* type_info, uint32_t flags)
+{
+    if (type_info) {
+        type_info->class_init = find_class_init_Fct(type_info->class_init, parent_type);
+    }
+    return my->g_type_module_register_type(module, parent_type, type_name, type_info, flags);
+}
+
 #define PRE_INIT    \
     if(BOX64ENV(nogtk)) \
         return -1;