ffi 1.9.18 → 1.9.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (468) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +22 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +52 -0
  5. data/.yardopts +5 -0
  6. data/Gemfile +15 -0
  7. data/{spec/ffi/LICENSE.SPECS → LICENSE.SPECS} +1 -1
  8. data/README.md +3 -4
  9. data/Rakefile +41 -5
  10. data/appveyor.yml +22 -0
  11. data/ext/ffi_c/AbstractMemory.c +6 -1
  12. data/ext/ffi_c/Call.c +1 -22
  13. data/ext/ffi_c/Call.h +0 -9
  14. data/ext/ffi_c/Closure.c +54 -0
  15. data/ext/ffi_c/{ClosurePool.h → Closure.h} +13 -23
  16. data/ext/ffi_c/Function.c +16 -25
  17. data/ext/ffi_c/Function.h +1 -2
  18. data/ext/ffi_c/FunctionInfo.c +0 -4
  19. data/ext/ffi_c/MethodHandle.c +33 -268
  20. data/ext/ffi_c/Platform.c +10 -2
  21. data/ext/ffi_c/extconf.rb +10 -5
  22. data/ext/ffi_c/ffi.c +2 -2
  23. data/ext/ffi_c/libffi/.appveyor.yml +48 -0
  24. data/ext/ffi_c/libffi/.gitignore +36 -0
  25. data/ext/ffi_c/libffi/.travis/install.sh +14 -0
  26. data/ext/ffi_c/libffi/.travis.yml +30 -0
  27. data/ext/ffi_c/libffi/ChangeLog.libffi +2 -2
  28. data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.libffi-3.1} +1402 -2
  29. data/ext/ffi_c/libffi/ChangeLog.v1 +1 -1
  30. data/ext/ffi_c/libffi/LICENSE +1 -1
  31. data/ext/ffi_c/libffi/Makefile.am +169 -158
  32. data/ext/ffi_c/libffi/Makefile.in +927 -938
  33. data/ext/ffi_c/libffi/README +164 -52
  34. data/ext/ffi_c/libffi/acinclude.m4 +387 -0
  35. data/ext/ffi_c/libffi/autogen.sh +2 -0
  36. data/ext/ffi_c/libffi/config.guess +336 -371
  37. data/ext/ffi_c/libffi/config.sub +246 -115
  38. data/ext/ffi_c/libffi/configure +6976 -2189
  39. data/ext/ffi_c/libffi/configure.ac +148 -256
  40. data/ext/ffi_c/libffi/configure.host +277 -4
  41. data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
  42. data/ext/ffi_c/libffi/doc/Makefile.in +811 -0
  43. data/ext/ffi_c/libffi/doc/libffi.texi +430 -45
  44. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  45. data/ext/ffi_c/libffi/fficonfig.h.in +24 -13
  46. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +203 -0
  47. data/ext/ffi_c/libffi/include/Makefile.am +3 -3
  48. data/ext/ffi_c/libffi/include/Makefile.in +188 -71
  49. data/ext/ffi_c/libffi/include/ffi.h.in +112 -50
  50. data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
  51. data/ext/ffi_c/libffi/include/ffi_common.h +32 -11
  52. data/ext/ffi_c/libffi/install-sh +190 -202
  53. data/ext/ffi_c/libffi/libffi.map.in +80 -0
  54. data/ext/ffi_c/libffi/libffi.pc.in +3 -2
  55. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +1043 -0
  56. data/ext/ffi_c/libffi/libtool-ldflags +106 -0
  57. data/ext/ffi_c/libffi/libtool-version +1 -1
  58. data/ext/ffi_c/libffi/ltmain.sh +3553 -2033
  59. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  60. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +69 -0
  61. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +13 -8
  62. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +31 -104
  63. data/ext/ffi_c/libffi/m4/{ax_check_compiler_flags.m4 → ax_check_compile_flag.m4} +30 -34
  64. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +32 -11
  65. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +6 -5
  66. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +31 -21
  67. data/ext/ffi_c/libffi/man/Makefile.am +2 -2
  68. data/ext/ffi_c/libffi/man/Makefile.in +141 -49
  69. data/ext/ffi_c/libffi/man/ffi.3 +10 -0
  70. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
  71. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  72. data/ext/ffi_c/libffi/missing +150 -311
  73. data/ext/ffi_c/libffi/msvcc.sh +72 -9
  74. data/ext/ffi_c/libffi/src/aarch64/ffi.c +964 -0
  75. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +81 -0
  76. data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
  77. data/ext/ffi_c/libffi/src/aarch64/sysv.S +438 -0
  78. data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
  79. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
  80. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  81. data/ext/ffi_c/libffi/src/alpha/osf.S +161 -266
  82. data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
  83. data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
  84. data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
  85. data/ext/ffi_c/libffi/src/arm/ffi.c +608 -517
  86. data/ext/ffi_c/libffi/src/arm/ffitarget.h +24 -7
  87. data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
  88. data/ext/ffi_c/libffi/src/arm/sysv.S +303 -417
  89. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
  90. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  91. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  92. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  93. data/ext/ffi_c/libffi/src/closures.c +366 -45
  94. data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
  95. data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
  96. data/ext/ffi_c/libffi/src/debug.c +6 -1
  97. data/ext/ffi_c/libffi/src/dlmalloc.c +16 -11
  98. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  99. data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
  100. data/ext/ffi_c/libffi/src/ia64/ffi.c +11 -7
  101. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +6 -1
  102. data/ext/ffi_c/libffi/src/ia64/unix.S +2 -0
  103. data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
  104. data/ext/ffi_c/libffi/src/m32r/ffi.c +1 -1
  105. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
  106. data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
  107. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
  108. data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
  109. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  110. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  111. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  112. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  113. data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
  114. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  115. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  116. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  117. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  118. data/ext/ffi_c/libffi/src/mips/ffi.c +103 -28
  119. data/ext/ffi_c/libffi/src/mips/ffitarget.h +10 -3
  120. data/ext/ffi_c/libffi/src/mips/n32.S +128 -56
  121. data/ext/ffi_c/libffi/src/mips/o32.S +148 -27
  122. data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
  123. data/ext/ffi_c/libffi/src/moxie/ffi.c +40 -44
  124. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  125. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  126. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  127. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  128. data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
  129. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  130. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  131. data/ext/ffi_c/libffi/src/pa/ffitarget.h +8 -1
  132. data/ext/ffi_c/libffi/src/powerpc/aix.S +245 -7
  133. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +253 -4
  134. data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
  135. data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
  136. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
  137. data/ext/ffi_c/libffi/src/powerpc/ffi.c +103 -1378
  138. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +111 -30
  139. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +945 -0
  140. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
  141. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  142. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +103 -44
  143. data/ext/ffi_c/libffi/src/powerpc/linux64.S +100 -59
  144. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +360 -108
  145. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  146. data/ext/ffi_c/libffi/src/powerpc/sysv.S +68 -112
  147. data/ext/ffi_c/libffi/src/prep_cif.c +108 -24
  148. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  149. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  150. data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
  151. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  152. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  153. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  154. data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
  155. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  156. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
  157. data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
  158. data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
  159. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
  160. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  161. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  162. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  163. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  164. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  165. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  166. data/ext/ffi_c/libffi/src/types.c +43 -14
  167. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  168. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  169. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  170. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  171. data/ext/ffi_c/libffi/src/x86/ffi.c +591 -500
  172. data/ext/ffi_c/libffi/src/x86/ffi64.c +359 -116
  173. data/ext/ffi_c/libffi/src/x86/ffitarget.h +55 -35
  174. data/ext/ffi_c/libffi/src/x86/ffiw64.c +287 -0
  175. data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
  176. data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
  177. data/ext/ffi_c/libffi/src/x86/sysv.S +975 -400
  178. data/ext/ffi_c/libffi/src/x86/unix64.S +398 -299
  179. data/ext/ffi_c/libffi/src/x86/win64.S +222 -458
  180. data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
  181. data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
  182. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
  183. data/ext/ffi_c/libffi/src/xtensa/sysv.S +253 -0
  184. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  185. data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -73
  186. data/ext/ffi_c/libffi/testsuite/Makefile.in +219 -111
  187. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +121 -25
  188. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +21 -1
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -6
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/{closure_stdcall.c → closure_simple.c} +7 -16
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -4
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -4
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -4
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -4
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -4
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -4
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -4
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +5 -5
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -4
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -4
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -4
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -4
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c +95 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -4
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -4
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -4
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -4
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +5 -5
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -4
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -4
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -4
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -4
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -4
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -4
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -4
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -4
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -4
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -4
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +4 -6
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +4 -6
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +4 -4
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -4
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -4
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +4 -4
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -4
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -4
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +4 -4
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +4 -4
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +10 -9
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +3 -3
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +10 -9
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +1 -1
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +11 -9
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +5 -5
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +23 -40
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +6 -4
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +18 -19
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +6 -6
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +8 -8
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +6 -6
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +5 -5
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +5 -5
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +5 -5
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +5 -5
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +6 -6
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +5 -5
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +6 -6
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +6 -6
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +7 -7
  274. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +7 -7
  275. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +5 -5
  276. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +5 -5
  277. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +2 -2
  278. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  282. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  283. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  284. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  285. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  286. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  287. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  288. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +2 -2
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  292. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest.cc +3 -10
  293. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest_ffi_call.cc +2 -1
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  314. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
  315. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  326. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  327. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  328. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  329. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  330. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  331. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  332. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  333. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  345. data/ext/ffi_c/libffi.bsd.mk +11 -5
  346. data/ext/ffi_c/libffi.darwin.mk +14 -4
  347. data/ext/ffi_c/libffi.gnu.mk +3 -2
  348. data/ext/ffi_c/libffi.mk +10 -5
  349. data/ext/ffi_c/libffi.vc.mk +1 -1
  350. data/ext/ffi_c/libffi.vc64.mk +1 -1
  351. data/ffi.gemspec +16 -3
  352. data/lib/ffi/enum.rb +124 -0
  353. data/lib/ffi/library.rb +66 -14
  354. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  355. data/lib/ffi/platform/x86_64-windows/types.conf +113 -20
  356. data/lib/ffi/platform.rb +7 -2
  357. data/lib/ffi/pointer.rb +1 -0
  358. data/lib/ffi/struct.rb +0 -2
  359. data/lib/ffi/version.rb +1 -2
  360. data/samples/getlogin.rb +8 -0
  361. data/samples/getpid.rb +8 -0
  362. data/samples/gettimeofday.rb +18 -0
  363. data/samples/hello.rb +7 -0
  364. data/samples/inotify.rb +60 -0
  365. data/samples/pty.rb +76 -0
  366. data/samples/qsort.rb +21 -0
  367. data/samples/sample_helper.rb +6 -0
  368. metadata +164 -115
  369. data/ext/ffi_c/ClosurePool.c +0 -283
  370. data/ext/ffi_c/libffi/Makefile.vc +0 -141
  371. data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
  372. data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
  373. data/ext/ffi_c/libffi/build-ios.sh +0 -67
  374. data/ext/ffi_c/libffi/compile +0 -143
  375. data/ext/ffi_c/libffi/depcomp +0 -630
  376. data/ext/ffi_c/libffi/doc/libffi.info +0 -593
  377. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  378. data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
  379. data/ext/ffi_c/libffi/include/ffi.h.vc64 +0 -427
  380. data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7831
  381. data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
  382. data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
  383. data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
  384. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -98
  385. data/ext/ffi_c/libffi/mdate-sh +0 -201
  386. data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
  387. data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
  388. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  389. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  390. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  391. data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
  392. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  393. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  394. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  395. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
  396. data/ext/ffi_c/libffi/texinfo.tex +0 -7210
  397. data/gen/Rakefile +0 -30
  398. data/libtest/Benchmark.c +0 -52
  399. data/libtest/BoolTest.c +0 -34
  400. data/libtest/BufferTest.c +0 -31
  401. data/libtest/ClosureTest.c +0 -205
  402. data/libtest/EnumTest.c +0 -51
  403. data/libtest/FunctionTest.c +0 -70
  404. data/libtest/GNUmakefile +0 -149
  405. data/libtest/GlobalVariable.c +0 -62
  406. data/libtest/LastErrorTest.c +0 -21
  407. data/libtest/NumberTest.c +0 -132
  408. data/libtest/PointerTest.c +0 -63
  409. data/libtest/ReferenceTest.c +0 -23
  410. data/libtest/StringTest.c +0 -34
  411. data/libtest/StructTest.c +0 -243
  412. data/libtest/UnionTest.c +0 -43
  413. data/libtest/VariadicTest.c +0 -99
  414. data/spec/ffi/async_callback_spec.rb +0 -35
  415. data/spec/ffi/bool_spec.rb +0 -32
  416. data/spec/ffi/buffer_spec.rb +0 -279
  417. data/spec/ffi/callback_spec.rb +0 -773
  418. data/spec/ffi/custom_param_type.rb +0 -37
  419. data/spec/ffi/custom_type_spec.rb +0 -74
  420. data/spec/ffi/dup_spec.rb +0 -52
  421. data/spec/ffi/enum_spec.rb +0 -423
  422. data/spec/ffi/errno_spec.rb +0 -20
  423. data/spec/ffi/ffi_spec.rb +0 -28
  424. data/spec/ffi/fixtures/Benchmark.c +0 -52
  425. data/spec/ffi/fixtures/BoolTest.c +0 -34
  426. data/spec/ffi/fixtures/BufferTest.c +0 -31
  427. data/spec/ffi/fixtures/ClosureTest.c +0 -205
  428. data/spec/ffi/fixtures/EnumTest.c +0 -51
  429. data/spec/ffi/fixtures/FunctionTest.c +0 -142
  430. data/spec/ffi/fixtures/GNUmakefile +0 -149
  431. data/spec/ffi/fixtures/GlobalVariable.c +0 -62
  432. data/spec/ffi/fixtures/LastErrorTest.c +0 -21
  433. data/spec/ffi/fixtures/NumberTest.c +0 -132
  434. data/spec/ffi/fixtures/PipeHelper.h +0 -21
  435. data/spec/ffi/fixtures/PipeHelperPosix.c +0 -41
  436. data/spec/ffi/fixtures/PipeHelperWindows.c +0 -72
  437. data/spec/ffi/fixtures/PointerTest.c +0 -63
  438. data/spec/ffi/fixtures/ReferenceTest.c +0 -23
  439. data/spec/ffi/fixtures/StringTest.c +0 -34
  440. data/spec/ffi/fixtures/StructTest.c +0 -243
  441. data/spec/ffi/fixtures/UnionTest.c +0 -43
  442. data/spec/ffi/fixtures/VariadicTest.c +0 -99
  443. data/spec/ffi/fixtures/classes.rb +0 -438
  444. data/spec/ffi/function_spec.rb +0 -97
  445. data/spec/ffi/io_spec.rb +0 -16
  446. data/spec/ffi/library_spec.rb +0 -286
  447. data/spec/ffi/long_double.rb +0 -30
  448. data/spec/ffi/managed_struct_spec.rb +0 -68
  449. data/spec/ffi/memorypointer_spec.rb +0 -78
  450. data/spec/ffi/number_spec.rb +0 -247
  451. data/spec/ffi/platform_spec.rb +0 -114
  452. data/spec/ffi/pointer_spec.rb +0 -285
  453. data/spec/ffi/rbx/attach_function_spec.rb +0 -34
  454. data/spec/ffi/rbx/memory_pointer_spec.rb +0 -194
  455. data/spec/ffi/rbx/spec_helper.rb +0 -6
  456. data/spec/ffi/rbx/struct_spec.rb +0 -18
  457. data/spec/ffi/spec_helper.rb +0 -93
  458. data/spec/ffi/string_spec.rb +0 -118
  459. data/spec/ffi/strptr_spec.rb +0 -50
  460. data/spec/ffi/struct_by_ref_spec.rb +0 -43
  461. data/spec/ffi/struct_callback_spec.rb +0 -69
  462. data/spec/ffi/struct_initialize_spec.rb +0 -35
  463. data/spec/ffi/struct_packed_spec.rb +0 -50
  464. data/spec/ffi/struct_spec.rb +0 -886
  465. data/spec/ffi/typedef_spec.rb +0 -91
  466. data/spec/ffi/union_spec.rb +0 -67
  467. data/spec/ffi/variadic_spec.rb +0 -132
  468. data/spec/spec.opts +0 -4
