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,37 @@
1
+ /* -*-c-*- */
2
+ #include "ffitest.h"
3
+ #include <complex.h>
4
+
5
+ static _Complex T_C_TYPE return_c(_Complex T_C_TYPE c)
6
+ {
7
+ printf ("%f,%fi\n", T_CONV creal (c), T_CONV cimag (c));
8
+ return 2 * c;
9
+ }
10
+ int main (void)
11
+ {
12
+ ffi_cif cif;
13
+ ffi_type *args[MAX_ARGS];
14
+ void *values[MAX_ARGS];
15
+ _Complex T_C_TYPE c, rc, rc2;
16
+ T_C_TYPE cr, ci;
17
+
18
+ args[0] = &T_FFI_TYPE;
19
+ values[0] = &c;
20
+
21
+ /* Initialize the cif */
22
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
23
+ &T_FFI_TYPE, args) == FFI_OK);
24
+
25
+ for (cr = -127.0; cr < 127; cr++)
26
+ {
27
+ ci = 1000.0 - cr;
28
+ c = cr + ci * I;
29
+ ffi_call(&cif, FFI_FN(return_c), &rc, values);
30
+ rc2 = return_c(c);
31
+ printf ("%f,%fi vs %f,%fi\n",
32
+ T_CONV creal (rc), T_CONV cimag (rc),
33
+ T_CONV creal (rc2), T_CONV cimag (rc2));
34
+ CHECK(rc == 2 * c);
35
+ }
36
+ exit(0);
37
+ }
@@ -0,0 +1,41 @@
1
+ /* -*-c-*- */
2
+ #include "ffitest.h"
3
+ #include <complex.h>
4
+
5
+ static _Complex T_C_TYPE return_c(_Complex T_C_TYPE c1, float fl2, unsigned int in3, _Complex T_C_TYPE c4)
6
+ {
7
+ return c1 + fl2 + in3 + c4;
8
+ }
9
+ int main (void)
10
+ {
11
+ ffi_cif cif;
12
+ ffi_type *args[MAX_ARGS];
13
+ void *values[MAX_ARGS];
14
+ _Complex T_C_TYPE c1, c4, rc, rc2;
15
+ float fl2;
16
+ unsigned int in3;
17
+ args[0] = &T_FFI_TYPE;
18
+ args[1] = &ffi_type_float;
19
+ args[2] = &ffi_type_uint;
20
+ args[3] = &T_FFI_TYPE;
21
+ values[0] = &c1;
22
+ values[1] = &fl2;
23
+ values[2] = &in3;
24
+ values[3] = &c4;
25
+
26
+ /* Initialize the cif */
27
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
28
+ &T_FFI_TYPE, args) == FFI_OK);
29
+ c1 = 127.0 + 255.0 * I;
30
+ fl2 = 128.0;
31
+ in3 = 255;
32
+ c4 = 512.7 + 1024.1 * I;
33
+
34
+ ffi_call(&cif, FFI_FN(return_c), &rc, values);
35
+ rc2 = return_c(c1, fl2, in3, c4);
36
+ printf ("%f,%fi vs %f,%fi\n",
37
+ T_CONV creal (rc), T_CONV cimag (rc),
38
+ T_CONV creal (rc2), T_CONV cimag (rc2));
39
+ CHECK(rc == rc2);
40
+ exit(0);
41
+ }
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_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 "return_complex1.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_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 "return_complex1.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_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 "return_complex1.inc"
@@ -0,0 +1,44 @@
1
+ /* -*-c-*- */
2
+ #include "ffitest.h"
3
+ #include <complex.h>
4
+
5
+ _Complex T_C_TYPE
6
+ return_c(_Complex T_C_TYPE c1, _Complex T_C_TYPE c2,
7
+ unsigned int in3, _Complex T_C_TYPE c4)
8
+ {
9
+ volatile _Complex T_C_TYPE r = c1 + c2 + in3 + c4;
10
+ return r;
11
+ }
12
+
13
+ int main (void)
14
+ {
15
+ ffi_cif cif;
16
+ ffi_type *args[MAX_ARGS];
17
+ void *values[MAX_ARGS];
18
+ _Complex T_C_TYPE c1, c2, c4, rc, rc2;
19
+ unsigned int in3;
20
+ args[0] = &T_FFI_TYPE;
21
+ args[1] = &T_FFI_TYPE;
22
+ args[2] = &ffi_type_uint;
23
+ args[3] = &T_FFI_TYPE;
24
+ values[0] = &c1;
25
+ values[1] = &c2;
26
+ values[2] = &in3;
27
+ values[3] = &c4;
28
+
29
+ /* Initialize the cif */
30
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
31
+ &T_FFI_TYPE, args) == FFI_OK);
32
+ c1 = 127.0 + 255.0 * I;
33
+ c2 = 128.0 + 256.0;
34
+ in3 = 255;
35
+ c4 = 512.7 + 1024.1 * I;
36
+
37
+ ffi_call(&cif, FFI_FN(return_c), &rc, values);
38
+ rc2 = return_c(c1, c2, in3, c4);
39
+ printf ("%f,%fi vs %f,%fi\n",
40
+ T_CONV creal (rc), T_CONV cimag (rc),
41
+ T_CONV creal (rc2), T_CONV cimag (rc2));
42
+ CHECK(rc == rc2);
43
+ exit(0);
44
+ }
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_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 "return_complex2.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_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 "return_complex2.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_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 "return_complex2.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_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 "return_complex.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_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 "return_complex.inc"
@@ -0,0 +1,10 @@
1
+ /* Area: ffi_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 "return_complex.inc"
@@ -0,0 +1,34 @@
1
+ /* { dg-do run } */
2
+
3
+ #include "static-chain.h"
4
+
5
+ #if defined(__GNUC__) && !defined(__clang__) && defined(STATIC_CHAIN_REG)
6
+
7
+ #include "ffitest.h"
8
+
9
+ /* Blatent assumption here that the prologue doesn't clobber the
10
+ static chain for trivial functions. If this is not true, don't
11
+ define STATIC_CHAIN_REG, and we'll test what we can via other tests. */
12
+ void *doit(void)
13
+ {
14
+ register void *chain __asm__(STATIC_CHAIN_REG);
15
+ return chain;
16
+ }
17
+
18
+ int main()
19
+ {
20
+ ffi_cif cif;
21
+ void *result;
22
+
23
+ CHECK(ffi_prep_cif(&cif, ABI_NUM, 0, &ffi_type_pointer, NULL) == FFI_OK);
24
+
25
+ ffi_call_go(&cif, FFI_FN(doit), &result, NULL, &result);
26
+
27
+ CHECK(result == &result);
28
+
29
+ return 0;
30
+ }
31
+
32
+ #else /* UNSUPPORTED */
33
+ int main() { return 0; }
34
+ #endif
@@ -0,0 +1,28 @@
1
+ /* { dg-do run } */
2
+
3
+ #include "ffitest.h"
4
+
5
+ void doit(ffi_cif *cif, void *rvalue, void **avalue, void *closure)
6
+ {
7
+ (void)cif;
8
+ (void)avalue;
9
+ *(void **)rvalue = closure;
10
+ }
11
+
12
+ typedef void * (*FN)(void);
13
+
14
+ int main()
15
+ {
16
+ ffi_cif cif;
17
+ ffi_go_closure cl;
18
+ void *result;
19
+
20
+ CHECK(ffi_prep_cif(&cif, ABI_NUM, 0, &ffi_type_pointer, NULL) == FFI_OK);
21
+ CHECK(ffi_prep_go_closure(&cl, &cif, doit) == FFI_OK);
22
+
23
+ ffi_call_go(&cif, FFI_FN(*(FN *)&cl), &result, NULL, &cl);
24
+
25
+ CHECK(result == &cl);
26
+
27
+ exit(0);
28
+ }
@@ -0,0 +1 @@
1
+ #include "../libffi.call/ffitest.h"
@@ -0,0 +1,36 @@
1
+ # Copyright (C) 2003, 2006, 2009, 2010, 2014 Free Software Foundation, Inc.
2
+
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with this program; see the file COPYING3. If not see
15
+ # <http://www.gnu.org/licenses/>.
16
+
17
+ dg-init
18
+ libffi-init
19
+
20
+ global srcdir subdir
21
+
22
+ set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.{c,cc}]]
23
+
24
+ if { [libffi_feature_test "#ifdef FFI_GO_CLOSURES"] } {
25
+ run-many-tests $tlist ""
26
+ } else {
27
+ foreach test $tlist {
28
+ unsupported "$test"
29
+ }
30
+ }
31
+
32
+ dg-finish
33
+
34
+ # Local Variables:
35
+ # tcl-indent-level:4
36
+ # End:
@@ -0,0 +1,19 @@
1
+ #ifdef __aarch64__
2
+ # define STATIC_CHAIN_REG "x18"
3
+ #elif defined(__alpha__)
4
+ # define STATIC_CHAIN_REG "$1"
5
+ #elif defined(__arm__)
6
+ # define STATIC_CHAIN_REG "ip"
7
+ #elif defined(__sparc__)
8
+ # if defined(__arch64__) || defined(__sparcv9)
9
+ # define STATIC_CHAIN_REG "g5"
10
+ # else
11
+ # define STATIC_CHAIN_REG "g2"
12
+ # endif
13
+ #elif defined(__x86_64__)
14
+ # define STATIC_CHAIN_REG "r10"
15
+ #elif defined(__i386__)
16
+ # ifndef ABI_NUM
17
+ # define STATIC_CHAIN_REG "ecx" /* FFI_DEFAULT_ABI only */
18
+ # endif
19
+ #endif
@@ -3,11 +3,11 @@
3
3
  # Makefile for BSD systems
