about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/include/myalign.h1
-rw-r--r--src/libtools/myalign.c8
-rw-r--r--src/wrapped/wrappedlibx11.c62
3 files changed, 32 insertions, 39 deletions
diff --git a/src/include/myalign.h b/src/include/myalign.h
index c29237d6..8e33aef1 100644
--- a/src/include/myalign.h
+++ b/src/include/myalign.h
@@ -218,6 +218,7 @@ void* add_xcb_connection(void* src);
 void del_xcb_connection(void* src);
 
 uintptr_t getVArgs(x64emu_t* emu, int pos, uintptr_t* b, int N);
+void setVArgs(x64emu_t* emu, int pos, uintptr_t* b, int N, uintptr_t a);
 
 // longjmp / setjmp
 typedef struct jump_buff_x64_s {
diff --git a/src/libtools/myalign.c b/src/libtools/myalign.c
index 123aa651..d60070bd 100644
--- a/src/libtools/myalign.c
+++ b/src/libtools/myalign.c
@@ -624,6 +624,14 @@ uintptr_t getVArgs(x64emu_t* emu, int pos, uintptr_t* b, int N)
     return emu->regs[regs_abi[pos+N]].q[0];
 }
 
+void setVArgs(x64emu_t* emu, int pos, uintptr_t* b, int N, uintptr_t a)
+{
+    if((pos+N)>5)
+        b[pos+N-6] = a;
+    else
+        emu->regs[regs_abi[pos+N]].q[0] = a;
+}
+
 #ifndef CONVERT_VALIST
 void myStackAlignValist(x64emu_t* emu, const char* fmt, uint64_t* mystack, x64_va_list_t va)
 {
diff --git a/src/wrapped/wrappedlibx11.c b/src/wrapped/wrappedlibx11.c
index bdfc3469..83bed6c5 100644
--- a/src/wrapped/wrappedlibx11.c
+++ b/src/wrapped/wrappedlibx11.c
@@ -1054,98 +1054,86 @@ GO(XNStatusDrawCallback)            \
 GO(XNR6PreeditCallback)             \
 GO(XNStringConversionCallback)
 
-#define VA_CALL(FUNC, FIRST_ARG, VAARGS, VAARGSZ, RESULT)       \
+#define VA_CALL(FUNC, FIRST_ARG, N, VAARGSZ, RESULT)       \
 switch (VAARGSZ)                                                \
 {                                                               \
 case 2:                                                         \
-    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], NULL);       \
+    RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), NULL);       \
     break;                                                      \
 case 4:                                                         \
-    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], NULL);     \
+    RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), NULL);     \
     break;                                                                          \
 case 6:                                                                             \
-    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], NULL);   \
+    RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), NULL);   \
     break;                                                                                              \
 case 8:                                                                                                 \
-    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], NULL); \
+    RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), getVArgs(emu, N, va, 6), getVArgs(emu, N, va, 7), NULL); \
     break;                                                                                                                  \
 case 10:                                                                                                                    \
-    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9], NULL);   \
+    RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), getVArgs(emu, N, va, 6), getVArgs(emu, N, va, 7), getVArgs(emu, N, va, 8), getVArgs(emu, N, va, 9), NULL);   \
     break;                                                                                                                                          \
 case 12:                                                                                                                                            \
-    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9],  VAARGS[10], VAARGS[11], NULL);  \
+    RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), getVArgs(emu, N, va, 6), getVArgs(emu, N, va, 7), getVArgs(emu, N, va, 8), getVArgs(emu, N, va, 9),  getVArgs(emu, N, va, 10), getVArgs(emu, N, va, 11), NULL);  \
     break;                                                                                                                                                                  \
 case 14:                                                                                                                                                                    \