@@ -0,0 +1,42 @@
1
+ /* -*-c-*- */
2
+ #include "ffitest.h"
3
+ #include <complex.h>
4
+
5
+ static void cls_ret_complex_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
6
+ void* userdata __UNUSED__)
7
+ {
8
+ _Complex T_C_TYPE *pa;
9
+ _Complex T_C_TYPE *pr;
10
+ pa = (_Complex T_C_TYPE *)args[0];
11
+ pr = (_Complex T_C_TYPE *)resp;
12
+ *pr = *pa;
13
+
14
+ printf("%.6f,%.6fi: %.6f,%.6fi\n",
15
+ T_CONV creal (*pa), T_CONV cimag (*pa),
16
+ T_CONV creal (*pr), T_CONV cimag (*pr));
17
+ }
18
+ typedef _Complex T_C_TYPE (*cls_ret_complex)(_Complex T_C_TYPE);
19
+
20
+ int main (void)
21
+ {
22
+ ffi_cif cif;
23
+ void *code;
24
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
25
+ ffi_type * cl_arg_types[2];
26
+ _Complex T_C_TYPE res;
27
+
28
+ cl_arg_types[0] = &T_FFI_TYPE;
29
+ cl_arg_types[1] = NULL;
30
+
31
+ /* Initialize the cif */
32
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
33
+ &T_FFI_TYPE, cl_arg_types) == FFI_OK);
34
+
35
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_complex_fn, NULL, code) == FFI_OK);
36
+
37
+ res = (*((cls_ret_complex)code))(0.125 + 128.0 * I);
38
+ printf("res: %.6f,%.6fi\n", T_CONV creal (res), T_CONV cimag (res));
39
+ CHECK (res == (0.125 + 128.0 * I));
40
+
41
+ exit(0);
42
+ }
@@ -0,0 +1,10 @@
1
+ /* Area: closure_call
2
+ Purpose: Check return value complex.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "complex_defs_double.inc"
10
+ #include "cls_complex.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: closure_call
2
+ Purpose: Check return value complex.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "complex_defs_float.inc"
10
+ #include "cls_complex.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: closure_call
2
+ Purpose: Check return value complex.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "complex_defs_longdouble.inc"
10
+ #include "cls_complex.inc"
@@ -0,0 +1,71 @@
1
+ /* -*-c-*- */
2
+ #include "ffitest.h"
3
+ #include <complex.h>
4
+
5
+ typedef struct Cs {
6
+ _Complex T_C_TYPE x;
7
+ _Complex T_C_TYPE y;
8
+ } Cs;
9
+
10
+ Cs gc;
11
+
12
+ void
13
+ closure_test_fn(Cs p)
14
+ {
15
+ printf("%.1f,%.1fi %.1f,%.1fi\n",
16
+ T_CONV creal (p.x), T_CONV cimag (p.x),
17
+ T_CONV creal (p.y), T_CONV cimag (p.y));
18
+ gc = p;
19
+ }
20
+
21
+ void
22
+ closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
23
+ void** args, void* userdata __UNUSED__)
24
+ {
25
+ closure_test_fn(*(Cs*)args[0]);
26
+ }
27
+
28
+ int main(int argc __UNUSED__, char** argv __UNUSED__)
29
+ {
30
+ ffi_cif cif;
31
+
32
+ void *code;
33
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
34
+ ffi_type *cl_arg_types[1];
35
+
36
+ ffi_type ts1_type;
37
+ ffi_type* ts1_type_elements[4];
38
+
39
+ Cs arg = { 1.0 + 11.0 * I, 2.0 + 22.0 * I};
40
+
41
+ ts1_type.size = 0;
42
+ ts1_type.alignment = 0;
43
+ ts1_type.type = FFI_TYPE_STRUCT;
44
+ ts1_type.elements = ts1_type_elements;
45
+
46
+ ts1_type_elements[0] = &T_FFI_TYPE;
47
+ ts1_type_elements[1] = &T_FFI_TYPE;
48
+ ts1_type_elements[2] = NULL;
49
+
50
+ cl_arg_types[0] = &ts1_type;
51
+
52
+ /* Initialize the cif */
53
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
54
+ &ffi_type_void, cl_arg_types) == FFI_OK);
55
+
56
+ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK);
57
+
58
+ gc.x = 0.0 + 0.0 * I;
59
+ gc.y = 0.0 + 0.0 * I;
60
+ ((void*(*)(Cs))(code))(arg);
61
+ /* { dg-output "1.0,11.0i 2.0,22.0i\n" } */
62
+ CHECK (gc.x == arg.x && gc.y == arg.y);
63
+
64
+ gc.x = 0.0 + 0.0 * I;
65
+ gc.y = 0.0 + 0.0 * I;
66
+ closure_test_fn(arg);
67
+ /* { dg-output "1.0,11.0i 2.0,22.0i\n" } */
68
+ CHECK (gc.x == arg.x && gc.y == arg.y);
69
+
70
+ return 0;
71
+ }
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Check complex arguments in structs.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "complex_defs_double.inc"
10
+ #include "cls_complex_struct.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Check complex arguments in structs.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "complex_defs_float.inc"
10
+ #include "cls_complex_struct.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Check complex arguments in structs.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "complex_defs_longdouble.inc"
10
+ #include "cls_complex_struct.inc"
@@ -0,0 +1,80 @@
1
+ /* -*-c-*- */
2
+ #include "ffitest.h"
3
+ #include <stdio.h>
4
+ #include <stdlib.h>
5
+ #include <stdarg.h>
6
+ #include <complex.h>
7
+
8
+ static _Complex T_C_TYPE gComplexValue1 = 1 + 2 * I;
9
+ static _Complex T_C_TYPE gComplexValue2 = 3 + 4 * I;
10
+
11
+ static int cls_variadic(const char *format, ...)
12
+ {
13
+ va_list ap;
14
+ _Complex T_C_TYPE p1, p2;
15
+
16
+ va_start (ap, format);
17
+ p1 = va_arg (ap, _Complex T_C_TYPE);
18
+ p2 = va_arg (ap, _Complex T_C_TYPE);
19
+ va_end (ap);
20
+
21
+ return printf(format, T_CONV creal (p1), T_CONV cimag (p1),
22
+ T_CONV creal (p2), T_CONV cimag (p2));
23
+ }
24
+
25
+ static void
26
+ cls_complex_va_fn(ffi_cif* cif __UNUSED__, void* resp,
27
+ void** args, void* userdata __UNUSED__)
28
+ {
29
+ char* format = *(char**)args[0];
30
+ gComplexValue1 = *(_Complex T_C_TYPE*)args[1];
31
+ gComplexValue2 = *(_Complex T_C_TYPE*)args[2];
32
+
33
+ *(ffi_arg*)resp =
34
+ printf(format,
35
+ T_CONV creal (gComplexValue1), T_CONV cimag (gComplexValue1),
36
+ T_CONV creal (gComplexValue2), T_CONV cimag (gComplexValue2));
37
+ }
38
+
39
+ int main (void)
40
+ {
41
+ ffi_cif cif;
42
+ void *code;
43
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
44
+ void* args[4];
45
+ ffi_type* arg_types[4];
46
+ char *format = "%.1f,%.1fi %.1f,%.1fi\n";
47
+
48
+ _Complex T_C_TYPE complexArg1 = 1.0 + 22.0 *I;
49
+ _Complex T_C_TYPE complexArg2 = 333.0 + 4444.0 *I;
50
+ ffi_arg res = 0;
51
+
52
+ arg_types[0] = &ffi_type_pointer;
53
+ arg_types[1] = &T_FFI_TYPE;
54
+ arg_types[2] = &T_FFI_TYPE;
55
+ arg_types[3] = NULL;
56
+
57
+ /* This printf call is variadic */
58
+ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 3, &ffi_type_sint,
59
+ arg_types) == FFI_OK);
60
+
61
+ args[0] = &format;
62
+ args[1] = &complexArg1;
63
+ args[2] = &complexArg2;
64
+ args[3] = NULL;
65
+
66
+ ffi_call(&cif, FFI_FN(cls_variadic), &res, args);
67
+ printf("res: %d\n", (int) res);
68
+ CHECK (res == 24);
69
+
70
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_complex_va_fn, NULL, code)
71
+ == FFI_OK);
72
+
73
+ res = ((int(*)(char *, ...))(code))(format, complexArg1, complexArg2);
74
+ CHECK (gComplexValue1 == complexArg1);
75
+ CHECK (gComplexValue2 == complexArg2);
76
+ printf("res: %d\n", (int) res);
77
+ CHECK (res == 24);
78
+
79
+ exit(0);
80
+ }
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Test complex' passed in variable argument lists.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "complex_defs_double.inc"
10
+ #include "cls_complex_va.inc"
@@ -0,0 +1,16 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Test complex' passed in variable argument lists.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ /* Alpha splits _Complex into two arguments. It's illegal to pass
10
+ float through varargs, so _Complex float goes badly. In sort of
11
+ gets passed as _Complex double, but the compiler doesn't agree
12
+ with itself on this issue. */
13
+ /* { dg-do run { xfail alpha*-*-* } } */
14
+
15
+ #include "complex_defs_float.inc"
16
+ #include "cls_complex_va.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Test complex' passed in variable argument lists.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "complex_defs_longdouble.inc"
10
+ #include "cls_complex_va.inc"
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2003, 2006, 2009, 2010 Free Software Foundation, Inc.
1
+ # Copyright (C) 2003, 2006, 2009, 2010, 2014 Free Software Foundation, Inc.
2
2
 
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -19,14 +19,15 @@ libffi-init
19
19
 
