2626
2727{.deadCodeElim : on .}
2828
29- when defined (windows ):
30- const libffidll * = "libffi.dll"
31- elif defined (macosx ):
32- const libffidll * = "libffi.dylib"
33- else :
34- const libffidll * = "libffi.so"
29+ when defined (windows ):
30+ # on Windows we don't use a DLL but instead embed libffi directly:
31+ {.pragma : mylib , header : r "ffi.h" .}
32+
33+ {.compile : r "common\callproc.c" .}
34+ {.compile : r "common\malloc_closure.c" .}
35+ {.compile : r "common\raw_api.c" .}
36+ when defined (vcc ):
37+ #{.compile : "libffi_msvc\ffi.h" .}
38+ #< ClInclude : "..\Modules\_ctypes\libffi_msvc\ffi_common.h" .}
39+ #< ClInclude : "..\Modules\_ctypes\libffi_msvc\fficonfig.h" .}
40+ #< ClInclude : "..\Modules\_ctypes\libffi_msvc\ffitarget.h" .}
41+ {.compile : r "msvc\ffi.c" .}
42+ {.compile : r "msvc\prep_cif.c" .}
43+ {.compile : r "msvc\win32.c" .}
44+ {.compile : r "msvc\types.c" .}
45+ when defined (cpu64 ):
46+ {.compile : r "msvc\win64.asm" .}
47+ else :
48+ {.compile : r "gcc\ffi.c" .}
49+ {.compile : r "gcc\prep_cif.c" .}
50+ {.compile : r "gcc\win32.c" .}
51+ {.compile : r "gcc\types.c" .}
52+ {.compile : r "gcc\closures.c" .}
53+ when defined (cpu64 ):
54+ {.compile : r "gcc\ffi64.c" .}
55+ {.compile : r "gcc\win64.S" .}
56+ else :
57+ {.compile : r "gcc\win32.S" .}
58+
59+ elif defined (macosx ):
60+ {.pragma : mylib , dynlib : "libffi.dylib" .}
61+ else :
62+ {.pragma : mylib , dynlib : "libffi.so" .}
3563
3664type
3765 TArg * = int
@@ -88,19 +116,19 @@ type
88116 elements * : ptr ptr TType
89117
90118var
91- type_void * {.importc : "ffi_type_void ", dynlib: libffidll .}: TType
92- type_uint8 * {.importc : "ffi_type_uint8" , dynlib : libffidll .}: TType
93- type_sint8 * {.importc : "ffi_type_sint8" , dynlib : libffidll .}: TType
94- type_uint16 * {.importc : "ffi_type_uint16" , dynlib : libffidll .}: TType
95- type_sint16 * {.importc : "ffi_type_sint16" , dynlib : libffidll .}: TType
96- type_uint32 * {.importc : "ffi_type_uint32" , dynlib : libffidll .}: TType
97- type_sint32 * {.importc : "ffi_type_sint32" , dynlib : libffidll .}: TType
98- type_uint64 * {.importc : "ffi_type_uint64" , dynlib : libffidll .}: TType
99- type_sint64 * {.importc : "ffi_type_sint64" , dynlib : libffidll .}: TType
100- type_float * {.importc : "ffi_type_float" , dynlib : libffidll .}: TType
101- type_double * {.importc : "ffi_type_double" , dynlib : libffidll .}: TType
102- type_pointer * {.importc : "ffi_type_pointer" , dynlib : libffidll .}: TType
103- type_longdouble * {.importc : "ffi_type_longdouble" , dynlib : libffidll .}: TType
119+ type_void * {.importc : "ffi_type_void" , mylib .}: TType
120+ type_uint8 * {.importc : "ffi_type_uint8" , mylib .}: TType
121+ type_sint8 * {.importc : "ffi_type_sint8" , mylib .}: TType
122+ type_uint16 * {.importc : "ffi_type_uint16" , mylib .}: TType
123+ type_sint16 * {.importc : "ffi_type_sint16" , mylib .}: TType
124+ type_uint32 * {.importc : "ffi_type_uint32" , mylib .}: TType
125+ type_sint32 * {.importc : "ffi_type_sint32" , mylib .}: TType
126+ type_uint64 * {.importc : "ffi_type_uint64" , mylib .}: TType
127+ type_sint64 * {.importc : "ffi_type_sint64" , mylib .}: TType
128+ type_float * {.importc : "ffi_type_float" , mylib .}: TType
129+ type_double * {.importc : "ffi_type_double" , mylib .}: TType
130+ type_pointer * {.importc : "ffi_type_pointer" , mylib .}: TType
131+ type_longdouble * {.importc : "ffi_type_longdouble" , mylib .}: TType
104132
105133type
106134 Tstatus * {.size : sizeof (cint ).} = enum
@@ -119,20 +147,18 @@ type
119147 sint * : TSArg
120148
121149proc raw_call * (cif : var Tcif ; fn : proc () {.cdecl .}; rvalue : pointer ;
122- avalue : ptr TRaw ) {.cdecl , importc : "ffi_raw_call" ,
123- dynlib : libffidll .}
150+ avalue : ptr TRaw ) {.cdecl , importc : "ffi_raw_call" , mylib .}
124151proc ptrarray_to_raw * (cif : var Tcif ; args : ptr pointer ; raw : ptr TRaw ) {.cdecl ,
125- importc : "ffi_ptrarray_to_raw" , dynlib : libffidll .}
152+ importc : "ffi_ptrarray_to_raw" , mylib .}
126153proc raw_to_ptrarray * (cif : var Tcif ; raw : ptr TRaw ; args : ptr pointer ) {.cdecl ,
127- importc : "ffi_raw_to_ptrarray" , dynlib : libffidll .}
128- proc raw_size * (cif : var Tcif ): int {.cdecl , importc : "ffi_raw_size" ,
129- dynlib : libffidll .}
154+ importc : "ffi_raw_to_ptrarray" , mylib .}
155+ proc raw_size * (cif : var Tcif ): int {.cdecl , importc : "ffi_raw_size" , mylib .}
130156
131157proc prep_cif * (cif : var Tcif ; abi : TABI ; nargs : cuint ; rtype : ptr TType ;
132158 atypes : ptr ptr TType ): TStatus {.cdecl , importc : "ffi_prep_cif" ,
133- dynlib : libffidll .}
159+ mylib .}
134160proc call * (cif : var Tcif ; fn : proc () {.cdecl .}; rvalue : pointer ;
135- avalue : ptr pointer ) {.cdecl , importc : "ffi_call" , dynlib : libffidll .}
161+ avalue : ptr pointer ) {.cdecl , importc : "ffi_call" , mylib .}
136162
137163# the same with an easier interface :
138164type
141167
142168proc prep_cif * (cif : var Tcif ; abi : TABI ; nargs : cuint ; rtype : ptr TType ;
143169 atypes : TParamList ): TStatus {.cdecl , importc : "ffi_prep_cif" ,
144- dynlib : libffidll .}
170+ mylib .}
145171proc call * (cif : var Tcif ; fn , rvalue : pointer ;
146- avalue : TArgList ) {.cdecl , importc : "ffi_call" , dynlib : libffidll .}
172+ avalue : TArgList ) {.cdecl , importc : "ffi_call" , mylib .}
147173
148174# Useful for eliminating compiler warnings
149175##define FFI_FN (f ) ((void (* )(void ))f )
0 commit comments