ffi 1.0.0 → 1.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (694) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +4 -0
  3. data/CHANGELOG.md +465 -0
  4. data/COPYING +49 -0
  5. data/Gemfile +21 -0
  6. data/LICENSE +21 -11
  7. data/LICENSE.SPECS +22 -0
  8. data/README.md +137 -0
  9. data/Rakefile +165 -148
  10. data/ext/ffi_c/AbstractMemory.c +716 -97
  11. data/ext/ffi_c/AbstractMemory.h +38 -17
  12. data/ext/ffi_c/ArrayType.c +102 -33
  13. data/ext/ffi_c/ArrayType.h +20 -18
  14. data/ext/ffi_c/Buffer.c +229 -54
  15. data/ext/ffi_c/Call.c +211 -100
  16. data/ext/ffi_c/Call.h +46 -28
  17. data/ext/ffi_c/ClosurePool.c +110 -81
  18. data/ext/ffi_c/ClosurePool.h +31 -1
  19. data/ext/ffi_c/DynamicLibrary.c +216 -54
  20. data/ext/ffi_c/DynamicLibrary.h +76 -0
  21. data/ext/ffi_c/Function.c +527 -164
  22. data/ext/ffi_c/Function.h +24 -20
  23. data/ext/ffi_c/FunctionInfo.c +151 -50
  24. data/ext/ffi_c/LastError.c +112 -28
  25. data/ext/ffi_c/LastError.h +29 -0
  26. data/ext/ffi_c/LongDouble.c +65 -0
  27. data/ext/ffi_c/LongDouble.h +47 -0
  28. data/ext/ffi_c/MappedType.c +107 -42
  29. data/ext/ffi_c/MappedType.h +20 -20
  30. data/ext/ffi_c/MemoryPointer.c +108 -46
  31. data/ext/ffi_c/MemoryPointer.h +33 -4
  32. data/ext/ffi_c/MethodHandle.c +71 -67
  33. data/ext/ffi_c/MethodHandle.h +26 -23
  34. data/ext/ffi_c/Platform.c +42 -25
  35. data/ext/ffi_c/Platform.h +32 -3
  36. data/ext/ffi_c/Pointer.c +324 -51
  37. data/ext/ffi_c/Pointer.h +29 -18
  38. data/ext/ffi_c/Struct.c +434 -161
  39. data/ext/ffi_c/Struct.h +47 -27
  40. data/ext/ffi_c/StructByValue.c +74 -37
  41. data/ext/ffi_c/StructByValue.h +20 -18
  42. data/ext/ffi_c/StructLayout.c +358 -87
  43. data/ext/ffi_c/Thread.c +129 -0
  44. data/ext/ffi_c/Thread.h +76 -0
  45. data/ext/ffi_c/Type.c +241 -76
  46. data/ext/ffi_c/Type.h +27 -11
  47. data/ext/ffi_c/Types.c +54 -34
  48. data/ext/ffi_c/Types.h +24 -24
  49. data/ext/ffi_c/Variadic.c +151 -55
  50. data/ext/ffi_c/compat.h +48 -38
  51. data/ext/ffi_c/extconf.rb +106 -34
  52. data/ext/ffi_c/ffi.c +35 -26
  53. data/ext/ffi_c/libffi/.allow-ai-service +0 -0
  54. data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
  55. data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
  56. data/ext/ffi_c/libffi/.appveyor.yml +84 -0
  57. data/ext/ffi_c/libffi/.ci/ar-lib +270 -0
  58. data/ext/ffi_c/libffi/.ci/bfin-sim.exp +58 -0
  59. data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
  60. data/ext/ffi_c/libffi/.ci/build-in-container.sh +10 -0
  61. data/ext/ffi_c/libffi/.ci/build.sh +124 -0
  62. data/ext/ffi_c/libffi/.ci/compile +351 -0
  63. data/ext/ffi_c/libffi/.ci/install.sh +78 -0
  64. data/ext/ffi_c/libffi/.ci/m32r-sim.exp +58 -0
  65. data/ext/ffi_c/libffi/.ci/moxie-sim.exp +60 -0
  66. data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
  67. data/ext/ffi_c/libffi/.ci/or1k-sim.exp +58 -0
  68. data/ext/ffi_c/libffi/.ci/powerpc-eabisim.exp +58 -0
  69. data/ext/ffi_c/libffi/.ci/site.exp +29 -0
  70. data/ext/ffi_c/libffi/.ci/wine-sim.exp +55 -0
  71. data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
  72. data/ext/ffi_c/libffi/.gitattributes +4 -0
  73. data/ext/ffi_c/libffi/.github/issue_template.md +10 -0
  74. data/ext/ffi_c/libffi/.github/workflows/build.yml +479 -0
  75. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +172 -0
  76. data/ext/ffi_c/libffi/.gitignore +46 -0
  77. data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.old} +6528 -3180
  78. data/ext/ffi_c/libffi/LICENSE +3 -3
  79. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +353 -0
  80. data/ext/ffi_c/libffi/Makefile.am +132 -162
  81. data/ext/ffi_c/libffi/Makefile.in +1339 -1003
  82. data/ext/ffi_c/libffi/README.md +531 -0
  83. data/ext/ffi_c/libffi/acinclude.m4 +289 -4
  84. data/ext/ffi_c/libffi/autogen.sh +2 -0
  85. data/ext/ffi_c/libffi/compile +227 -21
  86. data/ext/ffi_c/libffi/config.guess +1034 -778
  87. data/ext/ffi_c/libffi/config.sub +1394 -1204
  88. data/ext/ffi_c/libffi/configure +14327 -8503
  89. data/ext/ffi_c/libffi/configure.ac +294 -247
  90. data/ext/ffi_c/libffi/configure.host +330 -4
  91. data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
  92. data/ext/ffi_c/libffi/doc/Makefile.in +818 -0
  93. data/ext/ffi_c/libffi/doc/libffi.texi +572 -67
  94. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  95. data/ext/ffi_c/libffi/fficonfig.h.in +53 -46
  96. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +312 -0
  97. data/ext/ffi_c/libffi/include/Makefile.am +3 -3
  98. data/ext/ffi_c/libffi/include/Makefile.in +219 -79
  99. data/ext/ffi_c/libffi/include/ffi.h.in +230 -111
  100. data/ext/ffi_c/libffi/include/ffi_cfi.h +76 -0
  101. data/ext/ffi_c/libffi/include/ffi_common.h +78 -16
  102. data/ext/ffi_c/libffi/include/tramp.h +45 -0
  103. data/ext/ffi_c/libffi/install-sh +402 -184
  104. data/ext/ffi_c/libffi/libffi.map.in +81 -0
  105. data/ext/ffi_c/libffi/libffi.pc.in +3 -2
  106. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +997 -0
  107. data/ext/ffi_c/libffi/libtool-ldflags +106 -0
  108. data/ext/ffi_c/libffi/libtool-version +2 -2
  109. data/ext/ffi_c/libffi/ltmain.sh +5752 -2722
  110. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  111. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +50 -0
  112. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +198 -0
  113. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +158 -0
  114. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +53 -0
  115. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +119 -0
  116. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +49 -0
  117. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +302 -0
  118. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +267 -0
  119. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +89 -0
  120. data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
  121. data/ext/ffi_c/libffi/m4/ax_require_defined.m4 +37 -0
  122. data/ext/ffi_c/libffi/make_sunver.pl +333 -0
  123. data/ext/ffi_c/libffi/man/Makefile.am +2 -2
  124. data/ext/ffi_c/libffi/man/Makefile.in +174 -57
  125. data/ext/ffi_c/libffi/man/ffi.3 +10 -0
  126. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
  127. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  128. data/ext/ffi_c/libffi/missing +155 -300
  129. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
  130. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
  131. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
  132. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
  133. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +511 -0
  134. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/fficonfig.h +219 -0
  135. data/ext/ffi_c/libffi/msvcc.sh +353 -0
  136. data/ext/ffi_c/libffi/src/aarch64/ffi.c +1142 -0
  137. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +97 -0
  138. data/ext/ffi_c/libffi/src/aarch64/internal.h +100 -0
  139. data/ext/ffi_c/libffi/src/aarch64/sysv.S +695 -0
  140. data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +506 -0
  141. data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
  142. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
  143. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  144. data/ext/ffi_c/libffi/src/alpha/osf.S +162 -246
  145. data/ext/ffi_c/libffi/src/arc/arcompact.S +210 -0
  146. data/ext/ffi_c/libffi/src/arc/ffi.c +443 -0
  147. data/ext/ffi_c/libffi/src/arc/ffitarget.h +67 -0
  148. data/ext/ffi_c/libffi/src/arm/ffi.c +806 -194
  149. data/ext/ffi_c/libffi/src/arm/ffitarget.h +43 -3
  150. data/ext/ffi_c/libffi/src/arm/internal.h +17 -0
  151. data/ext/ffi_c/libffi/src/arm/sysv.S +381 -231
  152. data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
  153. data/ext/ffi_c/libffi/src/avr32/ffi.c +4 -2
  154. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +8 -3
  155. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  156. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  157. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  158. data/ext/ffi_c/libffi/src/closures.c +574 -100
  159. data/ext/ffi_c/libffi/src/cris/ffi.c +11 -8
  160. data/ext/ffi_c/libffi/src/cris/ffitarget.h +8 -3
  161. data/ext/ffi_c/libffi/src/csky/ffi.c +395 -0
  162. data/ext/ffi_c/libffi/src/csky/ffitarget.h +63 -0
  163. data/ext/ffi_c/libffi/src/csky/sysv.S +371 -0
  164. data/ext/ffi_c/libffi/src/debug.c +8 -3
  165. data/ext/ffi_c/libffi/src/dlmalloc.c +89 -17
  166. data/ext/ffi_c/libffi/src/frv/ffi.c +2 -2
  167. data/ext/ffi_c/libffi/src/frv/ffitarget.h +8 -7
  168. data/ext/ffi_c/libffi/src/ia64/ffi.c +48 -12
  169. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +10 -4
  170. data/ext/ffi_c/libffi/src/ia64/unix.S +28 -3
  171. data/ext/ffi_c/libffi/src/java_raw_api.c +24 -6
  172. data/ext/ffi_c/libffi/src/kvx/asm.h +5 -0
  173. data/ext/ffi_c/libffi/src/kvx/ffi.c +273 -0
  174. data/ext/ffi_c/libffi/src/kvx/ffitarget.h +75 -0
  175. data/ext/ffi_c/libffi/src/kvx/sysv.S +127 -0
  176. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +624 -0
  177. data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
  178. data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
  179. data/ext/ffi_c/libffi/src/m32r/ffi.c +32 -15
  180. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +8 -3
  181. data/ext/ffi_c/libffi/src/m68k/ffi.c +97 -13
  182. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +8 -3
  183. data/ext/ffi_c/libffi/src/m68k/sysv.S +148 -25
  184. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  185. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  186. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  187. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  188. data/ext/ffi_c/libffi/src/metag/ffitarget.h +53 -0
  189. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  190. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  191. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  192. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  193. data/ext/ffi_c/libffi/src/mips/ffi.c +392 -104
  194. data/ext/ffi_c/libffi/src/mips/ffitarget.h +40 -24
  195. data/ext/ffi_c/libffi/src/mips/n32.S +325 -93
  196. data/ext/ffi_c/libffi/src/mips/o32.S +211 -31
  197. data/ext/ffi_c/libffi/src/moxie/eabi.S +101 -0
  198. data/ext/ffi_c/libffi/src/moxie/ffi.c +310 -0
  199. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  200. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  201. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  202. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  203. data/ext/ffi_c/libffi/src/or1k/ffi.c +341 -0
  204. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  205. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  206. data/ext/ffi_c/libffi/src/pa/ffi.c +68 -111
  207. data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
  208. data/ext/ffi_c/libffi/src/pa/ffitarget.h +34 -17
  209. data/ext/ffi_c/libffi/src/pa/hpux32.S +87 -38
  210. data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
  211. data/ext/ffi_c/libffi/src/pa/linux.S +109 -39
  212. data/ext/ffi_c/libffi/src/powerpc/aix.S +250 -8
  213. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +255 -4
  214. data/ext/ffi_c/libffi/src/powerpc/asm.h +3 -3
  215. data/ext/ffi_c/libffi/src/powerpc/darwin.S +211 -78
  216. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +356 -102
  217. data/ext/ffi_c/libffi/src/powerpc/ffi.c +108 -1375
  218. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +746 -210
  219. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1153 -0
  220. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +105 -0
  221. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  222. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +126 -48
  223. data/ext/ffi_c/libffi/src/powerpc/linux64.S +191 -85
  224. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +438 -108
  225. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  226. data/ext/ffi_c/libffi/src/powerpc/sysv.S +73 -119
  227. data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
  228. data/ext/ffi_c/libffi/src/prep_cif.c +141 -32
  229. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  230. data/ext/ffi_c/libffi/src/riscv/ffi.c +514 -0
  231. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +69 -0
  232. data/ext/ffi_c/libffi/src/riscv/sysv.S +293 -0
  233. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  234. data/ext/ffi_c/libffi/src/s390/ffitarget.h +13 -3
  235. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  236. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  237. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  238. data/ext/ffi_c/libffi/src/sh/ffitarget.h +8 -3
  239. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  240. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +8 -3
  241. data/ext/ffi_c/libffi/src/sparc/ffi.c +334 -491
  242. data/ext/ffi_c/libffi/src/sparc/ffi64.c +630 -0
  243. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -5
  244. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  245. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  246. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  247. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  248. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  249. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  250. data/ext/ffi_c/libffi/src/tramp.c +716 -0
  251. data/ext/ffi_c/libffi/src/types.c +48 -19
  252. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  253. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  254. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  255. data/ext/ffi_c/libffi/src/wasm32/ffi.c +947 -0
  256. data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
  257. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  258. data/ext/ffi_c/libffi/src/x86/ffi.c +690 -540
  259. data/ext/ffi_c/libffi/src/x86/ffi64.c +450 -126
  260. data/ext/ffi_c/libffi/src/x86/ffitarget.h +86 -42
  261. data/ext/ffi_c/libffi/src/x86/ffiw64.c +361 -0
  262. data/ext/ffi_c/libffi/src/x86/internal.h +43 -0
  263. data/ext/ffi_c/libffi/src/x86/internal64.h +36 -0
  264. data/ext/ffi_c/libffi/src/x86/sysv.S +1199 -381
  265. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +998 -0
  266. data/ext/ffi_c/libffi/src/x86/unix64.S +587 -298
  267. data/ext/ffi_c/libffi/src/x86/win64.S +251 -457
  268. data/ext/ffi_c/libffi/src/x86/win64_intel.S +238 -0
  269. data/ext/ffi_c/libffi/src/xtensa/ffi.c +306 -0
  270. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +57 -0
  271. data/ext/ffi_c/libffi/src/xtensa/sysv.S +268 -0
  272. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  273. data/ext/ffi_c/libffi/testsuite/Makefile.am +80 -73
  274. data/ext/ffi_c/libffi/testsuite/Makefile.in +251 -117
  275. data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
  276. data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
  277. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +86 -0
  278. data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
  279. data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
  280. data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
  281. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +682 -0
  282. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +22 -2
  283. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +28 -0
  284. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +78 -0
  285. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +50 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +63 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1746 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2885 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +747 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +46 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
  293. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +28 -10
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +4 -3
  299. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +88 -42
  300. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  301. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +15 -12
  302. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  303. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +110 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  305. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  309. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  313. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +6 -0
  314. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  315. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  317. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +9 -10
  320. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  324. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +57 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  326. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  327. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  328. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  329. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  330. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  331. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  332. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  333. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +78 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
  345. data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
  346. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +134 -0
  347. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +134 -0
  348. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +140 -0
  349. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
  350. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +3 -2
  351. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +2 -0
  352. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +2 -0
  353. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +21 -1
  354. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +2 -0
  355. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +2 -0
  356. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +2 -0
  357. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +7 -6
  358. data/ext/ffi_c/libffi/testsuite/{libffi.call/closure_stdcall.c → libffi.closures/closure_simple.c} +13 -16
  359. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +22 -4
  360. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +26 -4
  361. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +28 -4
  362. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +33 -4
  363. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +8 -4
  364. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +23 -5
  365. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +25 -5
  366. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +40 -8
  367. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +17 -4
  368. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +23 -4
  369. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +17 -4
  370. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +17 -4
  371. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +113 -0
  372. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +26 -4
  373. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +17 -4
  374. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +33 -5
  375. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +23 -5
  376. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +29 -5
  377. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +32 -5
  378. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +28 -6
  379. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +43 -5
  380. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +29 -5
  381. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +18 -4
  382. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +18 -5
  383. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +18 -6
  384. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +23 -5
  385. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +23 -5
  386. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +24 -5
  387. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +44 -31
  388. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +44 -9
  389. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +23 -5
  390. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +22 -5
  391. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +22 -7
  392. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +23 -5
  393. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +22 -5
  394. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +23 -5
  395. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +24 -5
  396. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +7 -5
  397. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +21 -9
  398. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +4 -0
  399. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +13 -3
  400. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +34 -11
  401. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c +70 -0
  402. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c +55 -0
  403. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +5 -1
  404. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +6 -1
  405. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +9 -1
  406. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +9 -1
  407. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +6 -2
  408. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +9 -1
  409. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +7 -2
  410. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +22 -10
  411. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +3 -0
  412. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +2 -0
  413. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +3 -0
  414. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +125 -0
  415. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +3 -0
  416. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +4 -0
  417. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +49 -0
  418. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +49 -0
  419. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +8 -5
  420. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +3 -0
  421. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +2 -3
  422. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -0
  423. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +57 -56
  424. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +38 -15
  425. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +9 -9
  426. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +19 -6
  427. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +137 -0
  428. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
  429. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
  430. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct2.c +15 -6
  431. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +15 -6
  432. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +14 -5
  433. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +14 -5
  434. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +17 -6
  435. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +14 -5
  436. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +17 -6
  437. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +17 -6
  438. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
  439. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
  440. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
  441. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large.c +7 -7
  442. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +7 -7
  443. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +6 -6
  444. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +7 -6
  445. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +8 -3
  446. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest.cc +4 -10
  447. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest_ffi_call.cc +4 -2
  448. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  449. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  450. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  451. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  452. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  453. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  454. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  455. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  456. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  457. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  458. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  459. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  460. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  461. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  462. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  463. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  464. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -10
  465. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  466. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  467. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  468. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  469. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  470. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  471. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  472. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  473. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  474. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  475. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  476. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  477. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  478. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  479. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  480. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  481. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  482. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  483. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  484. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  485. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  486. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  487. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  488. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  489. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  490. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  491. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  492. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  493. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  494. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  495. data/ext/ffi_c/libffi.bsd.mk +14 -8
  496. data/ext/ffi_c/libffi.darwin.mk +56 -26
  497. data/ext/ffi_c/libffi.gnu.mk +9 -6
  498. data/ext/ffi_c/libffi.mk +13 -8
  499. data/ext/ffi_c/libffi.vc.mk +26 -0
  500. data/ext/ffi_c/libffi.vc64.mk +26 -0
  501. data/ext/ffi_c/rbffi.h +34 -6
  502. data/ext/ffi_c/{endian.h → rbffi_endian.h} +21 -2
  503. data/ffi.gemspec +42 -0
  504. data/lib/ffi/abstract_memory.rb +44 -0
  505. data/lib/ffi/autopointer.rb +111 -52
  506. data/lib/ffi/compat.rb +43 -0
  507. data/lib/ffi/data_converter.rb +67 -0
  508. data/lib/ffi/dynamic_library.rb +118 -0
  509. data/lib/ffi/enum.rb +203 -22
  510. data/lib/ffi/errno.rb +27 -12
  511. data/lib/ffi/ffi.rb +88 -11
  512. data/lib/ffi/function.rb +71 -0
  513. data/lib/ffi/io.rb +35 -14
  514. data/lib/ffi/library.rb +382 -96
  515. data/lib/ffi/library_path.rb +109 -0
  516. data/lib/ffi/managedstruct.rb +64 -35
  517. data/lib/ffi/memorypointer.rb +1 -33
  518. data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
  519. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  520. data/lib/ffi/platform/aarch64-freebsd12/types.conf +181 -0
  521. data/lib/ffi/platform/aarch64-linux/types.conf +175 -0
  522. data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
  523. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  524. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  525. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  526. data/lib/ffi/platform/arm-linux/types.conf +132 -0
  527. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  528. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  529. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  530. data/lib/ffi/platform/i386-darwin/types.conf +100 -0
  531. data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
  532. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  533. data/lib/ffi/platform/i386-gnu/types.conf +107 -0
  534. data/lib/ffi/platform/i386-linux/types.conf +103 -0
  535. data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
  536. data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
  537. data/lib/ffi/platform/i386-solaris/types.conf +122 -0
  538. data/lib/ffi/platform/i386-windows/types.conf +52 -0
  539. data/lib/ffi/platform/ia64-linux/types.conf +104 -0
  540. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  541. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  542. data/lib/ffi/platform/mips64-linux/types.conf +104 -0
  543. data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
  544. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  545. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
  546. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
  547. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
  548. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -0
  549. data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
  550. data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
  551. data/lib/ffi/platform/powerpc-linux/types.conf +130 -0
  552. data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
  553. data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
  554. data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
  555. data/lib/ffi/platform/riscv64-linux/types.conf +104 -0
  556. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  557. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  558. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  559. data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
  560. data/lib/ffi/platform/sparcv9-linux/types.conf +102 -0
  561. data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
  562. data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
  563. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  564. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  565. data/lib/ffi/platform/x86_64-darwin/types.conf +130 -0
  566. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
  567. data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
  568. data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
  569. data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
  570. data/lib/ffi/platform/x86_64-linux/types.conf +132 -0
  571. data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
  572. data/lib/ffi/platform/x86_64-netbsd/types.conf +128 -0
  573. data/lib/ffi/platform/x86_64-openbsd/types.conf +134 -0
  574. data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
  575. data/lib/ffi/platform/x86_64-windows/types.conf +52 -0
  576. data/lib/ffi/platform.rb +110 -34
  577. data/lib/ffi/pointer.rb +117 -90
  578. data/lib/ffi/struct.rb +101 -70
  579. data/lib/ffi/struct_by_reference.rb +72 -0
  580. data/lib/ffi/struct_layout.rb +96 -0
  581. data/lib/ffi/struct_layout_builder.rb +90 -21
  582. data/lib/ffi/tools/const_generator.rb +86 -31
  583. data/lib/ffi/tools/generator.rb +49 -2
  584. data/lib/ffi/tools/generator_task.rb +13 -16
  585. data/lib/ffi/tools/struct_generator.rb +6 -5
  586. data/lib/ffi/tools/types_generator.rb +25 -11
  587. data/lib/ffi/types.rb +105 -36
  588. data/lib/ffi/union.rb +23 -12
  589. data/lib/ffi/variadic.rb +44 -29
  590. data/lib/ffi/version.rb +3 -0
  591. data/lib/ffi.rb +25 -9
  592. data/rakelib/ffi_gem_helper.rb +65 -0
  593. data/samples/getlogin.rb +8 -0
  594. data/samples/getpid.rb +8 -0
  595. data/samples/gettimeofday.rb +18 -0
  596. data/samples/hello.rb +8 -0
  597. data/samples/hello_ractor.rb +11 -0
  598. data/samples/inotify.rb +60 -0
  599. data/samples/pty.rb +75 -0
  600. data/samples/qsort.rb +20 -0
  601. data/samples/qsort_ractor.rb +28 -0
  602. data/sig/ffi/abstract_memory.rbs +165 -0
  603. data/sig/ffi/auto_pointer.rbs +26 -0
  604. data/sig/ffi/buffer.rbs +18 -0
  605. data/sig/ffi/data_converter.rbs +10 -0
  606. data/sig/ffi/dynamic_library.rbs +9 -0
  607. data/sig/ffi/enum.rbs +38 -0
  608. data/sig/ffi/function.rbs +39 -0
  609. data/sig/ffi/library.rbs +42 -0
  610. data/sig/ffi/native_type.rbs +86 -0
  611. data/sig/ffi/pointer.rbs +42 -0
  612. data/sig/ffi/struct.rbs +76 -0
  613. data/sig/ffi/struct_by_reference.rbs +11 -0
  614. data/sig/ffi/struct_by_value.rbs +7 -0
  615. data/sig/ffi/struct_layout.rbs +9 -0
  616. data/sig/ffi/struct_layout_builder.rbs +5 -0
  617. data/sig/ffi/type.rbs +39 -0
  618. data/sig/ffi.rbs +26 -0
  619. data.tar.gz.sig +0 -0
  620. metadata +547 -248
  621. metadata.gz.sig +0 -0
  622. data/History.txt +0 -109
  623. data/README.rdoc +0 -70
  624. data/ext/ffi_c/DataConverter.c +0 -62
  625. data/ext/ffi_c/StructByReference.c +0 -150
  626. data/ext/ffi_c/StructByReference.h +0 -50
  627. data/ext/ffi_c/libffi/ChangeLog.libffi +0 -658
  628. data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
  629. data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
  630. data/ext/ffi_c/libffi/README +0 -306
  631. data/ext/ffi_c/libffi/aclocal.m4 +0 -8998
  632. data/ext/ffi_c/libffi/depcomp +0 -584
  633. data/ext/ffi_c/libffi/doc/libffi.info +0 -533
  634. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  635. data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7360
  636. data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -368
  637. data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
  638. data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
  639. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -92
  640. data/ext/ffi_c/libffi/mdate-sh +0 -201
  641. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  642. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  643. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  644. data/ext/ffi_c/libffi/src/x86/win32.S +0 -877
  645. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  646. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  647. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  648. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
  649. data/ext/ffi_c/libffi/texinfo.tex +0 -7210
  650. data/gen/Rakefile +0 -14
  651. data/spec/ffi/async_callback_spec.rb +0 -23
  652. data/spec/ffi/bool_spec.rb +0 -24
  653. data/spec/ffi/buffer_spec.rb +0 -202
  654. data/spec/ffi/callback_spec.rb +0 -653
  655. data/spec/ffi/custom_param_type.rb +0 -31
  656. data/spec/ffi/custom_type_spec.rb +0 -73
  657. data/spec/ffi/enum_spec.rb +0 -183
  658. data/spec/ffi/errno_spec.rb +0 -13
  659. data/spec/ffi/ffi_spec.rb +0 -24
  660. data/spec/ffi/function_spec.rb +0 -73
  661. data/spec/ffi/library_spec.rb +0 -174
  662. data/spec/ffi/managed_struct_spec.rb +0 -56
  663. data/spec/ffi/number_spec.rb +0 -231
  664. data/spec/ffi/pointer_spec.rb +0 -210
  665. data/spec/ffi/rbx/attach_function_spec.rb +0 -28
  666. data/spec/ffi/rbx/memory_pointer_spec.rb +0 -109
  667. data/spec/ffi/rbx/spec_helper.rb +0 -1
  668. data/spec/ffi/rbx/struct_spec.rb +0 -13
  669. data/spec/ffi/spec_helper.rb +0 -21
  670. data/spec/ffi/string_spec.rb +0 -103
  671. data/spec/ffi/strptr_spec.rb +0 -36
  672. data/spec/ffi/struct_callback_spec.rb +0 -64
  673. data/spec/ffi/struct_initialize_spec.rb +0 -30
  674. data/spec/ffi/struct_packed_spec.rb +0 -46
  675. data/spec/ffi/struct_spec.rb +0 -638
  676. data/spec/ffi/typedef_spec.rb +0 -62
  677. data/spec/ffi/union_spec.rb +0 -60
  678. data/spec/ffi/variadic_spec.rb +0 -84
  679. data/spec/spec.opts +0 -4
  680. data/tasks/ann.rake +0 -80
  681. data/tasks/extension.rake +0 -25
  682. data/tasks/gem.rake +0 -200
  683. data/tasks/git.rake +0 -41
  684. data/tasks/notes.rake +0 -27
  685. data/tasks/post_load.rake +0 -34
  686. data/tasks/rdoc.rake +0 -50
  687. data/tasks/rubyforge.rake +0 -55
  688. data/tasks/setup.rb +0 -301
  689. data/tasks/spec.rake +0 -54
  690. data/tasks/svn.rake +0 -47
  691. data/tasks/test.rake +0 -40
  692. /data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
  693. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
  694. /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
