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
@@ -1,773 +0,0 @@
1
- #
2
- # This file is part of ruby-ffi.
3
- # For licensing, see LICENSE.SPECS
4
- #
5
-
6
- require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
7
-
8
- describe "Callback" do
9
- # module LibC
10
- # extend FFI::Library
11
- # callback :qsort_cmp, [ :pointer, :pointer ], :int
12
- # attach_function :qsort, [ :pointer, :int, :int, :qsort_cmp ], :int
13
- # end
14
- # it "arguments get passed correctly" do
15
- # p = MemoryPointer.new(:int, 2)
16
- # p.put_array_of_int32(0, [ 1 , 2 ])
17
- # args = []
18
- # cmp = proc do |p1, p2| args.push(p1.get_int(0)); args.push(p2.get_int(0)); 0; end
19
- # # this is a bit dodgey, as it relies on qsort passing the args in order
20
- # LibC.qsort(p, 2, 4, cmp)
21
- # args.should == [ 1, 2 ]
22
- # end
23
- #
24
- # it "Block can be substituted for Callback as last argument" do
25
- # p = MemoryPointer.new(:int, 2)
26
- # p.put_array_of_int32(0, [ 1 , 2 ])
27
- # args = []
28
- # # this is a bit dodgey, as it relies on qsort passing the args in order
29
- # LibC.qsort(p, 2, 4) do |p1, p2|
30
- # args.push(p1.get_int(0))
31
- # args.push(p2.get_int(0))
32
- # 0
33
- # end
34
- # args.should == [ 1, 2 ]
35
- # end
36
- module LibTest
37
- extend FFI::Library
38
- ffi_lib TestLibrary::PATH
39
- class S8F32S32 < FFI::Struct
40
- layout :s8, :char, :f32, :float, :s32, :int
41
- end
42
-
43
- callback :cbVrS8, [ ], :char
44
- callback :cbVrU8, [ ], :uchar
45
- callback :cbVrS16, [ ], :short
46
- callback :cbVrU16, [ ], :ushort
47
- callback :cbVrS32, [ ], :int
48
- callback :cbVrU32, [ ], :uint
49
- callback :cbVrL, [ ], :long
50
- callback :cbVrUL, [ ], :ulong
51
- callback :cbVrS64, [ ], :long_long
52
- callback :cbVrU64, [ ], :ulong_long
53
- callback :cbVrP, [], :pointer
54
- callback :cbVrZ, [], :bool
55
- callback :cbCrV, [ :char ], :void
56
- callback :cbSrV, [ :short ], :void
57
- callback :cbIrV, [ :int ], :void
58
- callback :cbLrV, [ :long ], :void
59
- callback :cbULrV, [ :ulong ], :void
60
- callback :cbLrV, [ :long_long ], :void
61
- callback :cbVrT, [ ], S8F32S32.by_value
62
- callback :cbTrV, [ S8F32S32.by_value ], :void
63
- callback :cbYrV, [ S8F32S32.ptr ], :void
64
- callback :cbVrY, [ ], S8F32S32.ptr
65
-
66
- attach_function :testCallbackVrS8, :testClosureVrB, [ :cbVrS8 ], :char
67
- attach_function :testCallbackVrU8, :testClosureVrB, [ :cbVrU8 ], :uchar
68
- attach_function :testCallbackVrS16, :testClosureVrS, [ :cbVrS16 ], :short
69
- attach_function :testCallbackVrU16, :testClosureVrS, [ :cbVrU16 ], :ushort
70
- attach_function :testCallbackVrS32, :testClosureVrI, [ :cbVrS32 ], :int
71
- attach_function :testCallbackVrU32, :testClosureVrI, [ :cbVrU32 ], :uint
72
- attach_function :testCallbackVrL, :testClosureVrL, [ :cbVrL ], :long
73
- attach_function :testCallbackVrZ, :testClosureVrZ, [ :cbVrZ ], :bool
74
- attach_function :testCallbackVrUL, :testClosureVrL, [ :cbVrUL ], :ulong
75
- attach_function :testCallbackVrS64, :testClosureVrLL, [ :cbVrS64 ], :long_long
76
- attach_function :testCallbackVrU64, :testClosureVrLL, [ :cbVrU64 ], :ulong_long
77
- attach_function :testCallbackVrP, :testClosureVrP, [ :cbVrP ], :pointer
78
- attach_function :testCallbackVrY, :testClosureVrP, [ :cbVrY ], S8F32S32.ptr
79
- attach_function :testCallbackVrT, :testClosureVrT, [ :cbVrT ], S8F32S32.by_value
80
- attach_function :testCallbackTrV, :testClosureTrV, [ :cbTrV, S8F32S32.ptr ], :void
81
- attach_variable :cbVrS8, :gvar_pointer, :cbVrS8
82
- attach_variable :pVrS8, :gvar_pointer, :pointer
83
- attach_function :testGVarCallbackVrS8, :testClosureVrB, [ :pointer ], :char
84
- attach_function :testOptionalCallbackCrV, :testOptionalClosureBrV, [ :cbCrV, :char ], :void
85
-
86
- end
87
-
88
- it "returning :char (0)" do
89
- expect(LibTest.testCallbackVrS8 { 0 }).to eq(0)
90
- end
91
-
92
- it "returning :char (127)" do
93
- expect(LibTest.testCallbackVrS8 { 127 }).to eq(127)
94
- end
95
-
96
- it "returning :char (-128)" do
97
- expect(LibTest.testCallbackVrS8 { -128 }).to eq(-128)
98
- end
99
- # test wrap around
100
- it "returning :char (128)" do
101
- expect(LibTest.testCallbackVrS8 { 128 }).to eq(-128)
102
- end
103
-
104
- it "returning :char (255)" do
105
- expect(LibTest.testCallbackVrS8 { 0xff }).to eq(-1)
106
- end
107
-
108
- it "returning :uchar (0)" do
109
- expect(LibTest.testCallbackVrU8 { 0 }).to eq(0)
110
- end
111
-
112
- it "returning :uchar (0xff)" do
113
- expect(LibTest.testCallbackVrU8 { 0xff }).to eq(0xff)
114
- end
115
-
116
- it "returning :uchar (-1)" do
117
- expect(LibTest.testCallbackVrU8 { -1 }).to eq(0xff)
118
- end
119
-
120
- it "returning :uchar (128)" do
121
- expect(LibTest.testCallbackVrU8 { 128 }).to eq(128)
122
- end
123
-
124
- it "returning :uchar (-128)" do
125
- expect(LibTest.testCallbackVrU8 { -128 }).to eq(128)
126
- end
127
-
128
- it "returning :short (0)" do
129
- expect(LibTest.testCallbackVrS16 { 0 }).to eq(0)
130
- end
131
-
132
- it "returning :short (0x7fff)" do
133
- expect(LibTest.testCallbackVrS16 { 0x7fff }).to eq(0x7fff)
134
- end
135
- # test wrap around
136
- it "returning :short (0x8000)" do
137
- expect(LibTest.testCallbackVrS16 { 0x8000 }).to eq(-0x8000)
138
- end
139
-
140
- it "returning :short (0xffff)" do
141
- expect(LibTest.testCallbackVrS16 { 0xffff }).to eq(-1)
142
- end
143
-
144
- it "returning :ushort (0)" do
145
- expect(LibTest.testCallbackVrU16 { 0 }).to eq(0)
146
- end
147
-
148
- it "returning :ushort (0x7fff)" do
149
- expect(LibTest.testCallbackVrU16 { 0x7fff }).to eq(0x7fff)
150
- end
151
-
152
- it "returning :ushort (0x8000)" do
153
- expect(LibTest.testCallbackVrU16 { 0x8000 }).to eq(0x8000)
154
- end
155
-
156
- it "returning :ushort (0xffff)" do
157
- expect(LibTest.testCallbackVrU16 { 0xffff }).to eq(0xffff)
158
- end
159
-
160
- it "returning :ushort (-1)" do
161
- expect(LibTest.testCallbackVrU16 { -1 }).to eq(0xffff)
162
- end
163
-
164
- it "returning :int (0)" do
165
- expect(LibTest.testCallbackVrS32 { 0 }).to eq(0)
166
- end
167
-
168
- it "returning :int (0x7fffffff)" do
169
- expect(LibTest.testCallbackVrS32 { 0x7fffffff }).to eq(0x7fffffff)
170
- end
171
- # test wrap around
172
- it "returning :int (-0x80000000)" do
173
- expect(LibTest.testCallbackVrS32 { -0x80000000 }).to eq(-0x80000000)
174
- end
175
-
176
- it "returning :int (-1)" do
177
- expect(LibTest.testCallbackVrS32 { -1 }).to eq(-1)
178
- end
179
-
180
- it "returning :uint (0)" do
181
- expect(LibTest.testCallbackVrU32 { 0 }).to eq(0)
182
- end
183
-
184
- it "returning :uint (0x7fffffff)" do
185
- expect(LibTest.testCallbackVrU32 { 0x7fffffff }).to eq(0x7fffffff)
186
- end
187
- # test wrap around
188
- it "returning :uint (0x80000000)" do
189
- expect(LibTest.testCallbackVrU32 { 0x80000000 }).to eq(0x80000000)
190
- end
191
-
192
- it "returning :uint (0xffffffff)" do
193
- expect(LibTest.testCallbackVrU32 { 0xffffffff }).to eq(0xffffffff)
194
- end
195
-
196
- it "returning :uint (-1)" do
197
- expect(LibTest.testCallbackVrU32 { -1 }).to eq(0xffffffff)
198
- end
199
-
200
- it "returning :long (0)" do
201
- expect(LibTest.testCallbackVrL { 0 }).to eq(0)
202
- end
203
-
204
- it "returning :long (0x7fffffff)" do
205
- expect(LibTest.testCallbackVrL { 0x7fffffff }).to eq(0x7fffffff)
206
- end
207
- # test wrap around
208
- it "returning :long (-0x80000000)" do
209
- expect(LibTest.testCallbackVrL { -0x80000000 }).to eq(-0x80000000)
210
- end
211
-
212
- it "returning :long (-1)" do
213
- expect(LibTest.testCallbackVrL { -1 }).to eq(-1)
214
- end
215
-
216
- it "returning :ulong (0)" do
217
- expect(LibTest.testCallbackVrUL { 0 }).to eq(0)
218
- end
219
-
220
- it "returning :ulong (0x7fffffff)" do
221
- expect(LibTest.testCallbackVrUL { 0x7fffffff }).to eq(0x7fffffff)
222
- end
223
- # test wrap around
224
- it "returning :ulong (0x80000000)" do
225
- expect(LibTest.testCallbackVrUL { 0x80000000 }).to eq(0x80000000)
226
- end
227
-
228
- it "returning :ulong (0xffffffff)" do
229
- expect(LibTest.testCallbackVrUL { 0xffffffff }).to eq(0xffffffff)
230
- end
231
-
232
- it "Callback returning :ulong (-1)" do
233
- if FFI::Platform::LONG_SIZE == 32
234
- expect(LibTest.testCallbackVrUL { -1 }).to eq(0xffffffff)
235
- else
236
- expect(LibTest.testCallbackVrUL { -1 }).to eq(0xffffffffffffffff)
237
- end
238
- end
239
-
240
- it "returning :long_long (0)" do
241
- expect(LibTest.testCallbackVrS64 { 0 }).to eq(0)
242
- end
243
-
244
- it "returning :long_long (0x7fffffffffffffff)" do
245
- expect(LibTest.testCallbackVrS64 { 0x7fffffffffffffff }).to eq(0x7fffffffffffffff)
246
- end
247
- # test wrap around
248
- it "returning :long_long (-0x8000000000000000)" do
249
- expect(LibTest.testCallbackVrS64 { -0x8000000000000000 }).to eq(-0x8000000000000000)
250
- end
251
-
252
- it "returning :long_long (-1)" do
253
- expect(LibTest.testCallbackVrS64 { -1 }).to eq(-1)
254
- end
255
-
256
- it "returning bool" do
257
- expect(LibTest.testCallbackVrZ { true }).to be true
258
- end
259
-
260
- it "returning :pointer (nil)" do
261
- expect(LibTest.testCallbackVrP { nil }).to be_null
262
- end
263
-
264
- it "returning :pointer (MemoryPointer)" do
265
- p = FFI::MemoryPointer.new :long
266
- expect(LibTest.testCallbackVrP { p }).to eq(p)
267
- end
268
-
269
- it "returning struct by value" do
270
- s = LibTest::S8F32S32.new
271
- s[:s8] = 0x12
272
- s[:s32] = 0x1eefbeef
273
- s[:f32] = 1.234567
274
- ret = LibTest.testCallbackVrT { s }
275
- expect(ret[:s8]).to eq(s[:s8])
276
- expect(ret[:f32]).to eq(s[:f32])
277
- expect(ret[:s32]).to eq(s[:s32])
278
-
279
- end
280
-
281
- it "struct by value parameter" do
282
- s = LibTest::S8F32S32.new
283
- s[:s8] = 0x12
284
- s[:s32] = 0x1eefbeef
285
- s[:f32] = 1.234567
286
- s2 = LibTest::S8F32S32.new
287
-
288
- LibTest.testCallbackTrV(s) do |struct|
289
- s2[:s8] = struct[:s8]
290
- s2[:f32] = struct[:f32]
291
- s2[:s32] = struct[:s32]
292
- end
293
-
294
- expect(s2[:s8]).to eql 0x12
295
- expect(s2[:s32]).to eql 0x1eefbeef
296
- expect(s2[:f32]).to be_within(0.0000001).of 1.234567
297
- end
298
-
299
-
300
- it "global variable" do
301
- proc = Proc.new { 0x1e }
302
- LibTest.cbVrS8 = proc
303
- expect(LibTest.testGVarCallbackVrS8(LibTest.pVrS8)).to eq(0x1e)
304
- end
305
-
306
- describe "When the callback is considered optional by the underlying library" do
307
- it "should handle receiving 'nil' in place of the closure" do
308
- expect(LibTest.testOptionalCallbackCrV(nil, 13)).to be_nil
309
- end
310
- end
311
-
312
- describe 'when inlined' do
313
- it 'could be anonymous' do
314
- module LibTest
315
- extend FFI::Library
316
- ffi_lib TestLibrary::PATH
317
- attach_function :testAnonymousCallbackVrS8, :testClosureVrB, [ callback([ ], :char) ], :char
318
- end
319
- expect(LibTest.testAnonymousCallbackVrS8 { 0 }).to eq(0)
320
- end
321
- end
322
-
323
- describe "as return value" do
324
-
325
- it "should not blow up when a callback is defined that returns a callback" do
326
- expect(module LibTest
327
- extend FFI::Library
328
- ffi_lib TestLibrary::PATH
329
- callback :cb_return_type_1, [ :short ], :short
330
- callback :cb_lookup_1, [ :short ], :cb_return_type_1
331
- attach_function :testReturnsCallback_1, :testReturnsClosure, [ :cb_lookup_1, :short ], :cb_return_type_1
332
- end).to be_an_instance_of FFI::Function
333
- end
334
-
335
- it "should return a callback" do
336
- module LibTest
337
- extend FFI::Library
338
- ffi_lib TestLibrary::PATH
339
- callback :cb_return_type, [ :int ], :int
340
- callback :cb_lookup, [ ], :cb_return_type
341
- attach_function :testReturnsCallback, :testReturnsClosure, [ :cb_lookup, :int ], :int
342
- end
343
-
344
- lookup_proc_called = false
345
- return_proc_called = false
346
-
347
- return_proc = Proc.new do |a|
348
- return_proc_called = true
349
- a * 2
350
- end
351
- lookup_proc = Proc.new do
352
- lookup_proc_called = true
353
- return_proc
354
- end
355
-
356
- val = LibTest.testReturnsCallback(lookup_proc, 0x1234)
357
- expect(val).to eq(0x1234 * 2)
358
- expect(lookup_proc_called).to be true
359
- expect(return_proc_called).to be true
360
- end
361
-
362
- it "should return a method callback" do
363
- module LibTest
364
- extend FFI::Library
365
- ffi_lib TestLibrary::PATH
366
- callback :cb_return_type, [ :int ], :int
367
- callback :cb_lookup, [ ], :cb_return_type
368
- attach_function :testReturnsCallback_2, :testReturnsClosure, [ :cb_lookup, :int ], :int
369
- end
370
- module MethodCallback
371
- def self.lookup
372
- method(:perform)
373
- end
374
- def self.perform num
375
- num * 2
376
- end
377
- end
378
-
379
- expect(LibTest.testReturnsCallback_2(MethodCallback.method(:lookup), 0x1234)).to eq(0x2468)
380
- end
381
-
382
- it 'should not blow up when a callback takes a callback as argument' do
383
- expect(module LibTest
384
- extend FFI::Library
385
- ffi_lib TestLibrary::PATH
386
- callback :cb_argument, [ :int ], :int
387
- callback :cb_with_cb_argument, [ :cb_argument, :int ], :int
388
- attach_function :testCallbackAsArgument_2, :testArgumentClosure, [ :cb_with_cb_argument, :int ], :int
389
- end).to be_an_instance_of FFI::Function
390
- end
391
- it 'should be able to use the callback argument' do
392
- module LibTest
393
- extend FFI::Library
394
- ffi_lib TestLibrary::PATH
395
- callback :cb_argument, [ :int ], :int
396
- callback :cb_with_cb_argument, [ :cb_argument, :int ], :int
397
- attach_function :testCallbackAsArgument, :testArgumentClosure, [ :cb_with_cb_argument, :cb_argument, :int ], :int
398
- end
399
- callback_arg_called = false
400
- callback_with_callback_arg_called = false
401
- callback_arg = Proc.new do |val|
402
- callback_arg_called = true
403
- val * 2
404
- end
405
- callback_with_callback_arg = Proc.new do |cb, val|
406
- callback_with_callback_arg_called = true
407
- cb.call(val)
408
- end
409
- val = LibTest.testCallbackAsArgument(callback_with_callback_arg, callback_arg, 0xff1)
410
- expect(val).to eq(0xff1 * 2)
411
- expect(callback_arg_called).to be true
412
- expect(callback_with_callback_arg_called).to be true
413
- end
414
- it 'function returns callable object' do
415
- module LibTest
416
- extend FFI::Library
417
- ffi_lib TestLibrary::PATH
418
- callback :funcptr, [ :int ], :int
419
- attach_function :testReturnsFunctionPointer, [ ], :funcptr
420
- end
421
- f = LibTest.testReturnsFunctionPointer
422
- expect(f.call(3)).to eq(6)
423
- end
424
- end
425
-
426
- end
427
-
428
-
429
- describe "Callback with " do
430
- #
431
- # Test callbacks that take an argument, returning void
432
- #
433
- module LibTest
434
- extend FFI::Library
435
- ffi_lib TestLibrary::PATH
436
-
437
- class S8F32S32 < FFI::Struct
438
- layout :s8, :char, :f32, :float, :s32, :int
439
- end
440
-
441
- callback :cbS8rV, [ :char ], :void
442
- callback :cbU8rV, [ :uchar ], :void
443
- callback :cbS16rV, [ :short ], :void
444
- callback :cbU16rV, [ :ushort ], :void
445
-
446
- callback :cbZrV, [ :bool ], :void
447
- callback :cbS32rV, [ :int ], :void
448
- callback :cbU32rV, [ :uint ], :void
449
-
450
- callback :cbLrV, [ :long ], :void
451
- callback :cbULrV, [ :ulong ], :void
452
- callback :cbArV, [ :string ], :void
453
- callback :cbPrV, [ :pointer], :void
454
- callback :cbYrV, [ S8F32S32.ptr ], :void
455
-
456
- callback :cbS64rV, [ :long_long ], :void
457
- attach_function :testCallbackCrV, :testClosureBrV, [ :cbS8rV, :char ], :void
458
- attach_function :testCallbackU8rV, :testClosureBrV, [ :cbU8rV, :uchar ], :void
459
- attach_function :testCallbackSrV, :testClosureSrV, [ :cbS16rV, :short ], :void
460
- attach_function :testCallbackU16rV, :testClosureSrV, [ :cbU16rV, :ushort ], :void
461
- attach_function :testCallbackZrV, :testClosureZrV, [ :cbZrV, :bool ], :void
462
- attach_function :testCallbackIrV, :testClosureIrV, [ :cbS32rV, :int ], :void
463
- attach_function :testCallbackU32rV, :testClosureIrV, [ :cbU32rV, :uint ], :void
464
-
465
- attach_function :testCallbackLrV, :testClosureLrV, [ :cbLrV, :long ], :void
466
- attach_function :testCallbackULrV, :testClosureULrV, [ :cbULrV, :ulong ], :void
467
-
468
- attach_function :testCallbackLLrV, :testClosureLLrV, [ :cbS64rV, :long_long ], :void
469
- attach_function :testCallbackArV, :testClosurePrV, [ :cbArV, :string ], :void
470
- attach_function :testCallbackPrV, :testClosurePrV, [ :cbPrV, :pointer], :void
471
- attach_function :testCallbackYrV, :testClosurePrV, [ :cbYrV, S8F32S32.in ], :void
472
- end
473
-
474
- it "function with Callback plus another arg should raise error if no arg given" do
475
- expect { LibTest.testCallbackCrV { |*a| }}.to raise_error
476
- end
477
-
478
- it ":char (0) argument" do
479
- v = 0xdeadbeef
480
- LibTest.testCallbackCrV(0) { |i| v = i }
481
- expect(v).to eq(0)
482
- end
483
-
484
- it ":char (127) argument" do
485
- v = 0xdeadbeef
486
- LibTest.testCallbackCrV(127) { |i| v = i }
487
- expect(v).to eq(127)
488
- end
489
-
490
- it ":char (-128) argument" do
491
- v = 0xdeadbeef
492
- LibTest.testCallbackCrV(-128) { |i| v = i }
493
- expect(v).to eq(-128)
494
- end
495
-
496
- it ":char (-1) argument" do
497
- v = 0xdeadbeef
498
- LibTest.testCallbackCrV(-1) { |i| v = i }
499
- expect(v).to eq(-1)
500
- end
501
-
502
- it ":uchar (0) argument" do
503
- v = 0xdeadbeef
504
- LibTest.testCallbackU8rV(0) { |i| v = i }
505
- expect(v).to eq(0)
506
- end
507
-
508
- it ":uchar (127) argument" do
509
- v = 0xdeadbeef
510
- LibTest.testCallbackU8rV(127) { |i| v = i }
511
- expect(v).to eq(127)
512
- end
513
-
514
- it ":uchar (128) argument" do
515
- v = 0xdeadbeef
516
- LibTest.testCallbackU8rV(128) { |i| v = i }
517
- expect(v).to eq(128)
518
- end
519
-
520
- it ":uchar (255) argument" do
521
- v = 0xdeadbeef
522
- LibTest.testCallbackU8rV(255) { |i| v = i }
523
- expect(v).to eq(255)
524
- end
525
-
526
- it ":short (0) argument" do
527
- v = 0xdeadbeef
528
- LibTest.testCallbackSrV(0) { |i| v = i }
529
- expect(v).to eq(0)
530
- end
531
-
532
- it ":short (0x7fff) argument" do
533
- v = 0xdeadbeef
534
- LibTest.testCallbackSrV(0x7fff) { |i| v = i }
535
- expect(v).to eq(0x7fff)
536
- end
537
-
538
- it ":short (-0x8000) argument" do
539
- v = 0xdeadbeef
540
- LibTest.testCallbackSrV(-0x8000) { |i| v = i }
541
- expect(v).to eq(-0x8000)
542
- end
543
-
544
- it ":short (-1) argument" do
545
- v = 0xdeadbeef
546
- LibTest.testCallbackSrV(-1) { |i| v = i }
547
- expect(v).to eq(-1)
548
- end
549
-
550
- it ":ushort (0) argument" do
551
- v = 0xdeadbeef
552
- LibTest.testCallbackU16rV(0) { |i| v = i }
553
- expect(v).to eq(0)
554
- end
555
-
556
- it ":ushort (0x7fff) argument" do
557
- v = 0xdeadbeef
558
- LibTest.testCallbackU16rV(0x7fff) { |i| v = i }
559
- expect(v).to eq(0x7fff)
560
- end
561
-
562
- it ":ushort (0x8000) argument" do
563
- v = 0xdeadbeef
564
- LibTest.testCallbackU16rV(0x8000) { |i| v = i }
565
- expect(v).to eq(0x8000)
566
- end
567
-
568
- it ":ushort (0xffff) argument" do
569
- v = 0xdeadbeef
570
- LibTest.testCallbackU16rV(0xffff) { |i| v = i }
571
- expect(v).to eq(0xffff)
572
- end
573
-
574
- it ":bool (true) argument" do
575
- v = false
576
- LibTest.testCallbackZrV(true) { |i| v = i }
577
- expect(v).to be true
578
- end
579
-
580
- it ":int (0) argument" do
581
- v = 0xdeadbeef
582
- LibTest.testCallbackIrV(0) { |i| v = i }
583
- expect(v).to eq(0)
584
- end
585
-
586
- it ":int (0x7fffffff) argument" do
587
- v = 0xdeadbeef
588
- LibTest.testCallbackIrV(0x7fffffff) { |i| v = i }
589
- expect(v).to eq(0x7fffffff)
590
- end
591
-
592
- it ":int (-0x80000000) argument" do
593
- v = 0xdeadbeef
594
- LibTest.testCallbackIrV(-0x80000000) { |i| v = i }
595
- expect(v).to eq(-0x80000000)
596
- end
597
-
598
- it ":int (-1) argument" do
599
- v = 0xdeadbeef
600
- LibTest.testCallbackIrV(-1) { |i| v = i }
601
- expect(v).to eq(-1)
602
- end
603
-
604
- it ":uint (0) argument" do
605
- v = 0xdeadbeef
606
- LibTest.testCallbackU32rV(0) { |i| v = i }
607
- expect(v).to eq(0)
608
- end
609
-
610
- it ":uint (0x7fffffff) argument" do
611
- v = 0xdeadbeef
612
- LibTest.testCallbackU32rV(0x7fffffff) { |i| v = i }
613
- expect(v).to eq(0x7fffffff)
614
- end
615
-
616
- it ":uint (0x80000000) argument" do
617
- v = 0xdeadbeef
618
- LibTest.testCallbackU32rV(0x80000000) { |i| v = i }
619
- expect(v).to eq(0x80000000)
620
- end
621
-
622
- it ":uint (0xffffffff) argument" do
623
- v = 0xdeadbeef
624
- LibTest.testCallbackU32rV(0xffffffff) { |i| v = i }
625
- expect(v).to eq(0xffffffff)
626
- end
627
-
628
- it ":long (0) argument" do
629
- v = 0xdeadbeef
630
- LibTest.testCallbackLrV(0) { |i| v = i }
631
- expect(v).to eq(0)
632
- end
633
-
634
- it ":long (0x7fffffff) argument" do
635
- v = 0xdeadbeef
636
- LibTest.testCallbackLrV(0x7fffffff) { |i| v = i }
637
- expect(v).to eq(0x7fffffff)
638
- end
639
-
640
- it ":long (-0x80000000) argument" do
641
- v = 0xdeadbeef
642
- LibTest.testCallbackLrV(-0x80000000) { |i| v = i }
643
- expect(v).to eq(-0x80000000)
644
- end
645
-
646
- it ":long (-1) argument" do
647
- v = 0xdeadbeef
648
- LibTest.testCallbackLrV(-1) { |i| v = i }
649
- expect(v).to eq(-1)
650
- end
651
-
652
- it ":ulong (0) argument" do
653
- v = 0xdeadbeef
654
- LibTest.testCallbackULrV(0) { |i| v = i }
655
- expect(v).to eq(0)
656
- end
657
-
658
- it ":ulong (0x7fffffff) argument" do
659
- v = 0xdeadbeef
660
- LibTest.testCallbackULrV(0x7fffffff) { |i| v = i }
661
- expect(v).to eq(0x7fffffff)
662
- end
663
-
664
- it ":ulong (0x80000000) argument" do
665
- v = 0xdeadbeef
666
- LibTest.testCallbackULrV(0x80000000) { |i| v = i }
667
- expect(v).to eq(0x80000000)
668
- end
669
-
670
- it ":ulong (0xffffffff) argument" do
671
- v = 0xdeadbeef
672
- LibTest.testCallbackULrV(0xffffffff) { |i| v = i }
673
- expect(v).to eq(0xffffffff)
674
- end
675
-
676
- it ":long_long (0) argument" do
677
- v = 0xdeadbeef
678
- LibTest.testCallbackLLrV(0) { |i| v = i }
679
- expect(v).to eq(0)
680
- end
681
-
682
- it ":long_long (0x7fffffffffffffff) argument" do
683
- v = 0xdeadbeef
684
- LibTest.testCallbackLLrV(0x7fffffffffffffff) { |i| v = i }
685
- expect(v).to eq(0x7fffffffffffffff)
686
- end
687
-
688
- it ":long_long (-0x8000000000000000) argument" do
689
- v = 0xdeadbeef
690
- LibTest.testCallbackLLrV(-0x8000000000000000) { |i| v = i }
691
- expect(v).to eq(-0x8000000000000000)
692
- end
693
-
694
- it ":long_long (-1) argument" do
695
- v = 0xdeadbeef
696
- LibTest.testCallbackLLrV(-1) { |i| v = i }
697
- expect(v).to eq(-1)
698
- end
699
-
700
- it ":string argument" do
701
- v = nil
702
- LibTest.testCallbackArV("Hello, World") { |i| v = i }
703
- expect(v).to eq("Hello, World")
704
- end
705
-
706
- it ":string (nil) argument" do
707
- v = "Hello, World"
708
- LibTest.testCallbackArV(nil) { |i| v = i }
709
- expect(v).to be_nil
710
- end
711
-
712
- it ":pointer argument" do
713
- v = nil
714
- magic = FFI::Pointer.new(0xdeadbeef)
715
- LibTest.testCallbackPrV(magic) { |i| v = i }
716
- expect(v).to eq(magic)
717
- end
718
-
719
- it ":pointer (nil) argument" do
720
- v = "Hello, World"
721
- LibTest.testCallbackPrV(nil) { |i| v = i }
722
- expect(v).to eq(FFI::Pointer::NULL)
723
- end
724
-
725
- it "struct by reference argument" do
726
- v = nil
727
- magic = LibTest::S8F32S32.new
728
- LibTest.testCallbackYrV(magic) { |i| v = i }
729
- expect(v.class).to eq(magic.class)
730
- expect(v.pointer).to eq(magic.pointer)
731
- end
732
-
733
- it "struct by reference argument with nil value" do
734
- v = LibTest::S8F32S32.new
735
- LibTest.testCallbackYrV(nil) { |i| v = i }
736
- expect(v.is_a?(FFI::Struct)).to be true
737
- expect(v.pointer).to eq(FFI::Pointer::NULL)
738
- end
739
-
740
- it "varargs parameters are rejected" do
741
- expect {
742
- Module.new do
743
- extend FFI::Library
744
- ffi_lib TestLibrary::PATH
745
- callback :cbVrL, [ :varargs ], :long
746
- end
747
- }.to raise_error(ArgumentError)
748
- end
749
-
750
- #
751
- # Test stdcall convention with function and callback.
752
- # This is Windows 32-bit only.
753
- #
754
- if FFI::Platform::OS =~ /windows|cygwin/ && FFI::Platform::ARCH == 'i386'
755
- module LibTestStdcall
756
- extend FFI::Library
757
- ffi_lib TestLibrary::PATH
758
- ffi_convention :stdcall
759
-
760
- callback :cbStdcall, [ :pointer, :long ], :void
761
- attach_function :testCallbackStdcall, 'testClosureStdcall', [ :pointer, :cbStdcall, :long ], :bool
762
- end
763
-
764
- it "stdcall convention" do
765
- v = 0xdeadbeef
766
- po = FFI::MemoryPointer.new :long
767
- pr = proc{|a,i| v = a,i; i }
768
- res = LibTestStdcall.testCallbackStdcall(po, pr, 0x7fffffff)
769
- expect(v).to eq([po, 0x7fffffff])
770
- expect(res).to be true
771
- end
772
- end
773
- end