diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64printer.c | 2 | ||||
| -rw-r--r-- | src/include/gtkclass.h | 21 | ||||
| -rw-r--r-- | src/tools/gtkclass.c | 2 | ||||
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 7 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedgobject2types.h | 6 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 2 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 1 | ||||
| -rw-r--r-- | src/wrapped/wrappedgobject2.c | 71 | ||||
| -rw-r--r-- | src/wrapped/wrappedgobject2_private.h | 6 |
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) |