@@ -1,51 +1,84 @@
1
1
  /*
2
2
  * Copyright (c) 2008, 2009, Wayne Meissner
3
+ * Copyright (C) 2009 Jake Douglas <jake@shiftedlabs.com>
4
+ * Copyright (C) 2008 Luc Heinrich <luc@honk-honk.com>
3
5
  *
6
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
4
7
  * All rights reserved.
5
8
  *
6
- * This file is part of ruby-ffi.
9
+ * Redistribution and use in source and binary forms, with or without
10
+ * modification, are permitted provided that the following conditions are met:
11
+ * * Redistributions of source code must retain the above copyright
12
+ * notice, this list of conditions and the following disclaimer.
13
+ * * Redistributions in binary form must reproduce the above copyright
14
+ * notice, this list of conditions and the following disclaimer in the
15
+ * documentation and/or other materials provided with the distribution.
16
+ * * Neither the name of the Ruby FFI project nor the
17
+ * names of its contributors may be used to endorse or promote products
18
+ * derived from this software without specific prior written permission.
7
19
  *
8
- * This code is free software: you can redistribute it and/or modify it under
9
- * the terms of the GNU Lesser General Public License version 3 only, as
10
- * published by the Free Software Foundation.
11
- *
12
- * This code is distributed in the hope that it will be useful, but WITHOUT
13
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
15
- * version 3 for more details.
16
- *
17
- * You should have received a copy of the GNU Lesser General Public License
18
- * version 3 along with this work. If not, see <http://www.gnu.org/licenses/>.
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
24
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
19
30
  */