4
4
  #
5
5
 
6
- INCFLAGS += -I${LIBFFI_BUILD_DIR}/include
7
6
  LOCAL_LIBS += ${LIBFFI} -lpthread
8
7
 
9
8
  LIBFFI_CFLAGS = ${FFI_MMAP_EXEC} -pthread
10
9
  LIBFFI_BUILD_DIR = ${.CURDIR}/libffi-${arch}
10
+ INCFLAGS := -I${LIBFFI_BUILD_DIR}/include -I${INCFLAGS}
11
11
 
12
12
  .if ${srcdir} == "."
13
13
  LIBFFI_SRC_DIR := ${.CURDIR}/libffi
@@ -17,16 +17,22 @@ LIBFFI_BUILD_DIR = ${.CURDIR}/libffi-${arch}
17
17
 
18
18
 
19
19
  LIBFFI = ${LIBFFI_BUILD_DIR}/.libs/libffi_convenience.a
20
+ LIBFFI_AUTOGEN = ${LIBFFI_SRC_DIR}/autogen.sh
20
21
  LIBFFI_CONFIGURE = ${LIBFFI_SRC_DIR}/configure --disable-static \
21
- --with-pic=yes --disable-dependency-tracking
22
+ --with-pic=yes --disable-dependency-tracking --disable-docs
22
23
 
