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
data/ext/ffi_c/Struct.c CHANGED
@@ -1,36 +1,37 @@
1
1
  /*
2
2
  * Copyright (c) 2008, 2009, Wayne Meissner
3
- * Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com>
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
8
  * Redistribution and use in source and binary forms, with or without
8
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.
9
18
  *
10
- * * Redistributions of source code must retain the above copyright notice, this
11
- * list of conditions and the following disclaimer.
12
- * * Redistributions in binary form must reproduce the above copyright notice
13
- * this list of conditions and the following disclaimer in the documentation
14
- * and/or other materials provided with the distribution.
15
- * * The name of the author or authors may not be used to endorse or promote
16
- * products derived from this software without specific prior written permission.
17
- *
18
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
22
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
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.
28
29
  */
29
30
 
30
31
  #include <sys/types.h>
31
-
32
- #include "Function.h"
33
- #include <sys/param.h>
32
+ #ifndef _MSC_VER
33
+ # include <sys/param.h>
34
+ #endif
34
35
  #include <stdint.h>
35
36
  #include <stdbool.h>
36
37
  #include <ruby.h>
@@ -41,9 +42,11 @@
41
42
  #include "MemoryPointer.h"
42
43
  #include "Function.h"
43
44
  #include "Types.h"
44
- #include "Struct.h"
45
+ #include "Function.h"
45
46
  #include "StructByValue.h"
46
47
  #include "ArrayType.h"
48
+ #include "MappedType.h"
49
+ #include "Struct.h"
47
50
 
48
51
  typedef struct InlineArray_ {
49
52
  VALUE rbMemory;
@@ -54,15 +57,33 @@ typedef struct InlineArray_ {
54
57
  MemoryOp *op;
55
58
  Type* componentType;
56
59
  ArrayType* arrayType;
57
- unsigned int length;
60
+ int length;
58
61
  } InlineArray;
59
62
 
60
63
 
61
- static void struct_mark(Struct *);
64
+ static void struct_mark(void *data);
65
+ static void struct_compact(void *data);
66
+ static void struct_free(void *data);
67
+ static size_t struct_memsize(const void *);
62
68
  static VALUE struct_class_layout(VALUE klass);
63
- static void struct_malloc(Struct* s);
64
- static void inline_array_mark(InlineArray *);
65
-
69
+ static void struct_malloc(VALUE self, Struct* s);
70
+ static void inline_array_mark(void *);
71
+ static void inline_array_compact(void *);
72
+ static size_t inline_array_memsize(const void *);
73
+ static void store_reference_value(VALUE self, StructField* f, Struct* s, VALUE value);
74
+
75
+ const rb_data_type_t rbffi_struct_data_type = { /* extern */
76
+ .wrap_struct_name = "FFI::Struct",
77
+ .function = {
78
+ .dmark = struct_mark,
79
+ .dfree = struct_free,
80
+ .dsize = struct_memsize,
81
+ ffi_compact_callback( struct_compact )
82
+ },
83
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
84
+ // macro to update VALUE references, as to trigger write barriers.
85
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
86
+ };
66
87
  VALUE rbffi_StructClass = Qnil;
67
88
 
68
89
  VALUE rbffi_StructInlineArrayClass = Qnil;
@@ -70,25 +91,36 @@ VALUE rbffi_StructLayoutCharArrayClass = Qnil;
70
91
 
71
92
  static ID id_pointer_ivar = 0, id_layout_ivar = 0;
72
93
  static ID id_get = 0, id_put = 0, id_to_ptr = 0, id_to_s = 0, id_layout = 0;
94
+ static ID id_initialize = 0;
73
95
 
74
96
  static inline char*
75
97
  memory_address(VALUE self)
76
98
  {
77
- return ((AbstractMemory *)DATA_PTR((self)))->address;
99
+ AbstractMemory *mem;
100
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, mem);
101
+ return mem->address;
78
102
  }
79
103
 
80
104
  static VALUE
81
105
  struct_allocate(VALUE klass)
82
106
  {
83
107
  Struct* s;
84
- VALUE obj = Data_Make_Struct(klass, Struct, struct_mark, -1, s);
85
-
86
- s->rbPointer = Qnil;
87
- s->rbLayout = Qnil;
108
+ VALUE obj = TypedData_Make_Struct(klass, Struct, &rbffi_struct_data_type, s);
109
+
110
+ RB_OBJ_WRITE(obj, &s->rbPointer, Qnil);
111
+ RB_OBJ_WRITE(obj, &s->rbLayout, Qnil);
88
112
 
89
113
  return obj;
90
114
  }
91
115
 
116
+ /*
117
+ * call-seq: initialize
118
+ * @overload initialize
119
+ * @overload initialize(pointer, *args)
120
+ * @param [AbstractMemory] pointer
121
+ * @param [Array] args
122
+ * @return [self]
123
+ */
92
124
  static VALUE
93
125
  struct_initialize(int argc, VALUE* argv, VALUE self)
