ffi 1.0.0 → 1.17.1

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 (694) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +4 -0
  3. data/CHANGELOG.md +465 -0
  4. data/COPYING +49 -0
  5. data/Gemfile +21 -0
  6. data/LICENSE +21 -11
  7. data/LICENSE.SPECS +22 -0
  8. data/README.md +137 -0
  9. data/Rakefile +165 -148
  10. data/ext/ffi_c/AbstractMemory.c +716 -97
  11. data/ext/ffi_c/AbstractMemory.h +38 -17
  12. data/ext/ffi_c/ArrayType.c +102 -33
  13. data/ext/ffi_c/ArrayType.h +20 -18
  14. data/ext/ffi_c/Buffer.c +229 -54
  15. data/ext/ffi_c/Call.c +211 -100
  16. data/ext/ffi_c/Call.h +46 -28
  17. data/ext/ffi_c/ClosurePool.c +110 -81
  18. data/ext/ffi_c/ClosurePool.h +31 -1
  19. data/ext/ffi_c/DynamicLibrary.c +216 -54
  20. data/ext/ffi_c/DynamicLibrary.h +76 -0
  21. data/ext/ffi_c/Function.c +527 -164
  22. data/ext/ffi_c/Function.h +24 -20
  23. data/ext/ffi_c/FunctionInfo.c +151 -50
  24. data/ext/ffi_c/LastError.c +112 -28
  25. data/ext/ffi_c/LastError.h +29 -0
  26. data/ext/ffi_c/LongDouble.c +65 -0
  27. data/ext/ffi_c/LongDouble.h +47 -0
  28. data/ext/ffi_c/MappedType.c +107 -42
  29. data/ext/ffi_c/MappedType.h +20 -20
  30. data/ext/ffi_c/MemoryPointer.c +108 -46
  31. data/ext/ffi_c/MemoryPointer.h +33 -4
  32. data/ext/ffi_c/MethodHandle.c +71 -67
  33. data/ext/ffi_c/MethodHandle.h +26 -23
  34. data/ext/ffi_c/Platform.c +42 -25
  35. data/ext/ffi_c/Platform.h +32 -3
  36. data/ext/ffi_c/Pointer.c +324 -51
  37. data/ext/ffi_c/Pointer.h +29 -18
  38. data/ext/ffi_c/Struct.c +434 -161
  39. data/ext/ffi_c/Struct.h +47 -27
  40. data/ext/ffi_c/StructByValue.c +74 -37
  41. data/ext/ffi_c/StructByValue.h +20 -18
  42. data/ext/ffi_c/StructLayout.c +358 -87
  43. data/ext/ffi_c/Thread.c +129 -0
  44. data/ext/ffi_c/Thread.h +76 -0
  45. data/ext/ffi_c/Type.c +241 -76
  46. data/ext/ffi_c/Type.h +27 -11
  47. data/ext/ffi_c/Types.c +54 -34
  48. data/ext/ffi_c/Types.h +24 -24
  49. data/ext/ffi_c/Variadic.c +151 -55
  50. data/ext/ffi_c/compat.h +48 -38
  51. data/ext/ffi_c/extconf.rb +106 -34
  52. data/ext/ffi_c/ffi.c +35 -26
  53. data/ext/ffi_c/libffi/.allow-ai-service +0 -0
  54. data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
  55. data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
  56. data/ext/ffi_c/libffi/.appveyor.yml +84 -0
  57. data/ext/ffi_c/libffi/.ci/ar-lib +270 -0
  58. data/ext/ffi_c/libffi/.ci/bfin-sim.exp +58 -0
  59. data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
  60. data/ext/ffi_c/libffi/.ci/build-in-container.sh +10 -0
  61. data/ext/ffi_c/libffi/.ci/build.sh +124 -0
  62. data/ext/ffi_c/libffi/.ci/compile +351 -0
  63. data/ext/ffi_c/libffi/.ci/install.sh +78 -0
  64. data/ext/ffi_c/libffi/.ci/m32r-sim.exp +58 -0
  65. data/ext/ffi_c/libffi/.ci/moxie-sim.exp +60 -0
  66. data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
  67. data/ext/ffi_c/libffi/.ci/or1k-sim.exp +58 -0
  68. data/ext/ffi_c/libffi/.ci/powerpc-eabisim.exp +58 -0
  69. data/ext/ffi_c/libffi/.ci/site.exp +29 -0
  70. data/ext/ffi_c/libffi/.ci/wine-sim.exp +55 -0
  71. data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
  72. data/ext/ffi_c/libffi/.gitattributes +4 -0
  73. data/ext/ffi_c/libffi/.github/issue_template.md +10 -0
  74. data/ext/ffi_c/libffi/.github/workflows/build.yml +479 -0
  75. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +172 -0
  76. data/ext/ffi_c/libffi/.gitignore +46 -0
  77. data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.old} +6528 -3180
  78. data/ext/ffi_c/libffi/LICENSE +3 -3
  79. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +353 -0
  80. data/ext/ffi_c/libffi/Makefile.am +132 -162
  81. data/ext/ffi_c/libffi/Makefile.in +1339 -1003
  82. data/ext/ffi_c/libffi/README.md +531 -0
  83. data/ext/ffi_c/libffi/acinclude.m4 +289 -4
  84. data/ext/ffi_c/libffi/autogen.sh +2 -0
  85. data/ext/ffi_c/libffi/compile +227 -21
  86. data/ext/ffi_c/libffi/config.guess +1034 -778
  87. data/ext/ffi_c/libffi/config.sub +1394 -1204
  88. data/ext/ffi_c/libffi/configure +14327 -8503
  89. data/ext/ffi_c/libffi/configure.ac +294 -247
  90. data/ext/ffi_c/libffi/configure.host +330 -4
  91. data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
  92. data/ext/ffi_c/libffi/doc/Makefile.in +818 -0
  93. data/ext/ffi_c/libffi/doc/libffi.texi +572 -67
  94. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  95. data/ext/ffi_c/libffi/fficonfig.h.in +53 -46
  96. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +312 -0
  97. data/ext/ffi_c/libffi/include/Makefile.am +3 -3
  98. data/ext/ffi_c/libffi/include/Makefile.in +219 -79
  99. data/ext/ffi_c/libffi/include/ffi.h.in +230 -111
  100. data/ext/ffi_c/libffi/include/ffi_cfi.h +76 -0
  101. data/ext/ffi_c/libffi/include/ffi_common.h +78 -16
  102. data/ext/ffi_c/libffi/include/tramp.h +45 -0
  103. data/ext/ffi_c/libffi/install-sh +402 -184
  104. data/ext/ffi_c/libffi/libffi.map.in +81 -0
  105. data/ext/ffi_c/libffi/libffi.pc.in +3 -2
  106. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +997 -0
  107. data/ext/ffi_c/libffi/libtool-ldflags +106 -0
  108. data/ext/ffi_c/libffi/libtool-version +2 -2
  109. data/ext/ffi_c/libffi/ltmain.sh +5752 -2722
  110. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  111. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +50 -0
  112. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +198 -0
  113. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +158 -0
  114. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +53 -0
  115. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +119 -0
  116. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +49 -0
  117. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +302 -0
  118. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +267 -0
  119. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +89 -0
  120. data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
  121. data/ext/ffi_c/libffi/m4/ax_require_defined.m4 +37 -0
  122. data/ext/ffi_c/libffi/make_sunver.pl +333 -0
  123. data/ext/ffi_c/libffi/man/Makefile.am +2 -2
  124. data/ext/ffi_c/libffi/man/Makefile.in +174 -57
  125. data/ext/ffi_c/libffi/man/ffi.3 +10 -0
  126. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
  127. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  128. data/ext/ffi_c/libffi/missing +155 -300
  129. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
  130. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
  131. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
  132. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
  133. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +511 -0
  134. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/fficonfig.h +219 -0
  135. data/ext/ffi_c/libffi/msvcc.sh +353 -0
  136. data/ext/ffi_c/libffi/src/aarch64/ffi.c +1142 -0
  137. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +97 -0
  138. data/ext/ffi_c/libffi/src/aarch64/internal.h +100 -0
  139. data/ext/ffi_c/libffi/src/aarch64/sysv.S +695 -0
  140. data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +506 -0
  141. data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
  142. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
  143. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  144. data/ext/ffi_c/libffi/src/alpha/osf.S +162 -246
  145. data/ext/ffi_c/libffi/src/arc/arcompact.S +210 -0
  146. data/ext/ffi_c/libffi/src/arc/ffi.c +443 -0
  147. data/ext/ffi_c/libffi/src/arc/ffitarget.h +67 -0
  148. data/ext/ffi_c/libffi/src/arm/ffi.c +806 -194
  149. data/ext/ffi_c/libffi/src/arm/ffitarget.h +43 -3
  150. data/ext/ffi_c/libffi/src/arm/internal.h +17 -0
  151. data/ext/ffi_c/libffi/src/arm/sysv.S +381 -231
  152. data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
  153. data/ext/ffi_c/libffi/src/avr32/ffi.c +4 -2
  154. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +8 -3
  155. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  156. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  157. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  158. data/ext/ffi_c/libffi/src/closures.c +574 -100
  159. data/ext/ffi_c/libffi/src/cris/ffi.c +11 -8
  160. data/ext/ffi_c/libffi/src/cris/ffitarget.h +8 -3
  161. data/ext/ffi_c/libffi/src/csky/ffi.c +395 -0
  162. data/ext/ffi_c/libffi/src/csky/ffitarget.h +63 -0
  163. data/ext/ffi_c/libffi/src/csky/sysv.S +371 -0
  164. data/ext/ffi_c/libffi/src/debug.c +8 -3
  165. data/ext/ffi_c/libffi/src/dlmalloc.c +89 -17
  166. data/ext/ffi_c/libffi/src/frv/ffi.c +2 -2
  167. data/ext/ffi_c/libffi/src/frv/ffitarget.h +8 -7
  168. data/ext/ffi_c/libffi/src/ia64/ffi.c +48 -12
  169. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +10 -4
  170. data/ext/ffi_c/libffi/src/ia64/unix.S +28 -3
  171. data/ext/ffi_c/libffi/src/java_raw_api.c +24 -6
  172. data/ext/ffi_c/libffi/src/kvx/asm.h +5 -0
  173. data/ext/ffi_c/libffi/src/kvx/ffi.c +273 -0
  174. data/ext/ffi_c/libffi/src/kvx/ffitarget.h +75 -0
  175. data/ext/ffi_c/libffi/src/kvx/sysv.S +127 -0
  176. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +624 -0
  177. data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
  178. data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
  179. data/ext/ffi_c/libffi/src/m32r/ffi.c +32 -15
  180. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +8 -3
  181. data/ext/ffi_c/libffi/src/m68k/ffi.c +97 -13
  182. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +8 -3
  183. data/ext/ffi_c/libffi/src/m68k/sysv.S +148 -25
  184. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  185. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  186. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  187. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  188. data/ext/ffi_c/libffi/src/metag/ffitarget.h +53 -0
  189. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  190. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  191. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  192. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  193. data/ext/ffi_c/libffi/src/mips/ffi.c +392 -104
  194. data/ext/ffi_c/libffi/src/mips/ffitarget.h +40 -24
  195. data/ext/ffi_c/libffi/src/mips/n32.S +325 -93
  196. data/ext/ffi_c/libffi/src/mips/o32.S +211 -31
  197. data/ext/ffi_c/libffi/src/moxie/eabi.S +101 -0
  198. data/ext/ffi_c/libffi/src/moxie/ffi.c +310 -0
  199. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  200. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  201. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  202. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  203. data/ext/ffi_c/libffi/src/or1k/ffi.c +341 -0
  204. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  205. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  206. data/ext/ffi_c/libffi/src/pa/ffi.c +68 -111
  207. data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
  208. data/ext/ffi_c/libffi/src/pa/ffitarget.h +34 -17
  209. data/ext/ffi_c/libffi/src/pa/hpux32.S +87 -38
  210. data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
  211. data/ext/ffi_c/libffi/src/pa/linux.S +109 -39
  212. data/ext/ffi_c/libffi/src/powerpc/aix.S +250 -8
  213. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +255 -4
  214. data/ext/ffi_c/libffi/src/powerpc/asm.h +3 -3
  215. data/ext/ffi_c/libffi/src/powerpc/darwin.S +211 -78
  216. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +356 -102
  217. data/ext/ffi_c/libffi/src/powerpc/ffi.c +108 -1375
  218. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +746 -210
  219. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1153 -0
  220. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +105 -0
  221. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  222. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +126 -48
  223. data/ext/ffi_c/libffi/src/powerpc/linux64.S +191 -85
  224. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +438 -108
  225. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  226. data/ext/ffi_c/libffi/src/powerpc/sysv.S +73 -119
  227. data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
  228. data/ext/ffi_c/libffi/src/prep_cif.c +141 -32
  229. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  230. data/ext/ffi_c/libffi/src/riscv/ffi.c +514 -0
  231. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +69 -0
  232. data/ext/ffi_c/libffi/src/riscv/sysv.S +293 -0
  233. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  234. data/ext/ffi_c/libffi/src/s390/ffitarget.h +13 -3
  235. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  236. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  237. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  238. data/ext/ffi_c/libffi/src/sh/ffitarget.h +8 -3
  239. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  240. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +8 -3
  241. data/ext/ffi_c/libffi/src/sparc/ffi.c +334 -491
  242. data/ext/ffi_c/libffi/src/sparc/ffi64.c +630 -0
  243. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -5
  244. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  245. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  246. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  247. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  248. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  249. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  250. data/ext/ffi_c/libffi/src/tramp.c +716 -0
  251. data/ext/ffi_c/libffi/src/types.c +48 -19
  252. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  253. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  254. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  255. data/ext/ffi_c/libffi/src/wasm32/ffi.c +947 -0
  256. data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
  257. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  258. data/ext/ffi_c/libffi/src/x86/ffi.c +690 -540
  259. data/ext/ffi_c/libffi/src/x86/ffi64.c +450 -126
  260. data/ext/ffi_c/libffi/src/x86/ffitarget.h +86 -42
  261. data/ext/ffi_c/libffi/src/x86/ffiw64.c +361 -0
  262. data/ext/ffi_c/libffi/src/x86/internal.h +43 -0
  263. data/ext/ffi_c/libffi/src/x86/internal64.h +36 -0
  264. data/ext/ffi_c/libffi/src/x86/sysv.S +1199 -381
  265. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +998 -0
  266. data/ext/ffi_c/libffi/src/x86/unix64.S +587 -298
  267. data/ext/ffi_c/libffi/src/x86/win64.S +251 -457
  268. data/ext/ffi_c/libffi/src/x86/win64_intel.S +238 -0
  269. data/ext/ffi_c/libffi/src/xtensa/ffi.c +306 -0
  270. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +57 -0
  271. data/ext/ffi_c/libffi/src/xtensa/sysv.S +268 -0
  272. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  273. data/ext/ffi_c/libffi/testsuite/Makefile.am +80 -73
  274. data/ext/ffi_c/libffi/testsuite/Makefile.in +251 -117
  275. data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
  276. data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
  277. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +86 -0
  278. data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
  279. data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
  280. data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
  281. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +682 -0
  282. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +22 -2
  283. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +28 -0
  284. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +78 -0
  285. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +50 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +63 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1746 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2885 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +747 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +46 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
  293. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +28 -10
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +4 -3
  299. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +88 -42
  300. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  301. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +15 -12
  302. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  303. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +110 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  305. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  309. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  313. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +6 -0
  314. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  315. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  317. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +9 -10
  320. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  324. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +57 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  326. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  327. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  328. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  329. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  330. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  331. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  332. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  333. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +78 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
  345. data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
  346. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +134 -0
  347. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +134 -0
  348. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +140 -0
  349. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
  350. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +3 -2
  351. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +2 -0
  352. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +2 -0
  353. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +21 -1
  354. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +2 -0
  355. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +2 -0
  356. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +2 -0
  357. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +7 -6
  358. data/ext/ffi_c/libffi/testsuite/{libffi.call/closure_stdcall.c → libffi.closures/closure_simple.c} +13 -16
  359. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +22 -4
  360. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +26 -4
  361. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +28 -4
  362. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +33 -4
  363. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +8 -4
  364. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +23 -5
  365. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +25 -5
  366. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +40 -8
  367. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +17 -4
  368. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +23 -4
  369. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +17 -4
  370. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +17 -4
  371. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +113 -0
  372. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +26 -4
  373. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +17 -4
  374. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +33 -5
  375. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +23 -5
  376. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +29 -5
  377. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +32 -5
  378. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +28 -6
  379. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +43 -5
  380. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +29 -5
  381. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +18 -4
  382. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +18 -5
  383. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +18 -6
  384. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +23 -5
  385. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +23 -5
  386. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +24 -5
  387. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +44 -31
  388. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +44 -9
  389. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +23 -5
  390. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +22 -5
  391. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +22 -7
  392. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +23 -5
  393. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +22 -5
  394. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +23 -5
  395. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +24 -5
  396. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +7 -5
  397. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +21 -9
  398. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +4 -0
  399. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +13 -3
  400. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +34 -11
  401. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c +70 -0
  402. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c +55 -0
  403. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +5 -1
  404. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +6 -1
  405. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +9 -1
  406. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +9 -1
  407. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +6 -2
  408. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +9 -1
  409. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +7 -2
  410. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +22 -10
  411. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +3 -0
  412. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +2 -0
  413. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +3 -0
  414. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +125 -0
  415. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +3 -0
  416. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +4 -0
  417. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +49 -0
  418. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +49 -0
  419. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +8 -5
  420. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +3 -0
  421. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +2 -3
  422. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -0
  423. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +57 -56
  424. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +38 -15
  425. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +9 -9
  426. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +19 -6
  427. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +137 -0
  428. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
  429. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
  430. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct2.c +15 -6
  431. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +15 -6
  432. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +14 -5
  433. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +14 -5
  434. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +17 -6
  435. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +14 -5
  436. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +17 -6
  437. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +17 -6
  438. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
  439. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
  440. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
  441. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large.c +7 -7
  442. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +7 -7
  443. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +6 -6
  444. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +7 -6
  445. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +8 -3
  446. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest.cc +4 -10
  447. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest_ffi_call.cc +4 -2
  448. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  449. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  450. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  451. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  452. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  453. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  454. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  455. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  456. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  457. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  458. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  459. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  460. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  461. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  462. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  463. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  464. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -10
  465. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  466. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  467. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  468. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  469. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  470. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  471. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  472. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  473. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  474. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  475. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  476. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  477. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  478. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  479. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  480. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  481. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  482. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  483. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  484. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  485. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  486. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  487. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  488. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  489. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  490. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  491. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  492. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  493. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  494. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  495. data/ext/ffi_c/libffi.bsd.mk +14 -8
  496. data/ext/ffi_c/libffi.darwin.mk +56 -26
  497. data/ext/ffi_c/libffi.gnu.mk +9 -6
  498. data/ext/ffi_c/libffi.mk +13 -8
  499. data/ext/ffi_c/libffi.vc.mk +26 -0
  500. data/ext/ffi_c/libffi.vc64.mk +26 -0
  501. data/ext/ffi_c/rbffi.h +34 -6
  502. data/ext/ffi_c/{endian.h → rbffi_endian.h} +21 -2
  503. data/ffi.gemspec +42 -0
  504. data/lib/ffi/abstract_memory.rb +44 -0
  505. data/lib/ffi/autopointer.rb +111 -52
  506. data/lib/ffi/compat.rb +43 -0
  507. data/lib/ffi/data_converter.rb +67 -0
  508. data/lib/ffi/dynamic_library.rb +118 -0
  509. data/lib/ffi/enum.rb +203 -22
  510. data/lib/ffi/errno.rb +27 -12
  511. data/lib/ffi/ffi.rb +88 -11
  512. data/lib/ffi/function.rb +71 -0
  513. data/lib/ffi/io.rb +35 -14
  514. data/lib/ffi/library.rb +382 -96
  515. data/lib/ffi/library_path.rb +109 -0
  516. data/lib/ffi/managedstruct.rb +64 -35
  517. data/lib/ffi/memorypointer.rb +1 -33
  518. data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
  519. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  520. data/lib/ffi/platform/aarch64-freebsd12/types.conf +181 -0
  521. data/lib/ffi/platform/aarch64-linux/types.conf +175 -0
  522. data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
  523. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  524. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  525. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  526. data/lib/ffi/platform/arm-linux/types.conf +132 -0
  527. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  528. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  529. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  530. data/lib/ffi/platform/i386-darwin/types.conf +100 -0
  531. data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
  532. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  533. data/lib/ffi/platform/i386-gnu/types.conf +107 -0
  534. data/lib/ffi/platform/i386-linux/types.conf +103 -0
  535. data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
  536. data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
  537. data/lib/ffi/platform/i386-solaris/types.conf +122 -0
  538. data/lib/ffi/platform/i386-windows/types.conf +52 -0
  539. data/lib/ffi/platform/ia64-linux/types.conf +104 -0
  540. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  541. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  542. data/lib/ffi/platform/mips64-linux/types.conf +104 -0
  543. data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
  544. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  545. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
  546. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
  547. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
  548. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -0
  549. data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
  550. data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
  551. data/lib/ffi/platform/powerpc-linux/types.conf +130 -0
  552. data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
  553. data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
  554. data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
  555. data/lib/ffi/platform/riscv64-linux/types.conf +104 -0
  556. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  557. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  558. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  559. data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
  560. data/lib/ffi/platform/sparcv9-linux/types.conf +102 -0
  561. data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
  562. data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
  563. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  564. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  565. data/lib/ffi/platform/x86_64-darwin/types.conf +130 -0
  566. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
  567. data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
  568. data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
  569. data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
  570. data/lib/ffi/platform/x86_64-linux/types.conf +132 -0
  571. data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
  572. data/lib/ffi/platform/x86_64-netbsd/types.conf +128 -0
  573. data/lib/ffi/platform/x86_64-openbsd/types.conf +134 -0
  574. data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
  575. data/lib/ffi/platform/x86_64-windows/types.conf +52 -0
  576. data/lib/ffi/platform.rb +110 -34
  577. data/lib/ffi/pointer.rb +117 -90
  578. data/lib/ffi/struct.rb +101 -70
  579. data/lib/ffi/struct_by_reference.rb +72 -0
  580. data/lib/ffi/struct_layout.rb +96 -0
  581. data/lib/ffi/struct_layout_builder.rb +90 -21
  582. data/lib/ffi/tools/const_generator.rb +86 -31
  583. data/lib/ffi/tools/generator.rb +49 -2
  584. data/lib/ffi/tools/generator_task.rb +13 -16
  585. data/lib/ffi/tools/struct_generator.rb +6 -5
  586. data/lib/ffi/tools/types_generator.rb +25 -11
  587. data/lib/ffi/types.rb +105 -36
  588. data/lib/ffi/union.rb +23 -12
  589. data/lib/ffi/variadic.rb +44 -29
  590. data/lib/ffi/version.rb +3 -0
  591. data/lib/ffi.rb +25 -9
  592. data/rakelib/ffi_gem_helper.rb +65 -0
  593. data/samples/getlogin.rb +8 -0
  594. data/samples/getpid.rb +8 -0
  595. data/samples/gettimeofday.rb +18 -0
  596. data/samples/hello.rb +8 -0
  597. data/samples/hello_ractor.rb +11 -0
  598. data/samples/inotify.rb +60 -0
  599. data/samples/pty.rb +75 -0
  600. data/samples/qsort.rb +20 -0
  601. data/samples/qsort_ractor.rb +28 -0
  602. data/sig/ffi/abstract_memory.rbs +165 -0
  603. data/sig/ffi/auto_pointer.rbs +26 -0
  604. data/sig/ffi/buffer.rbs +18 -0
  605. data/sig/ffi/data_converter.rbs +10 -0
  606. data/sig/ffi/dynamic_library.rbs +9 -0
  607. data/sig/ffi/enum.rbs +38 -0
  608. data/sig/ffi/function.rbs +39 -0
  609. data/sig/ffi/library.rbs +42 -0
  610. data/sig/ffi/native_type.rbs +86 -0
  611. data/sig/ffi/pointer.rbs +42 -0
  612. data/sig/ffi/struct.rbs +76 -0
  613. data/sig/ffi/struct_by_reference.rbs +11 -0
  614. data/sig/ffi/struct_by_value.rbs +7 -0
  615. data/sig/ffi/struct_layout.rbs +9 -0
  616. data/sig/ffi/struct_layout_builder.rbs +5 -0
  617. data/sig/ffi/type.rbs +39 -0
  618. data/sig/ffi.rbs +26 -0
  619. data.tar.gz.sig +0 -0
  620. metadata +547 -248
  621. metadata.gz.sig +0 -0
  622. data/History.txt +0 -109
  623. data/README.rdoc +0 -70
  624. data/ext/ffi_c/DataConverter.c +0 -62
  625. data/ext/ffi_c/StructByReference.c +0 -150
  626. data/ext/ffi_c/StructByReference.h +0 -50
  627. data/ext/ffi_c/libffi/ChangeLog.libffi +0 -658
  628. data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
  629. data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
  630. data/ext/ffi_c/libffi/README +0 -306
  631. data/ext/ffi_c/libffi/aclocal.m4 +0 -8998
  632. data/ext/ffi_c/libffi/depcomp +0 -584
  633. data/ext/ffi_c/libffi/doc/libffi.info +0 -533
  634. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  635. data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7360
  636. data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -368
  637. data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
  638. data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
  639. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -92
  640. data/ext/ffi_c/libffi/mdate-sh +0 -201
  641. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  642. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  643. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  644. data/ext/ffi_c/libffi/src/x86/win32.S +0 -877
  645. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  646. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  647. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  648. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
  649. data/ext/ffi_c/libffi/texinfo.tex +0 -7210
  650. data/gen/Rakefile +0 -14
  651. data/spec/ffi/async_callback_spec.rb +0 -23
  652. data/spec/ffi/bool_spec.rb +0 -24
  653. data/spec/ffi/buffer_spec.rb +0 -202
  654. data/spec/ffi/callback_spec.rb +0 -653
  655. data/spec/ffi/custom_param_type.rb +0 -31
  656. data/spec/ffi/custom_type_spec.rb +0 -73
  657. data/spec/ffi/enum_spec.rb +0 -183
  658. data/spec/ffi/errno_spec.rb +0 -13
  659. data/spec/ffi/ffi_spec.rb +0 -24
  660. data/spec/ffi/function_spec.rb +0 -73
  661. data/spec/ffi/library_spec.rb +0 -174
  662. data/spec/ffi/managed_struct_spec.rb +0 -56
  663. data/spec/ffi/number_spec.rb +0 -231
  664. data/spec/ffi/pointer_spec.rb +0 -210
  665. data/spec/ffi/rbx/attach_function_spec.rb +0 -28
  666. data/spec/ffi/rbx/memory_pointer_spec.rb +0 -109
  667. data/spec/ffi/rbx/spec_helper.rb +0 -1
  668. data/spec/ffi/rbx/struct_spec.rb +0 -13
  669. data/spec/ffi/spec_helper.rb +0 -21
  670. data/spec/ffi/string_spec.rb +0 -103
  671. data/spec/ffi/strptr_spec.rb +0 -36
  672. data/spec/ffi/struct_callback_spec.rb +0 -64
  673. data/spec/ffi/struct_initialize_spec.rb +0 -30
  674. data/spec/ffi/struct_packed_spec.rb +0 -46
  675. data/spec/ffi/struct_spec.rb +0 -638
  676. data/spec/ffi/typedef_spec.rb +0 -62
  677. data/spec/ffi/union_spec.rb +0 -60
  678. data/spec/ffi/variadic_spec.rb +0 -84
  679. data/spec/spec.opts +0 -4
  680. data/tasks/ann.rake +0 -80
  681. data/tasks/extension.rake +0 -25
  682. data/tasks/gem.rake +0 -200
  683. data/tasks/git.rake +0 -41
  684. data/tasks/notes.rake +0 -27
  685. data/tasks/post_load.rake +0 -34
  686. data/tasks/rdoc.rake +0 -50
  687. data/tasks/rubyforge.rake +0 -55
  688. data/tasks/setup.rb +0 -301
  689. data/tasks/spec.rake +0 -54
  690. data/tasks/svn.rake +0 -47
  691. data/tasks/test.rake +0 -40
  692. /data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
  693. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
  694. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
