ffi 1.1.2 → 1.17.0

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 (706) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +456 -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 +166 -156
  10. data/ext/ffi_c/AbstractMemory.c +240 -140
  11. data/ext/ffi_c/AbstractMemory.h +25 -15
  12. data/ext/ffi_c/ArrayType.c +78 -29
  13. data/ext/ffi_c/ArrayType.h +22 -12
  14. data/ext/ffi_c/Buffer.c +121 -60
  15. data/ext/ffi_c/Call.c +184 -137
  16. data/ext/ffi_c/Call.h +46 -22
  17. data/ext/ffi_c/ClosurePool.c +101 -43
  18. data/ext/ffi_c/ClosurePool.h +24 -13
  19. data/ext/ffi_c/DynamicLibrary.c +139 -57
  20. data/ext/ffi_c/DynamicLibrary.h +70 -12
  21. data/ext/ffi_c/Function.c +372 -273
  22. data/ext/ffi_c/Function.h +25 -20
  23. data/ext/ffi_c/FunctionInfo.c +135 -49
  24. data/ext/ffi_c/LastError.c +97 -30
  25. data/ext/ffi_c/LastError.h +21 -12
  26. data/ext/ffi_c/LongDouble.c +15 -9
  27. data/ext/ffi_c/LongDouble.h +21 -16
  28. data/ext/ffi_c/MappedType.c +88 -38
  29. data/ext/ffi_c/MappedType.h +21 -14
  30. data/ext/ffi_c/MemoryPointer.c +91 -38
  31. data/ext/ffi_c/MemoryPointer.h +22 -19
  32. data/ext/ffi_c/MethodHandle.c +52 -51
  33. data/ext/ffi_c/MethodHandle.h +24 -14
  34. data/ext/ffi_c/Platform.c +28 -62
  35. data/ext/ffi_c/Platform.h +21 -12
  36. data/ext/ffi_c/Pointer.c +145 -86
  37. data/ext/ffi_c/Pointer.h +23 -19
  38. data/ext/ffi_c/Struct.c +363 -163
  39. data/ext/ffi_c/Struct.h +39 -21
  40. data/ext/ffi_c/StructByValue.c +72 -37
  41. data/ext/ffi_c/StructByValue.h +21 -12
  42. data/ext/ffi_c/StructLayout.c +308 -94
  43. data/ext/ffi_c/Thread.c +73 -270
  44. data/ext/ffi_c/Thread.h +32 -35
  45. data/ext/ffi_c/Type.c +147 -84
  46. data/ext/ffi_c/Type.h +27 -11
  47. data/ext/ffi_c/Types.c +40 -24
  48. data/ext/ffi_c/Types.h +24 -21
  49. data/ext/ffi_c/Variadic.c +148 -64
  50. data/ext/ffi_c/compat.h +45 -37
  51. data/ext/ffi_c/extconf.rb +86 -32
  52. data/ext/ffi_c/ffi.c +32 -21
  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} +6366 -3559
  78. data/ext/ffi_c/libffi/LICENSE +1 -1
  79. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +353 -0
  80. data/ext/ffi_c/libffi/Makefile.am +131 -170
  81. data/ext/ffi_c/libffi/Makefile.in +1317 -1010
  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 +222 -17
  86. data/ext/ffi_c/libffi/config.guess +1033 -780
  87. data/ext/ffi_c/libffi/config.sub +1393 -1206
  88. data/ext/ffi_c/libffi/configure +16340 -10740
  89. data/ext/ffi_c/libffi/configure.ac +226 -271
  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 +525 -79
  94. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  95. data/ext/ffi_c/libffi/fficonfig.h.in +41 -52
  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 +201 -79
  99. data/ext/ffi_c/libffi/include/ffi.h.in +190 -99
  100. data/ext/ffi_c/libffi/include/ffi_cfi.h +76 -0
  101. data/ext/ffi_c/libffi/include/ffi_common.h +72 -14
  102. data/ext/ffi_c/libffi/include/tramp.h +45 -0
  103. data/ext/ffi_c/libffi/install-sh +231 -210
  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 +3868 -2068
  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 +47 -25
  113. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +110 -147
  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 +75 -19
  116. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +8 -29
  117. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +11 -9
  118. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +104 -52
  119. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +18 -8
  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 +156 -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 +153 -314
  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/{include/ffi.h.vc64 → msvc_build/aarch64/aarch64_include/ffi.h} +151 -67
  134. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/fficonfig.h +219 -0
  135. data/ext/ffi_c/libffi/msvcc.sh +176 -20
  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 +161 -266
  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 +706 -513
  149. data/ext/ffi_c/libffi/src/arm/ffitarget.h +32 -8
  150. data/ext/ffi_c/libffi/src/arm/internal.h +17 -0
  151. data/ext/ffi_c/libffi/src/arm/sysv.S +372 -413
  152. data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
  153. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
  154. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  155. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  156. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  157. data/ext/ffi_c/libffi/src/closures.c +565 -73
  158. data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
  159. data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
  160. data/ext/ffi_c/libffi/src/csky/ffi.c +395 -0
  161. data/ext/ffi_c/libffi/src/csky/ffitarget.h +63 -0
  162. data/ext/ffi_c/libffi/src/csky/sysv.S +371 -0
  163. data/ext/ffi_c/libffi/src/debug.c +8 -3
  164. data/ext/ffi_c/libffi/src/dlmalloc.c +23 -13
  165. data/ext/ffi_c/libffi/src/frv/ffi.c +2 -2
  166. data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
  167. data/ext/ffi_c/libffi/src/ia64/ffi.c +47 -13
  168. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +8 -2
  169. data/ext/ffi_c/libffi/src/ia64/unix.S +28 -3
  170. data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
  171. data/ext/ffi_c/libffi/src/kvx/asm.h +5 -0
  172. data/ext/ffi_c/libffi/src/kvx/ffi.c +273 -0
  173. data/ext/ffi_c/libffi/src/kvx/ffitarget.h +75 -0
  174. data/ext/ffi_c/libffi/src/kvx/sysv.S +127 -0
  175. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +624 -0
  176. data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
  177. data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
  178. data/ext/ffi_c/libffi/src/m32r/ffi.c +32 -15
  179. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
  180. data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
  181. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
  182. data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
  183. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  184. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  185. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  186. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  187. data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
  188. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  189. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  190. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  191. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  192. data/ext/ffi_c/libffi/src/mips/ffi.c +382 -101
  193. data/ext/ffi_c/libffi/src/mips/ffitarget.h +23 -14
  194. data/ext/ffi_c/libffi/src/mips/n32.S +321 -89
  195. data/ext/ffi_c/libffi/src/mips/o32.S +211 -31
  196. data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
  197. data/ext/ffi_c/libffi/src/moxie/ffi.c +100 -66
  198. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  199. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  200. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  201. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  202. data/ext/ffi_c/libffi/src/or1k/ffi.c +341 -0
  203. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  204. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  205. data/ext/ffi_c/libffi/src/pa/ffi.c +62 -108
  206. data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
  207. data/ext/ffi_c/libffi/src/pa/ffitarget.h +28 -12
  208. data/ext/ffi_c/libffi/src/pa/hpux32.S +87 -38
  209. data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
  210. data/ext/ffi_c/libffi/src/pa/linux.S +109 -39
  211. data/ext/ffi_c/libffi/src/powerpc/aix.S +245 -7
  212. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +253 -4
  213. data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
  214. data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
  215. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
  216. data/ext/ffi_c/libffi/src/powerpc/ffi.c +105 -1378
  217. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +157 -52
  218. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1153 -0
  219. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +105 -0
  220. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  221. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +110 -45
  222. data/ext/ffi_c/libffi/src/powerpc/linux64.S +191 -85
  223. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +438 -108
  224. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  225. data/ext/ffi_c/libffi/src/powerpc/sysv.S +73 -119
  226. data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
  227. data/ext/ffi_c/libffi/src/prep_cif.c +131 -25
  228. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  229. data/ext/ffi_c/libffi/src/riscv/ffi.c +514 -0
  230. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +69 -0
  231. data/ext/ffi_c/libffi/src/riscv/sysv.S +293 -0
  232. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  233. data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
  234. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  235. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  236. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  237. data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
  238. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  239. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
  240. data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
  241. data/ext/ffi_c/libffi/src/sparc/ffi64.c +630 -0
  242. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
  243. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  244. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  245. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  246. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  247. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  248. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  249. data/ext/ffi_c/libffi/src/tramp.c +716 -0
  250. data/ext/ffi_c/libffi/src/types.c +48 -19
  251. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  252. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  253. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  254. data/ext/ffi_c/libffi/src/wasm32/ffi.c +947 -0
  255. data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
  256. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  257. data/ext/ffi_c/libffi/src/x86/ffi.c +686 -498
  258. data/ext/ffi_c/libffi/src/x86/ffi64.c +444 -129
  259. data/ext/ffi_c/libffi/src/x86/ffitarget.h +79 -36
  260. data/ext/ffi_c/libffi/src/x86/ffiw64.c +361 -0
  261. data/ext/ffi_c/libffi/src/x86/internal.h +43 -0
  262. data/ext/ffi_c/libffi/src/x86/internal64.h +36 -0
  263. data/ext/ffi_c/libffi/src/x86/sysv.S +1198 -394
  264. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +998 -0
  265. data/ext/ffi_c/libffi/src/x86/unix64.S +585 -300
  266. data/ext/ffi_c/libffi/src/x86/win64.S +244 -458
  267. data/ext/ffi_c/libffi/src/x86/win64_intel.S +238 -0
  268. data/ext/ffi_c/libffi/src/xtensa/ffi.c +306 -0
  269. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +57 -0
  270. data/ext/ffi_c/libffi/src/xtensa/sysv.S +268 -0
  271. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  272. data/ext/ffi_c/libffi/testsuite/Makefile.am +80 -73
  273. data/ext/ffi_c/libffi/testsuite/Makefile.in +233 -117
  274. data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
  275. data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
  276. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +86 -0
  277. data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
  278. data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
  279. data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
  280. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +360 -28
  281. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +22 -2
  282. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +28 -0
  283. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +78 -0
  284. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +50 -0
  285. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +63 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1746 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2885 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +747 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +46 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +28 -6
  293. data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
  298. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +52 -42
  299. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  300. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +15 -12
  301. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  302. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +110 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  304. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  308. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  312. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +5 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  314. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
  315. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  316. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +9 -10
  319. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  323. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +57 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  325. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  326. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  327. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  328. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  329. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  330. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  331. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  332. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
  333. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +78 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
  345. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +134 -0
  346. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +134 -0
  347. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +140 -0
  348. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
  349. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +3 -2
  350. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +2 -0
  351. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +2 -0
  352. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +21 -1
  353. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +2 -0
  354. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +2 -0
  355. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +2 -0
  356. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +7 -6
  357. data/ext/ffi_c/libffi/testsuite/{libffi.call/closure_stdcall.c → libffi.closures/closure_simple.c} +13 -16
  358. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +22 -4
  359. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +26 -4
  360. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +28 -4
  361. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +33 -4
  362. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +8 -4
  363. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +23 -5
  364. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +25 -5
  365. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +40 -8
  366. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +17 -4
  367. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +23 -4
  368. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +17 -4
  369. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +17 -4
  370. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +113 -0
  371. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +26 -4
  372. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +17 -4
  373. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +33 -5
  374. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +23 -5
  375. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +29 -5
  376. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +32 -5
  377. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +28 -6
  378. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +43 -5
  379. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +29 -5
  380. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +18 -4
  381. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +18 -5
  382. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +18 -6
  383. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +23 -5
  384. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +23 -5
  385. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +24 -5
  386. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +44 -31
  387. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +44 -9
  388. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +23 -5
  389. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +22 -5
  390. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +22 -7
  391. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +22 -5
  392. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +22 -5
  393. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +23 -5
  394. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +23 -5
  395. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +7 -5
  396. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +19 -10
  397. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +4 -0
  398. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +14 -4
  399. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +32 -12
  400. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c +70 -0
  401. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c +55 -0
  402. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +5 -1
  403. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +6 -1
  404. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +9 -1
  405. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +9 -1
  406. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +6 -2
  407. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +9 -1
  408. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +6 -1
  409. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +21 -9
  410. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +3 -0
  411. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +2 -0
  412. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +3 -0
  413. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +125 -0
  414. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +3 -0
  415. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +4 -0
  416. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +49 -0
  417. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +49 -0
  418. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +7 -5
  419. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +3 -0
  420. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -0
  421. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +41 -40
  422. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +38 -15
  423. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +9 -9
  424. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +19 -6
  425. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +137 -0
  426. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
  427. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
  428. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct2.c +15 -6
  429. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +15 -6
  430. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +14 -5
  431. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +14 -5
  432. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +17 -6
  433. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +14 -5
  434. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +17 -6
  435. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +17 -6
  436. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
  437. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
  438. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
  439. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large.c +7 -7
  440. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +7 -7
  441. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +6 -6
  442. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +6 -6
  443. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +8 -3
  444. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest.cc +4 -10
  445. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest_ffi_call.cc +4 -2
  446. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  447. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  448. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  449. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  450. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  451. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  452. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  453. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  454. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  455. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  456. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  457. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  458. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  459. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  460. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  461. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  462. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
  463. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  464. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  465. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  466. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  467. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  468. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  469. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  470. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  471. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  472. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  473. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  474. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  475. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  476. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  477. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  478. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  479. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  480. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  481. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  482. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  483. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  484. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  485. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  486. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  487. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  488. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  489. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  490. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  491. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  492. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  493. data/ext/ffi_c/libffi.bsd.mk +13 -7
  494. data/ext/ffi_c/libffi.darwin.mk +25 -13
  495. data/ext/ffi_c/libffi.gnu.mk +4 -3
  496. data/ext/ffi_c/libffi.mk +11 -6
  497. data/ext/ffi_c/libffi.vc.mk +1 -1
  498. data/ext/ffi_c/libffi.vc64.mk +1 -1
  499. data/ext/ffi_c/rbffi.h +23 -15
  500. data/ext/ffi_c/rbffi_endian.h +11 -2
  501. data/ffi.gemspec +42 -0
  502. data/lib/ffi/abstract_memory.rb +44 -0
  503. data/lib/ffi/autopointer.rb +65 -68
  504. data/lib/ffi/compat.rb +43 -0
  505. data/lib/ffi/data_converter.rb +67 -0
  506. data/lib/ffi/dynamic_library.rb +118 -0
  507. data/lib/ffi/enum.rb +166 -25
  508. data/lib/ffi/errno.rb +21 -11
  509. data/lib/ffi/ffi.rb +28 -11
  510. data/lib/ffi/function.rb +71 -0
  511. data/lib/ffi/io.rb +25 -15
  512. data/lib/ffi/library.rb +227 -136
  513. data/lib/ffi/library_path.rb +109 -0
  514. data/lib/ffi/managedstruct.rb +64 -35
  515. data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
  516. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  517. data/lib/ffi/platform/aarch64-freebsd12/types.conf +181 -0
  518. data/lib/ffi/platform/aarch64-linux/types.conf +175 -0
  519. data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
  520. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  521. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  522. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  523. data/lib/ffi/platform/arm-linux/types.conf +110 -82
  524. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  525. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  526. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  527. data/lib/ffi/platform/i386-darwin/types.conf +63 -63
  528. data/lib/ffi/platform/i386-freebsd/types.conf +89 -89
  529. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  530. data/lib/ffi/platform/i386-linux/types.conf +77 -77
  531. data/lib/ffi/platform/i386-netbsd/types.conf +87 -87
  532. data/lib/ffi/platform/i386-openbsd/types.conf +89 -87
  533. data/lib/ffi/platform/i386-solaris/types.conf +96 -96
  534. data/lib/ffi/platform/i386-windows/types.conf +43 -96
  535. data/lib/ffi/platform/ia64-linux/types.conf +79 -79
  536. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  537. data/lib/ffi/platform/mips-linux/types.conf +79 -79
  538. data/lib/ffi/platform/mips64-linux/types.conf +104 -0
  539. data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
  540. data/lib/ffi/platform/mipsel-linux/types.conf +79 -79
  541. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
  542. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
  543. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
  544. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -0
  545. data/lib/ffi/platform/powerpc-aix/types.conf +155 -155
  546. data/lib/ffi/platform/powerpc-darwin/types.conf +63 -63
  547. data/lib/ffi/platform/powerpc-linux/types.conf +108 -78
  548. data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
  549. data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
  550. data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
  551. data/lib/ffi/platform/riscv64-linux/types.conf +104 -0
  552. data/lib/ffi/platform/s390-linux/types.conf +79 -79
  553. data/lib/ffi/platform/s390x-linux/types.conf +79 -79
  554. data/lib/ffi/platform/sparc-linux/types.conf +79 -79
  555. data/lib/ffi/platform/sparc-solaris/types.conf +103 -103
  556. data/lib/ffi/platform/sparcv9-linux/types.conf +102 -0
  557. data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
  558. data/lib/ffi/platform/sparcv9-solaris/types.conf +103 -103
  559. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  560. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  561. data/lib/ffi/platform/x86_64-darwin/types.conf +93 -63
  562. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
  563. data/lib/ffi/platform/x86_64-freebsd/types.conf +90 -88
  564. data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
  565. data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
  566. data/lib/ffi/platform/x86_64-linux/types.conf +107 -77
  567. data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
  568. data/lib/ffi/platform/x86_64-netbsd/types.conf +89 -87
  569. data/lib/ffi/platform/x86_64-openbsd/types.conf +100 -92
  570. data/lib/ffi/platform/x86_64-solaris/types.conf +96 -96
  571. data/lib/ffi/platform/x86_64-windows/types.conf +52 -0
  572. data/lib/ffi/platform.rb +91 -34
  573. data/lib/ffi/pointer.rb +78 -33
  574. data/lib/ffi/struct.rb +100 -66
  575. data/lib/ffi/struct_by_reference.rb +72 -0
  576. data/lib/ffi/struct_layout.rb +96 -0
  577. data/lib/ffi/struct_layout_builder.rb +84 -19
  578. data/lib/ffi/tools/const_generator.rb +11 -8
  579. data/lib/ffi/tools/generator.rb +48 -1
  580. data/lib/ffi/tools/generator_task.rb +13 -16
  581. data/lib/ffi/tools/struct_generator.rb +6 -5
  582. data/lib/ffi/tools/types_generator.rb +14 -10
  583. data/lib/ffi/types.rb +96 -51
  584. data/lib/ffi/union.rb +23 -12
  585. data/lib/ffi/variadic.rb +44 -29
  586. data/lib/ffi/version.rb +3 -0
  587. data/lib/ffi.rb +20 -8
  588. data/rakelib/ffi_gem_helper.rb +65 -0
  589. data/samples/getlogin.rb +8 -0
  590. data/samples/getpid.rb +8 -0
  591. data/samples/gettimeofday.rb +18 -0
  592. data/samples/hello.rb +8 -0
  593. data/samples/hello_ractor.rb +11 -0
  594. data/samples/inotify.rb +60 -0
  595. data/samples/pty.rb +75 -0
  596. data/samples/qsort.rb +20 -0
  597. data/samples/qsort_ractor.rb +28 -0
  598. data/sig/ffi/abstract_memory.rbs +165 -0
  599. data/sig/ffi/auto_pointer.rbs +27 -0
  600. data/sig/ffi/buffer.rbs +18 -0
  601. data/sig/ffi/data_converter.rbs +10 -0
  602. data/sig/ffi/dynamic_library.rbs +9 -0
  603. data/sig/ffi/enum.rbs +38 -0
  604. data/sig/ffi/function.rbs +39 -0
  605. data/sig/ffi/library.rbs +42 -0
  606. data/sig/ffi/native_type.rbs +86 -0
  607. data/sig/ffi/pointer.rbs +42 -0
  608. data/sig/ffi/struct.rbs +76 -0
  609. data/sig/ffi/struct_by_reference.rbs +11 -0
  610. data/sig/ffi/struct_by_value.rbs +7 -0
  611. data/sig/ffi/struct_layout.rbs +9 -0
  612. data/sig/ffi/struct_layout_builder.rbs +5 -0
  613. data/sig/ffi/type.rbs +39 -0
  614. data/sig/ffi.rbs +26 -0
  615. data.tar.gz.sig +0 -0
  616. metadata +508 -268
  617. metadata.gz.sig +1 -0
  618. data/History.txt +0 -1
  619. data/README.rdoc +0 -102
  620. data/ext/ffi_c/DataConverter.c +0 -91
  621. data/ext/ffi_c/Ffi_c.iml +0 -12
  622. data/ext/ffi_c/StructByReference.c +0 -158
  623. data/ext/ffi_c/StructByReference.h +0 -50
  624. data/ext/ffi_c/libffi/ChangeLog.libffi +0 -584
  625. data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
  626. data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
  627. data/ext/ffi_c/libffi/Makefile.vc +0 -141
  628. data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
  629. data/ext/ffi_c/libffi/README +0 -342
  630. data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
  631. data/ext/ffi_c/libffi/build-ios.sh +0 -67
  632. data/ext/ffi_c/libffi/depcomp +0 -630
  633. data/ext/ffi_c/libffi/doc/libffi.info +0 -593
  634. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  635. data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
  636. data/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 +0 -76
  637. data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7831
  638. data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
  639. data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
  640. data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
  641. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -98
  642. data/ext/ffi_c/libffi/mdate-sh +0 -201
  643. data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
  644. data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
  645. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  646. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  647. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  648. data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
  649. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  650. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  651. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  652. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
  653. data/ext/ffi_c/libffi/texinfo.tex +0 -7210
  654. data/ext/ffi_c/win32/stdint.h +0 -199
  655. data/gen/Rakefile +0 -30
  656. data/lib/Lib.iml +0 -13
  657. data/spec/ffi/Ffi.iml +0 -12
  658. data/spec/ffi/async_callback_spec.rb +0 -46
  659. data/spec/ffi/bool_spec.rb +0 -40
  660. data/spec/ffi/buffer_spec.rb +0 -215
  661. data/spec/ffi/callback_spec.rb +0 -668
  662. data/spec/ffi/custom_param_type.rb +0 -47
  663. data/spec/ffi/custom_type_spec.rb +0 -85
  664. data/spec/ffi/dup_spec.rb +0 -65
  665. data/spec/ffi/enum_spec.rb +0 -227
  666. data/spec/ffi/errno_spec.rb +0 -29
  667. data/spec/ffi/ffi_spec.rb +0 -40
  668. data/spec/ffi/function_spec.rb +0 -87
  669. data/spec/ffi/library_spec.rb +0 -208
  670. data/spec/ffi/long_double.rb +0 -41
  671. data/spec/ffi/managed_struct_spec.rb +0 -72
  672. data/spec/ffi/number_spec.rb +0 -247
  673. data/spec/ffi/pointer_spec.rb +0 -214
  674. data/spec/ffi/rbx/attach_function_spec.rb +0 -28
  675. data/spec/ffi/rbx/memory_pointer_spec.rb +0 -111
  676. data/spec/ffi/rbx/spec_helper.rb +0 -1
  677. data/spec/ffi/rbx/struct_spec.rb +0 -13
  678. data/spec/ffi/spec_helper.rb +0 -35
  679. data/spec/ffi/string_spec.rb +0 -119
  680. data/spec/ffi/strptr_spec.rb +0 -61
  681. data/spec/ffi/struct_callback_spec.rb +0 -80
  682. data/spec/ffi/struct_initialize_spec.rb +0 -46
  683. data/spec/ffi/struct_packed_spec.rb +0 -62
  684. data/spec/ffi/struct_spec.rb +0 -719
  685. data/spec/ffi/typedef_spec.rb +0 -89
  686. data/spec/ffi/union_spec.rb +0 -76
  687. data/spec/ffi/variadic_spec.rb +0 -103
  688. data/spec/spec.opts +0 -4
  689. data/tasks/ann.rake +0 -80
  690. data/tasks/extension.rake +0 -32
  691. data/tasks/gem.rake +0 -199
  692. data/tasks/git.rake +0 -41
  693. data/tasks/notes.rake +0 -27
  694. data/tasks/post_load.rake +0 -34
  695. data/tasks/rdoc.rake +0 -50
  696. data/tasks/rubyforge.rake +0 -55
  697. data/tasks/setup.rb +0 -301
  698. data/tasks/spec.rake +0 -54
  699. data/tasks/svn.rake +0 -47
  700. data/tasks/test.rake +0 -40
  701. data/tasks/yard.rake +0 -11
  702. data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
  703. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
  704. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +0 -0
  705. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
  706. data/lib/ffi/platform/{i486-gnu → i386-gnu}/types.conf +84 -84