23
24
  $(OBJS): ${LIBFFI}
24
25
 
25
- $(LIBFFI):
26
+ $(LIBFFI):
26
27
  @mkdir -p ${LIBFFI_BUILD_DIR}
28
+ @if [ ! -f $(LIBFFI_SRC_DIR)/configure ]; then \
29
+ echo "Running autoreconf for libffi"; \
30
+ cd "$(LIBFFI_SRC_DIR)" && \
31
+ /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \
32
+ fi
27
33
  @if [ ! -f ${LIBFFI_BUILD_DIR}/Makefile ]; then \
28
- echo "Configuring libffi"; \
29
- cd ${LIBFFI_BUILD_DIR} && \
34
+ echo "Configuring libffi"; \
35
+ cd ${LIBFFI_BUILD_DIR} && \
30
36
  /usr/bin/env CC="${CC}" LD="${LD}" CFLAGS="${LIBFFI_CFLAGS}" GREP_OPTIONS="" \
31
37
  /bin/sh ${LIBFFI_CONFIGURE} ${LIBFFI_HOST} > /dev/null; \
32
38
  fi
@@ -8,7 +8,7 @@ BUILD_DIR := $(shell pwd)
8
8
  INCFLAGS += -I"$(BUILD_DIR)"
9
9
 
10
10
  # Work out which arches we need to compile the lib for
11
- ARCHES :=
11
+ ARCHES :=
12
12
  ARCHFLAGS ?= $(filter -arch %, $(CFLAGS))
13
13
 
14
14
  ifneq ($(findstring -arch ppc,$(ARCHFLAGS)),)
@@ -26,11 +26,16 @@ endif
26
26
  ifeq ($(strip $(ARCHES)),)
27
27
  LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi-$(arch)
28
28
  # Just build the one (default) architecture
29
- $(LIBFFI):
29
+ $(LIBFFI):
30
30
  @mkdir -p "$(LIBFFI_BUILD_DIR)" "$(@D)"
31
+ @if [ ! -f "$(LIBFFI_SRC_DIR)"/configure ]; then \
32
+ echo "Running autoreconf for libffi"; \
33
+ cd "$(LIBFFI_SRC_DIR)" && \
34
+ /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \
35
+ fi
31
36
  @if [ ! -f "$(LIBFFI_BUILD_DIR)"/Makefile ]; then \