20
31
 
21
32
  #include <sys/types.h>
22
- #include <sys/param.h>
33
+ #ifndef _MSC_VER
34
+ # include <sys/param.h>
35
+ #endif
23
36
  #include <stdint.h>
24
37
  #include <stdbool.h>
38
+
25
39
  #include <limits.h>
26
40
  #include <ruby.h>
41
+
27
42
  #include "rbffi.h"
28
43
  #include "compat.h"
29
44
  #include "AbstractMemory.h"
30
45
  #include "Pointer.h"
31
46
  #include "Function.h"
47
+ #include "LongDouble.h"
32
48
 
49
+ #ifdef PRIsVALUE
50
+ # define RB_OBJ_CLASSNAME(obj) rb_obj_class(obj)
51
+ # define RB_OBJ_STRING(obj) (obj)
52
+ #else
53
+ # define PRIsVALUE "s"
54
+ # define RB_OBJ_CLASSNAME(obj) rb_obj_classname(obj)
55
+ # define RB_OBJ_STRING(obj) StringValueCStr(obj)
56
+ #endif
33
57
 
58
+ static size_t memsize(const void *data);
34
59
  static inline char* memory_address(VALUE self);
35
60
  VALUE rbffi_AbstractMemoryClass = Qnil;
36
61
  static VALUE NullPointerErrorClass = Qnil;