@@ -2,35 +2,39 @@
2
2
  * Copyright (c) 2008, 2009, Wayne Meissner
3
3
  * Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com>
4
4
  *
5
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
5
6
  * All rights reserved.
6
7
  *
7
- * This file is part of ruby-ffi.
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above copyright
13
+ * notice, this list of conditions and the following disclaimer in the
14
+ * documentation and/or other materials provided with the distribution.
15
+ * * Neither the name of the Ruby FFI project nor the
16
+ * names of its contributors may be used to endorse or promote products
17
+ * derived from this software without specific prior written permission.
8
18
  *
9
- * This code is free software: you can redistribute it and/or modify it under
10
- * the terms of the GNU Lesser General Public License version 3 only, as
11
- * published by the Free Software Foundation.
12
- *
13
- * This code is distributed in the hope that it will be useful, but WITHOUT
14
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
16
- * version 3 for more details.
17
- *
18
- * You should have received a copy of the GNU Lesser General Public License
19
- * version 3 along with this work. If not, see <http://www.gnu.org/licenses/>.
19
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
23
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
20
29
  */
21
30
 
22
31
  #include <sys/types.h>
23
32
 
24
- #include "Function.h"
25
33
  #ifndef _MSC_VER
26
- #include <sys/param.h>
34
+ # include <sys/param.h>
35
+ #endif
27
36
  #include <stdint.h>
