about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64printer.c2
-rw-r--r--src/include/gtkclass.h21
-rw-r--r--src/tools/gtkclass.c2
-rw-r--r--src/wrapped/generated/functions_list.txt7
-rw-r--r--src/wrapped/generated/wrappedgobject2types.h6
-rw-r--r--src/wrapped/generated/wrapper.c2
-rw-r--r--src/wrapped/generated/wrapper.h1
-rw-r--r--src/wrapped/wrappedgobject2.c71
-rw-r--r--src/wrapped/wrappedgobject2_private.h6
9 files changed, 114 insertions, 4 deletions
diff --git a/src/emu/x64printer.c b/src/emu/x64printer.c
index eff11ad4..d8b12860 100644
--- a/src/emu/x64printer.c
+++ b/src/emu/x64printer.c
@@ -4445,6 +4445,8 @@ void x64Print(x64emu_t* emu, char* buff, size_t buffsz, const char* func, int ti
         snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIu64 ", %" PRIp ", %" PRIp ", %" PRIp ", %" PRIu32 ")", tid, *(void**)(R_RSP), func, (uintptr_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (uint32_t)R_R8);
     } else if (w == LFEpuppp) {
         snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIp ", %" PRIu32 ", %" PRIp ", %" PRIp ", %" PRIp ")", tid, *(void**)(R_RSP), func, (void*)R_RDI, (uint32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8);
+    } else if (w == LFEpLppu) {
+        snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIp ", %" PRIu64 ", %" PRIp ", %" PRIp ", %" PRIu32 ")", tid, *(void**)(R_RSP), func, (void*)R_RDI, (uintptr_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (uint32_t)R_R8);
     } else if (w == LFEppppu) {
         snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIp ", %" PRIp ", %" PRIp ", %" PRIp ", %" PRIu32 ")", tid, *(void**)(R_RSP), func, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (uint32_t)R_R8);
     } else if (w == LFpipipi) {
diff --git a/src/include/gtkclass.h b/src/include/gtkclass.h
index b79837cb..200c034d 100644
--- a/src/include/gtkclass.h
+++ b/src/include/gtkclass.h
@@ -50,6 +50,26 @@ typedef struct my_GObjectClass_s
   void*  pdummy[6];
 } my_GObjectClass_t;
 