37
62
  static ID id_to_ptr = 0, id_plus = 0, id_call = 0;
38
63
 
39
- static VALUE
40
- memory_allocate(VALUE klass)
41
- {
42
- AbstractMemory* memory;
43
- VALUE obj;
44
- obj = Data_Make_Struct(klass, AbstractMemory, NULL, -1, memory);
45
- memory->flags = MEM_RD | MEM_WR;
64
+ const rb_data_type_t rbffi_abstract_memory_data_type = { /* extern */
65
+ .wrap_struct_name = "FFI::AbstractMemory",
66
+ .function = {
67
+ .dmark = NULL,
68
+ .dfree = RUBY_TYPED_DEFAULT_FREE,
69
+ .dsize = memsize,
70
+ },
71
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
72
+ // macro to update VALUE references, as to trigger write barriers.
73
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
74
+ };
46
75
 
47
- return obj;
76
+ static size_t
77
+ memsize(const void *data)
78
+ {
79
+ return sizeof(AbstractMemory);
48
80
  }
81
+
49
82
  #define VAL(x, swap) (unlikely(((memory->flags & MEM_SWAP) != 0)) ? swap((x)) : (x))
50
83
 
51
84
  #define NUM_OP(name, type, toNative, fromNative, swap) \
@@ -63,10 +96,19 @@ static VALUE \
63
96
  memory_put_##name(VALUE self, VALUE offset, VALUE value) \
64
97
  { \
65
98
  AbstractMemory* memory; \
66
- Data_Get_Struct(self, AbstractMemory, memory); \
99
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
67
100
  memory_op_put_##name(memory, NUM2LONG(offset), value); \
68
101
  return self; \
69
102
  } \
103
+ static VALUE memory_write_##name(VALUE self, VALUE value); \
104
+ static VALUE \
105
+ memory_write_##name(VALUE self, VALUE value) \
106
+ { \
107
+ AbstractMemory* memory; \
108
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
109
+ memory_op_put_##name(memory, 0, value); \
110
+ return self; \
111
+ } \
70
112
  static VALUE memory_op_get_##name(AbstractMemory* memory, long off); \
71
113
  static VALUE \
72
114
  memory_op_get_##name(AbstractMemory* memory, long off) \
@@ -82,27 +124,43 @@ static VALUE \
82
124
  memory_get_##name(VALUE self, VALUE offset) \
83
125
  { \
84
126
  AbstractMemory* memory; \
85
- Data_Get_Struct(self, AbstractMemory, memory); \
127
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
86
128
  return memory_op_get_##name(memory, NUM2LONG(offset)); \
87
129
  } \
130
+ static VALUE memory_read_##name(VALUE self); \
131
+ static VALUE \
132
+ memory_read_##name(VALUE self) \
133
+ { \
134
+ AbstractMemory* memory; \
135
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
136
+ return memory_op_get_##name(memory, 0); \
137
+ } \
88
138
  static MemoryOp memory_op_##name = { memory_op_get_##name, memory_op_put_##name }; \
89
139
  \
90
140
  static VALUE memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary); \
91
141
  static VALUE \
92
142
  memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary) \
93
143
  { \
94
- long count = RARRAY_LEN(ary); \
144
+ long count; \
95
145
  long off = NUM2LONG(offset); \
96
146
  AbstractMemory* memory = MEMORY(self); \
97
147
  long i; \
98
- checkWrite(memory); \
148
+ Check_Type(ary, T_ARRAY); \
149
+ count = RARRAY_LEN(ary); \
150
+ if (likely(count > 0)) checkWrite(memory); \
99
151
  checkBounds(memory, off, count * sizeof(type)); \
100
152
  for (i = 0; i < count; i++) { \
101
- type tmp = (type) VAL(toNative(RARRAY_PTR(ary)[i]), swap); \
153
+ type tmp = (type) VAL(toNative(RARRAY_AREF(ary, i)), swap); \
102
154
  memcpy(memory->address + off + (i * sizeof(type)), &tmp, sizeof(tmp)); \
103
155
  } \
104
156
  return self; \
105
157
  } \
158
+ static VALUE memory_write_array_of_##name(VALUE self, VALUE ary); \
159
+ static VALUE \
160
+ memory_write_array_of_##name(VALUE self, VALUE ary) \
161
+ { \
162
+ return memory_put_array_of_##name(self, INT2FIX(0), ary); \
163
+ } \
106
164
  static VALUE memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length); \
107
165
  static VALUE \
108
166
  memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length) \
@@ -110,16 +168,22 @@ memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length) \
110
168
  long count = NUM2LONG(length); \
111
169
  long off = NUM2LONG(offset); \
112
170
  AbstractMemory* memory = MEMORY(self); \
171
+ VALUE retVal = rb_ary_new2(count); \
113
172
  long i; \
114
- checkRead(memory); \
173
+ if (likely(count > 0)) checkRead(memory); \
115
174
  checkBounds(memory, off, count * sizeof(type)); \
116
- VALUE retVal = rb_ary_new2(count); \
117
175
  for (i = 0; i < count; ++i) { \
118
176
  type tmp; \
119
177
  memcpy(&tmp, memory->address + off + (i * sizeof(type)), sizeof(tmp)); \
120
178
  rb_ary_push(retVal, fromNative(VAL(tmp, swap))); \
121
179
  } \
122
180
  return retVal; \
181
+ } \
182
+ static VALUE memory_read_array_of_##name(VALUE self, VALUE length); \
183
+ static VALUE \
184
+ memory_read_array_of_##name(VALUE self, VALUE length) \
185
+ { \
186
+ return memory_get_array_of_##name(self, INT2FIX(0), length); \
123
187
  }
124
188
 
125
189
  #define NOSWAP(x) (x)
@@ -136,28 +200,75 @@ SWAPU16(uint16_t x)
136
200
  return bswap16(x);
137
201
  }
138
202
 
139
- #define SWAP16(x) (x)
140
- #define SWAP32(x) __builtin_bswap32(x)
141
- #define SWAP64(x) __builtin_bswap64(x)
203
+ #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
204
+ #define bswap32(x) \
205
+ (((x << 24) & 0xff000000) | \
206
+ ((x << 8) & 0x00ff0000) | \
207
+ ((x >> 8) & 0x0000ff00) | \
208
+ ((x >> 24) & 0x000000ff))
209
+
210
+ #define bswap64(x) \
211
+ (((x << 56) & 0xff00000000000000ULL) | \
212
+ ((x << 40) & 0x00ff000000000000ULL) | \
213
+ ((x << 24) & 0x0000ff0000000000ULL) | \
214
+ ((x << 8) & 0x000000ff00000000ULL) | \
215
+ ((x >> 8) & 0x00000000ff000000ULL) | \
216
+ ((x >> 24) & 0x0000000000ff0000ULL) | \
217
+ ((x >> 40) & 0x000000000000ff00ULL) | \
218
+ ((x >> 56) & 0x00000000000000ffULL))
219
+
220
+ static inline int32_t
221
+ SWAPS32(int32_t x)
222
+ {
223
+ return bswap32(x);
224
+ }
225
+
226
+ static inline uint32_t
227
+ SWAPU32(uint32_t x)
228
+ {
229
+ return bswap32(x);
230
+ }
231
+
232
+ static inline int64_t
233
+ SWAPS64(int64_t x)
234
+ {
235
+ return bswap64(x);
236
+ }
237
+
238
+ static inline uint64_t
239
+ SWAPU64(uint64_t x)
240
+ {
241
+ return bswap64(x);
242
+ }
243
+
244
+ #else
245
+ # define SWAPS32(x) ((int32_t) __builtin_bswap32(x))
246
+ # define SWAPU32(x) ((uint32_t) __builtin_bswap32(x))
247
+ # define SWAPS64(x) ((int64_t) __builtin_bswap64(x))
248
+ # define SWAPU64(x) ((uint64_t) __builtin_bswap64(x))
249
+ #endif
142
250
 
143
251
  #if LONG_MAX > INT_MAX
144
- # define SWAPLONG SWAP64
252
+ # define SWAPSLONG SWAPS64
253
+ # define SWAPULONG SWAPU64
145
254
  #else
146
- # define SWAPLONG SWAP32
255
+ # define SWAPSLONG SWAPS32
256
+ # define SWAPULONG SWAPU32
147
257
  #endif
148
258
 
149
259
  NUM_OP(int8, int8_t, NUM2INT, INT2NUM, NOSWAP);
150
260
  NUM_OP(uint8, uint8_t, NUM2UINT, UINT2NUM, NOSWAP);