@@ -1,638 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
- describe "Struct tests" do
3
- StructTypes = {
4
- 's8' => :char,
5
- 's16' => :short,
6
- 's32' => :int,
7
- 's64' => :long_long,
8
- 'long' => :long,
9
- 'f32' => :float,
10
- 'f64' => :double
11
- }
12
- module LibTest
13
- extend FFI::Library
14
- ffi_lib TestLibrary::PATH
15
- attach_function :ptr_ret_pointer, [ :pointer, :int], :string
16
- attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int
17
- attach_function :ptr_from_address, [ :ulong ], :pointer
18
- attach_function :string_equals, [ :string, :string ], :int
19
- [ 's8', 's16', 's32', 's64', 'f32', 'f64', 'long' ].each do |t|
20
- attach_function "struct_align_#{t}", [ :pointer ], StructTypes[t]
21
- end
22
- end
23
- class PointerMember < FFI::Struct
24
- layout :pointer, :pointer
25
- end
26
- class StringMember < FFI::Struct
27
- layout :string, :string
28
- end
29
- it "Struct#[:pointer]" do
30
- magic = 0x12345678
31
- mp = FFI::MemoryPointer.new :long
32
- mp.put_long(0, magic)
33
- smp = FFI::MemoryPointer.new :pointer
34
- smp.put_pointer(0, mp)
35
- s = PointerMember.new smp
36
- s[:pointer].should == mp
37
- end
38
- it "Struct#[:pointer].nil? for NULL value" do
39
- magic = 0x12345678
40
- mp = FFI::MemoryPointer.new :long
41
- mp.put_long(0, magic)
42
- smp = FFI::MemoryPointer.new :pointer
43
- smp.put_pointer(0, nil)
44
- s = PointerMember.new smp
45
- s[:pointer].null?.should == true
46
- end
47
- it "Struct#[:pointer]=" do
48
- magic = 0x12345678
49
- mp = FFI::MemoryPointer.new :long
50
- mp.put_long(0, magic)
51
- smp = FFI::MemoryPointer.new :pointer
52
- s = PointerMember.new smp
53
- s[:pointer] = mp
54
- smp.get_pointer(0).should == mp
55
- end
56
- it "Struct#[:pointer]=struct" do
57
- magic = 0x12345678
58
- smp = FFI::MemoryPointer.new :pointer
59
- s = PointerMember.new smp
60
- lambda { s[:pointer] = s }.should_not raise_error
61
- end
62
- it "Struct#[:pointer]=nil" do
63
- smp = FFI::MemoryPointer.new :pointer
64
- s = PointerMember.new smp
65
- s[:pointer] = nil
66
- smp.get_pointer(0).null?.should == true
67
- end
68
- it "Struct#[:string]" do
69
- magic = "test"
70
- mp = FFI::MemoryPointer.new 1024
71
- mp.put_string(0, magic)
72
- smp = FFI::MemoryPointer.new :pointer
73
- smp.put_pointer(0, mp)
74
- s = StringMember.new smp
75
- s[:string].should == magic
76
- end
77
- it "Struct#[:string].nil? for NULL value" do
78
- smp = FFI::MemoryPointer.new :pointer
79
- smp.put_pointer(0, nil)
80
- s = StringMember.new smp
81
- s[:string].nil?.should == true
82
- end
83
- it "Struct#layout works with :name, :type pairs" do
84
- class PairLayout < FFI::Struct
85
- layout :a, :int, :b, :long_long
86
- end
87
- ll_off = (FFI::TYPE_UINT64.alignment == 4 ? 4 : 8)
88
- PairLayout.size.should == (ll_off + 8)
89
- mp = FFI::MemoryPointer.new(PairLayout.size)
90
- s = PairLayout.new mp
91
- s[:a] = 0x12345678
92
- mp.get_int(0).should == 0x12345678
93
- s[:b] = 0xfee1deadbeef
94
- mp.get_int64(ll_off).should == 0xfee1deadbeef
95
- end
96
- it "Struct#layout works with :name, :type, offset tuples" do
97
- class PairLayout < FFI::Struct
98
- layout :a, :int, 0, :b, :long_long, 4
99
- end
100
- PairLayout.size.should == (FFI::TYPE_UINT64.alignment == 4 ? 12 : 16)
101
- mp = FFI::MemoryPointer.new(PairLayout.size)
102
- s = PairLayout.new mp
103
- s[:a] = 0x12345678
104
- mp.get_int(0).should == 0x12345678
105
- s[:b] = 0xfee1deadbeef
106
- mp.get_int64(4).should == 0xfee1deadbeef
107
- end
108
- it "Struct#layout works with mixed :name,:type and :name,:type,offset" do
109
- class MixedLayout < FFI::Struct
110
- layout :a, :int, :b, :long_long, 4
111
- end
112
- MixedLayout.size.should == (FFI::TYPE_UINT64.alignment == 4 ? 12 : 16)
113
- mp = FFI::MemoryPointer.new(MixedLayout.size)
114
- s = MixedLayout.new mp
115
- s[:a] = 0x12345678
116
- mp.get_int(0).should == 0x12345678
117
- s[:b] = 0xfee1deadbeef
118
- mp.get_int64(4).should == 0xfee1deadbeef
119
- end
120
- rb_maj, rb_min = RUBY_VERSION.split('.')
121
- if rb_maj.to_i >= 1 && rb_min.to_i >= 9 || RUBY_PLATFORM =~ /java/
122
- it "Struct#layout withs with a hash of :name => type" do
123
- class HashLayout < FFI::Struct
124
- layout :a => :int, :b => :long_long
125
- end
126
- ll_off = (FFI::TYPE_UINT64.alignment == 4? 4 : 8)
127
- HashLayout.size.should == (ll_off + 8)
128
- mp = FFI::MemoryPointer.new(HashLayout.size)
129
- s = HashLayout.new mp
130
- s[:a] = 0x12345678
131
- mp.get_int(0).should == 0x12345678
132
- s[:b] = 0xfee1deadbeef
133
- mp.get_int64(ll_off).should == 0xfee1deadbeef
134
- end
135
- end
136
-
137
- it "subclass overrides initialize without calling super" do
138
- class InitializeWithoutSuper < FFI::Struct
139
- layout :a, :int, :b, :long_long, :d, [:double, 2]
140
-
141
- def initialize(a, b)
142
- self[:a] = a
143
- self[:b] = b
144
- self[:d][0] = 1.2
145
- self[:d][1] = 3.4
146
- end
147
-
148
- end
149
- s = InitializeWithoutSuper.new(0x1eefbeef, 0xdeadcafebabe)
150
- s[:a].should == 0x1eefbeef
151
- s[:b].should == 0xdeadcafebabe
152
- end
153
-
154
- it "Can use Struct subclass as parameter type" do
155
- module StructParam
156
- extend FFI::Library
157
- ffi_lib TestLibrary::PATH
158
- class TestStruct < FFI::Struct
159
- layout :c, :char
160
- end
161
- attach_function :struct_field_s8, [ TestStruct.in ], :char
162
- end
163
- end
164
- it "Can use Struct subclass as IN parameter type" do
165
- module StructParam
166
- extend FFI::Library
167
- ffi_lib TestLibrary::PATH
168
- class TestStruct < FFI::Struct
169
- layout :c, :char
170
- end
171
- attach_function :struct_field_s8, [ TestStruct.in ], :char
172
- end
173
- end
174
- it "Can use Struct subclass as OUT parameter type" do
175
- module StructParam
176
- extend FFI::Library
177
- ffi_lib TestLibrary::PATH
178
- class TestStruct < FFI::Struct
179
- layout :c, :char
180
- end
181
- attach_function :struct_field_s8, [ TestStruct.out ], :char
182
- end
183
- end
184
- it "can be passed directly as a :pointer parameter" do
185
- class TestStruct < FFI::Struct
186
- layout :i, :int
187
- end
188
- s = TestStruct.new
189
- s[:i] = 0x12
190
- LibTest.ptr_ret_int32_t(s, 0).should == 0x12
191
- end
192
- it ":char member aligned correctly" do
193
- class AlignChar < FFI::Struct
194
- layout :c, :char, :v, :char
195
- end
196
- s = AlignChar.new
197
- s[:v] = 0x12
198
- LibTest.struct_align_s8(s.pointer).should == 0x12
199
- end
200
- it ":short member aligned correctly" do
201
- class AlignShort < FFI::Struct
202
- layout :c, :char, :v, :short
203
- end
204
- s = AlignShort.alloc_in
205
- s[:v] = 0x1234
206
- LibTest.struct_align_s16(s.pointer).should == 0x1234
207
- end
208
- it ":int member aligned correctly" do
209
- class AlignInt < FFI::Struct
210
- layout :c, :char, :v, :int
211
- end
212
- s = AlignInt.alloc_in
213
- s[:v] = 0x12345678
214
- LibTest.struct_align_s32(s.pointer).should == 0x12345678
215
- end
216
- it ":long_long member aligned correctly" do
217
- class AlignLongLong < FFI::Struct
218
- layout :c, :char, :v, :long_long
219
- end
220
- s = AlignLongLong.alloc_in
221
- s[:v] = 0x123456789abcdef0
222
- LibTest.struct_align_s64(s.pointer).should == 0x123456789abcdef0
223
- end
224
- it ":long member aligned correctly" do
225
- class AlignLong < FFI::Struct
226
- layout :c, :char, :v, :long
227
- end
228
- s = AlignLong.alloc_in
229
- s[:v] = 0x12345678
230
- LibTest.struct_align_long(s.pointer).should == 0x12345678
231
- end
232
- it ":float member aligned correctly" do
233
- class AlignFloat < FFI::Struct
234
- layout :c, :char, :v, :float
235
- end
236
- s = AlignFloat.alloc_in
237
- s[:v] = 1.23456
238
- (LibTest.struct_align_f32(s.pointer) - 1.23456).abs.should < 0.00001
239
- end
240
- it ":double member aligned correctly" do
241
- class AlignDouble < FFI::Struct
242
- layout :c, :char, :v, :double
243
- end
244
- s = AlignDouble.alloc_in
245
- s[:v] = 1.23456789
246
- (LibTest.struct_align_f64(s.pointer) - 1.23456789).abs.should < 0.00000001
247
- end
248
- it ":ulong, :pointer struct" do
249
- class ULPStruct < FFI::Struct
250
- layout :ul, :ulong, :p, :pointer
251
- end
252
- s = ULPStruct.alloc_in
253
- s[:ul] = 0xdeadbeef
254
- s[:p] = LibTest.ptr_from_address(0x12345678)
255
- s.pointer.get_ulong(0).should == 0xdeadbeef
256
- end
257
- def test_num_field(type, v)
258
- klass = Class.new(FFI::Struct)
259
- klass.layout :v, type, :dummy, :long
260
-
261
- s = klass.new
262
- s[:v] = v
263
- s.pointer.send("get_#{type.to_s}", 0).should == v
264
- s.pointer.send("put_#{type.to_s}", 0, 0)
265
- s[:v].should == 0
266
- end
267
- def self.int_field_test(type, values)
268
- values.each do |v|
269
- it "#{type} field r/w (#{v.to_s(16)})" do
270
- test_num_field(type, v)
271
- end
272
- end
273
- end
274
- int_field_test(:char, [ 0, 127, -128, -1 ])
275
- int_field_test(:uchar, [ 0, 0x7f, 0x80, 0xff ])
276
- int_field_test(:short, [ 0, 0x7fff, -0x8000, -1 ])
277
- int_field_test(:ushort, [ 0, 0x7fff, 0x8000, 0xffff ])
278
- int_field_test(:int, [ 0, 0x7fffffff, -0x80000000, -1 ])
279
- int_field_test(:uint, [ 0, 0x7fffffff, 0x80000000, 0xffffffff ])
280
- int_field_test(:long_long, [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ])
281
- int_field_test(:ulong_long, [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ])
282
- if FFI::Platform::LONG_SIZE == 32
283
- int_field_test(:long, [ 0, 0x7fffffff, -0x80000000, -1 ])
284
- int_field_test(:ulong, [ 0, 0x7fffffff, 0x80000000, 0xffffffff ])
285
- else
286
- int_field_test(:long, [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ])
287
- int_field_test(:ulong, [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ])
288
- end
289
- it ":float field r/w" do
290
- klass = Class.new(FFI::Struct)
291
- klass.layout :v, :float, :dummy, :long
292
-
293
- s = klass.new
294
- value = 1.23456
295
- s[:v] = value
296
- (s.pointer.get_float(0) - value).abs.should < 0.0001
297
- end
298
- it ":double field r/w" do
299
- klass = Class.new(FFI::Struct)
300
- klass.layout :v, :double, :dummy, :long
301
-
302
- s = klass.new
303
- value = 1.23456
304
- s[:v] = value
305
- (s.pointer.get_double(0) - value).abs.should < 0.0001
306
- end
307
- module EnumFields
308
- extend FFI::Library
309
- enum :test_enum, [:c1, 10, :c2, 20, :c3, 30, :c4, 40]
310
- class TestStruct < FFI::Struct
311
- layout :a, :int, :c, :test_enum
312
- end
313
- end
314
- it ":enum field r/w" do
315
- s = EnumFields::TestStruct.new
316
- s[:c] = :c3
317
-
318
- s.pointer.get_uint(FFI::Type::INT32.size).should == 30
319
- s[:c].should == :c3
320
- end
321
- module CallbackMember
322
- extend FFI::Library
323
- ffi_lib TestLibrary::PATH
324
- callback :add, [ :int, :int ], :int
325
- callback :sub, [ :int, :int ], :int
326
- class TestStruct < FFI::Struct
327
- layout :add, :add,
328
- :sub, :sub
329
- end
330
- attach_function :struct_call_add_cb, [TestStruct.in, :int, :int], :int
331
- attach_function :struct_call_sub_cb, [TestStruct.in, :int, :int], :int
332
- end
333
- it "Can have CallbackInfo struct field" do
334
- s = CallbackMember::TestStruct.new
335
- add_proc = lambda { |a, b| a+b }
336
- sub_proc = lambda { |a, b| a-b }
337
- s[:add] = add_proc
338
- s[:sub] = sub_proc
339
- CallbackMember.struct_call_add_cb(s, 40, 2).should == 42
340
- CallbackMember.struct_call_sub_cb(s, 44, 2).should == 42
341
- end
342
- it "Can return its members as a list" do
343
- class TestStruct < FFI::Struct
344
- layout :a, :int, :b, :int, :c, :int
345
- end
346
- TestStruct.members.should include(:a, :b, :c)
347
- end
348
- it "Can return its instance members and values as lists" do
349
- class TestStruct < FFI::Struct
350
- layout :a, :int, :b, :int, :c, :int
351
- end
352
- s = TestStruct.new
353
- s.members.should include(:a, :b, :c)
354
- s[:a] = 1
355
- s[:b] = 2
356
- s[:c] = 3
357
- s.values.should include(1, 2, 3)
358
- end
359
- it 'should return an ordered field/offset pairs array' do
360
- class TestStruct < FFI::Struct
361
- layout :a, :int, :b, :int, :c, :int
362
- end
363
- s = TestStruct.new
364
- s.offsets.should == [[:a, 0], [:b, 4], [:c, 8]]
365
- TestStruct.offsets.should == [[:a, 0], [:b, 4], [:c, 8]]
366
- end
367
- it "Struct#offset_of returns offset of field within struct" do
368
- class TestStruct < FFI::Struct
369
- layout :a, :int, :b, :int, :c, :int
370
- end
371
- TestStruct.offset_of(:a).should == 0
372
- TestStruct.offset_of(:b).should == 4
373
- TestStruct.offset_of(:c).should == 8
374
- end
375
- end
376
-
377
- describe FFI::Struct, ' with a nested struct field' do
378
- module LibTest
379
- extend FFI::Library
380
- ffi_lib TestLibrary::PATH
381
- class NestedStruct < FFI::Struct
382
- layout :i, :int
383
- end
384
- class ContainerStruct < FFI::Struct
385
- layout :first, :char, :ns, NestedStruct
386
- end
387
- attach_function :struct_align_nested_struct, [ :pointer ], :int
388
- attach_function :struct_make_container_struct, [ :int ], :pointer
389
- end
390
- before do
391
- @cs = LibTest::ContainerStruct.new
392
- end
393
- it 'should align correctly nested struct field' do
394
- @cs[:ns][:i] = 123
395
- LibTest.struct_align_nested_struct(@cs.to_ptr).should == 123
396
- end
397
- it 'should correctly calculate Container size (in bytes)' do
398
- LibTest::ContainerStruct.size.should == 8
399
- end
400
- it 'should return a Struct object when the field is accessed' do
401
- @cs[:ns].is_a?(FFI::Struct).should be_true
402
- end
403
- it 'should read a value from memory' do
404
- @cs = LibTest::ContainerStruct.new(LibTest.struct_make_container_struct(123))
405
- @cs[:ns][:i].should == 123
406
- end
407
- it 'should write a value to memory' do
408
- @cs = LibTest::ContainerStruct.new(LibTest.struct_make_container_struct(123))
409
- @cs[:ns][:i] = 456
410
- LibTest.struct_align_nested_struct(@cs.to_ptr).should == 456
411
- end
412
- end
413
-
414
- describe FFI::Struct, ' with a nested array of structs' do
415
- module InlineArrayOfStructs
416
- extend FFI::Library
417
- ffi_lib TestLibrary::PATH
418
- class NestedStruct < FFI::Struct
419
- layout :i, :int
420
- end
421
- class ContainerStruct < FFI::Struct
422
- layout :first, :char, :ns, [ NestedStruct, 1 ]
423
- end
424
- attach_function :struct_align_nested_struct, [ :pointer ], :int
425
- attach_function :struct_make_container_struct, [ :int ], :pointer
426
- end
427
-
428
- before do
429
- @cs = InlineArrayOfStructs::ContainerStruct.new
430
- end
431
-
432
- it 'should align correctly nested struct field' do
433
- @cs[:ns][0][:i] = 123
434
- InlineArrayOfStructs.struct_align_nested_struct(@cs.to_ptr).should == 123
435
- end
436
-
437
- it 'should correctly calculate Container size (in bytes)' do
438
- InlineArrayOfStructs::ContainerStruct.size.should == 8
439
- end
440
-
441
- it 'should return a Struct object when the field is accessed' do
442
- @cs[:ns][0].is_a?(FFI::Struct).should be_true
443
- end
444
-
445
- it 'should read a value from memory' do
446
- @cs = InlineArrayOfStructs::ContainerStruct.new(InlineArrayOfStructs.struct_make_container_struct(123))
447
- @cs[:ns][0][:i].should == 123
448
- end
449
-
450
- it 'should write a value to memory' do
451
- @cs = InlineArrayOfStructs::ContainerStruct.new(InlineArrayOfStructs.struct_make_container_struct(123))
452
- @cs[:ns][0][:i] = 456
453
- InlineArrayOfStructs.struct_align_nested_struct(@cs.to_ptr).should == 456
454
- end
455
-
456
- it 'should support Enumerable#each' do
457
- @cs = InlineArrayOfStructs::ContainerStruct.new(InlineArrayOfStructs.struct_make_container_struct(123))
458
- ints = []
459
- @cs[:ns].each { |s| ints << s[:i] }
460
- ints[0].should == 123
461
- end
462
- end
463
-
464
- describe FFI::Struct, ' by value' do
465
- module LibTest
466
- extend FFI::Library
467
- ffi_lib TestLibrary::PATH
468
-
469
- class S8S32 < FFI::Struct
470
- layout :s8, :char, :s32, :int
471
- end
472
-
473
- class StructString < FFI::Struct
474
- layout :bytes, :string, :len, :int
475
- end
476
-
477
- attach_function :struct_return_s8s32, [ ], S8S32.by_value
478
- attach_function :struct_s8s32_set, [ :char, :int ], S8S32.by_value
479
- attach_function :struct_s8s32_get_s8, [ S8S32.by_value ], :char
480
- attach_function :struct_s8s32_get_s32, [ S8S32.by_value ], :int
481
- attach_function :struct_s8s32_s32_ret_s32, [ S8S32.by_value, :int ], :int
482
- attach_function :struct_s8s32_s64_ret_s64, [ S8S32.by_value, :long_long ], :long_long
483
- attach_function :struct_varargs_ret_struct_string, [ :int, :varargs ], StructString.by_value
484
- end
485
-
486
- it 'return using pre-set values' do
487
- s = LibTest.struct_return_s8s32
488
- s[:s8].should == 0x7f
489
- s[:s32].should == 0x12345678
490
- end
491
-
492
- it 'return using passed in values' do
493
- s = LibTest.struct_s8s32_set(123, 456789)
494
- s[:s8].should == 123
495
- s[:s32].should == 456789
496
- end
497
-
498
- it 'parameter' do
499
- s = LibTest::S8S32.new
500
- s[:s8] = 0x12
501
- s[:s32] = 0x34567890
502
- LibTest.struct_s8s32_get_s8(s).should == 0x12
503
- LibTest.struct_s8s32_get_s32(s).should == 0x34567890
504
- end
505
-
506
- it 'parameter with following s32' do
507
- s = LibTest::S8S32.new
508
- s[:s8] = 0x12
509
- s[:s32] = 0x34567890
510
-
511
- LibTest.struct_s8s32_s32_ret_s32(s, 0x1eefdead).should == 0x1eefdead
512
- end
513
-
514
- it 'parameter with following s64' do
515
- s = LibTest::S8S32.new
516
- s[:s8] = 0x12
517
- s[:s32] = 0x34567890
518
-
519
- LibTest.struct_s8s32_s64_ret_s64(s, 0xdeadcafebabe).should == 0xdeadcafebabe
520
- end
521
-
522
- it 'varargs returning a struct' do
523
- string = "test"
524
- s = LibTest.struct_varargs_ret_struct_string(4, :string, string)
525
- s[:len].should == string.length
526
- s[:bytes].should == string
527
- end
528
- end
529
-
530
- describe FFI::Struct, ' with an array field' do
531
- module LibTest
532
- extend FFI::Library
533
- ffi_lib TestLibrary::PATH
534
- class StructWithArray < FFI::Struct
535
- layout :first, :char, :a, [:int, 5]
536
- end
537
- attach_function :struct_make_struct_with_array, [:int, :int, :int, :int, :int], :pointer
538
- attach_function :struct_field_array, [:pointer], :pointer
539
- end
540
- before do
541
- @s = LibTest::StructWithArray.new
542
- end
543
- it 'should correctly calculate StructWithArray size (in bytes)' do
544
- LibTest::StructWithArray.size.should == 24
545
- end
546
- it 'should read values from memory' do
547
- @s = LibTest::StructWithArray.new(LibTest.struct_make_struct_with_array(0, 1, 2, 3, 4))
548
- @s[:a].to_a.should == [0, 1, 2, 3, 4]
549
- end
550
- # it 'should cache array object for successive calls' do
551
- # @s[:a].object_id.should == @s[:a].object_id
552
- # end
553
- it 'should return the size of the array field in bytes' do
554
- @s = LibTest::StructWithArray.new(LibTest.struct_make_struct_with_array(0, 1, 2, 3, 4))
555
- @s[:a].size.should == 20
556
- end
557
- it 'should allow iteration through the array elements' do
558
- @s = LibTest::StructWithArray.new(LibTest.struct_make_struct_with_array(0, 1, 2, 3, 4))
559
- @s[:a].each_with_index { |elem, i| elem.should == i }
560
- end
561
- it 'should return the pointer to the array' do
562
- @s = LibTest::StructWithArray.new(LibTest.struct_make_struct_with_array(0, 1, 2, 3, 4))
563
- @s[:a].to_ptr.should == LibTest::struct_field_array(@s.to_ptr)
564
- end
565
- end
566
-
567
- describe 'BuggedStruct' do
568
- module LibTest
569
- extend FFI::Library
570
- ffi_lib TestLibrary::PATH
571
- class BuggedStruct < FFI::Struct
572
- layout :visible, :uchar,
573
- :x, :uint,
574
- :y, :uint,
575
- :rx, :short,
576
- :ry, :short,
577
- :order, :uchar,
578
- :size, :uchar
579
- end
580
- attach_function :bugged_struct_size, [], :uint
581
- end
582
- it 'should return its correct size' do
583
- LibTest::BuggedStruct.size.should == LibTest.bugged_struct_size
584
- end
585
- it "offsets within struct should be correct" do
586
- LibTest::BuggedStruct.offset_of(:visible).should == 0
587
- LibTest::BuggedStruct.offset_of(:x).should == 4
588
- LibTest::BuggedStruct.offset_of(:y).should == 8
589
- LibTest::BuggedStruct.offset_of(:rx).should == 12
590
- LibTest::BuggedStruct.offset_of(:ry).should == 14
591
- LibTest::BuggedStruct.offset_of(:order).should == 16
592
- LibTest::BuggedStruct.offset_of(:size).should == 17
593
- end
594
- it 'should return correct field/offset pairs' do
595
- LibTest::BuggedStruct.offsets.sort do |a, b|
596
- a[1] <=> b[1]
597
- end.should == [[:visible, 0], [:x, 4], [:y, 8], [:rx, 12], [:ry, 14], [:order, 16], [:size, 17]]
598
- end
599
- end
600
-
601
- describe "Struct allocation" do
602
- it "MemoryPointer.new(Struct, 2)" do
603
- class S < FFI::Struct
604
- layout :i, :uint
605
- end
606
- p = FFI::MemoryPointer.new(S, 2)
607
- p.total.should == 8
608
- p.type_size.should == 4
609
- p.put_uint(4, 0xdeadbeef)
610
- S.new(p[1])[:i].should == 0xdeadbeef
611
- p[1].address.should == (p[0].address + 4)
612
- end
613
-
614
- it "Buffer.new(Struct, 2)" do
615
- class S < FFI::Struct
616
- layout :i, :uint
617
- end
618
- p = FFI::Buffer.new(S, 2)
619
- p.total.should == 8
620
- p.type_size.should == 4
621
- p.put_uint(4, 0xdeadbeef)
622
- S.new(p[1])[:i].should == 0xdeadbeef
623
- end
624
-
625
- it "null? should be true when initialized with NULL pointer" do
626
- class S < FFI::Struct
627
- layout :i, :uint
628
- end
629
- S.new(Pointer::NULL).null?.should be_true
630
- end
631
-
632
- it "null? should be false when initialized with non-NULL pointer" do
633
- class S < FFI::Struct
634
- layout :i, :uint
635
- end
636
- S.new(MemoryPointer.new(S)).null?.should be_false
637
- end
638
- end
@@ -1,62 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
- describe "Custom type definitions" do
3
- it "attach_function with custom typedef" do
4
- module CustomTypedef
5
- extend FFI::Library
6
- ffi_lib TestLibrary::PATH
7
- typedef :uint, :fubar_t
8
- attach_function :ret_u32, [ :fubar_t ], :fubar_t
9
- end
10
- CustomTypedef.ret_u32(0x12345678).should == 0x12345678
11
- end
12
- it "variadic invoker with custom typedef" do
13
- module VariadicCustomTypedef
14
- extend FFI::Library
15
- ffi_lib TestLibrary::PATH
16
- typedef :uint, :fubar_t
17
- attach_function :pack_varargs, [ :buffer_out, :string, :varargs ], :void
18
- end
19
- buf = FFI::Buffer.new :uint, 10
20
- VariadicCustomTypedef.pack_varargs(buf, "i", :fubar_t, 0x12345678)
21
- buf.get_int64(0).should == 0x12345678
22
- end
23
- it "Callback with custom typedef parameter" do
24
- module CallbackCustomTypedef
25
- extend FFI::Library
26
- ffi_lib TestLibrary::PATH
27
- typedef :uint, :fubar3_t
28
- callback :cbIrV, [ :fubar3_t ], :void
29
- attach_function :testCallbackU32rV, :testClosureIrV, [ :cbIrV, :fubar3_t ], :void
30
- end
31
- i = 0
32
- CallbackCustomTypedef.testCallbackU32rV(0xdeadbeef) { |v| i = v }
33
- i.should == 0xdeadbeef
34
- end
35
- module StructCustomTypedef
36
- extend FFI::Library
37
- ffi_lib TestLibrary::PATH
38
- typedef :uint, :fubar3_t
39
- class S < FFI::Struct
40
- layout :a, :fubar3_t
41
- end
42
- end
43
- it "Struct with custom typedef field" do
44
- s = StructCustomTypedef::S.new
45
- s[:a] = 0x12345678
46
- s.pointer.get_uint(0).should == 0x12345678
47
- end
48
-
49
- it "attach_function after a typedef should not reject normal types" do
50
- lambda do
51
- Module.new do
52
- extend FFI::Library
53
- # enum() will insert a custom typedef called :foo for the enum
54
- enum :foo, [ :a, :b ]
55
- typedef :int, :bar
56
-
57
- ffi_lib TestLibrary::PATH
58
- attach_function :ptr_ret_int32_t, [ :string, :foo ], :bar
59
- end
60
- end.should_not raise_error
61
- end
62
- end