ffi 1.9.24 → 1.16.3

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 (457) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +348 -0
  4. data/Gemfile +4 -5
  5. data/README.md +44 -17
  6. data/Rakefile +74 -148
  7. data/ext/ffi_c/AbstractMemory.c +89 -70
  8. data/ext/ffi_c/AbstractMemory.h +3 -2
  9. data/ext/ffi_c/ArrayType.c +49 -13
  10. data/ext/ffi_c/ArrayType.h +1 -0
  11. data/ext/ffi_c/Buffer.c +90 -38
  12. data/ext/ffi_c/Call.c +55 -56
  13. data/ext/ffi_c/Call.h +12 -6
  14. data/ext/ffi_c/ClosurePool.c +333 -0
  15. data/ext/ffi_c/{Closure.h → ClosurePool.h} +25 -13
  16. data/ext/ffi_c/DynamicLibrary.c +91 -33
  17. data/ext/ffi_c/Function.c +306 -235
  18. data/ext/ffi_c/Function.h +3 -5
  19. data/ext/ffi_c/FunctionInfo.c +87 -32
  20. data/ext/ffi_c/LastError.c +74 -15
  21. data/ext/ffi_c/LongDouble.c +12 -10
  22. data/ext/ffi_c/LongDouble.h +0 -4
  23. data/ext/ffi_c/MappedType.c +66 -23
  24. data/ext/ffi_c/MappedType.h +0 -2
  25. data/ext/ffi_c/MemoryPointer.c +37 -15
  26. data/ext/ffi_c/MemoryPointer.h +0 -4
  27. data/ext/ffi_c/MethodHandle.c +265 -38
  28. data/ext/ffi_c/MethodHandle.h +3 -2
  29. data/ext/ffi_c/Platform.c +5 -56
  30. data/ext/ffi_c/Pointer.c +93 -55
  31. data/ext/ffi_c/Pointer.h +1 -4
  32. data/ext/ffi_c/Struct.c +202 -134
  33. data/ext/ffi_c/Struct.h +18 -9
  34. data/ext/ffi_c/StructByValue.c +50 -23
  35. data/ext/ffi_c/StructLayout.c +135 -64
  36. data/ext/ffi_c/Thread.c +4 -228
  37. data/ext/ffi_c/Thread.h +1 -20
  38. data/ext/ffi_c/Type.c +105 -55
  39. data/ext/ffi_c/Type.h +3 -2
  40. data/ext/ffi_c/Types.c +8 -9
  41. data/ext/ffi_c/Types.h +3 -4
  42. data/ext/ffi_c/Variadic.c +88 -47
  43. data/ext/ffi_c/compat.h +26 -22
  44. data/ext/ffi_c/extconf.rb +75 -32
  45. data/ext/ffi_c/ffi.c +9 -10
  46. data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
  47. data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
  48. data/ext/ffi_c/libffi/.appveyor.yml +53 -19
  49. data/ext/ffi_c/libffi/.ci/bfin-sim.exp +58 -0
  50. data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
  51. data/ext/ffi_c/libffi/.ci/build-in-container.sh +10 -0
  52. data/ext/ffi_c/libffi/.ci/build.sh +124 -0
  53. data/ext/ffi_c/libffi/.ci/install.sh +78 -0
  54. data/ext/ffi_c/libffi/.ci/m32r-sim.exp +58 -0
  55. data/ext/ffi_c/libffi/{.travis → .ci}/moxie-sim.exp +1 -1
  56. data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
  57. data/ext/ffi_c/libffi/.ci/or1k-sim.exp +58 -0
  58. data/ext/ffi_c/libffi/.ci/powerpc-eabisim.exp +58 -0
  59. data/ext/ffi_c/libffi/.ci/site.exp +29 -0
  60. data/ext/ffi_c/libffi/.ci/wine-sim.exp +55 -0
  61. data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
  62. data/ext/ffi_c/libffi/.gitattributes +4 -0
  63. data/ext/ffi_c/libffi/.github/workflows/build.yml +460 -0
  64. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +171 -0
  65. data/ext/ffi_c/libffi/.gitignore +10 -2
  66. data/ext/ffi_c/libffi/{ChangeLog.libffi-3.1 → ChangeLog.old} +1407 -0
  67. data/ext/ffi_c/libffi/LICENSE +1 -1
  68. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +5 -4
  69. data/ext/ffi_c/libffi/Makefile.am +64 -73
  70. data/ext/ffi_c/libffi/Makefile.in +553 -235
  71. data/ext/ffi_c/libffi/README.md +165 -100
  72. data/ext/ffi_c/libffi/acinclude.m4 +10 -112
  73. data/ext/ffi_c/libffi/compile +348 -0
  74. data/ext/ffi_c/libffi/config.guess +950 -662
  75. data/ext/ffi_c/libffi/config.sub +1362 -1306
  76. data/ext/ffi_c/libffi/configure +4909 -4096
  77. data/ext/ffi_c/libffi/configure.ac +93 -32
  78. data/ext/ffi_c/libffi/configure.host +76 -28
  79. data/ext/ffi_c/libffi/doc/Makefile.in +15 -8
  80. data/ext/ffi_c/libffi/doc/libffi.texi +107 -46
  81. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  82. data/ext/ffi_c/libffi/fficonfig.h.in +22 -44
  83. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +165 -56
  84. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  85. data/ext/ffi_c/libffi/include/Makefile.in +17 -12
  86. data/ext/ffi_c/libffi/include/ffi.h.in +64 -48
  87. data/ext/ffi_c/libffi/include/ffi_cfi.h +21 -0
  88. data/ext/ffi_c/libffi/include/ffi_common.h +34 -1
  89. data/ext/ffi_c/libffi/include/tramp.h +45 -0
  90. data/ext/ffi_c/libffi/install-sh +107 -74
  91. data/ext/ffi_c/libffi/libffi.map.in +8 -12
  92. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +2 -48
  93. data/ext/ffi_c/libffi/libtool-version +2 -2
  94. data/ext/ffi_c/libffi/ltmain.sh +576 -284
  95. data/ext/ffi_c/libffi/m4/asmcfi.m4 +1 -1
  96. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +5 -26
  97. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +18 -14
  98. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +108 -72
  99. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +5 -26
  100. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +76 -44
  101. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +5 -26
  102. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +7 -3
  103. data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
  104. data/ext/ffi_c/libffi/make_sunver.pl +333 -0
  105. data/ext/ffi_c/libffi/man/Makefile.in +15 -8
  106. data/ext/ffi_c/libffi/missing +8 -8
  107. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
  108. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
  109. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
  110. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
  111. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +511 -0
  112. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/fficonfig.h +219 -0
  113. data/ext/ffi_c/libffi/msvcc.sh +39 -14
  114. data/ext/ffi_c/libffi/src/aarch64/ffi.c +286 -98
  115. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +19 -3
  116. data/ext/ffi_c/libffi/src/aarch64/internal.h +33 -0
  117. data/ext/ffi_c/libffi/src/aarch64/sysv.S +142 -37
  118. data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +506 -0
  119. data/ext/ffi_c/libffi/src/arc/arcompact.S +169 -94
  120. data/ext/ffi_c/libffi/src/arc/ffi.c +325 -148
  121. data/ext/ffi_c/libffi/src/arc/ffitarget.h +14 -0
  122. data/ext/ffi_c/libffi/src/arm/ffi.c +112 -10
  123. data/ext/ffi_c/libffi/src/arm/ffitarget.h +8 -1
  124. data/ext/ffi_c/libffi/src/arm/internal.h +10 -0
  125. data/ext/ffi_c/libffi/src/arm/sysv.S +117 -44
  126. data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
  127. data/ext/ffi_c/libffi/src/closures.c +189 -48
  128. data/ext/ffi_c/libffi/src/csky/ffi.c +395 -0
  129. data/ext/ffi_c/libffi/src/csky/ffitarget.h +63 -0
  130. data/ext/ffi_c/libffi/src/csky/sysv.S +371 -0
  131. data/ext/ffi_c/libffi/src/dlmalloc.c +6 -1
  132. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  133. data/ext/ffi_c/libffi/src/ia64/ffi.c +12 -0
  134. data/ext/ffi_c/libffi/src/ia64/unix.S +20 -2
  135. data/ext/ffi_c/libffi/src/kvx/asm.h +5 -0
  136. data/ext/ffi_c/libffi/src/kvx/ffi.c +273 -0
  137. data/ext/ffi_c/libffi/src/kvx/ffitarget.h +75 -0
  138. data/ext/ffi_c/libffi/src/kvx/sysv.S +127 -0
  139. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +621 -0
  140. data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
  141. data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
  142. data/ext/ffi_c/libffi/src/m32r/ffi.c +31 -14
  143. data/ext/ffi_c/libffi/src/metag/ffi.c +1 -1
  144. data/ext/ffi_c/libffi/src/mips/ffi.c +245 -66
  145. data/ext/ffi_c/libffi/src/mips/ffitarget.h +8 -1
  146. data/ext/ffi_c/libffi/src/mips/n32.S +137 -28
  147. data/ext/ffi_c/libffi/src/mips/o32.S +63 -4
  148. data/ext/ffi_c/libffi/src/moxie/ffi.c +48 -23
  149. data/ext/ffi_c/libffi/src/or1k/ffi.c +25 -12
  150. data/ext/ffi_c/libffi/src/pa/ffi.c +62 -108
  151. data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
  152. data/ext/ffi_c/libffi/src/pa/ffitarget.h +20 -11
  153. data/ext/ffi_c/libffi/src/pa/hpux32.S +87 -38
  154. data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
  155. data/ext/ffi_c/libffi/src/pa/linux.S +109 -39
  156. data/ext/ffi_c/libffi/src/powerpc/ffi.c +6 -4
  157. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +13 -1
  158. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +211 -32
  159. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +18 -7
  160. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +10 -4
  161. data/ext/ffi_c/libffi/src/powerpc/linux64.S +93 -28
  162. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +83 -5
  163. data/ext/ffi_c/libffi/src/powerpc/sysv.S +5 -7
  164. data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
  165. data/ext/ffi_c/libffi/src/prep_cif.c +26 -4
  166. data/ext/ffi_c/libffi/src/riscv/ffi.c +79 -10
  167. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +1 -0
  168. data/ext/ffi_c/libffi/src/riscv/sysv.S +86 -7
  169. data/ext/ffi_c/libffi/src/sparc/ffi64.c +16 -0
  170. data/ext/ffi_c/libffi/src/tramp.c +716 -0
  171. data/ext/ffi_c/libffi/src/wasm32/ffi.c +934 -0
  172. data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
  173. data/ext/ffi_c/libffi/src/x86/ffi.c +128 -49
  174. data/ext/ffi_c/libffi/src/x86/ffi64.c +89 -23
  175. data/ext/ffi_c/libffi/src/x86/ffitarget.h +21 -4
  176. data/ext/ffi_c/libffi/src/x86/ffiw64.c +63 -10
  177. data/ext/ffi_c/libffi/src/x86/internal.h +14 -0
  178. data/ext/ffi_c/libffi/src/x86/internal64.h +14 -0
  179. data/ext/ffi_c/libffi/src/x86/sysv.S +274 -45
  180. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +998 -0
  181. data/ext/ffi_c/libffi/src/x86/unix64.S +190 -4
  182. data/ext/ffi_c/libffi/src/x86/win64.S +32 -10
  183. data/ext/ffi_c/libffi/src/x86/win64_intel.S +3 -2
  184. data/ext/ffi_c/libffi/src/xtensa/ffi.c +16 -8
  185. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +4 -0
  186. data/ext/ffi_c/libffi/src/xtensa/sysv.S +26 -16
  187. data/ext/ffi_c/libffi/testsuite/Makefile.am +127 -109
  188. data/ext/ffi_c/libffi/testsuite/Makefile.in +144 -88
  189. data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
  190. data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
  191. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +80 -0
  192. data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
  193. data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
  194. data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
  195. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +71 -25
  196. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +2 -2
  197. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +7 -2
  198. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +5 -4
  199. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2 -2
  200. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +5 -1
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +12 -1
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +28 -3
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +9 -8
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +3 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +5 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +8 -9
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +2 -2
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +2 -2
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +2 -2
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +1 -1
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +1 -119
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +13 -0
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +11 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +15 -0
  230. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
  231. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +3 -2
  232. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +2 -0
  233. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +2 -0
  234. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +21 -1
  235. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +2 -0
  236. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +2 -0
  237. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +2 -0
  238. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +7 -6
  239. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_simple.c +6 -0
  240. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +18 -0
  241. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +22 -0
  242. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +24 -0
  243. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +29 -0
  244. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +4 -0
  245. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +19 -1
  246. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +21 -1
  247. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +35 -3
  248. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +13 -0
  249. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +19 -0
  250. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +13 -0
  251. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +13 -0
  252. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3float.c +18 -0
  253. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +22 -0
  254. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +13 -0
  255. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +29 -1
  256. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +19 -1
  257. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +24 -0
  258. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +28 -1
  259. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +24 -2
  260. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +39 -1
  261. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +25 -1
  262. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +14 -0
  263. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +14 -1
  264. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +14 -2
  265. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +19 -1
  266. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +19 -1
  267. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +20 -1
  268. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +40 -25
  269. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +40 -3
  270. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +19 -1
  271. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +18 -1
  272. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +18 -3
  273. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +18 -1
  274. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +18 -1
  275. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +19 -1
  276. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +19 -1
  277. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +3 -1
  278. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +9 -1
  279. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +4 -0
  280. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +11 -1
  281. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +22 -3
  282. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +5 -1
  283. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +6 -1
  284. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +9 -1
  285. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +9 -1
  286. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +6 -2
  287. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +9 -1
  288. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +5 -0
  289. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +10 -0
  290. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +3 -0
  291. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +2 -0
  292. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +3 -0
  293. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_struct_va1.c +11 -0
  294. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +3 -0
  295. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +4 -0
  296. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint_va.c +4 -0
  297. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulong_va.c +4 -0
  298. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +2 -0
  299. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +3 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -0
  301. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +24 -22
  302. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +32 -9
  303. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +1 -1
  304. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +12 -0
  305. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct11.c +21 -5
  306. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
  308. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct2.c +10 -1
  309. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +10 -1
  310. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +9 -0
  311. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +9 -0
  312. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +11 -0
  313. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +9 -0
  314. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +11 -0
  315. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +11 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
  319. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +1 -1
  320. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +1 -1
  321. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +6 -1
  322. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/unwindtest.cc +2 -1
  323. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/unwindtest_ffi_call.cc +1 -0
  324. data/ext/ffi_c/libffi.bsd.mk +2 -2
  325. data/ext/ffi_c/libffi.darwin.mk +1 -1
  326. data/ext/ffi_c/libffi.gnu.mk +2 -2
  327. data/ext/ffi_c/rbffi.h +1 -3
  328. data/ffi.gemspec +15 -9
  329. data/lib/ffi/abstract_memory.rb +44 -0
  330. data/lib/ffi/autopointer.rb +8 -23
  331. data/lib/ffi/compat.rb +43 -0
  332. data/lib/ffi/data_converter.rb +67 -0
  333. data/lib/ffi/dynamic_library.rb +89 -0
  334. data/lib/ffi/enum.rb +18 -11
  335. data/lib/ffi/ffi.rb +6 -0
  336. data/lib/ffi/function.rb +71 -0
  337. data/lib/ffi/io.rb +3 -3
  338. data/lib/ffi/library.rb +65 -77
  339. data/lib/ffi/library_path.rb +109 -0
  340. data/lib/ffi/managedstruct.rb +3 -3
  341. data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
  342. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  343. data/lib/ffi/platform/aarch64-freebsd12/types.conf +181 -0
  344. data/lib/ffi/platform/aarch64-linux/types.conf +81 -81
  345. data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
  346. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  347. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  348. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  349. data/lib/ffi/platform/arm-linux/types.conf +110 -82
  350. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  351. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  352. data/lib/ffi/platform/i386-cygwin/types.conf +1 -1
  353. data/lib/ffi/platform/i386-darwin/types.conf +63 -63
  354. data/lib/ffi/platform/i386-freebsd/types.conf +89 -89
  355. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  356. data/lib/ffi/platform/i386-gnu/types.conf +84 -84
  357. data/lib/ffi/platform/i386-linux/types.conf +77 -77
  358. data/lib/ffi/platform/i386-netbsd/types.conf +87 -87
  359. data/lib/ffi/platform/i386-openbsd/types.conf +89 -89
  360. data/lib/ffi/platform/i386-solaris/types.conf +96 -96
  361. data/lib/ffi/platform/i386-windows/types.conf +43 -96
  362. data/lib/ffi/platform/ia64-linux/types.conf +79 -79
  363. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  364. data/lib/ffi/platform/mips-linux/types.conf +79 -79
  365. data/lib/ffi/platform/mips64-linux/types.conf +81 -81
  366. data/lib/ffi/platform/mips64el-linux/types.conf +81 -81
  367. data/lib/ffi/platform/mipsel-linux/types.conf +79 -79
  368. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +79 -79
  369. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +79 -79
  370. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +81 -81
  371. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +81 -81
  372. data/lib/ffi/platform/powerpc-aix/types.conf +155 -155
  373. data/lib/ffi/platform/powerpc-darwin/types.conf +63 -63
  374. data/lib/ffi/platform/powerpc-linux/types.conf +108 -78
  375. data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
  376. data/lib/ffi/platform/powerpc64-linux/types.conf +81 -81
  377. data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
  378. data/lib/ffi/platform/riscv64-linux/types.conf +104 -0
  379. data/lib/ffi/platform/s390-linux/types.conf +79 -79
  380. data/lib/ffi/platform/s390x-linux/types.conf +79 -79
  381. data/lib/ffi/platform/sparc-linux/types.conf +79 -79
  382. data/lib/ffi/platform/sparc-solaris/types.conf +103 -103
  383. data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
  384. data/lib/ffi/platform/sparcv9-solaris/types.conf +103 -103
  385. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  386. data/lib/ffi/platform/x86_64-cygwin/types.conf +1 -1
  387. data/lib/ffi/platform/x86_64-darwin/types.conf +88 -84
  388. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
  389. data/lib/ffi/platform/x86_64-freebsd/types.conf +90 -90
  390. data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
  391. data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
  392. data/lib/ffi/platform/x86_64-linux/types.conf +107 -77
  393. data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
  394. data/lib/ffi/platform/x86_64-netbsd/types.conf +89 -89
  395. data/lib/ffi/platform/x86_64-openbsd/types.conf +86 -86
  396. data/lib/ffi/platform/x86_64-solaris/types.conf +96 -96
  397. data/lib/ffi/platform/x86_64-windows/types.conf +42 -110
  398. data/lib/ffi/platform.rb +43 -20
  399. data/lib/ffi/pointer.rb +26 -20
  400. data/lib/ffi/struct.rb +14 -68
  401. data/lib/ffi/struct_by_reference.rb +72 -0
  402. data/lib/ffi/struct_layout.rb +96 -0
  403. data/lib/ffi/struct_layout_builder.rb +1 -1
  404. data/lib/ffi/tools/const_generator.rb +11 -8
  405. data/lib/ffi/tools/generator.rb +47 -2
  406. data/lib/ffi/tools/generator_task.rb +13 -17
  407. data/lib/ffi/tools/struct_generator.rb +6 -5
  408. data/lib/ffi/tools/types_generator.rb +7 -4
  409. data/lib/ffi/types.rb +33 -7
  410. data/lib/ffi/variadic.rb +20 -18
  411. data/lib/ffi/version.rb +1 -1
  412. data/lib/ffi.rb +10 -3
  413. data/rakelib/ffi_gem_helper.rb +65 -0
  414. data/samples/getlogin.rb +1 -1
  415. data/samples/getpid.rb +1 -1
  416. data/samples/gettimeofday.rb +8 -8
  417. data/samples/hello.rb +2 -1
  418. data/samples/hello_ractor.rb +11 -0
  419. data/samples/inotify.rb +1 -1
  420. data/samples/pty.rb +1 -2
  421. data/samples/qsort.rb +0 -1
  422. data/samples/qsort_ractor.rb +28 -0
  423. data.tar.gz.sig +0 -0
  424. metadata +252 -153
  425. metadata.gz.sig +0 -0
  426. data/.gitignore +0 -22
  427. data/.gitmodules +0 -3
  428. data/.travis.yml +0 -52
  429. data/.yardopts +0 -5
  430. data/appveyor.yml +0 -22
  431. data/ext/ffi_c/Closure.c +0 -54
  432. data/ext/ffi_c/DataConverter.c +0 -91
  433. data/ext/ffi_c/StructByReference.c +0 -190
  434. data/ext/ffi_c/StructByReference.h +0 -50
  435. data/ext/ffi_c/libffi/.travis/build.sh +0 -34
  436. data/ext/ffi_c/libffi/.travis/install.sh +0 -22
  437. data/ext/ffi_c/libffi/.travis/site.exp +0 -18
  438. data/ext/ffi_c/libffi/.travis.yml +0 -34
  439. data/ext/ffi_c/libffi/ChangeLog.libffi +0 -584
  440. data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
  441. data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
  442. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +0 -44
  443. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +0 -44
  444. data/ext/ffi_c/win32/stdbool.h +0 -8
  445. data/ext/ffi_c/win32/stdint.h +0 -201
  446. data/samples/sample_helper.rb +0 -6
  447. data/ext/ffi_c/libffi/{.travis → .ci}/ar-lib +0 -0
  448. data/ext/ffi_c/libffi/{.travis → .ci}/compile +0 -0
  449. data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
  450. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
  451. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_many_mixed_args.c +0 -0
  452. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_many_mixed_float_double.c +0 -0
  453. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +0 -0
  454. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
  455. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large.c +0 -0
  456. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +0 -0
  457. data/lib/ffi/platform/{sparc64-linux → sparcv9-linux}/types.conf +79 -79