28
37
  #include <stdbool.h>
29
- #else
30
- typedef int bool;
31
- #define true 1
32
- #define false 0
33
- #endif
34
38
  #include <ruby.h>
35
39
  #include "rbffi.h"
36
40
  #include "compat.h"
@@ -39,16 +43,21 @@ typedef int bool;
39
43
  #include "MemoryPointer.h"
40
44
  #include "Function.h"
41
45
  #include "Types.h"
42
- #include "Struct.h"
43
46
  #include "StructByValue.h"
44
47
  #include "ArrayType.h"
48
+ #include "Function.h"
45
49
  #include "MappedType.h"
50
+ #include "Struct.h"
46
51
 
47
52
  #define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1)
48
53
 
49
- static void struct_layout_mark(StructLayout *);
50
- static void struct_layout_free(StructLayout *);
51
- static void struct_field_mark(StructField* );
54
+ static void struct_layout_mark(void *);
55
+ static void struct_layout_compact(void *);
56
+ static void struct_layout_free(void *);
57
+ static size_t struct_layout_memsize(const void *);
58
+ static void struct_field_mark(void *);
59
+ static void struct_field_compact(void *);
60
+ static size_t struct_field_memsize(const void *);
52
61
 
53
62
  VALUE rbffi_StructLayoutFieldClass = Qnil;