+typedef struct my_GTypeModule_s
+{
+  my_GObject_t parent_instance;
+  uint32_t use_count;
+  void* type_infos;      // GSList
+  void* interface_infos; // GSList
+  char *name;
+} my_GTypeModule_t;
+
+typedef struct my_GTypeModuleClass_s
+{
+  my_GObjectClass_t parent_class;
+  int  (*load)   (my_GTypeModule_t* module);
+  void (*unload) (my_GTypeModule_t* module);
+  void (*reserved1) (void);
+  void (*reserved2) (void);
+  void (*reserved3) (void);
+  void (*reserved4) (void);
+} my_GTypeModuleClass_t;
+
 typedef struct my_GInitiallyUnowned_s
 {
   my_GTypeInstance_t  g_type_instance;
@@ -2215,6 +2235,7 @@ typedef struct my_GtkTypeInfo_s {
 my_GTypeValueTable_t* findFreeGTypeValueTable(my_GTypeValueTable_t* fcts);
 my_GTypeInfo_t* findFreeGTypeInfo(my_GTypeInfo_t* fcts, size_t parent);
 my_GtkTypeInfo_t* findFreeGtkTypeInfo(my_GtkTypeInfo_t* fcts, size_t parent);
+void* find_class_init_Fct(void* fct, size_t parent);
 
 void InitGTKClass(bridge_t *bridge);
 void FiniGTKClass(void);
diff --git a/src/tools/gtkclass.c b/src/tools/gtkclass.c
index 8f68b9df..2ab2e863 100644
--- a/src/tools/gtkclass.c
+++ b/src/tools/gtkclass.c
@@ -5434,7 +5434,7 @@ static int my_class_init_##A(void* a, void* b)                              \
 }
 SUPER()
 #undef GO
-static void* find_class_init_Fct(void* fct, size_t parent)
+void* find_class_init_Fct(void* fct, size_t parent)
 {
     if(!fct) return fct;
     if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index c85af77d..c5cd502e 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -2435,6 +2435,7 @@
 #() LFEuuppp
 #() LFELpppu
 #() LFEpuppp
+#() LFEpLppu
 #() LFEppppu
 #() LFpipipi
 #() LFpLippp
@@ -4101,6 +4102,8 @@ wrappedgnutls:
   - gnutls_transport_set_pull_timeout_function
   - gnutls_transport_set_push_function
 wrappedgobject2:
+- iFp:
+  - g_type_module_use
 - pFL:
   - g_type_value_table_peek
 - pFp:
@@ -4147,6 +4150,8 @@ wrappedgobject2:
 - vFpupp:
   - g_object_set_qdata_full
   - g_param_spec_set_qdata_full
+- vFpLLp:
+  - g_type_module_add_interface
 - vFpppp:
   - g_object_set_data_full
 - LFLppu:
@@ -4155,6 +4160,8 @@ wrappedgobject2:
   - g_signal_add_emission_hook
 - LFLpppu:
   - g_type_register_fundamental
+- LFpLppu:
+  - g_type_module_register_type
 - LFppppu:
   - g_signal_connect_object
 - LFpppppu:
diff --git a/src/wrapped/generated/wrappedgobject2types.h b/src/wrapped/generated/wrappedgobject2types.h
index 54038c97..f709151d 100644
--- a/src/wrapped/generated/wrappedgobject2types.h
+++ b/src/wrapped/generated/wrappedgobject2types.h
@@ -11,6 +11,7 @@
 #define ADDED_FUNCTIONS() 
 #endif
 
+typedef int32_t (*iFp_t)(void*);
 typedef void* (*pFL_t)(uintptr_t);
 typedef void* (*pFp_t)(void*);
 typedef void (*vFpp_t)(void*, void*);
@@ -30,10 +31,12 @@ typedef void* (*pFppV_t)(void*, void*, ...);
 typedef void (*vFpuuV_t)(void*, uint32_t, uint32_t, ...);
 typedef void (*vFpuuA_t)(void*, uint32_t, uint32_t, va_list);
 typedef void (*vFpupp_t)(void*, uint32_t, void*, void*);
+typedef void (*vFpLLp_t)(void*, uintptr_t, uintptr_t, void*);
 typedef void (*vFpppp_t)(void*, void*, void*, void*);
 typedef uintptr_t (*LFLppu_t)(uintptr_t, void*, void*, uint32_t);
 typedef uintptr_t (*LFuuppp_t)(uint32_t, uint32_t, void*, void*, void*);
 typedef uintptr_t (*LFLpppu_t)(uintptr_t, void*, void*, void*, uint32_t);
+typedef uintptr_t (*LFpLppu_t)(void*, uintptr_t, void*, void*, uint32_t);
 typedef uintptr_t (*LFppppu_t)(void*, void*, void*, void*, uint32_t);
 typedef uintptr_t (*LFpppppu_t)(void*, void*, void*, void*, void*, uint32_t);
 typedef uint32_t (*uFpuuuppp_t)(void*, uint32_t, uint32_t, uint32_t, void*, void*, void*);
@@ -44,6 +47,7 @@ typedef uint32_t (*uFpLuppppLup_t)(void*, uintptr_t, uint32_t, void*, void*, voi
 typedef uint32_t (*uFpLuppppLuA_t)(void*, uintptr_t, uint32_t, void*, void*, void*, void*, uintptr_t, uint32_t, va_list);
 
 #define SUPER() ADDED_FUNCTIONS() \
+	GO(g_type_module_use, iFp_t) \
 	GO(g_type_value_table_peek, pFL_t) \
 	GO(g_type_class_peek_parent, pFp_t) \
 	GO(g_closure_set_marshal, vFpp_t) \
@@ -71,10 +75,12 @@ typedef uint32_t (*uFpLuppppLuA_t)(void*, uintptr_t, uint32_t, void*, void*, voi
 	GO(g_signal_emit_valist, vFpuuA_t) \
 	GO(g_object_set_qdata_full, vFpupp_t) \
 	GO(g_param_spec_set_qdata_full, vFpupp_t) \
+	GO(g_type_module_add_interface, vFpLLp_t) \
 	GO(g_object_set_data_full, vFpppp_t) \
 	GO(g_type_register_static, LFLppu_t) \
 	GO(g_signal_add_emission_hook, LFuuppp_t) \
 	GO(g_type_register_fundamental, LFLpppu_t) \
+	GO(g_type_module_register_type, LFpLppu_t) \
 	GO(g_signal_connect_object, LFppppu_t) \
 	GO(g_signal_connect_data, LFpppppu_t) \
 	GO(g_signal_handlers_block_matched, uFpuuuppp_t) \
diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c
index 72731388..19885227 100644
--- a/src/wrapped/generated/wrapper.c
+++ b/src/wrapped/generated/wrapper.c
@@ -2462,6 +2462,7 @@ typedef intptr_t (*lFpppLpp_t)(void*, void*, void*, uintptr_t, void*, void*);
 typedef uintptr_t (*LFEuuppp_t)(x64emu_t*, uint32_t, uint32_t, void*, void*, void*);
 typedef uintptr_t (*LFELpppu_t)(x64emu_t*, uintptr_t, void*, void*, void*, uint32_t);
 typedef uintptr_t (*LFEpuppp_t)(x64emu_t*, void*, uint32_t, void*, void*, void*);
+typedef uintptr_t (*LFEpLppu_t)(x64emu_t*, void*, uintptr_t, void*, void*, uint32_t);
 typedef uintptr_t (*LFEppppu_t)(x64emu_t*, void*, void*, void*, void*, uint32_t);
 typedef uintptr_t (*LFpipipi_t)(void*, int32_t, void*, int32_t, void*, int32_t);
 typedef uintptr_t (*LFpLippp_t)(void*, uintptr_t, int32_t, void*, void*, void*);
@@ -6000,6 +6001,7 @@ void lFpppLpp(x64emu_t *emu, uintptr_t fcn) { lFpppLpp_t fn = (lFpppLpp_t)fcn; R
 void LFEuuppp(x64emu_t *emu, uintptr_t fcn) { LFEuuppp_t fn = (LFEuuppp_t)fcn; R_RAX=(uintptr_t)fn(emu, (uint32_t)R_RDI, (uint32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8); }
 void LFELpppu(x64emu_t *emu, uintptr_t fcn) { LFELpppu_t fn = (LFELpppu_t)fcn; R_RAX=(uintptr_t)fn(emu, (uintptr_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (uint32_t)R_R8); }
 void LFEpuppp(x64emu_t *emu, uintptr_t fcn) { LFEpuppp_t fn = (LFEpuppp_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (uint32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8); }
+void LFEpLppu(x64emu_t *emu, uintptr_t fcn) { LFEpLppu_t fn = (LFEpLppu_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (uintptr_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (uint32_t)R_R8); }
 void LFEppppu(x64emu_t *emu, uintptr_t fcn) { LFEppppu_t fn = (LFEppppu_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (uint32_t)R_R8); }
 void LFpipipi(x64emu_t *emu, uintptr_t fcn) { LFpipipi_t fn = (LFpipipi_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (int32_t)R_RCX, (void*)R_R8, (int32_t)R_R9); }
 void LFpLippp(x64emu_t *emu, uintptr_t fcn) { LFpLippp_t fn = (LFpLippp_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (uintptr_t)R_RSI, (int32_t)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9); }
diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h
index aa147cfb..2425de36 100644
--- a/src/wrapped/generated/wrapper.h
+++ b/src/wrapped/generated/wrapper.h
@@ -2472,6 +2472,7 @@ void lFpppLpp(x64emu_t *emu, uintptr_t fnc);
 void LFEuuppp(x64emu_t *emu, uintptr_t fnc);
 void LFELpppu(x64emu_t *emu, uintptr_t fnc);
 void LFEpuppp(x64emu_t *emu, uintptr_t fnc);
+void LFEpLppu(x64emu_t *emu, uintptr_t fnc);
 void LFEppppu(x64emu_t *emu, uintptr_t fnc);
 void LFpipipi(x64emu_t *emu, uintptr_t fnc);
 void LFpLippp(x64emu_t *emu, uintptr_t fnc);
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;
diff --git a/src/wrapped/wrappedgobject2_private.h b/src/wrapped/wrappedgobject2_private.h
index 51c12010..492e296d 100644
--- a/src/wrapped/wrappedgobject2_private.h
+++ b/src/wrapped/wrappedgobject2_private.h
@@ -315,14 +315,14 @@ GO(g_type_interface_peek_parent, pFp)
 GO(g_type_interface_prerequisites, pFLp)
 GO(g_type_interfaces, pFLp)
 GO(g_type_is_a, iFLL)
-//GOM(g_type_module_add_interface, vFpLLp)
+GOM(g_type_module_add_interface, vFEpLLp)
 GO(g_type_module_get_type, LFv)
 GO(g_type_module_register_enum, LFppp)
 GO(g_type_module_register_flags, LFppp)
-//GOM(g_type_module_register_type, LFpLppu)
+GOM(g_type_module_register_type, LFEpLppu)
 GO(g_type_module_set_name, vFpp)
 GO(g_type_module_unuse, vFp)
-GO(g_type_module_use, iFp)
+GOM(g_type_module_use, iFEp)
 GO(g_type_name, pFL)
 GO(g_type_name_from_class, pFp)
 GO(g_type_name_from_instance, pFp)