@@ -32,12 +32,9 @@
32
32
  #include <sys/types.h>
33
33
  #ifndef _MSC_VER
34
34
  # include <sys/param.h>
35
- # include <stdint.h>
36
- # include <stdbool.h>
37
- #else
38
- # include "win32/stdbool.h"
39
- # include "win32/stdint.h"
40
35
  #endif
36
+ #include <stdint.h>
37
+ #include <stdbool.h>
41
38
 
42
39
  #include <limits.h>
43
40
  #include <ruby.h>
@@ -58,21 +55,30 @@
58
55
  # define RB_OBJ_STRING(obj) StringValueCStr(obj)
59
56
  #endif
60
57
 
58
+ static size_t memsize(const void *data);
61
59
  static inline char* memory_address(VALUE self);
62
60
  VALUE rbffi_AbstractMemoryClass = Qnil;
63
61
  static VALUE NullPointerErrorClass = Qnil;
64
62
  static ID id_to_ptr = 0, id_plus = 0, id_call = 0;
65
63
 
66
- static VALUE
67
- memory_allocate(VALUE klass)
68
- {
69
- AbstractMemory* memory;
70
- VALUE obj;
71
- obj = Data_Make_Struct(klass, AbstractMemory, NULL, -1, memory);
72
- 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
+ };
73
75
 