54
63
  VALUE rbffi_StructLayoutNumberFieldClass = Qnil, rbffi_StructLayoutPointerFieldClass = Qnil;
@@ -57,6 +66,33 @@ VALUE rbffi_StructLayoutFunctionFieldClass = Qnil, rbffi_StructLayoutArrayFieldC
57
66
 
58
67
  VALUE rbffi_StructLayoutClass = Qnil;
59
68
 
69
+ const rb_data_type_t rbffi_struct_layout_data_type = { /* extern */
70
+ .wrap_struct_name = "FFI::StructLayout",
71
+ .function = {
72
+ .dmark = struct_layout_mark,
73
+ .dfree = struct_layout_free,
74
+ .dsize = struct_layout_memsize,
75
+ ffi_compact_callback( struct_layout_compact )
76
+ },
77
+ .parent = &rbffi_type_data_type,
78
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
79
+ // macro to update VALUE references, as to trigger write barriers.
80
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
81
+ };
82
+
83
+ const rb_data_type_t rbffi_struct_field_data_type = { /* extern */
84
+ .wrap_struct_name = "FFI::StructField",
85
+ .function = {
86
+ .dmark = struct_field_mark,
87
+ .dfree = RUBY_TYPED_DEFAULT_FREE,
88
+ .dsize = struct_field_memsize,
89
+ ffi_compact_callback( struct_field_compact )
90
+ },
91
+ .parent = &rbffi_type_data_type,
92
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
93
+ // macro to update VALUE references, as to trigger write barriers.
94
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
95
+ };
60
96
 
