diff -ru libffi-3.2.1/src/x86/ffi.c libffi-3.2.1/src/x86/ffi.c — libffi-3.2.1/src/x86/ffi.c 2014-11-08 21:47:24.000000000 +0900 +++ libffi-3.2.1/src/x86/ffi.c 2014-12-25 18:46:14.806761900 +0900 @@ -99,11 +99,13 @@
i != 0; i--, p_arg += dir, p_argv += dir) {
+ size_t z; +
/* Align if necessary */ if ((sizeof(void*) - 1) & (size_t) argp) argp = (char *) ALIGN(argp, sizeof(void*));
-
size_t z = (*p_arg)->size;
+ z = (*p_arg)->size;
#ifdef X86_WIN64 if (z > FFI_SIZEOF_ARG
@@ -202,6 +204,7 @@
on top of stack, so that those can be moved to registers by call-handler. */ if (stack_args_count > 0) {
+ int i;
if (dir < 0 && stack_args_count > 1) { /* Reverse order if iterating arguments backwards */
@@ -210,7 +213,6 @@
*(ffi_arg*) p_stack_data[stack_args_count - 1] = tmp; }
-
int i; for (i = 0; i < stack_args_count; i++)
{ if (p_stack_data[i] != argp2)
@@ -569,11 +571,12 @@
i < cif->nargs && passed_regs < max_stack_count; i++, p_arg++) {
+ size_t sz;
if ((*p_arg)->type == FFI_TYPE_FLOAT || (*p_arg)->type == FFI_TYPE_STRUCT) continue;
-
size_t sz = (*p_arg)->size;
+ sz = (*p_arg)->size;
if(sz == 0 || sz > FFI_SIZEOF_ARG) continue;
@@ -599,11 +602,13 @@
i != 0; i--, p_arg += dir, p_argv += dir) {
+ size_t z; +
/* Align if necessary */ if ((sizeof(void*) - 1) & (size_t) argp) argp = (char *) ALIGN(argp, sizeof(void*));
-
size_t z = (*p_arg)->size;
+ z = (*p_arg)->size;
#ifdef X86_WIN64 if (z > FFI_SIZEOF_ARG
@@ -642,7 +647,7 @@
#endif }
-
return (size_t)argp - (size_t)stack;
+ return (int)((size_t)argp - (size_t)stack);
} #define FFI_INIT_TRAMPOLINE_WIN64(TRAMP,FUN,CTX,MASK) \
@@ -855,11 +860,12 @@
for (i = 0; i < cif->nargs && passed_regs <= max_regs; i++) {
+ size_t sz;
if (cif->arg_types[i]->type == FFI_TYPE_FLOAT || cif->arg_types[i]->type == FFI_TYPE_STRUCT) continue;
-
size_t sz = cif->arg_types->size;
+ sz = cif->arg_types->size;
if (sz == 0 || sz > FFI_SIZEOF_ARG) continue;
diff -ru libffi-3.2.1/src/x86/ffitarget.h libffi-3.2.1/src/x86/ffitarget.h — libffi-3.2.1/src/x86/ffitarget.h 2014-11-08 21:47:24.000000000 +0900 +++ libffi-3.2.1/src/x86/ffitarget.h 2014-12-22 15:45:54.000000000 +0900 @@ -50,7 +50,9 @@
#endif #define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION
+#ifndef _MSC_VER
#define FFI_TARGET_HAS_COMPLEX_TYPE
+#endif
/* ---- Generic type definitions ----------------------------------------- */
diff -ru libffi-3.2.1/src/x86/win64.S libffi-3.2.1/src/x86/win64.S — libffi-3.2.1/src/x86/win64.S 2014-11-08 21:47:24.000000000 +0900 +++ libffi-3.2.1/src/x86/win64.S 2014-12-22 16:14:40.000000000 +0900 @@ -127,7 +127,7 @@
mov rcx, QWORD PTR RVALUE[rbp] mov DWORD PTR [rcx], eax
-
jmp ret_void$
+ jmp SHORT ret_void$
ret_struct2b$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_2B
@@ -135,7 +135,7 @@
mov rcx, QWORD PTR RVALUE[rbp] mov WORD PTR [rcx], ax
-
jmp ret_void$
+ jmp SHORT ret_void$
ret_struct1b$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_1B
@@ -143,7 +143,7 @@
mov rcx, QWORD PTR RVALUE[rbp] mov BYTE PTR [rcx], al
-
jmp ret_void$
+ jmp SHORT ret_void$
ret_uint8$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT8
@@ -152,7 +152,7 @@
mov rcx, QWORD PTR RVALUE[rbp] movzx rax, al mov QWORD PTR [rcx], rax
-
jmp ret_void$
+ jmp SHORT ret_void$
ret_sint8$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT8
@@ -161,7 +161,7 @@
mov rcx, QWORD PTR RVALUE[rbp] movsx rax, al mov QWORD PTR [rcx], rax
-
jmp ret_void$
+ jmp SHORT ret_void$
ret_uint16$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT16
@@ -188,7 +188,13 @@
mov rcx, QWORD PTR RVALUE[rbp] mov eax, eax mov QWORD PTR [rcx], rax
-
jmp SHORT ret_void$
+ +ret_void$: + xor rax, rax + + lea rsp, QWORD PTR [rbp+16] + pop rbp + ret 0
ret_sint32$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT32
@@ -247,13 +253,6 @@
cdqe mov QWORD PTR [rcx], rax jmp SHORT ret_void$
- -ret_void$:
-
xor rax, rax
-
-
lea rsp, QWORD PTR [rbp+16]
-
pop rbp
-
ret 0
ffi_call_win64 ENDP _TEXT ENDS END
diff -ru libffi-3.2.1/include/ffi.h.in libffi-3.2.1/include/ffi.h.in — libffi-3.2.1/include/ffi.h.in 2014-11-08 21:47:24.000000000 +0900 +++ libffi-3.2.1/include/ffi.h.in 2015-01-11 12:35:30.000000000 +0900 @@ -103,6 +103,11 @@
# undef FFI_64_BIT_MAX # define FFI_64_BIT_MAX 9223372036854775807LL # endif
+# ifdef _MSC_VER +# define FFI_LONG_LONG_MAX _I64_MAX +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807I64 +# endif
# endif #endif