74
- return obj;
76
+ static size_t
77
+ memsize(const void *data)
78
+ {
79
+ return sizeof(AbstractMemory);
75
80
  }
81
+
76
82
  #define VAL(x, swap) (unlikely(((memory->flags & MEM_SWAP) != 0)) ? swap((x)) : (x))
77
83
 
78
84
  #define NUM_OP(name, type, toNative, fromNative, swap) \
@@ -90,7 +96,7 @@ static VALUE \
90
96
  memory_put_##name(VALUE self, VALUE offset, VALUE value) \
91
97
  { \
92
98
  AbstractMemory* memory; \
93
- Data_Get_Struct(self, AbstractMemory, memory); \
99
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
94
100
  memory_op_put_##name(memory, NUM2LONG(offset), value); \
95
101
  return self; \
96
102
  } \
@@ -99,7 +105,7 @@ static VALUE \
99
105
  memory_write_##name(VALUE self, VALUE value) \
100
106
  { \
101
107
  AbstractMemory* memory; \
102
- Data_Get_Struct(self, AbstractMemory, memory); \
108
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
103
109
  memory_op_put_##name(memory, 0, value); \
104
110
  return self; \
105
111
  } \
@@ -118,7 +124,7 @@ static VALUE \
118
124
  memory_get_##name(VALUE self, VALUE offset) \