94
126
  {
@@ -96,28 +128,76 @@ struct_initialize(int argc, VALUE* argv, VALUE self)
96
128
  VALUE rbPointer = Qnil, rest = Qnil, klass = CLASS_OF(self);
97
129
  int nargs;
98
130
 
99
- Data_Get_Struct(self, Struct, s);
100
-
131
+ TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
132
+
101
133
  nargs = rb_scan_args(argc, argv, "01*", &rbPointer, &rest);
102
134
 
103
135
  /* Call up into ruby code to adjust the layout */
104
136
  if (nargs > 1) {
105
- s->rbLayout = rb_funcall2(CLASS_OF(self), id_layout, RARRAY_LEN(rest), RARRAY_PTR(rest));
137
+ VALUE rbLayout = rb_apply(CLASS_OF(self), id_layout, rest);
138
+ RB_OBJ_WRITE(self, &s->rbLayout, rbLayout);
106
139
  } else {
107
- s->rbLayout = struct_class_layout(klass);
140
+ RB_OBJ_WRITE(self, &s->rbLayout, struct_class_layout(klass));
108
141
  }
109
142
 
110
143
  if (!rb_obj_is_kind_of(s->rbLayout, rbffi_StructLayoutClass)) {
111
144
  rb_raise(rb_eRuntimeError, "Invalid Struct layout");
112
145
  }
113
146
 
114
- Data_Get_Struct(s->rbLayout, StructLayout, s->layout);
115
-
147
+ TypedData_Get_Struct(s->rbLayout, StructLayout, &rbffi_struct_layout_data_type, s->layout);
148
+
116
149
  if (rbPointer != Qnil) {
117
150
  s->pointer = MEMORY(rbPointer);
118
- s->rbPointer = rbPointer;
151
+ RB_OBJ_WRITE(self, &s->rbPointer, rbPointer);
152
+ } else {
153
+ struct_malloc(self, s);
154
+ }
155
+
156
+ return self;
157
+ }
158
+
159
+ /*
160
+ * call-seq: initialize_copy(other)
161
+ * @return [nil]
162
+ * DO NOT CALL THIS METHOD
163
+ */
164
+ static VALUE
165
+ struct_initialize_copy(VALUE self, VALUE other)
166
+ {
167
+ Struct* src;
168
+ Struct* dst;
169
+
170
+ TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, dst);
171
+ TypedData_Get_Struct(other, Struct, &rbffi_struct_data_type, src);
172
+ if (dst == src) {
173
+ return self;
174
+ }
175
+
176
+ RB_OBJ_WRITE(self, &dst->rbLayout, src->rbLayout);
177
+ dst->layout = src->layout;
178
+
179
+ /*
180
+ * A new MemoryPointer instance is allocated here instead of just calling
181
+ * #dup on rbPointer, since the Pointer may not know its length, or may
182
+ * be longer than just this struct.
183
+ */
184
+ if (src->pointer->address != NULL) {
185
+ RB_OBJ_WRITE(self, &dst->rbPointer, rbffi_MemoryPointer_NewInstance(1, src->layout->size, false));
186
+ dst->pointer = MEMORY(dst->rbPointer);
187
+ memcpy(dst->pointer->address, src->pointer->address, src->layout->size);
119
188
  } else {
120
- struct_malloc(s);
189
+ RB_OBJ_WRITE(self, &dst->rbPointer, src->rbPointer);
190
+ dst->pointer = src->pointer;
191
+ }
192
+
193
+ if (src->layout->referenceFieldCount > 0) {
194
+ size_t index;
195
+
196
+ dst->rbReferences = ALLOC_N(VALUE, dst->layout->referenceFieldCount);
197
+ memcpy(dst->rbReferences, src->rbReferences, dst->layout->referenceFieldCount * sizeof(VALUE));
198
+ for ( index = 0; index < dst->layout->referenceFieldCount; index++) {
199
+ RB_OBJ_WRITTEN(self, Qundef, &dst->rbReferences[index]);
200
+ }
121
201
  }
122
202
 
123
203
  return self;
@@ -127,11 +207,11 @@ static VALUE
127
207
  struct_class_layout(VALUE klass)