151
- NUM_OP(int16, int16_t, NUM2INT, INT2NUM, SWAP16);
152
- NUM_OP(uint16, uint16_t, NUM2UINT, UINT2NUM, SWAP16);
153
- NUM_OP(int32, int32_t, NUM2INT, INT2NUM, SWAP32);
154
- NUM_OP(uint32, uint32_t, NUM2UINT, UINT2NUM, SWAP32);
155
- NUM_OP(int64, int64_t, NUM2LL, LL2NUM, SWAP64);
156
- NUM_OP(uint64, uint64_t, NUM2ULL, ULL2NUM, SWAP64);
157
- NUM_OP(long, long, NUM2LONG, LONG2NUM, SWAPLONG);
158
- NUM_OP(ulong, unsigned long, NUM2ULONG, ULONG2NUM, SWAPLONG);
261
+ NUM_OP(int16, int16_t, NUM2INT, INT2NUM, SWAPS16);
262
+ NUM_OP(uint16, uint16_t, NUM2UINT, UINT2NUM, SWAPU16);
263
+ NUM_OP(int32, int32_t, NUM2INT, INT2NUM, SWAPS32);
264
+ NUM_OP(uint32, uint32_t, NUM2UINT, UINT2NUM, SWAPU32);
265
+ NUM_OP(int64, int64_t, NUM2LL, LL2NUM, SWAPS64);
266
+ NUM_OP(uint64, uint64_t, NUM2ULL, ULL2NUM, SWAPU64);
267
+ NUM_OP(long, long, NUM2LONG, LONG2NUM, SWAPSLONG);
268
+ NUM_OP(ulong, unsigned long, NUM2ULONG, ULONG2NUM, SWAPULONG);
159
269
  NUM_OP(float32, float, NUM2DBL, rb_float_new, NOSWAP);
160
270
  NUM_OP(float64, double, NUM2DBL, rb_float_new, NOSWAP);
271
+ NUM_OP(longdouble, long double, rbffi_num2longdouble, rbffi_longdouble_new, NOSWAP);
161
272
 
162
273
  static inline void*
163
274
  get_pointer_value(VALUE value)