61
97
  static VALUE
62
98
  struct_field_allocate(VALUE klass)
@@ -64,20 +100,43 @@ struct_field_allocate(VALUE klass)
64
100
  StructField* field;
65
101
  VALUE obj;
66
102
 
67
- obj = Data_Make_Struct(klass, StructField, struct_field_mark, -1, field);
68
- field->rbType = Qnil;
69
- field->rbName = Qnil;
103
+ obj = TypedData_Make_Struct(klass, StructField, &rbffi_struct_field_data_type, field);
104
+ RB_OBJ_WRITE(obj, &field->rbType, Qnil);
105
+ RB_OBJ_WRITE(obj, &field->rbName, Qnil);
70
106
 
71
107
  return obj;
72
108
  }
73
109
 
74
110
  static void
75
- struct_field_mark(StructField* f)
111
+ struct_field_mark(void *data)
76
112
  {
77
- rb_gc_mark(f->rbType);
78
- rb_gc_mark(f->rbName);
113
+ StructField *f = (StructField *)data;
114
+ rb_gc_mark_movable(f->rbType);
115
+ rb_gc_mark_movable(f->rbName);
79
116
  }
80
117
 
118
+ static void
119
+ struct_field_compact(void *data)
120
+ {
121
+ StructField *f = (StructField *)data;
122
+ ffi_gc_location(f->rbType);
123
+ ffi_gc_location(f->rbName);
124
+ }
125
+
126
+ static size_t
127
+ struct_field_memsize(const void *data)
128
+ {
129
+ return sizeof(StructField);
130
+ }
131
+
132
+ /*
133
+ * call-seq: initialize(name, offset, type)
134
+ * @param [String,Symbol] name
135
+ * @param [Integer] offset
136
+ * @param [FFI::Type] type
137
+ * @return [self]
138
+ * A new FFI::StructLayout::Field instance.
139
+ */
81
140
  static VALUE
82
141
  struct_field_initialize(int argc, VALUE* argv, VALUE self)
83
142
  {
@@ -85,7 +144,7 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
85
144
  StructField* field;
86
145
  int nargs;
87
146
 
88
- Data_Get_Struct(self, StructField, field);
147
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
89
148
 
90
149
  nargs = rb_scan_args(argc, argv, "3", &rbName, &rbOffset, &rbType);
91
150
 
@@ -102,15 +161,14 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
102
161
  }
103
162
 
104
163
  field->offset = NUM2UINT(rbOffset);
105
- field->rbName = (TYPE(rbName) == T_SYMBOL) ? rbName : rb_str_intern(rbName);
106
- field->rbType = rbType;
107
- Data_Get_Struct(field->rbType, Type, field->type);
164
+ RB_OBJ_WRITE(self, &field->rbName, (TYPE(rbName) == T_SYMBOL) ? rbName : rb_str_intern(rbName));
165
+ RB_OBJ_WRITE(self, &field->rbType, rbType);
166
+ TypedData_Get_Struct(field->rbType, Type, &rbffi_type_data_type, field->type);
108
167
  field->memoryOp = get_memory_op(field->type);
109
168
  field->referenceIndex = -1;
110
169
 
111
170
  switch (field->type->nativeType == NATIVE_MAPPED ? ((MappedType *) field->type)->type->nativeType : field->type->nativeType) {
112
171
  case NATIVE_FUNCTION:
113
- case NATIVE_CALLBACK:
114
172
  case NATIVE_POINTER:
115
173
  field->referenceRequired = true;
116
174
  break;
@@ -122,57 +180,90 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
122
180
  && RTEST(rb_funcall2(rbType, rb_intern("reference_required?"), 0, NULL)));
123
181
  break;
124
182
  }
125
-
183
+
184
+ rb_obj_freeze(self);
185
+
126
186
  return self;
127
187
  }
128
188
 
189
+ /*
190
+ * call-seq: offset
191
+ * @return [Integer]
192
+ * Get the field offset.
193
+ */
129
194
  static VALUE
130
195
  struct_field_offset(VALUE self)
131
196
  {
132
197
  StructField* field;
133
- Data_Get_Struct(self, StructField, field);
198
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
134
199
  return UINT2NUM(field->offset);
135
200
  }
136
201
 
202
+ /*
203
+ * call-seq: size
204
+ * @return [Integer]
205
+ * Get the field size.
206
+ */
137
207
  static VALUE
138
208
  struct_field_size(VALUE self)
139
209
  {
140
210
  StructField* field;
141
- Data_Get_Struct(self, StructField, field);
211
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
142
212
  return UINT2NUM(field->type->ffiType->size);
143
213
  }
144
214
 
215
+ /*
216
+ * call-seq: alignment
217
+ * @return [Integer]
218
+ * Get the field alignment.
219
+ */
145
220
  static VALUE
146
221
  struct_field_alignment(VALUE self)
147
222
  {
148
223
  StructField* field;
149
- Data_Get_Struct(self, StructField, field);
224
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
150
225
  return UINT2NUM(field->type->ffiType->alignment);
151
226
  }
152
227
 
228
+ /*
229
+ * call-seq: type
230
+ * @return [Type]
231
+ * Get the field type.
232
+ */
153
233
  static VALUE
154
234
  struct_field_type(VALUE self)
155
235
  {
156
236
  StructField* field;
157
- Data_Get_Struct(self, StructField, field);
237
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
158
238
 
159
239
  return field->rbType;
160
240
  }
161
241
 
242
+ /*
243
+ * call-seq: name
244
+ * @return [Symbol]
245
+ * Get the field name.
246
+ */
162
247
  static VALUE
163
248
  struct_field_name(VALUE self)
164
249
  {
165
250
  StructField* field;
166
- Data_Get_Struct(self, StructField, field);
251
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
167
252
  return field->rbName;
168
253
  }
169
254
 
255
+ /*
256
+ * call-seq: get(pointer)
257
+ * @param [AbstractMemory] pointer pointer on a {Struct}
258
+ * @return [Object]
259
+ * Get an object of type {#type} from memory pointed by +pointer+.
260
+ */
170
261
  static VALUE