119
125
  { \
120
126
  AbstractMemory* memory; \
121
- Data_Get_Struct(self, AbstractMemory, memory); \
127
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
122
128
  return memory_op_get_##name(memory, NUM2LONG(offset)); \
123
129
  } \
124
130
  static VALUE memory_read_##name(VALUE self); \
@@ -126,7 +132,7 @@ static VALUE \
126
132
  memory_read_##name(VALUE self) \
127
133
  { \
128
134
  AbstractMemory* memory; \
129
- Data_Get_Struct(self, AbstractMemory, memory); \
135
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
130
136
  return memory_op_get_##name(memory, 0); \
131
137
  } \
132
138
  static MemoryOp memory_op_##name = { memory_op_get_##name, memory_op_put_##name }; \
@@ -135,14 +141,16 @@ static VALUE memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary); \
135
141
  static VALUE \
136
142
  memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary) \
137
143
  { \
138
- long count = RARRAY_LEN(ary); \
144
+ long count; \
139
145
  long off = NUM2LONG(offset); \
140
146
  AbstractMemory* memory = MEMORY(self); \
141
147
  long i; \
142
- checkWrite(memory); \
148
+ Check_Type(ary, T_ARRAY); \
149
+ count = RARRAY_LEN(ary); \
150
+ if (likely(count > 0)) checkWrite(memory); \
143
151
  checkBounds(memory, off, count * sizeof(type)); \
144
152
  for (i = 0; i < count; i++) { \
145
- type tmp = (type) VAL(toNative(RARRAY_PTR(ary)[i]), swap); \
153
+ type tmp = (type) VAL(toNative(RARRAY_AREF(ary, i)), swap); \
146
154
  memcpy(memory->address + off + (i * sizeof(type)), &tmp, sizeof(tmp)); \
147
155
  } \
148
156
  return self; \
@@ -162,7 +170,7 @@ memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length) \
162
170
  AbstractMemory* memory = MEMORY(self); \