128
208
  {
129
209
  VALUE layout;
130
- if (!rb_cvar_defined(klass, id_layout_ivar)) {
210
+ if (!rb_ivar_defined(klass, id_layout_ivar)) {
131
211
  rb_raise(rb_eRuntimeError, "no Struct layout configured for %s", rb_class2name(klass));
132
212
  }
133
213
 
134
- layout = rb_cvar_get(klass, id_layout_ivar);
214
+ layout = rb_ivar_get(klass, id_layout_ivar);
135
215
  if (!rb_obj_is_kind_of(layout, rbffi_StructLayoutClass)) {
136
216
  rb_raise(rb_eRuntimeError, "invalid Struct layout for %s", rb_class2name(klass));
137
217
  }
@@ -142,14 +222,15 @@ struct_class_layout(VALUE klass)
142
222
  static StructLayout*
143
223
  struct_layout(VALUE self)
144
224
  {
145
- Struct* s = (Struct *) DATA_PTR(self);
225
+ Struct* s;
226
+ TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
146
227
  if (s->layout != NULL) {
147
228
  return s->layout;
148
229
  }
149
230
 
150
231
  if (s->layout == NULL) {
151
- s->rbLayout = struct_class_layout(CLASS_OF(self));
152
- Data_Get_Struct(s->rbLayout, StructLayout, s->layout);
232
+ RB_OBJ_WRITE(self, &s->rbLayout, struct_class_layout(CLASS_OF(self)));
233
+ TypedData_Get_Struct(s->rbLayout, StructLayout, &rbffi_struct_layout_data_type, s->layout);
153
234
  }
154
235
 
155
236
  return s->layout;
@@ -159,113 +240,181 @@ static Struct*
159
240
  struct_validate(VALUE self)
160
241
  {
161
242
  Struct* s;
162
- Data_Get_Struct(self, Struct, s);
243
+ TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
163
244
 
164
245
  if (struct_layout(self) == NULL) {
165
246
  rb_raise(rb_eRuntimeError, "struct layout == null");
166
247
  }
167
248
 
168
249
  if (s->pointer == NULL) {
169
- struct_malloc(s);
250
+ struct_malloc(self, s);
170
251
  }
171
252
 
172
253
  return s;
173
254
  }
174
255
 
175
256
  static void
176
- struct_malloc(Struct* s)
257
+ struct_malloc(VALUE self, Struct* s)
177
258
  {
178
259
  if (s->rbPointer == Qnil) {
179
- s->rbPointer = rbffi_MemoryPointer_NewInstance(s->layout->size, 1, true);
180
-
260
+ RB_OBJ_WRITE(self, &s->rbPointer, rbffi_MemoryPointer_NewInstance(s->layout->size, 1, true));
181
261
  } else if (!rb_obj_is_kind_of(s->rbPointer, rbffi_AbstractMemoryClass)) {
182
262
  rb_raise(rb_eRuntimeError, "invalid pointer in struct");
183
263
  }
184
264
 
185
- s->pointer = (AbstractMemory *) DATA_PTR(s->rbPointer);
265
+ TypedData_Get_Struct(s->rbPointer, AbstractMemory, &rbffi_abstract_memory_data_type, s->pointer);
186
266
  }
187
267
 
188
268
  static void
189
- struct_mark(Struct *s)
269
+ struct_mark(void *data)
190
270
  {
191
- rb_gc_mark(s->rbPointer);
192
- rb_gc_mark(s->rbLayout);
271
+ Struct *s = (Struct *)data;
272
+ rb_gc_mark_movable(s->rbPointer);
273
+ rb_gc_mark_movable(s->rbLayout);
274
+ if (s->rbReferences != NULL) {
275
+ size_t index;
276
+ for (index = 0; index < s->layout->referenceFieldCount; index++) {
277
+ rb_gc_mark_movable(s->rbReferences[index]);
278
+ }
279
+ }
193
280
  }
194
281
 
195
- static VALUE
196
- struct_field(Struct* s, VALUE fieldName)
282
+ static void
283
+ struct_compact(void *data)
197
284
  {
198
- StructLayout* layout = s->layout;
199
- VALUE rbField;
285
+ Struct *s = (Struct *)data;
286
+ ffi_gc_location(s->rbPointer);
287
+ ffi_gc_location(s->rbLayout);
288
+ if (s->rbReferences != NULL) {
289
+ size_t index;
290
+ for (index = 0; index < s->layout->referenceFieldCount; index++) {
291
+ ffi_gc_location(s->rbReferences[index]);
292
+ }
293
+ }
294
+ }
200
295
 
201
- if (likely(SYMBOL_P(fieldName) && st_lookup(layout->fieldSymbolTable, fieldName, (st_data_t *) &rbField))) {
202
- return rbField;
296
+ static void
297
+ struct_free(void *data)
298
+ {
299
+ Struct *s = (Struct *)data;
300
+ xfree(s->rbReferences);
301
+ xfree(s);
302
+ }
303
+
304
+ static size_t
305
+ struct_memsize(const void *data)
306
+ {
307
+ const Struct *s = (const Struct *)data;
308
+ return sizeof(Struct) + (s->layout->referenceFieldCount * sizeof(VALUE));
309
+ }
310
+
311
+ static void
312
+ store_reference_value(VALUE self, StructField* f, Struct* s, VALUE value)
313
+ {
314
+ if (unlikely(f->referenceIndex == -1)) {
315
+ rb_raise(rb_eRuntimeError, "put_reference_value called for non-reference type");
316
+ return;
317
+ }
318
+ if (s->rbReferences == NULL) {
319
+ int i;
320
+ s->rbReferences = ALLOC_N(VALUE, s->layout->referenceFieldCount);
321
+ for (i = 0; i < s->layout->referenceFieldCount; ++i) {
322
+ RB_OBJ_WRITE(self, &s->rbReferences[i], Qnil);
323
+ }
203
324
  }
204
325
 
205
- rbField = rb_hash_aref(layout->rbFieldMap, fieldName);
206
- if (rbField == Qnil) {
207
- VALUE str = rb_funcall2(fieldName, id_to_s, 0, NULL);
208
- rb_raise(rb_eArgError, "No such field '%s'", StringValuePtr(str));
326
+ RB_OBJ_WRITE(self, &s->rbReferences[f->referenceIndex], value);
327
+ }
328
+
329
+
330
+ static StructField *
331
+ struct_field(Struct* s, VALUE fieldName)
332
+ {
333
+ StructLayout* layout = s->layout;
334
+ struct field_cache_entry *p_ce = FIELD_CACHE_LOOKUP(layout, fieldName);
335
+
336
+ /* Do a hash lookup only if cache entry is empty or fieldName is unexpected? */
337
+ if (unlikely(!SYMBOL_P(fieldName) || !p_ce->fieldName || p_ce->fieldName != fieldName)) {
338
+ VALUE rbField = rb_hash_aref(layout->rbFieldMap, fieldName);
339
+ if (unlikely(NIL_P(rbField))) {
340
+ VALUE str = rb_funcall2(fieldName, id_to_s, 0, NULL);
341
+ rb_raise(rb_eArgError, "No such field '%s'", StringValueCStr(str));
342
+ }
343
+ /* Write the retrieved coder to the cache */
344
+ RB_OBJ_WRITE(s->rbLayout, &p_ce->fieldName, fieldName);
345
+ TypedData_Get_Struct(rbField, StructField, &rbffi_struct_field_data_type, p_ce->field);
209
346
  }
210
347
 
211
- return rbField;
348
+ return p_ce->field;
212
349
  }
213
350
 
351
+ /*
352
+ * call-seq: struct[field_name]
353
+ * @param field_name field to access
354
+ * Acces to a Struct field.
355
+ */
214
356
  static VALUE
215
357
  struct_aref(VALUE self, VALUE fieldName)
216
358
  {
217
359
  Struct* s;
218
- VALUE rbField;
219
360
  StructField* f;
220
361
 
221
362
  s = struct_validate(self);
222
363
 
223
- rbField = struct_field(s, fieldName);
224
- f = (StructField *) DATA_PTR(rbField);
225
-
226
- if (f->get != NULL) {
227
- return (*f->get)(f, s);
228
-
229
- } else if (f->memoryOp != NULL) {
364
+ f = struct_field(s, fieldName);
365
+ if (f->memoryOp != NULL) {
230
366
  return (*f->memoryOp->get)(s->pointer, f->offset);
231
367
 
232
368
  } else {
233
-
369
+ VALUE rbField = rb_hash_aref(s->layout->rbFieldMap, fieldName);
234
370
  /* call up to the ruby code to fetch the value */
235
371
  return rb_funcall2(rbField, id_get, 1, &s->rbPointer);
236
372
  }
237
373
  }
238
374
 
375
+ /*
376
+ * call-seq: []=(field_name, value)
377
+ * @param field_name field to access
378
+ * @param value value to set to +field_name+
379
+ * @return [value]
380
+ * Set a field in Struct.
381
+ */
239
382
  static VALUE
240
383
  struct_aset(VALUE self, VALUE fieldName, VALUE value)
241
384
  {
242
385
  Struct* s;
243
- VALUE rbField;
244
386
  StructField* f;
245
387
 
246
-
388
+ rb_check_frozen(self);
247
389
  s = struct_validate(self);
248
390
 
249
- rbField = struct_field(s, fieldName);
250
- f = (StructField *) DATA_PTR(rbField);
251
- if (f->put != NULL) {
252
- (*f->put)(f, s, value);
253
-
254
- } else if (f->memoryOp != NULL) {
391
+ f = struct_field(s, fieldName);
392
+ if (f->memoryOp != NULL) {
255
393
 
256
394
  (*f->memoryOp->put)(s->pointer, f->offset, value);
257
-
395
+
258
396
  } else {
397
+ VALUE rbField = rb_hash_aref(s->layout->rbFieldMap, fieldName);
259
398
  /* call up to the ruby code to set the value */
260
399
  VALUE argv[2];
261
400
  argv[0] = s->rbPointer;
262
401
  argv[1] = value;
263
402
  rb_funcall2(rbField, id_put, 2, argv);
264
403
  }
265
-
404
+
405
+ if (f->referenceRequired) {
406
+ store_reference_value(self, f, s, value);
407
+ }
408
+
266
409
  return value;
267
410
  }
268
411
 
412
+ /*
413
+ * call-seq: pointer= pointer
414
+ * @param [AbstractMemory] pointer
415
+ * @return [self]
416
+ * Make Struct point to +pointer+.
417
+ */
269
418
  static VALUE
270
419
  struct_set_pointer(VALUE self, VALUE pointer)
271
420
  {
@@ -273,84 +422,109 @@ struct_set_pointer(VALUE self, VALUE pointer)
273
422
  StructLayout* layout;
274
423
  AbstractMemory* memory;
275
424
 
425
+ rb_check_frozen(self);
276
426
  if (!rb_obj_is_kind_of(pointer, rbffi_AbstractMemoryClass)) {
277
427
  rb_raise(rb_eTypeError, "wrong argument type %s (expected Pointer or Buffer)",
278
428
  rb_obj_classname(pointer));
279
429
  return Qnil;
280
430
  }
281
431
 
282
-
283
- Data_Get_Struct(self, Struct, s);
284
- Data_Get_Struct(pointer, AbstractMemory, memory);
432
+
433
+ TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
434
+ TypedData_Get_Struct(pointer, AbstractMemory, &rbffi_abstract_memory_data_type, memory);
285
435
  layout = struct_layout(self);
286
436
 
287
- if (layout->base.ffiType->size > memory->size) {
288
- rb_raise(rb_eArgError, "memory of %d bytes too small for struct %s (expected at least %d)",
289
- memory->size, rb_obj_classname(self), layout->base.ffiType->size);
437
+ if ((int) layout->base.ffiType->size > memory->size) {
438
+ rb_raise(rb_eArgError, "memory of %ld bytes too small for struct %s (expected at least %ld)",
439
+ memory->size, rb_obj_classname(self), (long) layout->base.ffiType->size);
290
440
  }
291
-
441
+
292
442
  s->pointer = MEMORY(pointer);
293
- s->rbPointer = pointer;
443
+ RB_OBJ_WRITE(self, &s->rbPointer, pointer);
294
444
  rb_ivar_set(self, id_pointer_ivar, pointer);
295
445
 
296
446
  return self;
297
447
  }
298
448
 
449
+ /*
450
+ * call-seq: pointer
451
+ * @return [AbstractMemory]
452
+ * Get pointer to Struct contents.
453
+ */
299
454
  static VALUE
300
455
  struct_get_pointer(VALUE self)
301
456
  {
302
457
  Struct* s;
303
458
 
304
- Data_Get_Struct(self, Struct, s);
459
+ TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
305
460
 
306
461
  return s->rbPointer;
307
462
  }
308
463
 
464
+ /*
465
+ * call-seq: layout= layout
466
+ * @param [StructLayout] layout
467
+ * @return [self]
468
+ * Set the Struct's layout.
469
+ */
309
470
  static VALUE
310
471
  struct_set_layout(VALUE self, VALUE layout)
311
472
  {
312
473
  Struct* s;
313
- Data_Get_Struct(self, Struct, s);
474
+ TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
314
475
 
476
+ rb_check_frozen(self);
315
477
  if (!rb_obj_is_kind_of(layout, rbffi_StructLayoutClass)) {
316
478
  rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)",
317
479
  rb_obj_classname(layout), rb_class2name(rbffi_StructLayoutClass));
318
480
  return Qnil;
319
481
  }
320
482
 
321
- Data_Get_Struct(layout, StructLayout, s->layout);
483
+ TypedData_Get_Struct(layout, StructLayout, &rbffi_struct_layout_data_type, s->layout);
322
484
  rb_ivar_set(self, id_layout_ivar, layout);
323
485
 
324
486
  return self;
325
487
  }
326
488
 
489
+ /*
490
+ * call-seq: layout
491
+ * @return [StructLayout]
492
+ * Get the Struct's layout.
493
+ */
327
494
  static VALUE
328
495
  struct_get_layout(VALUE self)
329
496
  {
330
497
  Struct* s;
331
498
 
332
- Data_Get_Struct(self, Struct, s);
499
+ TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
333
500
 
334
501
  return s->rbLayout;
335
502
  }
336
503
 
337
-
504
+ /*
505
+ * call-seq: null?
506
+ * @return [Boolean]
507
+ * Test if Struct's pointer is NULL
508
+ */
338
509
  static VALUE
339
510
  struct_null_p(VALUE self)
340
511
  {
341
512
  Struct* s;
342
513
 
343
- Data_Get_Struct(self, Struct, s);
514
+ TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
344
515
 
345
516
  return s->pointer->address == NULL ? Qtrue : Qfalse;
346
517
  }
347
518
 
519
+ /*
520
+ * (see Pointer#order)
521
+ */
348
522
  static VALUE
349
523
  struct_order(int argc, VALUE* argv, VALUE self)
350
524
  {
351
525
  Struct* s;
352
526
 
353
- Data_Get_Struct(self, Struct, s);
527
+ TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
354
528
  if (argc == 0) {
355
529
  return rb_funcall(s->rbPointer, rb_intern("order"), 0);
356
530
 
@@ -358,11 +532,23 @@ struct_order(int argc, VALUE* argv, VALUE self)
358
532
  VALUE retval = rb_obj_dup(self);
359
533
  VALUE rbPointer = rb_funcall2(s->rbPointer, rb_intern("order"), argc, argv);
360
534
  struct_set_pointer(retval, rbPointer);
361
-
535
+
362
536
  return retval;
363
537
  }
364
538
  }
365
539
 
540
+ static const rb_data_type_t inline_array_data_type = {
541
+ .wrap_struct_name = "FFI::Struct::InlineArray",
542
+ .function = {
543
+ .dmark = inline_array_mark,
544
+ .dfree = RUBY_TYPED_DEFAULT_FREE,
545
+ .dsize = inline_array_memsize,
546
+ ffi_compact_callback( inline_array_compact )
547
+ },
548
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
549
+ // macro to update VALUE references, as to trigger write barriers.
550
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
551
+ };
366
552
 
367
553
  static VALUE
368
554
  inline_array_allocate(VALUE klass)
@@ -370,75 +556,123 @@ inline_array_allocate(VALUE klass)
370
556
  InlineArray* array;
371
557
  VALUE obj;
372
558
 
373
- obj = Data_Make_Struct(klass, InlineArray, inline_array_mark, -1, array);
374
- array->rbField = Qnil;
375
- array->rbMemory = Qnil;
559
+ obj = TypedData_Make_Struct(klass, InlineArray, &inline_array_data_type, array);
560
+ RB_OBJ_WRITE(obj, &array->rbMemory, Qnil);
561
+ RB_OBJ_WRITE(obj, &array->rbField, Qnil);
376
562
 
377
563
  return obj;
378
564
  }
379
565
 
380
566
  static void
381
- inline_array_mark(InlineArray* array)
567
+ inline_array_mark(void *data)
382
568
  {
383
- rb_gc_mark(array->rbField);
384
- rb_gc_mark(array->rbMemory);
569
+ InlineArray *array = (InlineArray *)data;
570
+ rb_gc_mark_movable(array->rbField);
571
+ rb_gc_mark_movable(array->rbMemory);
385
572
  }
386
573
 
574
+ static void
575
+ inline_array_compact(void *data)
576
+ {
577
+ InlineArray *array = (InlineArray *)data;
578
+ ffi_gc_location(array->rbField);
579
+ ffi_gc_location(array->rbMemory);
580
+ }
581
+
582
+ static size_t
583
+ inline_array_memsize(const void *data)
584
+ {
585
+ return sizeof(InlineArray);
586
+ }
587
+
588
+ /*
589
+ * Document-method: FFI::Struct::InlineArray#initialize
590
+ * call-seq: initialize(memory, field)
591
+ * @param [AbstractMemory] memory
592
+ * @param [StructField] field
593
+ * @return [self]
594
+ */
387
595
  static VALUE
388
596
  inline_array_initialize(VALUE self, VALUE rbMemory, VALUE rbField)
389
597
  {
390
598
  InlineArray* array;
391
-
392
- Data_Get_Struct(self, InlineArray, array);
393
- array->rbMemory = rbMemory;
394
- array->rbField = rbField;
395
-
396
- Data_Get_Struct(rbMemory, AbstractMemory, array->memory);
397
- Data_Get_Struct(rbField, StructField, array->field);
398
- Data_Get_Struct(array->field->rbType, ArrayType, array->arrayType);
399
- Data_Get_Struct(array->arrayType->rbComponentType, Type, array->componentType);
400
-
599
+
600
+ TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
601
+ RB_OBJ_WRITE(self, &array->rbMemory, rbMemory);
602
+ RB_OBJ_WRITE(self, &array->rbField, rbField);
603
+
604
+ TypedData_Get_Struct(rbMemory, AbstractMemory, &rbffi_abstract_memory_data_type, array->memory);
605
+ TypedData_Get_Struct(rbField, StructField, &rbffi_struct_field_data_type, array->field);
606
+ TypedData_Get_Struct(array->field->rbType, ArrayType, &rbffi_array_type_data_type, array->arrayType);
607
+ TypedData_Get_Struct(array->arrayType->rbComponentType, Type, &rbffi_type_data_type, array->componentType);
608
+
401
609
  array->op = get_memory_op(array->componentType);
610
+ if (array->op == NULL && array->componentType->nativeType == NATIVE_MAPPED) {
611
+ array->op = get_memory_op(((MappedType *) array->componentType)->type);
612
+ }
613
+
402
614
  array->length = array->arrayType->length;
403
615
 
404
616
  return self;
405
617
  }
406
618
 
619
+ /*
620
+ * call-seq: size
621
+ * @return [Integer]
622
+ * Get size
623
+ */
407
624
  static VALUE
408
625
  inline_array_size(VALUE self)
409
626
  {
410
627
  InlineArray* array;
411
628
 
412
- Data_Get_Struct(self, InlineArray, array);
629
+ TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
413
630
 
414
- return UINT2NUM(array->field->type->ffiType->size);
631
+ return UINT2NUM(((ArrayType *) array->field->type)->length);
415
632
  }
416
633
 
417
634
  static int
418
635
  inline_array_offset(InlineArray* array, int index)
419
636
  {
420
- if (index < 0 || index >= array->length) {
637
+ if (index < 0 || (index >= array->length && array->length > 0)) {
421
638
  rb_raise(rb_eIndexError, "index %d out of bounds", index);
422
639
  }
423
640
 
424
- return array->field->offset + (index * array->componentType->ffiType->size);
641
+ return (int) array->field->offset + (index * (int) array->componentType->ffiType->size);
425
642
  }
426
643
 
644
+ /*
645
+ * call-seq: [](index)
646
+ * @param [Integer] index
647
+ * @return [Type, Struct]
648
+ */
427
649
  static VALUE
428
650
  inline_array_aref(VALUE self, VALUE rbIndex)
429
651
  {
430
652
  InlineArray* array;
431
653
 
432
- Data_Get_Struct(self, InlineArray, array);
654
+ TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
433
655
 
434
656
  if (array->op != NULL) {
435
- return array->op->get(array->memory, inline_array_offset(array, NUM2INT(rbIndex)));
657
+ VALUE rbNativeValue = array->op->get(array->memory,
658
+ inline_array_offset(array, NUM2INT(rbIndex)));
659
+ if (unlikely(array->componentType->nativeType == NATIVE_MAPPED)) {
660
+ return rb_funcall(((MappedType *) array->componentType)->rbConverter,
661
+ rb_intern("from_native"), 2, rbNativeValue, Qnil);
662
+ } else {
663
+ return rbNativeValue;
664
+ }
665
+
436
666
  } else if (array->componentType->nativeType == NATIVE_STRUCT) {
437
667
  VALUE rbOffset = INT2NUM(inline_array_offset(array, NUM2INT(rbIndex)));
438
668
  VALUE rbLength = INT2NUM(array->componentType->ffiType->size);
439
669
  VALUE rbPointer = rb_funcall(array->rbMemory, rb_intern("slice"), 2, rbOffset, rbLength);
670
+ VALUE obj;
440
671
 
441
- return rb_class_new_instance(1, &rbPointer, ((StructByValue *) array->componentType)->rbStructClass);
672
+ /* We avoid rb_class_new_instance here, to avoid passing the method block */
673
+ obj = rb_obj_alloc(((StructByValue *) array->componentType)->rbStructClass);
674
+ rb_funcallv(obj, id_initialize, 1, &rbPointer);
675
+ return obj;
442
676
  } else {
443
677
 
444
678
  rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(array->arrayType->rbComponentType));
@@ -446,16 +680,28 @@ inline_array_aref(VALUE self, VALUE rbIndex)
446
680
  }
447
681
  }
448
682
 
683
+ /*
684
+ * call-seq: []=(index, value)
685
+ * @param [Integer] index
686
+ * @param [Type, Struct]
687
+ * @return [value]
688
+ */
449
689
  static VALUE
450
690
  inline_array_aset(VALUE self, VALUE rbIndex, VALUE rbValue)
451
691
  {
452
692
  InlineArray* array;
453
693
 
454
- Data_Get_Struct(self, InlineArray, array);
694
+ rb_check_frozen(self);
695
+ TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
455
696
 
456
697
  if (array->op != NULL) {
698
+ if (unlikely(array->componentType->nativeType == NATIVE_MAPPED)) {
699
+ rbValue = rb_funcall(((MappedType *) array->componentType)->rbConverter,
700
+ rb_intern("to_native"), 2, rbValue, Qnil);
701
+ }
457
702
  array->op->put(array->memory, inline_array_offset(array, NUM2INT(rbIndex)),
458
703
  rbValue);
704
+
459
705
  } else if (array->componentType->nativeType == NATIVE_STRUCT) {
460
706
  int offset = inline_array_offset(array, NUM2INT(rbIndex));
461
707
  Struct* s;
@@ -468,7 +714,7 @@ inline_array_aset(VALUE self, VALUE rbIndex, VALUE rbValue)
468
714
  checkWrite(array->memory);
469
715
  checkBounds(array->memory, offset, array->componentType->ffiType->size);
470
716
 
471
- Data_Get_Struct(rbValue, Struct, s);
717
+ TypedData_Get_Struct(rbValue, Struct, &rbffi_struct_data_type, s);
472
718
  checkRead(s->pointer);
473
719
  checkBounds(s->pointer, 0, array->componentType->ffiType->size);
474
720
 
@@ -476,7 +722,7 @@ inline_array_aset(VALUE self, VALUE rbIndex, VALUE rbValue)
476
722
 
477
723
  } else {
478
724
  ArrayType* arrayType;
479
- Data_Get_Struct(array->field->rbType, ArrayType, arrayType);
725
+ TypedData_Get_Struct(array->field->rbType, ArrayType, &rbffi_array_type_data_type, arrayType);
480
726
 
481
727
  rb_raise(rb_eArgError, "set not supported for %s", rb_obj_classname(arrayType->rbComponentType));
482
728
  return Qnil;
@@ -485,39 +731,31 @@ inline_array_aset(VALUE self, VALUE rbIndex, VALUE rbValue)
485
731
  return rbValue;
486
732
  }
487
733
 
734
+ /*
735
+ * call-seq: each
736
+ * Yield block for each element of +self+.
737
+ */
488
738
  static VALUE
489
739
  inline_array_each(VALUE self)
490
740
  {
491
741
  InlineArray* array;
492
-
493
- int i;
494
742
 
495
- Data_Get_Struct(self, InlineArray, array);
496
-
497
- if (array->op != NULL) {
498
- for (i = 0; i < array->length; ++i) {
499
- int offset = inline_array_offset(array, i);
500
- rb_yield(array->op->get(array->memory, offset));
501
- }
502
- } else if (array->componentType->nativeType == NATIVE_STRUCT) {
503
- for (i = 0; i < array->length; ++i) {
504
- VALUE rbOffset = UINT2NUM(inline_array_offset(array, i));
505
- VALUE rbLength = UINT2NUM(array->componentType->ffiType->size);
506
- VALUE rbPointer = rb_funcall(array->rbMemory, rb_intern("slice"), 2, rbOffset, rbLength);
743
+ int i;
507
744
 
508
- rb_yield(rb_class_new_instance(1, &rbPointer, ((StructByValue *) array->componentType)->rbStructClass));
509
- }
510
- } else {
511
- ArrayType* arrayType;
512
- Data_Get_Struct(array->field->rbType, ArrayType, arrayType);
745
+ TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
513
746
 
514
- rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(arrayType->rbComponentType));
515
- return Qnil;
747
+ for (i = 0; i < array->length; ++i) {
748
+ rb_yield(inline_array_aref(self, INT2FIX(i)));
516
749
  }
517
750
 
518
751
  return self;
519
752
  }
520
753
 
754
+ /*
755
+ * call-seq: to_a
756
+ * @return [Array]
757
+ * Convert +self+ to an array.
758
+ */
521
759
  static VALUE
522
760
  inline_array_to_a(VALUE self)
523
761
  {
@@ -525,26 +763,31 @@ inline_array_to_a(VALUE self)
525
763
  VALUE obj;
526
764
  int i;
527
765
 
528
- Data_Get_Struct(self, InlineArray, array);
766
+ TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
529
767
  obj = rb_ary_new2(array->length);
530
768
 
531
-
769
+
532
770
  for (i = 0; i < array->length; ++i) {
533
- int offset = inline_array_offset(array, i);
534
- rb_ary_push(obj, array->op->get(array->memory, offset));
771
+ rb_ary_push(obj, inline_array_aref(self, INT2FIX(i)));
535
772
  }
536
773
 
537
774
  return obj;
538
775
  }
539
776
 
777
+ /*
778
+ * Document-method: FFI::StructLayout::CharArray#to_s
779
+ * call-seq: to_s
780
+ * @return [String]
781
+ * Convert +self+ to a string.
782
+ */
540
783
  static VALUE
541
784
  inline_array_to_s(VALUE self)
542
785
  {
543
786
  InlineArray* array;
544
787
  VALUE argv[2];
545
788
 
546
- Data_Get_Struct(self, InlineArray, array);
547
-
789
+ TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
790
+
548
791
  if (array->componentType->nativeType != NATIVE_INT8 && array->componentType->nativeType != NATIVE_UINT8) {
549
792
  VALUE dummy = Qnil;
550
793
  return rb_call_super(0, &dummy);
@@ -556,13 +799,17 @@ inline_array_to_s(VALUE self)
556
799
  return rb_funcall2(array->rbMemory, rb_intern("get_string"), 2, argv);
557
800
  }
558
801
 
559
-
802
+ /*
803
+ * call-seq: to_ptr
804
+ * @return [AbstractMemory]
805
+ * Get pointer to +self+ content.
806
+ */
560
807
  static VALUE
561
808
  inline_array_to_ptr(VALUE self)
562
809
  {
563
810
  InlineArray* array;
564
-
565
- Data_Get_Struct(self, InlineArray, array);
811
+
812
+ TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
566
813
 
567
814
  return rb_funcall(array->rbMemory, rb_intern("slice"), 2,
568
815
  UINT2NUM(array->field->offset), UINT2NUM(array->arrayType->base.ffiType->size));
@@ -576,21 +823,45 @@ rbffi_Struct_Init(VALUE moduleFFI)
576
823
 
577
824
  rbffi_StructLayout_Init(moduleFFI);
578
825
 
579
- rbffi_StructClass = StructClass = rb_define_class_under(moduleFFI, "Struct", rb_cObject);
826
+ /*
827
+ * Document-class: FFI::Struct
828
+ *
829
+ * A FFI::Struct means to mirror a C struct.
830
+ *
831
+ * A Struct is defined as:
832
+ * class MyStruct < FFI::Struct
833
+ * layout :value1, :int,
834
+ * :value2, :double
835
+ * end
836
+ * and is used as:
837
+ * my_struct = MyStruct.new
838
+ * my_struct[:value1] = 12
839
+ *
840
+ * For more information, see http://github.com/ffi/ffi/wiki/Structs
841
+ */
842
+ rbffi_StructClass = rb_define_class_under(moduleFFI, "Struct", rb_cObject);
843
+ StructClass = rbffi_StructClass; // put on a line alone to help RDoc
580
844
  rb_global_variable(&rbffi_StructClass);
581
845
 
846
+ /*
847
+ * Document-class: FFI::Struct::InlineArray
848
+ */
582
849
  rbffi_StructInlineArrayClass = rb_define_class_under(rbffi_StructClass, "InlineArray", rb_cObject);
583
850
  rb_global_variable(&rbffi_StructInlineArrayClass);
584
851
 
585
- rbffi_StructLayoutCharArrayClass = rb_define_class_under(rbffi_StructLayoutClass,
586
- "CharArray", rbffi_StructInlineArrayClass);
852
+ /*
853
+ * Document-class: FFI::StructLayout::CharArray < FFI::Struct::InlineArray
854
+ */
855
+ rbffi_StructLayoutCharArrayClass = rb_define_class_under(rbffi_StructLayoutClass, "CharArray",
856
+ rbffi_StructInlineArrayClass);
587
857
  rb_global_variable(&rbffi_StructLayoutCharArrayClass);
588
858
 
589
859
 
590
860
  rb_define_alloc_func(StructClass, struct_allocate);
591
861
  rb_define_method(StructClass, "initialize", struct_initialize, -1);
862
+ rb_define_method(StructClass, "initialize_copy", struct_initialize_copy, 1);
592
863
  rb_define_method(StructClass, "order", struct_order, -1);
593
-
864
+
594
865
  rb_define_alias(rb_singleton_class(StructClass), "alloc_in", "new");
595
866
  rb_define_alias(rb_singleton_class(StructClass), "alloc_out", "new");
596
867
  rb_define_alias(rb_singleton_class(StructClass), "alloc_inout", "new");
@@ -628,4 +899,6 @@ rbffi_Struct_Init(VALUE moduleFFI)
628
899
  id_put = rb_intern("put");
629
900
  id_to_ptr = rb_intern("to_ptr");
630
901
  id_to_s = rb_intern("to_s");
902
+ id_initialize = rb_intern("initialize");
631
903
  }
904
+