@@ -168,7 +279,7 @@ get_pointer_value(VALUE value)
168
279
  } else if (type == T_NIL) {
169
280
  return NULL;
170
281
  } else if (type == T_FIXNUM) {
171
- return (void *) (uintptr_t) FIX2INT(value);
282
+ return (void *) (uintptr_t) FIX2ULONG(value);
172
283
  } else if (type == T_BIGNUM) {
173
284
  return (void *) (uintptr_t) NUM2ULL(value);
174
285
  } else if (rb_respond_to(value, id_to_ptr)) {
@@ -181,24 +292,127 @@ get_pointer_value(VALUE value)
181
292
 
182
293
  NUM_OP(pointer, void *, get_pointer_value, rbffi_Pointer_NewInstance, NOSWAP);
183
294
 
295
+ static inline uint8_t
296
+ rbffi_bool_value(VALUE value)
297
+ {
298
+ return RTEST(value);
299
+ }
300
+
301
+ static inline VALUE
302
+ rbffi_bool_new(uint8_t value)
303
+ {
304
+ return (value & 1) != 0 ? Qtrue : Qfalse;
305
+ }
306
+
307
+ NUM_OP(bool, unsigned char, rbffi_bool_value, rbffi_bool_new, NOSWAP);
308
+
309
+
310
+ /*
311
+ * call-seq: memory.clear
312
+ * Set the memory to all-zero.
313
+ * @return [self]
314
+ */
184
315
  static VALUE
185
316
  memory_clear(VALUE self)
186
317
  {
187
318
  AbstractMemory* ptr = MEMORY(self);
319
+ checkWrite(ptr);
188
320
  memset(ptr->address, 0, ptr->size);
189
321
  return self;
190
322
  }
191
323
 
324
+ /*
325
+ * call-seq: memory.size
326
+ * Return memory size in bytes (alias: #total)
327
+ * @return [Integer]
328
+ */
192
329
  static VALUE
193
- memory_size(VALUE self)
330
+ memory_size(VALUE self)
194
331
  {
195
332
  AbstractMemory* ptr;
196
333
 
197
- Data_Get_Struct(self, AbstractMemory, ptr);
334
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
198
335
 
199
336
  return LONG2NUM(ptr->size);
200
337
  }
201
338
 
339
+ /*
340
+ * call-seq: memory.get(type, offset)
341
+ * Return data of given type contained in memory.
342
+ * @param [Symbol, Type] type_name type of data to get
343
+ * @param [Integer] offset point in buffer to start from
344
+ * @return [Object]
345
+ * @raise {ArgumentError} if type is not supported
346
+ */
347
+ static VALUE
348
+ memory_get(VALUE self, VALUE type_name, VALUE offset)
349
+ {
350
+ AbstractMemory* ptr;
351
+ VALUE nType;
352
+ Type *type;
353
+ MemoryOp *op;
354
+
355
+ nType = rbffi_Type_Lookup(type_name);
356
+ if(NIL_P(nType)) goto undefined_type;
357
+
358
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
359
+ TypedData_Get_Struct(nType, Type, &rbffi_type_data_type, type);
360
+
361
+ op = get_memory_op(type);
362
+ if(op == NULL) goto undefined_type;
363
+
364
+ return op->get(ptr, NUM2LONG(offset));
365
+
366
+ undefined_type: {
367
+ VALUE msg = rb_sprintf("undefined type '%" PRIsVALUE "'", type_name);
368
+ rb_exc_raise(rb_exc_new3(rb_eArgError, msg));
369
+ return Qnil;
370
+ }
371
+ }
372
+
373
+ /*
374
+ * call-seq: memory.put(type, offset, value)
375
+ * @param [Symbol, Type] type_name type of data to put
376
+ * @param [Integer] offset point in buffer to start from
377
+ * @return [nil]
378
+ * @raise {ArgumentError} if type is not supported
379
+ */
380
+ static VALUE
381
+ memory_put(VALUE self, VALUE type_name, VALUE offset, VALUE value)
382
+ {
383
+ AbstractMemory* ptr;
384
+ VALUE nType;
385
+ Type *type;
386
+ MemoryOp *op;
387
+
388
+ nType = rbffi_Type_Lookup(type_name);
389
+ if(NIL_P(nType)) goto undefined_type;
390
+
391
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
392
+ TypedData_Get_Struct(nType, Type, &rbffi_type_data_type, type);
393
+
394
+ op = get_memory_op(type);
395
+ if(op == NULL) goto undefined_type;
396
+
397
+ op->put(ptr, NUM2LONG(offset), value);
398
+ return Qnil;
399
+
400
+ undefined_type: {
401
+ VALUE msg = rb_sprintf("unsupported type '%" PRIsVALUE "'", type_name);
402
+ rb_exc_raise(rb_exc_new3(rb_eArgError, msg));
403
+ return Qnil;
404
+ }
405
+ }
406
+
407
+ /*
408
+ * call-seq: memory.get_string(offset, length=nil)
409
+ * Return string contained in memory.
410
+ * @param [Integer] offset point in buffer to start from
411
+ * @param [Integer] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
412
+ * @return [String]
413
+ * @raise {IndexError} if +length+ is too great
414
+ * @raise {NullPointerError} if memory not initialized
415
+ */
202
416
  static VALUE
203
417
  memory_get_string(int argc, VALUE* argv, VALUE self)
204
418
  {
@@ -214,10 +428,19 @@ memory_get_string(int argc, VALUE* argv, VALUE self)
214
428
  checkBounds(ptr, off, len);
215
429
 
216
430
  end = memchr(ptr->address + off, 0, len);
217
- return rb_tainted_str_new((char *) ptr->address + off,
431
+ return rb_str_new((char *) ptr->address + off,
218
432
  (end != NULL ? end - ptr->address - off : len));
219
433
  }
220
434
 
435
+ /*
436
+ * call-seq: memory.get_array_of_string(offset, count=nil)
437
+ * Return an array of strings contained in memory.
438
+ * @param [Integer] offset point in memory to start from
439
+ * @param [Integer] count number of strings to get. If nil, return all strings
440
+ * @return [Array<String>]
441
+ * @raise {IndexError} if +offset+ is too great
442
+ * @raise {NullPointerError} if memory not initialized
443
+ */
221
444
  static VALUE
222
445
  memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
223
446
  {
@@ -231,17 +454,17 @@ memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
231
454
  count = (countnum == Qnil ? 0 : NUM2INT(countnum));
232
455
  retVal = rb_ary_new2(count);
233
456
 
234
- Data_Get_Struct(self, AbstractMemory, ptr);
457
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
235
458
  checkRead(ptr);
236
459
 
237
460
  if (countnum != Qnil) {
238
461
  int i;
239
462
 
240
463
  checkBounds(ptr, off, count * sizeof (char*));
241
-
464
+
242
465
  for (i = 0; i < count; ++i) {
243
466
  const char* strptr = *((const char**) (ptr->address + off) + i);
244
- rb_ary_push(retVal, (strptr == NULL ? Qnil : rb_tainted_str_new2(strptr)));
467
+ rb_ary_push(retVal, (strptr == NULL ? Qnil : rb_str_new2(strptr)));
245
468
  }
246
469
 
247
470
  } else {
@@ -251,13 +474,45 @@ memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
251
474
  if (strptr == NULL) {
252
475
  break;
253
476
  }
254
- rb_ary_push(retVal, rb_tainted_str_new2(strptr));
477
+ rb_ary_push(retVal, rb_str_new2(strptr));
255
478
  }
256
479
  }
257
480
 
258
481
  return retVal;
259
482
  }
260
483
 
484
+ /*
485
+ * call-seq: memory.read_array_of_string(count=nil)
486
+ * Return an array of strings contained in memory. Same as:
487
+ * memory.get_array_of_string(0, count)
488
+ * @param [Integer] count number of strings to get. If nil, return all strings
489
+ * @return [Array<String>]
490
+ */
491
+ static VALUE
492
+ memory_read_array_of_string(int argc, VALUE* argv, VALUE self)
493
+ {
494
+ VALUE* rargv = ALLOCA_N(VALUE, argc + 1);
495
+ int i;
496
+
497
+ rargv[0] = INT2FIX(0);
498
+ for (i = 0; i < argc; i++) {
499
+ rargv[i + 1] = argv[i];
500
+ }
501
+
502
+ return memory_get_array_of_string(argc + 1, rargv, self);
503
+ }
504
+
505
+
506
+ /*
507
+ * call-seq: memory.put_string(offset, str)
508
+ * @param [Integer] offset
509
+ * @param [String] str
510
+ * @return [self]
511
+ * @raise {SecurityError} when writing unsafe string to memory
512
+ * @raise {IndexError} if +offset+ is too great
513
+ * @raise {NullPointerError} if memory not initialized
514
+ * Put a string in memory.
515
+ */
261
516
  static VALUE
262
517
  memory_put_string(VALUE self, VALUE offset, VALUE str)
263
518
  {
@@ -270,11 +525,6 @@ memory_put_string(VALUE self, VALUE offset, VALUE str)
270
525
 
271
526
  checkWrite(ptr);
272
527
  checkBounds(ptr, off, len + 1);
273
-
274
- if (rb_safe_level() >= 1 && OBJ_TAINTED(str)) {
275
- rb_raise(rb_eSecurityError, "Writing unsafe string to memory");
276
- return Qnil;
277
- }
278
528
 
279
529
  memcpy(ptr->address + off, RSTRING_PTR(str), len);
280
530
  *((char *) ptr->address + off + len) = '\0';
@@ -282,21 +532,43 @@ memory_put_string(VALUE self, VALUE offset, VALUE str)
282
532
  return self;
283
533
  }
284
534
 
535
+ /*
536
+ * call-seq: memory.get_bytes(offset, length)
537
+ * Return string contained in memory.
538
+ * @param [Integer] offset point in buffer to start from
539
+ * @param [Integer] length string's length in bytes.
540
+ * @return [String]
541
+ * @raise {IndexError} if +length+ is too great
542
+ * @raise {NullPointerError} if memory not initialized
543
+ */
285
544
  static VALUE
286
545
  memory_get_bytes(VALUE self, VALUE offset, VALUE length)
287
546
  {
288
547
  AbstractMemory* ptr = MEMORY(self);
289
548
  long off, len;
290
-
549
+
291
550
  off = NUM2LONG(offset);
292
551
  len = NUM2LONG(length);
293
552
 
294
553
  checkRead(ptr);
295
554
  checkBounds(ptr, off, len);
296
-
297
- return rb_tainted_str_new((char *) ptr->address + off, len);
555
+
556
+ return rb_str_new((char *) ptr->address + off, len);
298
557
  }
299
558
 
559
+ /*
560
+ * call-seq: memory.put_bytes(offset, str, index=0, length=nil)
561
+ * Put a string in memory.
562
+ * @param [Integer] offset point in buffer to start from
563
+ * @param [String] str string to put to memory
564
+ * @param [Integer] index
565
+ * @param [Integer] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
566
+ * @return [self]
567
+ * @raise {IndexError} if +length+ is too great
568
+ * @raise {NullPointerError} if memory not initialized
569
+ * @raise {RangeError} if +index+ is negative, or if index+length is greater than size of string
570
+ * @raise {SecurityError} when writing unsafe string to memory
571
+ */
300
572
  static VALUE
301
573
  memory_put_bytes(int argc, VALUE* argv, VALUE self)
302
574
  {
@@ -310,7 +582,7 @@ memory_put_bytes(int argc, VALUE* argv, VALUE self)
310
582
  off = NUM2LONG(offset);
311
583
  idx = nargs > 2 ? NUM2LONG(rbIndex) : 0;
312
584
  if (idx < 0) {
313
- rb_raise(rb_eRangeError, "index canot be less than zero");
585
+ rb_raise(rb_eRangeError, "index cannot be less than zero");
314
586
  return Qnil;
315
587
  }
316
588
  len = nargs > 3 ? NUM2LONG(rbLength) : (RSTRING_LEN(str) - idx);
@@ -322,32 +594,76 @@ memory_put_bytes(int argc, VALUE* argv, VALUE self)
322
594
  checkWrite(ptr);
323
595
  checkBounds(ptr, off, len);
324
596
 
325
- if (rb_safe_level() >= 1 && OBJ_TAINTED(str)) {
326
- rb_raise(rb_eSecurityError, "Writing unsafe string to memory");
327
- return Qnil;
328
- }
329
597
  memcpy(ptr->address + off, RSTRING_PTR(str) + idx, len);
330
598
 
331
599
  return self;
332
600
  }
333
601
 
602
+ /*
603
+ * call-seq: memory.read_bytes(length)
604
+ * @param [Integer] length of string to return
605
+ * @return [String]
606
+ * equivalent to :
607
+ * memory.get_bytes(0, length)
608
+ */
609
+ static VALUE
610
+ memory_read_bytes(VALUE self, VALUE length)
611
+ {
612
+ return memory_get_bytes(self, INT2FIX(0), length);
613
+ }
614
+
615
+ /*
616
+ * call-seq: memory.write_bytes(str, index=0, length=nil)
617
+ * @param [String] str string to put to memory
618
+ * @param [Integer] index
619
+ * @param [Integer] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
620
+ * @return [self]
621
+ * equivalent to :
622
+ * memory.put_bytes(0, str, index, length)
623
+ */
624
+ static VALUE
625
+ memory_write_bytes(int argc, VALUE* argv, VALUE self)
626
+ {
627
+ VALUE* wargv = ALLOCA_N(VALUE, argc + 1);
628
+ int i;
629
+
630
+ wargv[0] = INT2FIX(0);
631
+ for (i = 0; i < argc; i++) {
632
+ wargv[i + 1] = argv[i];
633
+ }
634
+
635
+ return memory_put_bytes(argc + 1, wargv, self);
636
+ }
637
+
638
+ /*
639
+ * call-seq: memory.type_size
640
+ * @return [Integer] type size in bytes
641
+ * Get the memory's type size.
642
+ */
334
643
  static VALUE
335
644
  memory_type_size(VALUE self)
336
645
  {
337
646
  AbstractMemory* ptr;
338
647
 
339
- Data_Get_Struct(self, AbstractMemory, ptr);
648
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
340
649
 
341
650
  return INT2NUM(ptr->typeSize);
342
651
  }
343
652
 
653
+ /*
654
+ * Document-method: []
655
+ * call-seq: memory[idx]
656
+ * @param [Integer] idx index to access in memory
657
+ * @return
658
+ * Memory read accessor.
659
+ */
344
660
  static VALUE
345
661
  memory_aref(VALUE self, VALUE idx)
346
662
  {
347
663
  AbstractMemory* ptr;
348
664
  VALUE rbOffset = Qnil;
349
665
 
350
- Data_Get_Struct(self, AbstractMemory, ptr);
666
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
351
667
 
352
668
  rbOffset = ULONG2NUM(NUM2ULONG(idx) * ptr->typeSize);
353
669
 
@@ -357,20 +673,43 @@ memory_aref(VALUE self, VALUE idx)
357
673
  static inline char*
358
674
  memory_address(VALUE obj)
359
675
  {
360
- return ((AbstractMemory *) DATA_PTR(obj))->address;
676
+ AbstractMemory *mem;
677
+ TypedData_Get_Struct(obj, AbstractMemory, &rbffi_abstract_memory_data_type, mem);
678
+ return mem->address;
361
679
  }
362
680
 
363
- AbstractMemory*
364
- rbffi_AbstractMemory_Cast(VALUE obj, VALUE klass)
681
+ static VALUE
682
+ memory_copy_from(VALUE self, VALUE rbsrc, VALUE rblen)
365
683
  {
366
- if (rb_obj_is_kind_of(obj, klass)) {
367
- AbstractMemory* memory;
368
- Data_Get_Struct(obj, AbstractMemory, memory);
369
- return memory;
370
- }
684
+ AbstractMemory* dst;
685
+
686
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, dst);
687
+
688
+ memcpy(dst->address, rbffi_AbstractMemory_Cast(rbsrc, &rbffi_abstract_memory_data_type)->address, NUM2INT(rblen));
689
+
690
+ return self;
691
+ }
371
692
 
372
- rb_raise(rb_eArgError, "Invalid Memory object");
373
- return NULL;
693
+ /*
694
+ * call-seq:
695
+ * res.freeze
696
+ *
697
+ * Freeze the AbstractMemory object and unset the writable flag.
698
+ */
699
+ static VALUE
700
+ memory_freeze(VALUE self)
701
+ {
702
+ AbstractMemory* ptr = MEMORY(self);
703
+ ptr->flags &= ~MEM_WR;
704
+ return rb_call_super(0, NULL);
705
+ }
706
+
707
+ AbstractMemory*
708
+ rbffi_AbstractMemory_Cast(VALUE obj, const rb_data_type_t *data_type)
709
+ {
710
+ AbstractMemory* memory;
711
+ TypedData_Get_Struct(obj, AbstractMemory, data_type, memory);
712
+ return memory;
374
713
  }
375
714
 
376
715
  void
@@ -397,7 +736,7 @@ memory_op_get_strptr(AbstractMemory* ptr, long offset)
397
736
  memcpy(&tmp, ptr->address + offset, sizeof(tmp));
398
737
  }
399
738
 
400
- return tmp != NULL ? rb_tainted_str_new2(tmp) : Qnil;
739
+ return tmp != NULL ? rb_str_new2(tmp) : Qnil;
401
740
  }
402
741
 
403
742
  static void
@@ -408,34 +747,67 @@ memory_op_put_strptr(AbstractMemory* ptr, long offset, VALUE value)
408
747
 
409
748
  static MemoryOp memory_op_strptr = { memory_op_get_strptr, memory_op_put_strptr };
410
749
 
411
- //static MemoryOp memory_op_pointer = { memory_op_get_pointer, memory_op_put_pointer };
412
750
 
