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*));

+ 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;
}

@@ -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;

+ 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*));

+ z = (*p_arg)->size;

#ifdef X86_WIN64
      if (z > FFI_SIZEOF_ARG

@@ -642,7 +647,7 @@

#endif
    }

+ 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;

+ 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 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 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 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 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 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

+ +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$:

-

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