-    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9],  VAARGS[10], VAARGS[11], VAARGS[12], VAARGS[13], NULL);  \
+    RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), getVArgs(emu, N, va, 6), getVArgs(emu, N, va, 7), getVArgs(emu, N, va, 8), getVArgs(emu, N, va, 9),  getVArgs(emu, N, va, 10), getVArgs(emu, N, va, 11), getVArgs(emu, N, va, 12), getVArgs(emu, N, va, 13), NULL);  \
     break;                                                                                                                                                                                          \
 case 16:                                                                                                                                                                                            \
-    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9],  VAARGS[10], VAARGS[11], VAARGS[12], VAARGS[13], VAARGS[14], VAARGS[15], NULL);  \
+    RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), getVArgs(emu, N, va, 6), getVArgs(emu, N, va, 7), getVArgs(emu, N, va, 8), getVArgs(emu, N, va, 9),  getVArgs(emu, N, va, 10), getVArgs(emu, N, va, 11), getVArgs(emu, N, va, 12), getVArgs(emu, N, va, 13), getVArgs(emu, N, va, 14), getVArgs(emu, N, va, 15), NULL);  \
     break;                                                                                                                                                                                                                  \
 case 18:                                                                                                                                                                                                                    \
-    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9],  VAARGS[10], VAARGS[11], VAARGS[12], VAARGS[13], VAARGS[14], VAARGS[15], VAARGS[16], VAARGS[17], NULL);  \
+    RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), getVArgs(emu, N, va, 6), getVArgs(emu, N, va, 7), getVArgs(emu, N, va, 8), getVArgs(emu, N, va, 9),  getVArgs(emu, N, va, 10), getVArgs(emu, N, va, 11), getVArgs(emu, N, va, 12), getVArgs(emu, N, va, 13), getVArgs(emu, N, va, 14), getVArgs(emu, N, va, 15), getVArgs(emu, N, va, 16), getVArgs(emu, N, va, 17), NULL);  \
     break;                                                                                                                                                                                                                                          \
 case 20:                                                                                                                                                                                                                                            \
-    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9],  VAARGS[10], VAARGS[11], VAARGS[12], VAARGS[13], VAARGS[14], VAARGS[15], VAARGS[16], VAARGS[17], VAARGS[18], VAARGS[19], NULL);  \
+    RESULT = FUNC(FIRST_ARG, getVArgs(emu, N, va, 0), getVArgs(emu, N, va, 1), getVArgs(emu, N, va, 2), getVArgs(emu, N, va, 3), getVArgs(emu, N, va, 4), getVArgs(emu, N, va, 5), getVArgs(emu, N, va, 6), getVArgs(emu, N, va, 7), getVArgs(emu, N, va, 8), getVArgs(emu, N, va, 9),  getVArgs(emu, N, va, 10), getVArgs(emu, N, va, 11), getVArgs(emu, N, va, 12), getVArgs(emu, N, va, 13), getVArgs(emu, N, va, 14), getVArgs(emu, N, va, 15), getVArgs(emu, N, va, 16), getVArgs(emu, N, va, 17), getVArgs(emu, N, va, 18), getVArgs(emu, N, va, 19), NULL);  \
     break;                                                                                                                                                                                                                                                                  \
 default:                                                                                                                \
     printf_log(LOG_NONE, "warning: %s's vasize (%d) is too large, need create new call case!\n", __func__, VAARGSZ);    \
     break;                                                                                                              \
 }
 