171
262
  struct_field_get(VALUE self, VALUE pointer)
172
263
  {
173
264
  StructField* f;
174
265
 
175
- Data_Get_Struct(self, StructField, f);
266
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
176
267
  if (f->memoryOp == NULL) {
177
268
  rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(f->rbType));
178
269
  return Qnil;
@@ -181,12 +272,19 @@ struct_field_get(VALUE self, VALUE pointer)
181
272
  return (*f->memoryOp->get)(MEMORY(pointer), f->offset);
182
273
  }
183
274
 
275
+ /*
276
+ * call-seq: put(pointer, value)
277
+ * @param [AbstractMemory] pointer pointer on a {Struct}
278
+ * @param [Object] value this object must be a kind of {#type}
279
+ * @return [self]
280
+ * Put an object to memory pointed by +pointer+.
281
+ */
184
282
  static VALUE
185
283
  struct_field_put(VALUE self, VALUE pointer, VALUE value)
186
284
  {
187
285
  StructField* f;
188
-
189
- Data_Get_Struct(self, StructField, f);
286
+
287
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
190
288
  if (f->memoryOp == NULL) {
191
289
  rb_raise(rb_eArgError, "put not supported for %s", rb_obj_classname(f->rbType));
192
290
  return self;
@@ -197,23 +295,38 @@ struct_field_put(VALUE self, VALUE pointer, VALUE value)
197
295
  return self;
198
296
  }
199
297
 
298
+ /*
299
+ * call-seq: get(pointer)
300
+ * @param [AbstractMemory] pointer pointer on a {Struct}
301
+ * @return [Function]
302
+ * Get a {Function} from memory pointed by +pointer+.
303
+ */
200
304
  static VALUE
201
305
  function_field_get(VALUE self, VALUE pointer)
202
306
  {
203
307
  StructField* f;
204
-
205
- Data_Get_Struct(self, StructField, f);
308
+
309
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
206
310
 
207
311
  return rbffi_Function_NewInstance(f->rbType, (*rbffi_AbstractMemoryOps.pointer->get)(MEMORY(pointer), f->offset));
208
312
  }
209
313
 
314
+ /*
315
+ * call-seq: put(pointer, proc)
316
+ * @param [AbstractMemory] pointer pointer to a {Struct}
317
+ * @param [Function, Proc] proc
318
+ * @return [Function]
319
+ * Set a {Function} to memory pointed by +pointer+ as a function.
320
+ *
321
+ * If a Proc is submitted as +proc+, it is automatically transformed to a {Function}.
322
+ */
210
323
  static VALUE
211
324
  function_field_put(VALUE self, VALUE pointer, VALUE proc)
212
325
  {
213
326
  StructField* f;
214
327
  VALUE value = Qnil;
215
328
 
216
- Data_Get_Struct(self, StructField, f);
329
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
217
330
 
218
331
  if (NIL_P(proc) || rb_obj_is_kind_of(proc, rbffi_FunctionClass)) {
219
332
  value = proc;
@@ -235,6 +348,12 @@ isCharArray(ArrayType* arrayType)
235
348
  || arrayType->componentType->nativeType == NATIVE_UINT8;
236
349
  }
237
350
 
351
+ /*
352
+ * call-seq: get(pointer)
353
+ * @param [AbstractMemory] pointer pointer on a {Struct}
354
+ * @return [FFI::StructLayout::CharArray, FFI::Struct::InlineArray]
355
+ * Get an array from a {Struct}.
356
+ */
238
357
  static VALUE
239
358
  array_field_get(VALUE self, VALUE pointer)
240
359
  {
@@ -242,8 +361,8 @@ array_field_get(VALUE self, VALUE pointer)
242
361
  ArrayType* array;
243
362
  VALUE argv[2];
244
363
 
245
- Data_Get_Struct(self, StructField, f);
246
- Data_Get_Struct(f->rbType, ArrayType, array);
364
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
365
+ TypedData_Get_Struct(f->rbType, ArrayType, &rbffi_array_type_data_type, array);
247
366
 
248
367
  argv[0] = pointer;
249
368
  argv[1] = self;
@@ -252,24 +371,35 @@ array_field_get(VALUE self, VALUE pointer)
252
371
  ? rbffi_StructLayoutCharArrayClass : rbffi_StructInlineArrayClass);
253
372
  }
254
373
 
374
+ /*
375
+ * call-seq: put(pointer, value)
376
+ * @param [AbstractMemory] pointer pointer on a {Struct}
377
+ * @param [String, Array] value +value+ may be a String only if array's type is a kind of +int8+
378
+ * @return [value]
379
+ * Set an array in a {Struct}.
380
+ */
255
381
  static VALUE
256
382
  array_field_put(VALUE self, VALUE pointer, VALUE value)
257
383
  {
258
384
  StructField* f;
259
385
  ArrayType* array;
260
-
261
386
 
262
- Data_Get_Struct(self, StructField, f);
263
- Data_Get_Struct(f->rbType, ArrayType, array);
264
-
387
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
388
+ TypedData_Get_Struct(f->rbType, ArrayType, &rbffi_array_type_data_type, array);
389
+
265
390
  if (isCharArray(array) && rb_obj_is_instance_of(value, rb_cString)) {
266
391
  VALUE argv[2];
267
392
 
268
393
  argv[0] = INT2FIX(f->offset);
269
394
  argv[1] = value;
270
395
 
271
- rb_funcall2(pointer, rb_intern("put_string"), 2, argv);
272
-
396
+ if (RSTRING_LEN(value) < array->length) {
397
+ rb_funcall2(pointer, rb_intern("put_string"), 2, argv);
398
+ } else if (RSTRING_LEN(value) == array->length) {
399
+ rb_funcall2(pointer, rb_intern("put_bytes"), 2, argv);
400
+ } else {
401
+ rb_raise(rb_eIndexError, "String is longer (%ld bytes) than the char array (%d bytes)", RSTRING_LEN(value), array->length);
402
+ }
273
403
  } else {
274
404
  #ifdef notyet
275
405
  MemoryOp* op;
@@ -281,7 +411,7 @@ array_field_put(VALUE self, VALUE pointer, VALUE value)
281
411
  rb_raise(rb_eIndexError, "array too large");
282
412
  }
283
413
 
284
- // clear the contents in case of a short write
414
+ /* clear the contents in case of a short write */
285
415
  checkWrite(memory);
286
416
  checkBounds(memory, f->offset, f->type->ffiType->size);
287
417
  if (count < array->length) {
@@ -289,7 +419,7 @@ array_field_put(VALUE self, VALUE pointer, VALUE value)
289
419
  0, (array->length - count) * array->componentType->ffiType->size);
290
420
  }
291
421
 
292
- // now copy each element in
422
+ /* now copy each element in */
293
423
  if ((op = get_memory_op(array->componentType)) != NULL) {
294
424
 
295
425
  for (i = 0; i < count; ++i) {
@@ -302,12 +432,8 @@ array_field_put(VALUE self, VALUE pointer, VALUE value)
302
432
  VALUE entry = rb_ary_entry(value, i);
303
433
  Struct* s;
304
434
 
305
- if (!rb_obj_is_kind_of(entry, rbffi_StructClass)) {
306
- rb_raise(rb_eTypeError, "array element not an instance of FFI::Struct");
307
- break;
308
- }
435
+ TypedData_Get_Struct(entry, Struct, &rbffi_struct_data_type, s);
309
436
 
310
- Data_Get_Struct(entry, Struct, s);
311
437
  checkRead(s->pointer);
312
438
  checkBounds(s->pointer, 0, array->componentType->ffiType->size);
313
439
 
@@ -333,11 +459,10 @@ struct_layout_allocate(VALUE klass)
333
459
  StructLayout* layout;
334
460
  VALUE obj;
335
461
 
336
- obj = Data_Make_Struct(klass, StructLayout, struct_layout_mark, struct_layout_free, layout);
337
- layout->rbFieldMap = Qnil;
338
- layout->rbFieldNames = Qnil;
339
- layout->rbFields = Qnil;
340
- layout->fieldSymbolTable = st_init_numtable();
462
+ obj = TypedData_Make_Struct(klass, StructLayout, &rbffi_struct_layout_data_type, layout);
463
+ RB_OBJ_WRITE(obj, &layout->rbFieldMap, Qnil);
464
+ RB_OBJ_WRITE(obj, &layout->rbFieldNames, Qnil);
465
+ RB_OBJ_WRITE(obj, &layout->rbFields, Qnil);
341
466
  layout->base.ffiType = xcalloc(1, sizeof(*layout->base.ffiType));
342
467
  layout->base.ffiType->size = 0;
343
468
  layout->base.ffiType->alignment = 0;
@@ -346,6 +471,14 @@ struct_layout_allocate(VALUE klass)
346
471
  return obj;
347
472
  }
348
473
 
474
+ /*
475
+ * call-seq: initialize(fields, size, align)
476
+ * @param [Array<StructLayout::Field>] fields
477
+ * @param [Integer] size
478
+ * @param [Integer] align
479
+ * @return [self]
480
+ * A new StructLayout instance.
481
+ */
349
482
  static VALUE
350
483
  struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
351
484
  {
@@ -353,15 +486,15 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
353
486
  ffi_type* ltype;
354
487
  int i;
355
488
 
356
- Data_Get_Struct(self, StructLayout, layout);
357
- layout->fieldCount = (int) RARRAY_LEN(fields);
358
- layout->rbFieldMap = rb_hash_new();
359
- layout->rbFieldNames = rb_ary_new2(layout->fieldCount);
360
- layout->size = FFI_ALIGN(NUM2INT(size), NUM2INT(align));
489
+ TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
490
+ layout->fieldCount = RARRAY_LENINT(fields);
491
+ RB_OBJ_WRITE(self, &layout->rbFieldMap, rb_hash_new());
492
+ RB_OBJ_WRITE(self, &layout->rbFieldNames, rb_ary_new2(layout->fieldCount));
493
+ layout->size = (int) FFI_ALIGN(NUM2INT(size), NUM2INT(align));
361
494
  layout->align = NUM2INT(align);
362
495
  layout->fields = xcalloc(layout->fieldCount, sizeof(StructField *));
363
496
  layout->ffiTypes = xcalloc(layout->fieldCount + 1, sizeof(ffi_type *));
364
- layout->rbFields = rb_ary_new2(layout->fieldCount);
497
+ RB_OBJ_WRITE(self, &layout->rbFields, rb_ary_new2(layout->fieldCount));
365
498
  layout->referenceFieldCount = 0;
366
499
  layout->base.ffiType->elements = layout->ffiTypes;
367
500
  layout->base.ffiType->size = layout->size;
@@ -380,7 +513,7 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
380
513
  }
381
514
  rbName = rb_funcall2(rbField, rb_intern("name"), 0, NULL);
382
515
 
383
- Data_Get_Struct(rbField, StructField, field);
516
+ TypedData_Get_Struct(rbField, StructField, &rbffi_struct_field_data_type, field);
384
517
  layout->fields[i] = field;
385
518
 
386
519
  if (field->type == NULL || field->type->ffiType == NULL) {
@@ -388,7 +521,7 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
388
521
  }
389
522
 
390
523
  ftype = field->type->ffiType;
391
- if (ftype->size == 0) {
524
+ if (ftype->size == 0 && i < ((int) layout->fieldCount - 1)) {
392
525
  rb_raise(rb_eTypeError, "type of field %d has zero size", i);
393
526
  }
394
527
 
@@ -396,8 +529,8 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
396
529
  field->referenceIndex = layout->referenceFieldCount++;
397
530
  }
398
531
 
399
- layout->ffiTypes[i] = ftype;
400
- st_insert(layout->fieldSymbolTable, rbName, rbField);
532
+
533
+ layout->ffiTypes[i] = ftype->size > 0 ? ftype : NULL;
401
534
  rb_hash_aset(layout->rbFieldMap, rbName, rbField);
402
535
  rb_ary_push(layout->rbFields, rbField);
403
536
  rb_ary_push(layout->rbFieldNames, rbName);
@@ -407,23 +540,34 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
407
540
  rb_raise(rb_eRuntimeError, "Struct size is zero");
408
541
  }
409
542
 
543
+ rb_obj_freeze(layout->rbFieldMap);
544
+ rb_obj_freeze(layout->rbFields);
545
+ rb_obj_freeze(layout->rbFieldNames);
546
+ rb_obj_freeze(self);
547
+
410
548
  return self;
411
549
  }