413
751
  MemoryOps rbffi_AbstractMemoryOps = {
414
- .int8 = &memory_op_int8,
415
- .uint8 = &memory_op_uint8,
416
- .int16 = &memory_op_int16,
417
- .uint16 = &memory_op_uint16,
418
- .int32 = &memory_op_int32,
419
- .uint32 = &memory_op_uint32,
420
- .int64 = &memory_op_int64,
421
- .uint64 = &memory_op_uint64,
422
- .slong = &memory_op_long,
423
- .ulong = &memory_op_ulong,
424
- .float32 = &memory_op_float32,
425
- .float64 = &memory_op_float64,
426
- .pointer = &memory_op_pointer,
427
- .strptr = &memory_op_strptr,
752
+ &memory_op_int8, /*.int8 */
753
+ &memory_op_uint8, /* .uint8 */
754
+ &memory_op_int16, /* .int16 */
755
+ &memory_op_uint16, /* .uint16 */
756
+ &memory_op_int32, /* .int32 */
757
+ &memory_op_uint32, /* .uint32 */
758
+ &memory_op_int64, /* .int64 */
759
+ &memory_op_uint64, /* .uint64 */
760
+ &memory_op_long, /* .slong */
761
+ &memory_op_ulong, /* .uslong */
762
+ &memory_op_float32, /* .float32 */
763
+ &memory_op_float64, /* .float64 */
764
+ &memory_op_longdouble, /* .longdouble */
765
+ &memory_op_pointer, /* .pointer */
766
+ &memory_op_strptr, /* .strptr */
767
+ &memory_op_bool /* .boolOp */
428
768
  };
429
769
 
430
770
  void
431
771
  rbffi_AbstractMemory_Init(VALUE moduleFFI)