-#define GO(A)                                           \
-if (new_va[i] && strcmp((char*)new_va[i], A) == 0) {    \
-    XICCallback* origin = (XICCallback*)new_va[i+1];    \
-    new_va[i+1] = find##A##Fct(origin);                 \
+#define GO(A)                                                                       \
+if (getVArgs(emu, 1, va, i) && strcmp((char*)getVArgs(emu, 1, va, i), A) == 0) {    \
+    XICCallback* origin = (XICCallback*)getVArgs(emu, 1, va, i+1);                  \
+    setVArgs(emu, 1, va, i+1, (uintptr_t)find##A##Fct(origin));                     \
 }
 
 EXPORT void* my_XVaCreateNestedList(x64emu_t* emu, int unused, uintptr_t* va) {
     int n = 0;
     while (getVArgs(emu, 1, va, n)) n+=2 ;
-    void** new_va = box_malloc(sizeof(void*) * n);
 
     for (int i = 0; i < n; i += 2) {
-        new_va[i] = (void*)getVArgs(emu, 1, va, i);
-        new_va[i+1] = (void*)getVArgs(emu, 1, va, i+1);
         SUPER()
     }
 
     void* res = NULL;
-    VA_CALL(my->XVaCreateNestedList, unused, new_va, n, res);
-    box_free(new_va);
+    VA_CALL(my->XVaCreateNestedList, unused, 1, n, res);
     return res;
 }
 
 EXPORT void* my_XCreateIC(x64emu_t* emu, void* xim, uintptr_t* va) {
     int n = 0;
     while (getVArgs(emu, 1, va, n)) n+=2;
-    void** new_va = box_malloc(sizeof(void*) * n);
 
     for (int i = 0; i < n; i += 2) {
-        new_va[i] = (void*)getVArgs(emu, 1, va, i);
-        new_va[i+1] = (void*)getVArgs(emu, 1, va, i+1);
         SUPER()
     }
 
     void* res = NULL;
-    VA_CALL(my->XCreateIC, xim, new_va, n, res);
-    box_free(new_va);
+    VA_CALL(my->XCreateIC, xim, 1, n, res);
     return res;
 }
 
 EXPORT void* my_XSetICValues(x64emu_t* emu, void* xic, uintptr_t* va) {
     int n = 0;
     while (getVArgs(emu, 1, va, n)) n+=2;
-    void** new_va = box_malloc(sizeof(void*) * n);
 
     for (int i = 0; i < n; i += 2) {
-        new_va[i] = (void*)getVArgs(emu, 1, va, i);
-        new_va[i+1] = (void*)getVArgs(emu, 1, va, i+1);
         SUPER()
     }
 
     void* res = NULL;
-    VA_CALL(my->XSetICValues, xic, new_va, n, res);
-    box_free(new_va);
+    VA_CALL(my->XSetICValues, xic, 1, n, res);
     return res;
 }
 #undef GO
@@ -1153,23 +1141,19 @@ EXPORT void* my_XSetICValues(x64emu_t* emu, void* xic, uintptr_t* va) {
 EXPORT void* my_XSetIMValues(x64emu_t* emu, void* xim, uintptr_t* va) {
     int n = 0;
     while (getVArgs(emu, 1, va, n)) n+=2;
-    void** new_va = box_malloc(sizeof(void*) * n);
 
-    #define GO(A)                                           \
-    if (new_va[i] && strcmp((char*)new_va[i], A) == 0) {    \
-        XIMCallback* origin = (XIMCallback*)new_va[i+1];    \
-        new_va[i+1] = find##A##Fct(origin);                 \
+    #define GO(A)                                                                       \
+    if (getVArgs(emu, 1, va, i) && strcmp((char*)getVArgs(emu, 1, va, i), A) == 0) {    \
+        XIMCallback* origin = (XIMCallback*)getVArgs(emu, 1, va, i+1);                  \
+        setVArgs(emu, 1, va, i+1, (uintptr_t)find##A##Fct(origin));                     \
     }
     for (int i = 0; i < n; i += 2) {
-        new_va[i] = (void*)getVArgs(emu, 1, va, i);
-        new_va[i+1] = (void*)getVArgs(emu, 1, va, i+1);
         SUPER()
     }
     #undef GO
 
     void* res = NULL;
-    VA_CALL(my->XSetIMValues, xim, new_va, n, res)
-    box_free(new_va);
+    VA_CALL(my->XSetIMValues, xim, 1, n, res)
     return res;
 }
 #undef VA_CALL