412
550
 
551
+ /*
552
+ * call-seq: [](field)
553
+ * @param [Symbol] field
554
+ * @return [StructLayout::Field]
555
+ * Get a field from the layout.
556
+ */
413
557
  static VALUE
414
- struct_layout_union_bang(VALUE self)
558
+ struct_layout_union_bang(VALUE self)
415
559
  {
416
- static const ffi_type *alignment_types[] = { &ffi_type_sint8, &ffi_type_sint16, &ffi_type_sint32, &ffi_type_sint64,
417
- &ffi_type_float, &ffi_type_double, &ffi_type_longdouble, NULL };
560
+ const ffi_type *alignment_types[] = { &ffi_type_sint8, &ffi_type_sint16, &ffi_type_sint32, &ffi_type_sint64,
561
+ &ffi_type_float, &ffi_type_double, &ffi_type_longdouble, NULL };
418
562
  StructLayout* layout;
419
563
  ffi_type *t = NULL;
420
564
  int count, i;
421
565
 
422
- Data_Get_Struct(self, StructLayout, layout);
566
+ TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
423
567
 
424
568
  for (i = 0; alignment_types[i] != NULL; ++i) {
425
569
  if (alignment_types[i]->alignment == layout->align) {
426
- t = alignment_types[i];
570
+ t = (ffi_type *) alignment_types[i];
427
571
  break;
428
572
  }
429
573
  }
@@ -432,7 +576,7 @@ struct_layout_union_bang(VALUE self)
432
576
  return Qnil;
433
577
  }