32
- echo "Configuring libffi"; \
33
- cd "$(LIBFFI_BUILD_DIR)" && \
37
+ echo "Configuring libffi"; \
38
+ cd "$(LIBFFI_BUILD_DIR)" && \
34
39
  /usr/bin/env CC="$(CC)" LD="$(LD)" CFLAGS="$(LIBFFI_CFLAGS)" GREP_OPTIONS="" \
35
40
  /bin/sh $(LIBFFI_CONFIGURE) $(LIBFFI_HOST) > /dev/null; \
36
41
  fi
@@ -42,6 +47,11 @@ LIBTARGETS = $(foreach arch,$(ARCHES),"$(BUILD_DIR)"/libffi-$(arch)/.libs/libffi
42
47
  # Build a fat binary and assemble
43
48
  build_ffi = \
44
49
  mkdir -p "$(BUILD_DIR)"/libffi-$(1); \
50
+ (if [ ! -f "$(LIBFFI_SRC_DIR)"/configure ]; then \
51
+ echo "Running autoreconf for libffi"; \
52
+ cd "$(LIBFFI_SRC_DIR)" && \
53
+ /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \
54
+ fi); \
45
55
  (if [ ! -f "$(BUILD_DIR)"/libffi-$(1)/Makefile ]; then \
46
56
  echo "Configuring libffi for $(1)"; \
47
57
  cd "$(BUILD_DIR)"/libffi-$(1) && \
@@ -5,11 +5,11 @@
5
5
 
6
6
 
7
7
  # Tack the extra deps onto the autogenerated variables
8
- INCFLAGS += -I"$(LIBFFI_BUILD_DIR)"/include
9
8
  LOCAL_LIBS += $(LIBFFI)
10
9
  BUILD_DIR = $(shell pwd)
11
10
  LIBFFI_CFLAGS = $(FFI_MMAP_EXEC)
12
11
  LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi-$(arch)
12
+ INCFLAGS := -I"$(LIBFFI_BUILD_DIR)"/include $(INCFLAGS)
13
13
 
14
14
  ifeq ($(srcdir),.)
15
15
  LIBFFI_SRC_DIR := $(shell pwd)/libffi
@@ -20,8 +20,9 @@ else
20
20
  endif
21
21
 
22
22
  LIBFFI = "$(LIBFFI_BUILD_DIR)"/.libs/libffi_convenience.a
23
+ LIBFFI_AUTOGEN = ${LIBFFI_SRC_DIR}/autogen.sh
23
24
  LIBFFI_CONFIGURE = "$(LIBFFI_SRC_DIR)"/configure --disable-static \
24
- --with-pic=yes --disable-dependency-tracking
25
+ --with-pic=yes --disable-dependency-tracking --disable-docs
25
26
 
26
27
  $(OBJS): $(LIBFFI)
27
28
 
data/ext/ffi_c/libffi.mk CHANGED
@@ -2,12 +2,17 @@
2
2
 
3
3
  include ${srcdir}/libffi.gnu.mk
4
4
 
5
- $(LIBFFI):
5
+ $(LIBFFI):
6
6
  @mkdir -p "$(LIBFFI_BUILD_DIR)" "$@(D)"
7
+ @if [ ! -f "$(LIBFFI_SRC_DIR)"/configure ]; then \
8
+ echo "Running autoreconf for libffi"; \
9
+ cd "$(LIBFFI_SRC_DIR)" && \
10
+ /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \
11
+ fi
7
12
  @if [ ! -f "$(LIBFFI_BUILD_DIR)"/Makefile ]; then \
8
- echo "Configuring libffi"; \
9
- cd "$(LIBFFI_BUILD_DIR)" && \
10
- /usr/bin/env CFLAGS="$(LIBFFI_CFLAGS)" GREP_OPTIONS="" \
11
- /bin/sh $(LIBFFI_CONFIGURE) $(LIBFFI_HOST) > /dev/null; \
13
+ echo "Configuring libffi"; \
14
+ cd "$(LIBFFI_BUILD_DIR)" && \
15
+ env CFLAGS="$(LIBFFI_CFLAGS)" GREP_OPTIONS="" \
16
+ sh $(LIBFFI_CONFIGURE) $(LIBFFI_HOST) > /dev/null; \
12
17
  fi
13
18
  $(MAKE) -C "$(LIBFFI_BUILD_DIR)"
@@ -4,7 +4,7 @@
4
4
  #
5
5
 
6
6
  # Tack the extra deps onto the autogenerated variables
7
- INCFLAGS = $(INCFLAGS) -I$(LIBFFI_BUILD_DIR)/include -I$(LIBFFI_BUILD_DIR)/src/x86
7
+ INCFLAGS = -I$(LIBFFI_BUILD_DIR)/include -I$(LIBFFI_BUILD_DIR)/src/x86 $(INCFLAGS)
8
8
  LOCAL_LIBS = $(LOCAL_LIBS) $(LIBFFI)
9
9
  BUILD_DIR = $(MAKEDIR)
10
10
  LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi
@@ -4,7 +4,7 @@
4
4
  #
5
5
 
6
6
  # Tack the extra deps onto the autogenerated variables
7
- INCFLAGS = $(INCFLAGS) -I$(LIBFFI_BUILD_DIR)/include -I$(LIBFFI_BUILD_DIR)/src/x86
7
+ INCFLAGS = -I$(LIBFFI_BUILD_DIR)/include -I$(LIBFFI_BUILD_DIR)/src/x86 $(INCFLAGS)
8
8
  LOCAL_LIBS = $(LOCAL_LIBS) $(LIBFFI)
9
9
  BUILD_DIR = $(MAKEDIR)
10
10
  LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi
data/ffi.gemspec CHANGED
@@ -8,16 +8,29 @@ Gem::Specification.new do |s|
8
8
  s.homepage = 'http://wiki.github.com/ffi/ffi'
9
9
  s.summary = 'Ruby FFI'
10
10
  s.description = 'Ruby FFI library'
11
- s.files = %w(ffi.gemspec LICENSE COPYING README.md Rakefile) + Dir.glob("{ext,gen,lib,spec,libtest}/**/*").reject { |f| f =~ /(lib\/[12]\.[089]|\.s?[ao]$|\.bundle|\.dylib$)/ }
11
+ s.files = `git ls-files -z`.split("\x0").reject do |f|
12
+ f =~ /^(bench|gen|libtest|nbproject|spec)/
13
+ end
14
+
15
+ # Add libffi git files
16
+ lfs = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0")
17
+ # Add autoconf generated files of libffi
18
+ lfs += %w[ configure config.guess config.sub install-sh ltmain.sh missing fficonfig.h.in ]
19
+ # Add automake generated files of libffi
20
+ lfs += `git --git-dir ext/ffi_c/libffi/.git ls-files -z *.am */*.am`.gsub(".am\0", ".in\0").split("\x0")
21
+ s.files += lfs.map do |f|
22
+ File.join("ext/ffi_c/libffi", f)
23
+ end
24
+
12
25
  s.extensions << 'ext/ffi_c/extconf.rb'
13
26
  s.has_rdoc = false
14
27
  s.rdoc_options = %w[--exclude=ext/ffi_c/.*\.o$ --exclude=ffi_c\.(bundle|so)$]
15
28
  s.license = 'BSD-3-Clause'
16
29
  s.require_paths << 'ext/ffi_c'
17
- s.required_ruby_version = '>= 1.8.7'
30
+ s.required_ruby_version = '>= 1.9'
18
31
  s.add_development_dependency 'rake', '~> 10.1'
19
32
  s.add_development_dependency 'rake-compiler', '~> 1.0'
20
- s.add_development_dependency 'rake-compiler-dock', '~> 0.6.0'
33
+ s.add_development_dependency 'rake-compiler-dock', '~> 0.6.2'
21
34
  s.add_development_dependency 'rspec', '~> 2.14.1'
22
35
  s.add_development_dependency 'rubygems-tasks', "~> 0.2.4"
23
36
  end
data/lib/ffi/enum.rb CHANGED
@@ -169,4 +169,128 @@ module FFI
169
169
  @vk_map[val] || val
170
170
  end
171
171
  end
172
+
173
+ # Represents a C enum whose values are power of 2
174
+ #
175
+ # @example
176
+ # enum {
177
+ # red = (1<<0),
178
+ # green = (1<<1),
179
+ # blue = (1<<2)
180
+ # }
181
+ #
182
+ # Contrary to classical enums, bitmask values are usually combined
183
+ # when used.
184
+ class Bitmask < Enum
185
+
186
+ # @overload initialize(info, tag=nil)
187
+ # @param [nil, Enumerable] info symbols and bit rank for new Bitmask
188
+ # @param [nil, Symbol] tag name of new Bitmask
189
+ # @overload initialize(native_type, info, tag=nil)
190
+ # @param [FFI::Type] native_type Native type for new Bitmask
191
+ # @param [nil, Enumerable] info symbols and bit rank for new Bitmask
192
+ # @param [nil, Symbol] tag name of new Bitmask
193
+ def initialize(*args)
194
+ @native_type = args.first.kind_of?(FFI::Type) ? args.shift : Type::INT
195
+ info, @tag = *args
196
+ @kv_map = Hash.new
197
+ unless info.nil?
198
+ last_cst = nil
199
+ value = 0
200
+ info.each do |i|
201
+ case i
202
+ when Symbol
203
+ raise ArgumentError, "duplicate bitmask key" if @kv_map.has_key?(i)
204
+ @kv_map[i] = 1 << value
205
+ last_cst = i
206
+ value += 1
207
+ when Integer
208
+ raise ArgumentError, "bitmask index should be positive" if i<0
209
+ @kv_map[last_cst] = 1 << i
210
+ value = i+1
211
+ end
212
+ end
213
+ end
214
+ @vk_map = @kv_map.invert
215
+ end
216
+
217
+ # Get a symbol list or a value from the bitmask
218
+ # @overload [](*query)
219
+ # Get bitmask value from symbol list
220
+ # @param [Symbol] query
221
+ # @return [Integer]
222
+ # @overload [](query)
223
+ # Get bitmaks value from symbol array
224
+ # @param [Array<Symbol>] query
225
+ # @return [Integer]
226
+ # @overload [](*query)
227
+ # Get a list of bitmask symbols corresponding to
228
+ # the or reduction of a list of integer
229
+ # @param [Integer] query
230
+ # @return [Array<Symbol>]
231
+ # @overload [](query)
232
+ # Get a list of bitmask symbols corresponding to
233
+ # the or reduction of a list of integer
234
+ # @param [Array<Integer>] query
235
+ # @return [Array<Symbol>]
236
+ def [](*query)
237
+ flat_query = query.flatten
238
+ raise ArgumentError, "query should be homogeneous, #{query.inspect}" unless flat_query.all? { |o| o.is_a?(Symbol) } || flat_query.all? { |o| o.is_a?(Integer) || o.respond_to?(:to_int) }
239
+ case flat_query[0]
240
+ when Symbol
241
+ flat_query.inject(0) do |val, o|
242
+ v = @kv_map[o]
243
+ if v then val |= v else val end
244
+ end
245
+ when Integer, ->(o) { o.respond_to?(:to_int) }
246
+ val = flat_query.inject(0) { |mask, o| mask |= o.to_int }
247
+ @kv_map.select { |_, v| v & val != 0 }.keys
248
+ end
249
+ end
250
+
251
+ # Get the native value of a bitmask
252
+ # @overload to_native(query, ctx)
253
+ # @param [Symbol, Integer, #to_int] query
254
+ # @param ctx unused
255
+ # @return [Integer] value of a bitmask
256
+ # @overload to_native(query, ctx)
257
+ # @param [Array<Symbol, Integer, #to_int>] query
258
+ # @param ctx unused
259
+ # @return [Integer] value of a bitmask
260
+ def to_native(query, ctx)
261
+ return 0 if query.nil?
262
+ flat_query = [query].flatten
263
+ flat_query.inject(0) do |val, o|
264
+ case o
265
+ when Symbol
266
+ v = @kv_map[o]
267
+ raise ArgumentError, "invalid bitmask value, #{o.inspect}" unless v
268
+ val |= v
269
+ when Integer
270
+ val |= o
271
+ when ->(obj) { obj.respond_to?(:to_int) }
272
+ val |= o.to_int
273
+ else
274
+ raise ArgumentError, "invalid bitmask value, #{o.inspect}"
275
+ end
276
+ end
277
+ end
278
+
279
+ # @param [Integer] val
280
+ # @param ctx unused
281
+ # @return [Array<Symbol, Integer>] list of symbol names corresponding to val, plus an optional remainder if some bits don't match any constant
282
+ def from_native(val, ctx)
283
+ list = @kv_map.select { |_, v| v & val != 0 }.keys
284
+ # If there are unmatch flags,
285
+ # return them in an integer,
286
+ # else information can be lost.
287
+ # Similar to Enum behavior.
288
+ remainder = val ^ list.inject(0) do |tmp, o|
289
+ v = @kv_map[o]
290
+ if v then tmp |= v else tmp end
291
+ end
292
+ list.push remainder unless remainder == 0
293
+ return list
294
+ end
295
+ end
172
296
  end