163
171
  VALUE retVal = rb_ary_new2(count); \
164
172
  long i; \
165
- checkRead(memory); \
173
+ if (likely(count > 0)) checkRead(memory); \
166
174
  checkBounds(memory, off, count * sizeof(type)); \
167
175
  for (i = 0; i < count; ++i) { \
168
176
  type tmp; \
@@ -209,13 +217,13 @@ SWAPU16(uint16_t x)
209
217
  ((x >> 40) & 0x000000000000ff00ULL) | \
210
218
  ((x >> 56) & 0x00000000000000ffULL))
211
219
 
212
- static inline int32_t
220
+ static inline int32_t
213
221
  SWAPS32(int32_t x)
214
222
  {
215
223
  return bswap32(x);
216
224
  }
217
225
 
218
- static inline uint32_t
226
+ static inline uint32_t
219
227
  SWAPU32(uint32_t x)
220
228
  {
221
229
  return bswap32(x);
@@ -308,6 +316,7 @@ static VALUE
308
316
  memory_clear(VALUE self)
309
317
  {
310
318
  AbstractMemory* ptr = MEMORY(self);
319
+ checkWrite(ptr);
311
320
  memset(ptr->address, 0, ptr->size);
312
321
  return self;
313
322
  }
@@ -322,7 +331,7 @@ memory_size(VALUE self)
322
331
  {
323
332
  AbstractMemory* ptr;
324
333
 
325
- Data_Get_Struct(self, AbstractMemory, ptr);
334
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
326
335
 
327
336
  return LONG2NUM(ptr->size);
328
337
  }
@@ -341,14 +350,15 @@ memory_get(VALUE self, VALUE type_name, VALUE offset)
341
350
  AbstractMemory* ptr;
342
351
  VALUE nType;
343
352
  Type *type;
353
+ MemoryOp *op;
344
354
 
345
355
  nType = rbffi_Type_Lookup(type_name);
346
356
  if(NIL_P(nType)) goto undefined_type;
347
357
 
348
- Data_Get_Struct(self, AbstractMemory, ptr);
349
- Data_Get_Struct(nType, Type, type);
358
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
359
+ TypedData_Get_Struct(nType, Type, &rbffi_type_data_type, type);
350
360
 
351
- MemoryOp *op = get_memory_op(type);
361
+ op = get_memory_op(type);
352
362
  if(op == NULL) goto undefined_type;
353
363
 
354
364
  return op->get(ptr, NUM2LONG(offset));
@@ -373,14 +383,15 @@ memory_put(VALUE self, VALUE type_name, VALUE offset, VALUE value)
373
383
  AbstractMemory* ptr;
374
384
  VALUE nType;
375
385
  Type *type;
386
+ MemoryOp *op;
376
387
 
377
388
  nType = rbffi_Type_Lookup(type_name);
378
389
  if(NIL_P(nType)) goto undefined_type;
379
390
 
380
- Data_Get_Struct(self, AbstractMemory, ptr);
381
- Data_Get_Struct(nType, Type, type);
391
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
392
+ TypedData_Get_Struct(nType, Type, &rbffi_type_data_type, type);
382
393
 
383
- MemoryOp *op = get_memory_op(type);
394
+ op = get_memory_op(type);
384
395
  if(op == NULL) goto undefined_type;
385
396
 
386
397
  op->put(ptr, NUM2LONG(offset), value);
@@ -417,7 +428,7 @@ memory_get_string(int argc, VALUE* argv, VALUE self)
417
428
  checkBounds(ptr, off, len);
418
429
 
419
430
  end = memchr(ptr->address + off, 0, len);
420
- return rb_tainted_str_new((char *) ptr->address + off,
431
+ return rb_str_new((char *) ptr->address + off,
421
432
  (end != NULL ? end - ptr->address - off : len));
422
433
  }
423
434
 
@@ -443,17 +454,17 @@ memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
443
454
  count = (countnum == Qnil ? 0 : NUM2INT(countnum));
444
455
  retVal = rb_ary_new2(count);
445
456
 
446
- Data_Get_Struct(self, AbstractMemory, ptr);
457
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
447
458
  checkRead(ptr);
448
459
 
449
460
  if (countnum != Qnil) {
450
461
  int i;
451
462
 
452
463
  checkBounds(ptr, off, count * sizeof (char*));
453
-
464
+
454
465
  for (i = 0; i < count; ++i) {
455
466
  const char* strptr = *((const char**) (ptr->address + off) + i);
456
- rb_ary_push(retVal, (strptr == NULL ? Qnil : rb_tainted_str_new2(strptr)));
467
+ rb_ary_push(retVal, (strptr == NULL ? Qnil : rb_str_new2(strptr)));
457
468
  }
458
469
 
459
470
  } else {
@@ -463,7 +474,7 @@ memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
463
474
  if (strptr == NULL) {
464
475
  break;
465
476
  }
466
- rb_ary_push(retVal, rb_tainted_str_new2(strptr));
477
+ rb_ary_push(retVal, rb_str_new2(strptr));
467
478
  }
468
479
  }