434
578
 
435
- count = layout->size / t->size;
579
+ count = (int) layout->size / (int) t->size;
436
580
  xfree(layout->ffiTypes);
437
581
  layout->ffiTypes = xcalloc(count + 1, sizeof(ffi_type *));
438
582
  layout->base.ffiType->elements = layout->ffiTypes;
@@ -449,81 +593,151 @@ struct_layout_aref(VALUE self, VALUE field)
449
593
  {
450
594
  StructLayout* layout;
451
595
 
452
- Data_Get_Struct(self, StructLayout, layout);
596
+ TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
453
597
 
454
598
  return rb_hash_aref(layout->rbFieldMap, field);
455
599
  }
456
600
 
601
+ /*
602
+ * call-seq: fields
603
+ * @return [Array<StructLayout::Field>]
604
+ * Get fields list.
605
+ */
457
606
  static VALUE
458
607
  struct_layout_fields(VALUE self)
459
608
  {
460
609
  StructLayout* layout;
461
610
 
462
- Data_Get_Struct(self, StructLayout, layout);
611
+ TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
463
612
 
464
613
  return rb_ary_dup(layout->rbFields);
465
614
  }
466
615
 
616
+ /*
617
+ * call-seq: members
618
+ * @return [Array<Symbol>]
619
+ * Get list of field names.
620
+ */
467
621
  static VALUE
468
622
  struct_layout_members(VALUE self)
469
623
  {
470
624
  StructLayout* layout;
471
625
 
472
- Data_Get_Struct(self, StructLayout, layout);
626
+ TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
473
627
 
474
628
  return rb_ary_dup(layout->rbFieldNames);
475
629
  }
476
630
 
631
+ /*
632
+ * call-seq: to_a
633
+ * @return [Array<StructLayout::Field>]
634
+ * Get an array of fields.
635
+ */
477
636
  static VALUE
478
637
  struct_layout_to_a(VALUE self)
479
638
  {
480
639
  StructLayout* layout;
481
640
 
482
- Data_Get_Struct(self, StructLayout, layout);
641
+ TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
483
642
 
484
643
  return rb_ary_dup(layout->rbFields);
485
644
  }
486
645
 
487
646
  static void
488
- struct_layout_mark(StructLayout *layout)
647
+ struct_layout_mark(void *data)
489
648
  {
490
- rb_gc_mark(layout->rbFieldMap);
491
- rb_gc_mark(layout->rbFieldNames);
492
- rb_gc_mark(layout->rbFields);
649
+ StructLayout *layout = (StructLayout *)data;
650
+ rb_gc_mark_movable(layout->rbFieldMap);
651
+ rb_gc_mark_movable(layout->rbFieldNames);
652
+ rb_gc_mark_movable(layout->rbFields);
653
+ /* The values stored in layout->cache_row.fieldName are primary stored in layout->rbFieldMap and are marked there */
493
654
  }
494
655
 
495
656
  static void
496
- struct_layout_free(StructLayout *layout)
657
+ struct_layout_compact(void *data)
497
658
  {
659
+ StructLayout *layout = (StructLayout *)data;
660
+ ffi_gc_location(layout->rbFieldMap);
661
+ ffi_gc_location(layout->rbFieldNames);
662
+ ffi_gc_location(layout->rbFields);
663
+
664
+ /* Clear the cache, to be safe from changes of fieldName VALUE by GC.compact */
665
+ memset(&layout->cache_row, 0, sizeof(layout->cache_row));
666
+ }
667
+
668
+ static void
669
+ struct_layout_free(void *data)
670
+ {
671
+ StructLayout *layout = (StructLayout *)data;
498
672
  xfree(layout->ffiTypes);
499
673
  xfree(layout->base.ffiType);
500
674
  xfree(layout->fields);
501
- st_free_table(layout->fieldSymbolTable);
502
675
  xfree(layout);
503
676
  }
504
677
 
505
678
 
679
+ static size_t
680
+ struct_layout_memsize(const void * data)
681
+ {
682
+ const StructLayout *layout = (const StructLayout *)data;
683
+ size_t memsize = sizeof(StructLayout);
684
+ memsize += layout->fieldCount * (sizeof(StructField *) + sizeof(ffi_type *));
685
+ memsize += sizeof(*layout->base.ffiType);
686
+ return memsize;
687
+ }
688
+
506
689
  void
507
690
  rbffi_StructLayout_Init(VALUE moduleFFI)
508
691
  {
509
- rbffi_StructLayoutClass = rb_define_class_under(moduleFFI, "StructLayout", rbffi_TypeClass);
692
+ VALUE ffi_Type = rbffi_TypeClass;
693
+
694
+ /*
695
+ * Document-class: FFI::StructLayout < FFI::Type
696
+ *
697
+ * This class aims at defining a struct layout.
698
+ */
699
+ rbffi_StructLayoutClass = rb_define_class_under(moduleFFI, "StructLayout", ffi_Type);
510
700
  rb_global_variable(&rbffi_StructLayoutClass);
511
-
701
+
702
+ /*
703
+ * Document-class: FFI::StructLayout::Field
704
+ * A field in a {StructLayout}.
705
+ */
512
706
  rbffi_StructLayoutFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Field", rb_cObject);
513
707
  rb_global_variable(&rbffi_StructLayoutFieldClass);
514
708
 
709
+ /*
710
+ * Document-class: FFI::StructLayout::Number
711
+ * A numeric {Field} in a {StructLayout}.
712
+ */
515
713
  rbffi_StructLayoutNumberFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Number", rbffi_StructLayoutFieldClass);
516
714
  rb_global_variable(&rbffi_StructLayoutNumberFieldClass);
517
715
 
716
+ /*
717
+ * Document-class: FFI::StructLayout::String
718
+ * A string {Field} in a {StructLayout}.
719
+ */
518
720
  rbffi_StructLayoutStringFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "String", rbffi_StructLayoutFieldClass);
519
721
  rb_global_variable(&rbffi_StructLayoutStringFieldClass);
520
722
 
723
+ /*
724
+ * Document-class: FFI::StructLayout::Pointer
725
+ * A pointer {Field} in a {StructLayout}.
726
+ */
521
727
  rbffi_StructLayoutPointerFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Pointer", rbffi_StructLayoutFieldClass);
522
728
  rb_global_variable(&rbffi_StructLayoutPointerFieldClass);
523
729
 
730
+ /*
731
+ * Document-class: FFI::StructLayout::Function
732
+ * A function pointer {Field} in a {StructLayout}.
733
+ */
524
734
  rbffi_StructLayoutFunctionFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Function", rbffi_StructLayoutFieldClass);
525
735
  rb_global_variable(&rbffi_StructLayoutFunctionFieldClass);
526
736
 
737
+ /*
738
+ * Document-class: FFI::StructLayout::Array
739
+ * An array {Field} in a {StructLayout}.
740
+ */
527
741
  rbffi_StructLayoutArrayFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Array", rbffi_StructLayoutFieldClass);
528
742
  rb_global_variable(&rbffi_StructLayoutArrayFieldClass);
529
743