20
20
  global srcdir subdir
21
21
 
22
- global cxx_options
22
+ set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.{c,cc}]]
23
23
 
24
- set cxx_options " -shared-libgcc -lstdc++"
25
-
26
- dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O0 -W -Wall"
27
- dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O2"
28
- dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O3"
29
- dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-Os"
24
+ if { [libffi_feature_test "#ifdef FFI_TARGET_HAS_COMPLEX_TYPE"] } {
25
+ run-many-tests $tlist ""
26
+ } else {
27
+ foreach test $tlist {
28
+ unsupported "$test"
29
+ }
30
+ }
30
31
 
31
32
  dg-finish
32
33
 
@@ -0,0 +1,51 @@
1
+ /* -*-c-*-*/
2
+ #include "ffitest.h"
3
+ #include <complex.h>
4
+
5
+ static _Complex T_C_TYPE f_complex(_Complex T_C_TYPE c, int x, int *py)
6
+ {
7
+ c = -(2 * creal (c)) + (cimag (c) + 1)* I;
8
+ *py += x;
9
+
10
+ return c;
11
+ }
12
+
13
+ int main (void)
14
+ {
15
+ ffi_cif cif;
16
+ ffi_type *args[MAX_ARGS];
17
+ void *values[MAX_ARGS];
18
+
19
+ _Complex T_C_TYPE tc_arg;
20
+ _Complex T_C_TYPE tc_result;
21
+ int tc_int_arg_x;
22
+ int tc_y;
23
+ int *tc_ptr_arg_y = &tc_y;
24
+
25
+ args[0] = &T_FFI_TYPE;
26
+ args[1] = &ffi_type_sint;
27
+ args[2] = &ffi_type_pointer;
28
+ values[0] = &tc_arg;
29
+ values[1] = &tc_int_arg_x;
30
+ values[2] = &tc_ptr_arg_y;
31
+
32
+ /* Initialize the cif */
33
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
34
+ &T_FFI_TYPE, args) == FFI_OK);
35
+
36
+ tc_arg = 1 + 7 * I;
37
+ tc_int_arg_x = 1234;
38
+ tc_y = 9876;
39
+ ffi_call(&cif, FFI_FN(f_complex), &tc_result, values);
40
+
41
+ printf ("%f,%fi %f,%fi, x %d 1234, y %d 11110\n",
42
+ T_CONV creal (tc_result), T_CONV cimag (tc_result),
43
+ T_CONV creal (2.0), T_CONV creal (8.0), tc_int_arg_x, tc_y);
44
+
45
+ CHECK (creal (tc_result) == -2);
46
+ CHECK (cimag (tc_result) == 8);
47
+ CHECK (tc_int_arg_x == 1234);
48
+ CHECK (*tc_ptr_arg_y == 11110);
49
+
50
+ exit(0);
51
+ }
@@ -0,0 +1,7 @@
1
+ /* -*-c-*- */
2
+ /* Complex base type. */
3
+ #define T_FFI_TYPE ffi_type_complex_double
4
+ /* C type corresponding to the base type. */
5
+ #define T_C_TYPE double
6
+ /* C cast for a value of type T_C_TYPE that is passed to printf. */
7
+ #define T_CONV
@@ -0,0 +1,7 @@
1
+ /* -*-c-*- */
2
+ /* Complex base type. */
3
+ #define T_FFI_TYPE ffi_type_complex_float
4
+ /* C type corresponding to the base type. */
5
+ #define T_C_TYPE float
6
+ /* C cast for a value of type T_C_TYPE that is passed to printf. */
7
+ #define T_CONV (double)
@@ -0,0 +1,7 @@
1
+ /* -*-c-*- */
2
+ /* Complex base type. */
3
+ #define T_FFI_TYPE ffi_type_complex_longdouble
4
+ /* C type corresponding to the base type. */
5
+ #define T_C_TYPE long double
6
+ /* C cast for a value of type T_C_TYPE that is passed to printf. */
7
+ #define T_CONV
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_call
2
+ Purpose: Check complex types.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "complex_defs_double.inc"
10
+ #include "complex.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_call
2
+ Purpose: Check complex types.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "complex_defs_float.inc"
10
+ #include "complex.inc"
@@ -0,0 +1,86 @@
1
+ /* Area: ffi_call
2
+ Purpose: Check non-standard complex types.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "ffitest.h"
10
+ #include "ffi.h"
11
+ #include <complex.h>
12
+
13
+ _Complex int f_complex(_Complex int c, int x, int *py)
14
+ {
15
+ __real__ c = -2 * __real__ c;
16
+ __imag__ c = __imag__ c + 1;
17
+ *py += x;
18
+ return c;
19
+ }
20
+
21
+ /*
22
+ * This macro can be used to define new complex type descriptors
23
+ * in a platform independent way.
24
+ *
25
+ * name: Name of the new descriptor is ffi_type_complex_<name>.
26
+ * type: The C base type of the complex type.
27
+ */
28
+ #define FFI_COMPLEX_TYPEDEF(name, type, ffitype) \
29
+ static ffi_type *ffi_elements_complex_##name [2] = { \
30
+ (ffi_type *)(&ffitype), NULL \
31
+ }; \
32
+ struct struct_align_complex_##name { \
33
+ char c; \
34
+ _Complex type x; \
35
+ }; \
36
+ ffi_type ffi_type_complex_##name = { \
37
+ sizeof(_Complex type), \
38
+ offsetof(struct struct_align_complex_##name, x), \
39
+ FFI_TYPE_COMPLEX, \
40
+ (ffi_type **)ffi_elements_complex_##name \
41
+ }
42
+
43
+ /* Define new complex type descriptors using the macro: */
44
+ /* ffi_type_complex_sint */
45
+ FFI_COMPLEX_TYPEDEF(sint, int, ffi_type_sint);
46
+ /* ffi_type_complex_uchar */
47
+ FFI_COMPLEX_TYPEDEF(uchar, unsigned char, ffi_type_uint8);
48
+
49
+ int main (void)
50
+ {
51
+ ffi_cif cif;
52
+ ffi_type *args[MAX_ARGS];
53
+ void *values[MAX_ARGS];
54
+
55
+ _Complex int tc_arg;
56
+ _Complex int tc_result;
57
+ int tc_int_arg_x;
58
+ int tc_y;
59
+ int *tc_ptr_arg_y = &tc_y;
60
+
61
+ args[0] = &ffi_type_complex_sint;
62
+ args[1] = &ffi_type_sint;
63
+ args[2] = &ffi_type_pointer;
64
+ values[0] = &tc_arg;
65
+ values[1] = &tc_int_arg_x;
66
+ values[2] = &tc_ptr_arg_y;
67
+
68
+ /* Initialize the cif */
69
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &ffi_type_complex_sint, args)
70
+ == FFI_OK);
71
+
72
+ tc_arg = 1 + 7 * I;
73
+ tc_int_arg_x = 1234;
74
+ tc_y = 9876;
75
+ ffi_call(&cif, FFI_FN(f_complex), &tc_result, values);
76
+
77
+ printf ("%d,%di %d,%di, x %d 1234, y %d 11110\n",
78
+ (int)tc_result, (int)(tc_result * -I), 2, 8, tc_int_arg_x, tc_y);
79
+ /* dg-output "-2,8i 2,8i, x 1234 1234, y 11110 11110" */
80
+ CHECK (creal (tc_result) == -2);
81
+ CHECK (cimag (tc_result) == 8);
82
+ CHECK (tc_int_arg_x == 1234);
83
+ CHECK (*tc_ptr_arg_y == 11110);
84
+
85
+ exit(0);
86
+ }
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_call
2
+ Purpose: Check complex types.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "complex_defs_longdouble.inc"
10
+ #include "complex.inc"
@@ -0,0 +1 @@
1
+ #include "../libffi.call/ffitest.h"
@@ -0,0 +1,78 @@
1
+ /* -*-c-*- */
2
+ #include "ffitest.h"
3
+
4
+ #include <stdlib.h>
5
+ #include <complex.h>
6
+
7
+ static _Complex T_C_TYPE many(_Complex T_C_TYPE c1,
8
+ _Complex T_C_TYPE c2,
9
+ _Complex T_C_TYPE c3,
10
+ _Complex T_C_TYPE c4,
11
+ _Complex T_C_TYPE c5,
12
+ _Complex T_C_TYPE c6,
13
+ _Complex T_C_TYPE c7,
14
+ _Complex T_C_TYPE c8,
15
+ _Complex T_C_TYPE c9,
16
+ _Complex T_C_TYPE c10,
17
+ _Complex T_C_TYPE c11,
18
+ _Complex T_C_TYPE c12,
19
+ _Complex T_C_TYPE c13)
20
+ {
21
+ printf("0 :%f,%fi\n"
22
+ "1 :%f,%fi\n"
23
+ "2 :%f,%fi\n"
24
+ "3 :%f,%fi\n"
25
+ "4 :%f,%fi\n"
26
+ "5 :%f,%fi\n"
27
+ "6 :%f,%fi\n"
28
+ "7 :%f,%fi\n"
29
+ "8 :%f,%fi\n"
30
+ "9 :%f,%fi\n"
31
+ "10:%f,%fi\n"
32
+ "11:%f,%fi\n"
33
+ "12:%f,%fi\n",
34
+ T_CONV creal (c1), T_CONV cimag (c1),
35
+ T_CONV creal (c2), T_CONV cimag (c2),
36
+ T_CONV creal (c3), T_CONV cimag (c3),
37
+ T_CONV creal (c4), T_CONV cimag (c4),
38
+ T_CONV creal (c5), T_CONV cimag (c5),
39
+ T_CONV creal (c6), T_CONV cimag (c6),
40
+ T_CONV creal (c7), T_CONV cimag (c7),
41
+ T_CONV creal (c8), T_CONV cimag (c8),
42
+ T_CONV creal (c9), T_CONV cimag (c9),
43
+ T_CONV creal (c10), T_CONV cimag (c10),
44
+ T_CONV creal (c11), T_CONV cimag (c11),
45
+ T_CONV creal (c12), T_CONV cimag (c12),
46
+ T_CONV creal (c13), T_CONV cimag (c13));
47
+
48
+ return (c1+c2-c3-c4+c5+c6+c7-c8-c9-c10-c11+c12+c13);
49
+ }
50
+
51
+ int main (void)
52
+ {
53
+ ffi_cif cif;
54
+ ffi_type *args[13];
55
+ void *values[13];
56
+ _Complex T_C_TYPE ca[13];
57
+ _Complex T_C_TYPE c, cc;
58
+ int i;
59
+
60
+ for (i = 0; i < 13; i++)
61
+ {
62
+ args[i] = &T_FFI_TYPE;
63
+ values[i] = &ca[i];
64
+ ca[i] = i + (-20 - i) * I;
65
+ }
66
+
67
+ /* Initialize the cif */
68
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13, &T_FFI_TYPE, args) == FFI_OK);
69
+
70
+ ffi_call(&cif, FFI_FN(many), &c, values);
71
+
72
+ cc = many(ca[0], ca[1], ca[2], ca[3], ca[4], ca[5], ca[6], ca[7], ca[8],
73
+ ca[9], ca[10], ca[11], ca[12]);
74
+ CHECK(creal (cc) == creal (c));
75
+ CHECK(cimag (cc) == cimag (c));
76
+
77
+ exit(0);
78
+ }
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_call
2
+ Purpose: Check return value complex, with many arguments
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "complex_defs_double.inc"
10
+ #include "many_complex.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_call
2
+ Purpose: Check return value complex, with many arguments
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "complex_defs_float.inc"
10
+ #include "many_complex.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_call
2
+ Purpose: Check return value complex, with many arguments
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <vogt@linux.vnet.ibm.com>. */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "complex_defs_longdouble.inc"
10
+ #include "many_complex.inc"