432
772
  {
773
+ /*
774
+ * Document-class: FFI::AbstractMemory
775
+ *
776
+ * {AbstractMemory} is the base class for many memory management classes such as {Buffer}.
777
+ *
778
+ * This class has a lot of methods to work with integers :
779
+ * * put_int<i>size</i>(offset, value)
780
+ * * get_int<i>size</i>(offset)
781
+ * * put_uint<i>size</i>(offset, value)
782
+ * * get_uint<i>size</i>(offset)
783
+ * * writeuint<i>size</i>(value)
784
+ * * read_int<i>size</i>
785
+ * * write_uint<i>size</i>(value)
786
+ * * read_uint<i>size</i>
787
+ * * put_array_of_int<i>size</i>(offset, ary)
788
+ * * get_array_of_int<i>size</i>(offset, length)
789
+ * * put_array_of_uint<i>size</i>(offset, ary)
790
+ * * get_array_of_uint<i>size</i>(offset, length)
791
+ * * write_array_of_int<i>size</i>(ary)
792
+ * * read_array_of_int<i>size</i>(length)
793
+ * * write_array_of_uint<i>size</i>(ary)
794
+ * * read_array_of_uint<i>size</i>(length)
795
+ * where _size_ is 8, 16, 32 or 64. Same methods exist for long type.
796
+ *
797
+ * Aliases exist : _char_ for _int8_, _short_ for _int16_, _int_ for _int32_ and <i>long_long</i> for _int64_.
798
+ *
799
+ * Others methods are listed below.
800
+ */
433
801
  VALUE classMemory = rb_define_class_under(moduleFFI, "AbstractMemory", rb_cObject);
434
802
  rbffi_AbstractMemoryClass = classMemory;
803
+ /*
804
+ * Document-variable: FFI::AbstractMemory
805
+ */
435
806
  rb_global_variable(&rbffi_AbstractMemoryClass);
436
- rb_define_alloc_func(classMemory, memory_allocate);
807
+ rb_undef_alloc_func(classMemory);
437
808
 
438
809
  NullPointerErrorClass = rb_define_class_under(moduleFFI, "NullPointerError", rb_eRuntimeError);
810
+ /* Document-variable: NullPointerError */
439
811
  rb_global_variable(&NullPointerErrorClass);
440
812
 
441
813
 
@@ -445,63 +817,310 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
445
817
  rb_define_method(classMemory, "get_" #type, memory_get_##type, 1); \
446
818
  rb_define_method(classMemory, "put_u" #type, memory_put_u##type, 2); \
447
819
  rb_define_method(classMemory, "get_u" #type, memory_get_u##type, 1); \
820
+ rb_define_method(classMemory, "write_" #type, memory_write_##type, 1); \
821
+ rb_define_method(classMemory, "read_" #type, memory_read_##type, 0); \
822
+ rb_define_method(classMemory, "write_u" #type, memory_write_u##type, 1); \
823
+ rb_define_method(classMemory, "read_u" #type, memory_read_u##type, 0); \
448
824
  rb_define_method(classMemory, "put_array_of_" #type, memory_put_array_of_##type, 2); \
449
825
  rb_define_method(classMemory, "get_array_of_" #type, memory_get_array_of_##type, 2); \
450
826
  rb_define_method(classMemory, "put_array_of_u" #type, memory_put_array_of_u##type, 2); \
451
- rb_define_method(classMemory, "get_array_of_u" #type, memory_get_array_of_u##type, 2);
452
-
827
+ rb_define_method(classMemory, "get_array_of_u" #type, memory_get_array_of_u##type, 2); \
828
+ rb_define_method(classMemory, "write_array_of_" #type, memory_write_array_of_##type, 1); \
829
+ rb_define_method(classMemory, "read_array_of_" #type, memory_read_array_of_##type, 1); \
830
+ rb_define_method(classMemory, "write_array_of_u" #type, memory_write_array_of_u##type, 1); \
831
+ rb_define_method(classMemory, "read_array_of_u" #type, memory_read_array_of_u##type, 1);
832
+
453
833
  INT(int8);
454
834
  INT(int16);
455
835
  INT(int32);
456
836
  INT(int64);
457
837
  INT(long);
458
-
838
+
459
839
  #define ALIAS(name, old) \
460
840
  rb_define_alias(classMemory, "put_" #name, "put_" #old); \
461
841
  rb_define_alias(classMemory, "get_" #name, "get_" #old); \
462
842
  rb_define_alias(classMemory, "put_u" #name, "put_u" #old); \
463
843
  rb_define_alias(classMemory, "get_u" #name, "get_u" #old); \
844
+ rb_define_alias(classMemory, "write_" #name, "write_" #old); \
845
+ rb_define_alias(classMemory, "read_" #name, "read_" #old); \
846
+ rb_define_alias(classMemory, "write_u" #name, "write_u" #old); \
847
+ rb_define_alias(classMemory, "read_u" #name, "read_u" #old); \
464
848
  rb_define_alias(classMemory, "put_array_of_" #name, "put_array_of_" #old); \
465
849
  rb_define_alias(classMemory, "get_array_of_" #name, "get_array_of_" #old); \
466
850
  rb_define_alias(classMemory, "put_array_of_u" #name, "put_array_of_u" #old); \
467
- rb_define_alias(classMemory, "get_array_of_u" #name, "get_array_of_u" #old);
468
-
851
+ rb_define_alias(classMemory, "get_array_of_u" #name, "get_array_of_u" #old); \
852
+ rb_define_alias(classMemory, "write_array_of_" #name, "write_array_of_" #old); \
853
+ rb_define_alias(classMemory, "read_array_of_" #name, "read_array_of_" #old); \
854
+ rb_define_alias(classMemory, "write_array_of_u" #name, "write_array_of_u" #old); \
855
+ rb_define_alias(classMemory, "read_array_of_u" #name, "read_array_of_u" #old);
856
+
469
857
  ALIAS(char, int8);
470
858
  ALIAS(short, int16);
471
859
  ALIAS(int, int32);
472
860
  ALIAS(long_long, int64);
473
-
861
+
862
+ /*
863
+ * Document-method: put_float32
864
+ * call-seq: memory.put_float32(offset, value)
865
+ * @param [Integer] offset
866
+ * @param [Numeric] value
867
+ * @return [self]
868
+ * Put +value+ as a 32-bit float in memory at offset +offset+ (alias: #put_float).
869
+ */
474
870
  rb_define_method(classMemory, "put_float32", memory_put_float32, 2);
871
+ /*
872
+ * Document-method: get_float32
873
+ * call-seq: memory.get_float32(offset)
874
+ * @param [Integer] offset
875
+ * @return [Float]
876
+ * Get a 32-bit float from memory at offset +offset+ (alias: #get_float).
877
+ */
475
878
  rb_define_method(classMemory, "get_float32", memory_get_float32, 1);
476
879
  rb_define_alias(classMemory, "put_float", "put_float32");
477
880
  rb_define_alias(classMemory, "get_float", "get_float32");
881
+ /*
882
+ * Document-method: write_float
883
+ * call-seq: memory.write_float(value)
884
+ * @param [Numeric] value
885
+ * @return [self]
886
+ * Write +value+ as a 32-bit float in memory.
887
+ *
888
+ * Same as:
889
+ * memory.put_float(0, value)
890
+ */
891
+ rb_define_method(classMemory, "write_float", memory_write_float32, 1);
892
+ /*
893
+ * Document-method: read_float
894
+ * call-seq: memory.read_float
895
+ * @return [Float]
896
+ * Read a 32-bit float from memory.
897
+ *
898
+ * Same as:
899
+ * memory.get_float(0)
900
+ */
901
+ rb_define_method(classMemory, "read_float", memory_read_float32, 0);
902
+ /*
903
+ * Document-method: put_array_of_float32
904
+ * call-seq: memory.put_array_of_float32(offset, ary)
905
+ * @param [Integer] offset
906
+ * @param [Array<Numeric>] ary
907
+ * @return [self]
908
+ * Put values from +ary+ as 32-bit floats in memory from offset +offset+ (alias: #put_array_of_float).
909
+ */
478
910
  rb_define_method(classMemory, "put_array_of_float32", memory_put_array_of_float32, 2);
911
+ /*
912
+ * Document-method: get_array_of_float32
913
+ * call-seq: memory.get_array_of_float32(offset, length)
914
+ * @param [Integer] offset
915
+ * @param [Integer] length number of Float to get
916
+ * @return [Array<Float>]
917
+ * Get 32-bit floats in memory from offset +offset+ (alias: #get_array_of_float).
918
+ */
479
919
  rb_define_method(classMemory, "get_array_of_float32", memory_get_array_of_float32, 2);
920
+ /*
921
+ * Document-method: write_array_of_float
922
+ * call-seq: memory.write_array_of_float(ary)
923
+ * @param [Array<Numeric>] ary
924
+ * @return [self]
925
+ * Write values from +ary+ as 32-bit floats in memory.
926
+ *
927
+ * Same as:
928
+ * memory.put_array_of_float(0, ary)
929
+ */
930
+ rb_define_method(classMemory, "write_array_of_float", memory_write_array_of_float32, 1);
931
+ /*
932
+ * Document-method: read_array_of_float
933
+ * call-seq: memory.read_array_of_float(length)
934
+ * @param [Integer] length number of Float to read
935
+ * @return [Array<Float>]
936
+ * Read 32-bit floats from memory.
937
+ *
938
+ * Same as:
939
+ * memory.get_array_of_float(0, ary)
940
+ */
941
+ rb_define_method(classMemory, "read_array_of_float", memory_read_array_of_float32, 1);
480
942
  rb_define_alias(classMemory, "put_array_of_float", "put_array_of_float32");
481
943
  rb_define_alias(classMemory, "get_array_of_float", "get_array_of_float32");
944
+ /*
945
+ * Document-method: put_float64
946
+ * call-seq: memory.put_float64(offset, value)
947
+ * @param [Integer] offset
948
+ * @param [Numeric] value
949
+ * @return [self]
950
+ * Put +value+ as a 64-bit float (double) in memory at offset +offset+ (alias: #put_double).
951
+ */
482
952
  rb_define_method(classMemory, "put_float64", memory_put_float64, 2);
953
+ /*
954
+ * Document-method: get_float64
955
+ * call-seq: memory.get_float64(offset)
956
+ * @param [Integer] offset
957
+ * @return [Float]
958
+ * Get a 64-bit float (double) from memory at offset +offset+ (alias: #get_double).
959
+ */
483
960
  rb_define_method(classMemory, "get_float64", memory_get_float64, 1);
484
961
  rb_define_alias(classMemory, "put_double", "put_float64");
485
962
  rb_define_alias(classMemory, "get_double", "get_float64");
963
+ /*
964
+ * Document-method: write_double
965
+ * call-seq: memory.write_double(value)
966
+ * @param [Numeric] value
967
+ * @return [self]
968
+ * Write +value+ as a 64-bit float (double) in memory.
969
+ *
970
+ * Same as:
971
+ * memory.put_double(0, value)
972
+ */
973
+ rb_define_method(classMemory, "write_double", memory_write_float64, 1);
974
+ /*
975
+ * Document-method: read_double
976
+ * call-seq: memory.read_double
977
+ * @return [Float]
978
+ * Read a 64-bit float (double) from memory.
979
+ *
980
+ * Same as:
981
+ * memory.get_double(0)
982
+ */
983
+ rb_define_method(classMemory, "read_double", memory_read_float64, 0);
984
+ /*
985
+ * Document-method: put_array_of_float64
986
+ * call-seq: memory.put_array_of_float64(offset, ary)
987
+ * @param [Integer] offset
988
+ * @param [Array<Numeric>] ary
989
+ * @return [self]
990
+ * Put values from +ary+ as 64-bit floats (doubles) in memory from offset +offset+ (alias: #put_array_of_double).
991
+ */
486
992
  rb_define_method(classMemory, "put_array_of_float64", memory_put_array_of_float64, 2);
993
+ /*
994
+ * Document-method: get_array_of_float64
995
+ * call-seq: memory.get_array_of_float64(offset, length)
996
+ * @param [Integer] offset
997
+ * @param [Integer] length number of Float to get
998
+ * @return [Array<Float>]
999
+ * Get 64-bit floats (doubles) in memory from offset +offset+ (alias: #get_array_of_double).
1000
+ */
487
1001
  rb_define_method(classMemory, "get_array_of_float64", memory_get_array_of_float64, 2);
1002
+ /*
1003
+ * Document-method: write_array_of_double
1004
+ * call-seq: memory.write_array_of_double(ary)
1005
+ * @param [Array<Numeric>] ary
1006
+ * @return [self]
1007
+ * Write values from +ary+ as 64-bit floats (doubles) in memory.
1008
+ *
1009
+ * Same as:
1010
+ * memory.put_array_of_double(0, ary)
1011
+ */
1012
+ rb_define_method(classMemory, "write_array_of_double", memory_write_array_of_float64, 1);
1013
+ /*
1014
+ * Document-method: read_array_of_double
1015
+ * call-seq: memory.read_array_of_double(length)
1016
+ * @param [Integer] length number of Float to read
1017
+ * @return [Array<Float>]
1018
+ * Read 64-bit floats (doubles) from memory.
1019
+ *
1020
+ * Same as:
1021
+ * memory.get_array_of_double(0, ary)
1022
+ */
1023
+ rb_define_method(classMemory, "read_array_of_double", memory_read_array_of_float64, 1);
488
1024
  rb_define_alias(classMemory, "put_array_of_double", "put_array_of_float64");
489
1025
  rb_define_alias(classMemory, "get_array_of_double", "get_array_of_float64");
1026
+ /*
1027
+ * Document-method: put_pointer
1028
+ * call-seq: memory.put_pointer(offset, value)
1029
+ * @param [Integer] offset
1030
+ * @param [nil,Pointer, Integer, #to_ptr] value
1031
+ * @return [self]
1032
+ * Put +value+ in memory from +offset+..
1033
+ */
490
1034
  rb_define_method(classMemory, "put_pointer", memory_put_pointer, 2);
1035
+ /*
1036
+ * Document-method: get_pointer
1037
+ * call-seq: memory.get_pointer(offset)
1038
+ * @param [Integer] offset
1039
+ * @return [Pointer]
1040
+ * Get a {Pointer} to the memory from +offset+.
1041
+ */
491
1042
  rb_define_method(classMemory, "get_pointer", memory_get_pointer, 1);
1043
+ /*
1044
+ * Document-method: write_pointer
1045
+ * call-seq: memory.write_pointer(value)
1046
+ * @param [nil,Pointer, Integer, #to_ptr] value
1047
+ * @return [self]
1048
+ * Write +value+ in memory.
1049
+ *
1050
+ * Equivalent to:
1051
+ * memory.put_pointer(0, value)
1052
+ */
1053
+ rb_define_method(classMemory, "write_pointer", memory_write_pointer, 1);
1054
+ /*
1055
+ * Document-method: read_pointer
1056
+ * call-seq: memory.read_pointer
1057
+ * @return [Pointer]
1058
+ * Get a {Pointer} to the memory from base address.
1059
+ *
1060
+ * Equivalent to:
1061
+ * memory.get_pointer(0)
1062
+ */
1063
+ rb_define_method(classMemory, "read_pointer", memory_read_pointer, 0);
1064
+ /*
1065
+ * Document-method: put_array_of_pointer
1066
+ * call-seq: memory.put_array_of_pointer(offset, ary)
1067
+ * @param [Integer] offset
1068
+ * @param [Array<#to_ptr>] ary
1069
+ * @return [self]
1070
+ * Put an array of {Pointer} into memory from +offset+.
1071
+ */
492
1072
  rb_define_method(classMemory, "put_array_of_pointer", memory_put_array_of_pointer, 2);
1073
+ /*
1074
+ * Document-method: get_array_of_pointer
1075
+ * call-seq: memory.get_array_of_pointer(offset, length)
1076
+ * @param [Integer] offset
1077
+ * @param [Integer] length
1078
+ * @return [Array<Pointer>]
1079
+ * Get an array of {Pointer} of length +length+ from +offset+.
1080
+ */
493
1081
  rb_define_method(classMemory, "get_array_of_pointer", memory_get_array_of_pointer, 2);
1082
+ /*
1083
+ * Document-method: write_array_of_pointer
1084
+ * call-seq: memory.write_array_of_pointer(ary)
1085
+ * @param [Array<#to_ptr>] ary
1086
+ * @return [self]
1087
+ * Write an array of {Pointer} into memory from +offset+.
1088
+ *
1089
+ * Same as :
1090
+ * memory.put_array_of_pointer(0, ary)
1091
+ */
1092
+ rb_define_method(classMemory, "write_array_of_pointer", memory_write_array_of_pointer, 1);
1093
+ /*
1094
+ * Document-method: read_array_of_pointer
1095
+ * call-seq: memory.read_array_of_pointer(length)
1096
+ * @param [Integer] length
1097
+ * @return [Array<Pointer>]
1098
+ * Read an array of {Pointer} of length +length+.
1099
+ *
1100
+ * Same as:
1101
+ * memory.get_array_of_pointer(0, length)
1102
+ */
1103
+ rb_define_method(classMemory, "read_array_of_pointer", memory_read_array_of_pointer, 1);
1104
+
494
1105
  rb_define_method(classMemory, "get_string", memory_get_string, -1);
495
1106
  rb_define_method(classMemory, "put_string", memory_put_string, 2);
496
1107
  rb_define_method(classMemory, "get_bytes", memory_get_bytes, 2);
497
1108
  rb_define_method(classMemory, "put_bytes", memory_put_bytes, -1);
1109
+ rb_define_method(classMemory, "read_bytes", memory_read_bytes, 1);
1110
+ rb_define_method(classMemory, "write_bytes", memory_write_bytes, -1);
498
1111
  rb_define_method(classMemory, "get_array_of_string", memory_get_array_of_string, -1);
1112
+ rb_define_method(classMemory, "read_array_of_string", memory_read_array_of_string, -1);
1113
+
1114
+ rb_define_method(classMemory, "get", memory_get, 2);
1115
+ rb_define_method(classMemory, "put", memory_put, 3);
499
1116
 
500
1117
  rb_define_method(classMemory, "clear", memory_clear, 0);
501
1118
  rb_define_method(classMemory, "total", memory_size, 0);
502
1119
  rb_define_alias(classMemory, "size", "total");
503
1120
  rb_define_method(classMemory, "type_size", memory_type_size, 0);
504
1121
  rb_define_method(classMemory, "[]", memory_aref, 1);
1122
+ rb_define_method(classMemory, "__copy_from__", memory_copy_from, 2);
1123
+ rb_define_method(classMemory, "freeze", memory_freeze, 0 );
505
1124
 
506
1125
  id_to_ptr = rb_intern("to_ptr");
507
1126
  id_call = rb_intern("call");