469
480
 
@@ -477,7 +488,7 @@ memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
477
488
  * @param [Numeric] count number of strings to get. If nil, return all strings
478
489
  * @return [Array<String>]
479
490
  */
480
- static VALUE
491
+ static VALUE
481
492
  memory_read_array_of_string(int argc, VALUE* argv, VALUE self)
482
493
  {
483
494
  VALUE* rargv = ALLOCA_N(VALUE, argc + 1);
@@ -535,14 +546,14 @@ memory_get_bytes(VALUE self, VALUE offset, VALUE length)
535
546
  {
536
547
  AbstractMemory* ptr = MEMORY(self);
537
548
  long off, len;
538
-
549
+
539
550
  off = NUM2LONG(offset);
540
551
  len = NUM2LONG(length);
541
552
 
542
553
  checkRead(ptr);
543
554
  checkBounds(ptr, off, len);
544
-
545
- return rb_tainted_str_new((char *) ptr->address + off, len);
555
+
556
+ return rb_str_new((char *) ptr->address + off, len);
546
557
  }
547
558
 
548
559
  /*
@@ -583,10 +594,6 @@ memory_put_bytes(int argc, VALUE* argv, VALUE self)
583
594
  checkWrite(ptr);
584
595
  checkBounds(ptr, off, len);
585
596
 
586
- if (rb_safe_level() >= 1 && OBJ_TAINTED(str)) {
587
- rb_raise(rb_eSecurityError, "Writing unsafe string to memory");
588
- return Qnil;
589
- }
590
597
  memcpy(ptr->address + off, RSTRING_PTR(str) + idx, len);
591
598
 
592
599
  return self;
@@ -599,7 +606,7 @@ memory_put_bytes(int argc, VALUE* argv, VALUE self)
599
606
  * equivalent to :
600
607
  * memory.get_bytes(0, length)
601
608
  */
602
- static VALUE
609
+ static VALUE
603
610
  memory_read_bytes(VALUE self, VALUE length)
604
611
  {
605
612
  return memory_get_bytes(self, INT2FIX(0), length);
@@ -614,7 +621,7 @@ memory_read_bytes(VALUE self, VALUE length)
614
621
  * equivalent to :
615
622
  * memory.put_bytes(0, str, index, length)
616
623
  */
617
- static VALUE
624
+ static VALUE
618
625
  memory_write_bytes(int argc, VALUE* argv, VALUE self)
619
626
  {
620
627
  VALUE* wargv = ALLOCA_N(VALUE, argc + 1);
@@ -638,7 +645,7 @@ memory_type_size(VALUE self)
638
645
  {
639
646
  AbstractMemory* ptr;
640
647
 
641
- Data_Get_Struct(self, AbstractMemory, ptr);
648
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
642
649
 
643
650
  return INT2NUM(ptr->typeSize);
644
651
  }
@@ -647,7 +654,7 @@ memory_type_size(VALUE self)
647
654
  * Document-method: []
648
655
  * call-seq: memory[idx]
649
656
  * @param [Numeric] idx index to access in memory
650
- * @return
657
+ * @return
651
658
  * Memory read accessor.
652
659
  */
653
660
  static VALUE
@@ -656,7 +663,7 @@ memory_aref(VALUE self, VALUE idx)
656
663
  AbstractMemory* ptr;
657
664
  VALUE rbOffset = Qnil;
658
665
 
659
- Data_Get_Struct(self, AbstractMemory, ptr);
666
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
660
667
 
661
668
  rbOffset = ULONG2NUM(NUM2ULONG(idx) * ptr->typeSize);
662
669
 
@@ -666,7 +673,9 @@ memory_aref(VALUE self, VALUE idx)
666
673
  static inline char*
667
674
  memory_address(VALUE obj)
668
675
  {
669
- 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;
670
679
  }
671
680
 
672
681
  static VALUE
@@ -674,24 +683,33 @@ memory_copy_from(VALUE self, VALUE rbsrc, VALUE rblen)
674
683
  {
675
684
  AbstractMemory* dst;
676
685
 
677
- Data_Get_Struct(self, AbstractMemory, dst);
686
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, dst);
678
687
 
679
- memcpy(dst->address, rbffi_AbstractMemory_Cast(rbsrc, rbffi_AbstractMemoryClass)->address, NUM2INT(rblen));
688
+ memcpy(dst->address, rbffi_AbstractMemory_Cast(rbsrc, &rbffi_abstract_memory_data_type)->address, NUM2INT(rblen));
680
689
 
681
690
  return self;
682
691
  }
683
692
 
684
- AbstractMemory*
685
- rbffi_AbstractMemory_Cast(VALUE obj, VALUE klass)
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)
686
701
  {
687
- if (rb_obj_is_kind_of(obj, klass)) {
688
- AbstractMemory* memory;
689
- Data_Get_Struct(obj, AbstractMemory, memory);
690
- return memory;
691
- }
702
+ AbstractMemory* ptr = MEMORY(self);
703
+ ptr->flags &= ~MEM_WR;
704
+ return rb_call_super(0, NULL);
705
+ }
692
706
 
693
- rb_raise(rb_eArgError, "Invalid Memory object");
694
- return NULL;
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;
695
713
  }
696
714
 
697
715
  void
@@ -718,7 +736,7 @@ memory_op_get_strptr(AbstractMemory* ptr, long offset)
718
736
  memcpy(&tmp, ptr->address + offset, sizeof(tmp));
719
737
  }
720
738
 
721
- return tmp != NULL ? rb_tainted_str_new2(tmp) : Qnil;
739
+ return tmp != NULL ? rb_str_new2(tmp) : Qnil;
722
740
  }
723
741
 
724
742
  static void
@@ -752,9 +770,9 @@ MemoryOps rbffi_AbstractMemoryOps = {
752
770
  void
753
771
  rbffi_AbstractMemory_Init(VALUE moduleFFI)
754
772
  {
755
- /*
773
+ /*
756
774
  * Document-class: FFI::AbstractMemory
757
- *
775
+ *
758
776
  * {AbstractMemory} is the base class for many memory management classes such as {Buffer}.
759
777
  *
760
778
  * This class has a lot of methods to work with integers :
@@ -782,11 +800,11 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
782
800
  */
783
801
  VALUE classMemory = rb_define_class_under(moduleFFI, "AbstractMemory", rb_cObject);
784
802
  rbffi_AbstractMemoryClass = classMemory;
785
- /*
786
- * Document-variable: FFI::AbstractMemory
803
+ /*
804
+ * Document-variable: FFI::AbstractMemory
787
805
  */
788
806
  rb_global_variable(&rbffi_AbstractMemoryClass);
789
- rb_define_alloc_func(classMemory, memory_allocate);
807
+ rb_undef_alloc_func(classMemory);
790
808
 
791
809
  NullPointerErrorClass = rb_define_class_under(moduleFFI, "NullPointerError", rb_eRuntimeError);
792
810
  /* Document-variable: NullPointerError */
@@ -811,13 +829,13 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
811
829
  rb_define_method(classMemory, "read_array_of_" #type, memory_read_array_of_##type, 1); \
812
830
  rb_define_method(classMemory, "write_array_of_u" #type, memory_write_array_of_u##type, 1); \
813
831
  rb_define_method(classMemory, "read_array_of_u" #type, memory_read_array_of_u##type, 1);
814
-
832
+
815
833
  INT(int8);
816
834
  INT(int16);
817
835
  INT(int32);
818
836
  INT(int64);
819
837
  INT(long);
820
-
838
+
821
839
  #define ALIAS(name, old) \
822
840
  rb_define_alias(classMemory, "put_" #name, "put_" #old); \
823
841
  rb_define_alias(classMemory, "get_" #name, "get_" #old); \
@@ -835,12 +853,12 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
835
853
  rb_define_alias(classMemory, "read_array_of_" #name, "read_array_of_" #old); \
836
854
  rb_define_alias(classMemory, "write_array_of_u" #name, "write_array_of_u" #old); \
837
855
  rb_define_alias(classMemory, "read_array_of_u" #name, "read_array_of_u" #old);
838
-
856
+
839
857
  ALIAS(char, int8);
840
858
  ALIAS(short, int16);
841
859
  ALIAS(int, int32);
842
860
  ALIAS(long_long, int64);
843
-
861
+
844
862
  /*
845
863
  * Document-method: put_float32
846
864
  * call-seq: memory.put_float32offset, value)
@@ -1101,6 +1119,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
1101
1119
  rb_define_method(classMemory, "type_size", memory_type_size, 0);
1102
1120
  rb_define_method(classMemory, "[]", memory_aref, 1);
1103
1121
  rb_define_method(classMemory, "__copy_from__", memory_copy_from, 2);
1122
+ rb_define_method(classMemory, "freeze", memory_freeze, 0 );
1104
1123
 
1105
1124
  id_to_ptr = rb_intern("to_ptr");
1106
1125
  id_call = rb_intern("call");
@@ -86,12 +86,13 @@ struct AbstractMemory_ {
86
86
  };
87
87
 
88
88
 
89
+ extern const rb_data_type_t rbffi_abstract_memory_data_type;
89
90
  extern VALUE rbffi_AbstractMemoryClass;
90
91
  extern MemoryOps rbffi_AbstractMemoryOps;
91
92
 
92
93
  extern void rbffi_AbstractMemory_Init(VALUE ffiModule);
93
94
 
94
- extern AbstractMemory* rbffi_AbstractMemory_Cast(VALUE obj, VALUE klass);
95
+ extern AbstractMemory* rbffi_AbstractMemory_Cast(VALUE obj, const rb_data_type_t *data_type);
95
96
 
96
97
  extern void rbffi_AbstractMemory_Error(AbstractMemory *, int op);
97
98
 
@@ -161,7 +162,7 @@ get_memory_op(Type* type)
161
162
  }
162
163
  }
163
164
 
164
- #define MEMORY(obj) rbffi_AbstractMemory_Cast((obj), rbffi_AbstractMemoryClass)
165
+ #define MEMORY(obj) rbffi_AbstractMemory_Cast((obj), &rbffi_abstract_memory_data_type)
165
166
  #define MEMORY_PTR(obj) MEMORY((obj))->address
166
167
  #define MEMORY_LEN(obj) MEMORY((obj))->size
167
168
 
@@ -29,12 +29,30 @@
29
29
 
30
30
  #include <ruby.h>
31
31
  #include <ffi.h>
32
+ #include "compat.h"
32
33
  #include "ArrayType.h"
33
34
 
34
35
  static VALUE array_type_s_allocate(VALUE klass);
35
36
  static VALUE array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength);
36
- static void array_type_mark(ArrayType *);
37
- static void array_type_free(ArrayType *);
37
+ static void array_type_mark(void *);
38
+ static void array_type_compact(void *);
39
+ static void array_type_free(void *);
40
+ static size_t array_type_memsize(const void *);
41
+
42
+ const rb_data_type_t rbffi_array_type_data_type = { /* extern */
43
+ .wrap_struct_name = "FFI::ArrayType",
44
+ .function = {
45
+ .dmark = array_type_mark,
46
+ .dfree = array_type_free,
47
+ .dsize = array_type_memsize,
48
+ ffi_compact_callback( array_type_compact )
49
+ },
50
+ .parent = &rbffi_type_data_type,
51
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
52
+ // macro to update VALUE references, as to trigger write barriers.
53
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
54
+ };
55
+
38
56
 
39
57
  VALUE rbffi_ArrayTypeClass = Qnil;
40
58
 
@@ -44,32 +62,50 @@ array_type_s_allocate(VALUE klass)
44
62
  ArrayType* array;
45
63
  VALUE obj;
46
64
 
47
- obj = Data_Make_Struct(klass, ArrayType, array_type_mark, array_type_free, array);
65
+ obj = TypedData_Make_Struct(klass, ArrayType, &rbffi_array_type_data_type, array);
48
66
 
49
67
  array->base.nativeType = NATIVE_ARRAY;
50
68
  array->base.ffiType = xcalloc(1, sizeof(*array->base.ffiType));
51
69
  array->base.ffiType->type = FFI_TYPE_STRUCT;
52
70
  array->base.ffiType->size = 0;
53
71
  array->base.ffiType->alignment = 0;
54
- array->rbComponentType = Qnil;
72
+ RB_OBJ_WRITE(obj, &array->rbComponentType, Qnil);
55
73
 
56
74
  return obj;
57
75
  }
58
76
 
59
77
  static void
60
- array_type_mark(ArrayType *array)
78
+ array_type_mark(void *data)
79
+ {
80
+ ArrayType *array = (ArrayType *)data;
81
+ rb_gc_mark_movable(array->rbComponentType);
82
+ }
83
+
84
+ static void
85
+ array_type_compact(void *data)
61
86
  {
62
- rb_gc_mark(array->rbComponentType);
87
+ ArrayType *array = (ArrayType *)data;
88
+ ffi_gc_location(array->rbComponentType);
63
89
  }
64
90
 
65
91
  static void
66
- array_type_free(ArrayType *array)
92
+ array_type_free(void *data)
67
93
  {
94
+ ArrayType *array = (ArrayType *)data;
68
95
  xfree(array->base.ffiType);
69
96
  xfree(array->ffiTypes);
70
97
  xfree(array);
71
98
  }
72
99
 
100
+ static size_t
101
+ array_type_memsize(const void *data)
102
+ {
103
+ const ArrayType *array = (const ArrayType *)data;
104
+ size_t memsize = sizeof(ArrayType);
105
+ memsize += array->length * sizeof(*array->ffiTypes);
106
+ memsize += sizeof(*array->base.ffiType);
107
+ return memsize;
108
+ }
73
109
 
74
110
  /*
75
111
  * call-seq: initialize(component_type, length)
@@ -84,12 +120,12 @@ array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength)
84
120
  ArrayType* array;
85
121
  int i;
86
122
 
87
- Data_Get_Struct(self, ArrayType, array);
123
+ TypedData_Get_Struct(self, ArrayType, &rbffi_array_type_data_type, array);
88
124
 
89
125
  array->length = NUM2UINT(rbLength);
90
- array->rbComponentType = rbComponentType;
91
- Data_Get_Struct(rbComponentType, Type, array->componentType);
92
-
126
+ RB_OBJ_WRITE(self, &array->rbComponentType, rbComponentType);
127
+ TypedData_Get_Struct(rbComponentType, Type, &rbffi_type_data_type, array->componentType);
128
+
93
129
  array->ffiTypes = xcalloc(array->length + 1, sizeof(*array->ffiTypes));
94
130
  array->base.ffiType->elements = array->ffiTypes;
95
131
  array->base.ffiType->size = array->componentType->ffiType->size * array->length;
@@ -112,7 +148,7 @@ array_type_length(VALUE self)
112
148
  {
113
149
  ArrayType* array;
114
150
 
115
- Data_Get_Struct(self, ArrayType, array);
151
+ TypedData_Get_Struct(self, ArrayType, &rbffi_array_type_data_type, array);
116
152
 
117
153
  return UINT2NUM(array->length);
118
154
  }
@@ -127,7 +163,7 @@ array_type_element_type(VALUE self)
127
163
  {
128
164
  ArrayType* array;
129
165
 
130
- Data_Get_Struct(self, ArrayType, array);
166
+ TypedData_Get_Struct(self, ArrayType, &rbffi_array_type_data_type, array);
131
167
 
132
168
  return array->rbComponentType;
133
169
  }
@@ -48,6 +48,7 @@ typedef struct ArrayType_ {
48
48
  } ArrayType;
49
49
 
50
50
  extern void rbffi_ArrayType_Init(VALUE moduleFFI);
51
+ extern const rb_data_type_t rbffi_array_type_data_type;
51
52
  extern VALUE rbffi_ArrayTypeClass;
52
53
 
53
54