ffi 1.15.5 → 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +118 -0
  4. data/Gemfile +10 -3
  5. data/README.md +4 -3
  6. data/Rakefile +25 -10
  7. data/ext/ffi_c/AbstractMemory.c +99 -74
  8. data/ext/ffi_c/AbstractMemory.h +3 -2
  9. data/ext/ffi_c/ArrayType.c +51 -15
  10. data/ext/ffi_c/ArrayType.h +1 -0
  11. data/ext/ffi_c/Buffer.c +90 -33
  12. data/ext/ffi_c/Call.c +29 -12
  13. data/ext/ffi_c/Call.h +3 -2
  14. data/ext/ffi_c/DynamicLibrary.c +90 -27
  15. data/ext/ffi_c/Function.c +244 -98
  16. data/ext/ffi_c/Function.h +1 -0
  17. data/ext/ffi_c/FunctionInfo.c +81 -25
  18. data/ext/ffi_c/LastError.c +29 -11
  19. data/ext/ffi_c/MappedType.c +66 -23
  20. data/ext/ffi_c/MappedType.h +0 -2
  21. data/ext/ffi_c/MemoryPointer.c +36 -9
  22. data/ext/ffi_c/MethodHandle.c +3 -1
  23. data/ext/ffi_c/Pointer.c +82 -40
  24. data/ext/ffi_c/Pointer.h +1 -0
  25. data/ext/ffi_c/Struct.c +166 -84
  26. data/ext/ffi_c/Struct.h +7 -4
  27. data/ext/ffi_c/StructByValue.c +48 -16
  28. data/ext/ffi_c/StructLayout.c +130 -61
  29. data/ext/ffi_c/Type.c +120 -51
  30. data/ext/ffi_c/Type.h +3 -1
  31. data/ext/ffi_c/Types.c +8 -2
  32. data/ext/ffi_c/Types.h +0 -1
  33. data/ext/ffi_c/Variadic.c +71 -26
  34. data/ext/ffi_c/compat.h +22 -22
  35. data/ext/ffi_c/extconf.rb +19 -2
  36. data/ext/ffi_c/ffi.c +4 -0
  37. data/ext/ffi_c/libffi/.allow-ai-service +0 -0
  38. data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
  39. data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
  40. data/ext/ffi_c/libffi/.appveyor.yml +27 -9
  41. data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
  42. data/ext/ffi_c/libffi/{.travis → .ci}/build-in-container.sh +4 -6
  43. data/ext/ffi_c/libffi/.ci/build.sh +124 -0
  44. data/ext/ffi_c/libffi/{.travis → .ci}/install.sh +14 -7
  45. data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
  46. data/ext/ffi_c/libffi/{.travis → .ci}/site.exp +5 -3
  47. data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
  48. data/ext/ffi_c/libffi/.github/workflows/build.yml +479 -0
  49. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +172 -0
  50. data/ext/ffi_c/libffi/.gitignore +10 -2
  51. data/ext/ffi_c/libffi/LICENSE +1 -1
  52. data/ext/ffi_c/libffi/Makefile.am +12 -5
  53. data/ext/ffi_c/libffi/Makefile.in +118 -51
  54. data/ext/ffi_c/libffi/README.md +150 -105
  55. data/ext/ffi_c/libffi/acinclude.m4 +10 -112
  56. data/ext/ffi_c/libffi/compile +348 -0
  57. data/ext/ffi_c/libffi/config.guess +623 -556
  58. data/ext/ffi_c/libffi/config.sub +75 -34
  59. data/ext/ffi_c/libffi/configure +4571 -3830
  60. data/ext/ffi_c/libffi/configure.ac +64 -28
  61. data/ext/ffi_c/libffi/configure.host +26 -7
  62. data/ext/ffi_c/libffi/doc/Makefile.in +9 -6
  63. data/ext/ffi_c/libffi/doc/libffi.texi +82 -33
  64. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  65. data/ext/ffi_c/libffi/fficonfig.h.in +12 -47
  66. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +163 -52
  67. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  68. data/ext/ffi_c/libffi/include/Makefile.in +10 -9
  69. data/ext/ffi_c/libffi/include/ffi.h.in +55 -60
  70. data/ext/ffi_c/libffi/include/ffi_cfi.h +21 -0
  71. data/ext/ffi_c/libffi/include/ffi_common.h +33 -2
  72. data/ext/ffi_c/libffi/include/tramp.h +45 -0
  73. data/ext/ffi_c/libffi/install-sh +92 -69
  74. data/ext/ffi_c/libffi/libffi.map.in +5 -0
  75. data/ext/ffi_c/libffi/libtool-version +2 -2
  76. data/ext/ffi_c/libffi/ltmain.sh +518 -333
  77. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +18 -14
  78. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +108 -72
  79. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +76 -45
  80. data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
  81. data/ext/ffi_c/libffi/man/Makefile.in +9 -6
  82. data/ext/ffi_c/libffi/missing +1 -1
  83. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +2 -2
  84. data/ext/ffi_c/libffi/msvcc.sh +1 -1
  85. data/ext/ffi_c/libffi/src/aarch64/ffi.c +172 -55
  86. data/ext/ffi_c/libffi/src/aarch64/internal.h +32 -0
  87. data/ext/ffi_c/libffi/src/aarch64/sysv.S +331 -87
  88. data/ext/ffi_c/libffi/src/arc/arcompact.S +169 -94
  89. data/ext/ffi_c/libffi/src/arc/ffi.c +325 -148
  90. data/ext/ffi_c/libffi/src/arc/ffitarget.h +14 -0
  91. data/ext/ffi_c/libffi/src/arm/ffi.c +62 -17
  92. data/ext/ffi_c/libffi/src/arm/ffitarget.h +3 -3
  93. data/ext/ffi_c/libffi/src/arm/internal.h +10 -0
  94. data/ext/ffi_c/libffi/src/arm/sysv.S +113 -42
  95. data/ext/ffi_c/libffi/src/closures.c +136 -50
  96. data/ext/ffi_c/libffi/src/debug.c +2 -2
  97. data/ext/ffi_c/libffi/src/dlmalloc.c +6 -1
  98. data/ext/ffi_c/libffi/src/ia64/ffi.c +12 -0
  99. data/ext/ffi_c/libffi/src/ia64/unix.S +20 -2
  100. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +624 -0
  101. data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
  102. data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
  103. data/ext/ffi_c/libffi/src/m32r/ffi.c +31 -14
  104. data/ext/ffi_c/libffi/src/mips/ffi.c +250 -67
  105. data/ext/ffi_c/libffi/src/mips/ffitarget.h +7 -0
  106. data/ext/ffi_c/libffi/src/mips/n32.S +193 -33
  107. data/ext/ffi_c/libffi/src/mips/o32.S +61 -4
  108. data/ext/ffi_c/libffi/src/moxie/ffi.c +47 -22
  109. data/ext/ffi_c/libffi/src/or1k/ffi.c +25 -12
  110. data/ext/ffi_c/libffi/src/pa/ffi.c +32 -33
  111. data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
  112. data/ext/ffi_c/libffi/src/pa/ffitarget.h +22 -8
  113. data/ext/ffi_c/libffi/src/pa/hpux32.S +83 -36
  114. data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
  115. data/ext/ffi_c/libffi/src/pa/linux.S +82 -35
  116. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +36 -24
  117. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1 -1
  118. data/ext/ffi_c/libffi/src/powerpc/linux64.S +2 -0
  119. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +2 -0
  120. data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
  121. data/ext/ffi_c/libffi/src/prep_cif.c +22 -2
  122. data/ext/ffi_c/libffi/src/riscv/ffi.c +37 -4
  123. data/ext/ffi_c/libffi/src/sparc/ffi64.c +23 -1
  124. data/ext/ffi_c/libffi/src/tramp.c +716 -0
  125. data/ext/ffi_c/libffi/src/types.c +4 -6
  126. data/ext/ffi_c/libffi/src/wasm32/ffi.c +947 -0
  127. data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
  128. data/ext/ffi_c/libffi/src/x86/ffi.c +99 -37
  129. data/ext/ffi_c/libffi/src/x86/ffi64.c +67 -12
  130. data/ext/ffi_c/libffi/src/x86/ffitarget.h +9 -5
  131. data/ext/ffi_c/libffi/src/x86/ffiw64.c +44 -1
  132. data/ext/ffi_c/libffi/src/x86/internal.h +14 -0
  133. data/ext/ffi_c/libffi/src/x86/internal64.h +14 -0
  134. data/ext/ffi_c/libffi/src/x86/sysv.S +172 -38
  135. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +91 -88
  136. data/ext/ffi_c/libffi/src/x86/unix64.S +96 -6
  137. data/ext/ffi_c/libffi/src/x86/win64.S +20 -7
  138. data/ext/ffi_c/libffi/src/xtensa/ffi.c +16 -8
  139. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +4 -0
  140. data/ext/ffi_c/libffi/src/xtensa/sysv.S +26 -16
  141. data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -114
  142. data/ext/ffi_c/libffi/testsuite/Makefile.in +89 -121
  143. data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
  144. data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
  145. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +86 -0
  146. data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
  147. data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
  148. data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
  149. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +43 -21
  150. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +2 -2
  151. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1 -0
  152. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +5 -1
  153. data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
  154. data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
  155. data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
  156. data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +28 -3
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +3 -0
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +5 -0
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +8 -9
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +2 -2
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +2 -2
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +2 -2
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +1 -1
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +1 -119
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
  181. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +13 -0
  182. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +11 -0
  183. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +15 -0
  184. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c +3 -2
  185. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c +2 -0
  186. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c +2 -0
  187. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c +21 -1
  188. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c +2 -0
  189. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c +2 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c +2 -0
  191. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c +7 -6
  192. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c +6 -0
  193. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c +18 -0
  194. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c +22 -0
  195. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c +24 -0
  196. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c +29 -0
  197. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c +4 -0
  198. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c +19 -1
  199. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c +21 -1
  200. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c +35 -3
  201. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c +13 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c +19 -0
  203. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c +13 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c +13 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +18 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c +22 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c +13 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c +29 -1
  209. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c +19 -1
  210. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c +24 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c +28 -1
  212. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c +24 -2
  213. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c +39 -1
  214. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c +25 -1
  215. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c +14 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c +14 -1
  217. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c +14 -2
  218. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c +19 -1
  219. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c +19 -1
  220. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c +20 -1
  221. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c +40 -25
  222. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c +40 -3
  223. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c +19 -1
  224. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c +18 -1
  225. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c +18 -3
  226. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c +18 -1
  227. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c +18 -1
  228. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c +19 -1
  229. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c +19 -1
  230. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c +3 -1
  231. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c +9 -1
  232. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c +4 -0
  233. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c +11 -1
  234. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c +22 -3
  235. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c +5 -1
  236. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c +6 -1
  237. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c +9 -1
  238. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c +9 -1
  239. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c +6 -2
  240. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c +9 -1
  241. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c +5 -0
  242. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c +10 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c +3 -0
  244. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c +2 -0
  245. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c +3 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +11 -0
  247. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c +3 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c +4 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +4 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +4 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c +2 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c +3 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -138
  254. data/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c +21 -21
  255. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c +32 -9
  256. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c +1 -1
  257. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c +12 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +21 -5
  259. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c +10 -1
  262. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c +10 -1
  263. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c +9 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c +9 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c +11 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c +9 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c +11 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c +11 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c +1 -1
  273. data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c +1 -1
  274. data/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c +6 -1
  275. data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc +2 -1
  276. data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc +1 -0
  277. data/ext/ffi_c/libffi.bsd.mk +2 -2
  278. data/ext/ffi_c/libffi.darwin.mk +2 -2
  279. data/ext/ffi_c/libffi.gnu.mk +2 -2
  280. data/ext/ffi_c/rbffi.h +1 -1
  281. data/ffi.gemspec +3 -3
  282. data/lib/ffi/autopointer.rb +8 -31
  283. data/lib/ffi/compat.rb +43 -0
  284. data/lib/ffi/data_converter.rb +2 -2
  285. data/lib/ffi/dynamic_library.rb +118 -0
  286. data/lib/ffi/enum.rb +18 -12
  287. data/lib/ffi/ffi.rb +3 -0
  288. data/lib/ffi/function.rb +71 -0
  289. data/lib/ffi/io.rb +2 -2
  290. data/lib/ffi/library.rb +72 -88
  291. data/lib/ffi/library_path.rb +109 -0
  292. data/lib/ffi/managedstruct.rb +1 -1
  293. data/lib/ffi/platform/aarch64-linux/types.conf +74 -3
  294. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  295. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  296. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  297. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  298. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  299. data/lib/ffi/platform.rb +15 -13
  300. data/lib/ffi/pointer.rb +6 -6
  301. data/lib/ffi/struct.rb +6 -5
  302. data/lib/ffi/struct_layout.rb +3 -3
  303. data/lib/ffi/struct_layout_builder.rb +9 -9
  304. data/lib/ffi/types.rb +65 -37
  305. data/lib/ffi/variadic.rb +19 -8
  306. data/lib/ffi/version.rb +1 -1
  307. data/samples/hello_ractor.rb +11 -0
  308. data/samples/qsort_ractor.rb +28 -0
  309. data/sig/ffi/abstract_memory.rbs +165 -0
  310. data/sig/ffi/auto_pointer.rbs +27 -0
  311. data/sig/ffi/buffer.rbs +18 -0
  312. data/sig/ffi/data_converter.rbs +10 -0
  313. data/sig/ffi/dynamic_library.rbs +9 -0
  314. data/sig/ffi/enum.rbs +38 -0
  315. data/sig/ffi/function.rbs +39 -0
  316. data/sig/ffi/library.rbs +42 -0
  317. data/sig/ffi/native_type.rbs +86 -0
  318. data/sig/ffi/pointer.rbs +42 -0
  319. data/sig/ffi/struct.rbs +76 -0
  320. data/sig/ffi/struct_by_reference.rbs +11 -0
  321. data/sig/ffi/struct_by_value.rbs +7 -0
  322. data/sig/ffi/struct_layout.rbs +9 -0
  323. data/sig/ffi/struct_layout_builder.rbs +5 -0
  324. data/sig/ffi/type.rbs +39 -0
  325. data/sig/ffi.rbs +26 -0
  326. data.tar.gz.sig +0 -0
  327. metadata +122 -28
  328. metadata.gz.sig +1 -0
  329. data/ext/ffi_c/libffi/.travis/build-cross-in-container.sh +0 -14
  330. data/ext/ffi_c/libffi/.travis/build.sh +0 -142
  331. data/ext/ffi_c/libffi/.travis.yml +0 -83
  332. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c +0 -44
  333. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c +0 -44
  334. /data/ext/ffi_c/libffi/{.travis → .ci}/ar-lib +0 -0
  335. /data/ext/ffi_c/libffi/{.travis → .ci}/bfin-sim.exp +0 -0
  336. /data/ext/ffi_c/libffi/{.travis → .ci}/compile +0 -0
  337. /data/ext/ffi_c/libffi/{.travis → .ci}/m32r-sim.exp +0 -0
  338. /data/ext/ffi_c/libffi/{.travis → .ci}/moxie-sim.exp +0 -0
  339. /data/ext/ffi_c/libffi/{.travis → .ci}/or1k-sim.exp +0 -0
  340. /data/ext/ffi_c/libffi/{.travis → .ci}/powerpc-eabisim.exp +0 -0
  341. /data/ext/ffi_c/libffi/{.travis → .ci}/wine-sim.exp +0 -0
  342. /data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
  343. /data/lib/ffi/platform/{sparc64-linux → sparcv9-linux}/types.conf +0 -0
@@ -49,20 +49,36 @@
49
49
 
50
50
  static VALUE sbv_allocate(VALUE);
51
51
  static VALUE sbv_initialize(VALUE, VALUE);
52
- static void sbv_mark(StructByValue *);
53
- static void sbv_free(StructByValue *);
52
+ static void sbv_mark(void *);
53
+ static void sbv_compact(void *);
54
+ static void sbv_free(void *);
55
+ static size_t sbv_memsize(const void *);
54
56
 
55
57
  VALUE rbffi_StructByValueClass = Qnil;
56
58
 
59
+ static const rb_data_type_t sbv_type_data_type = {
60
+ .wrap_struct_name = "FFI::StructByValue",
61
+ .function = {
62
+ .dmark = sbv_mark,
63
+ .dfree = sbv_free,
64
+ .dsize = sbv_memsize,
65
+ ffi_compact_callback( sbv_compact )
66
+ },
67
+ .parent = &rbffi_type_data_type,
68
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
69
+ // macro to update VALUE references, as to trigger write barriers.
70
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
71
+ };
72
+
57
73
  static VALUE
58
74
  sbv_allocate(VALUE klass)
59
75
  {
60
76
  StructByValue* sbv;
61
77
 
62
- VALUE obj = Data_Make_Struct(klass, StructByValue, sbv_mark, sbv_free, sbv);
78
+ VALUE obj = TypedData_Make_Struct(klass, StructByValue, &sbv_type_data_type, sbv);
63
79
 
64
- sbv->rbStructClass = Qnil;
65
- sbv->rbStructLayout = Qnil;
80
+ RB_OBJ_WRITE(obj, &sbv->rbStructClass, Qnil);
81
+ RB_OBJ_WRITE(obj, &sbv->rbStructLayout, Qnil);
66
82
  sbv->base.nativeType = NATIVE_STRUCT;
67
83
 
68
84
  sbv->base.ffiType = xcalloc(1, sizeof(*sbv->base.ffiType));
@@ -85,38 +101,54 @@ sbv_initialize(VALUE self, VALUE rbStructClass)
85
101
  rb_raise(rb_eTypeError, "wrong type in @layout ivar (expected FFI::StructLayout)");
86
102
  }
87
103
 
88
- Data_Get_Struct(rbLayout, StructLayout, layout);
89
- Data_Get_Struct(self, StructByValue, sbv);
90
- sbv->rbStructClass = rbStructClass;
91
- sbv->rbStructLayout = rbLayout;
104
+ TypedData_Get_Struct(rbLayout, StructLayout, &rbffi_struct_layout_data_type, layout);
105
+ TypedData_Get_Struct(self, StructByValue, &sbv_type_data_type, sbv);
106
+ RB_OBJ_WRITE(self, &sbv->rbStructClass, rbStructClass);
107
+ RB_OBJ_WRITE(self, &sbv->rbStructLayout, rbLayout);
92
108
 
93
109
  /* We can just use everything from the ffi_type directly */
94
110
  *sbv->base.ffiType = *layout->base.ffiType;
95
-
111
+
96
112
  return self;
97
113
  }
98
114
 
99
115
  static void
100
- sbv_mark(StructByValue *sbv)
116
+ sbv_mark(void *data)
117
+ {
118
+ StructByValue *sbv = (StructByValue *)data;
119
+ rb_gc_mark_movable(sbv->rbStructClass);
120
+ rb_gc_mark_movable(sbv->rbStructLayout);
121
+ }
122
+
123
+ static void
124
+ sbv_compact(void *data)
101
125
  {
102
- rb_gc_mark(sbv->rbStructClass);
103
- rb_gc_mark(sbv->rbStructLayout);
126
+ StructByValue *sbv = (StructByValue *)data;
127
+ ffi_gc_location(sbv->rbStructClass);
128
+ ffi_gc_location(sbv->rbStructLayout);
104
129
  }
105
130
 
106
131
  static void
107
- sbv_free(StructByValue *sbv)
132
+ sbv_free(void *data)
108
133
  {
134
+ StructByValue *sbv = (StructByValue *)data;
109
135
  xfree(sbv->base.ffiType);
110
136
  xfree(sbv);
111
137
  }
112
138
 
139
+ static size_t
140
+ sbv_memsize(const void *data)
141
+ {
142
+ const StructByValue *sbv = (const StructByValue *)data;
143
+ return sizeof(StructByValue) + sizeof(*sbv->base.ffiType);
144
+ }
113
145
 
114
146
  static VALUE
115
147
  sbv_layout(VALUE self)
116
148
  {
117
149
  StructByValue* sbv;
118
150
 
119
- Data_Get_Struct(self, StructByValue, sbv);
151
+ TypedData_Get_Struct(self, StructByValue, &sbv_type_data_type, sbv);
120
152
  return sbv->rbStructLayout;
121
153
  }
122
154
 
@@ -125,7 +157,7 @@ sbv_struct_class(VALUE self)
125
157
  {
126
158
  StructByValue* sbv;
127
159
 
128
- Data_Get_Struct(self, StructByValue, sbv);
160
+ TypedData_Get_Struct(self, StructByValue, &sbv_type_data_type, sbv);
129
161
 
130
162
  return sbv->rbStructClass;
131
163
  }
@@ -51,9 +51,13 @@
51
51
 
52
52
  #define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1)
53
53
 
54
- static void struct_layout_mark(StructLayout *);
55
- static void struct_layout_free(StructLayout *);
56
- static void struct_field_mark(StructField* );
54
+ static void struct_layout_mark(void *);
55
+ static void struct_layout_compact(void *);
56
+ static void struct_layout_free(void *);
57
+ static size_t struct_layout_memsize(const void *);
58
+ static void struct_field_mark(void *);
59
+ static void struct_field_compact(void *);
60
+ static size_t struct_field_memsize(const void *);
57
61
 
58
62
  VALUE rbffi_StructLayoutFieldClass = Qnil;
59
63
  VALUE rbffi_StructLayoutNumberFieldClass = Qnil, rbffi_StructLayoutPointerFieldClass = Qnil;
@@ -62,6 +66,33 @@ VALUE rbffi_StructLayoutFunctionFieldClass = Qnil, rbffi_StructLayoutArrayFieldC
62
66
 
63
67
  VALUE rbffi_StructLayoutClass = Qnil;
64
68
 
69
+ const rb_data_type_t rbffi_struct_layout_data_type = { /* extern */
70
+ .wrap_struct_name = "FFI::StructLayout",
71
+ .function = {
72
+ .dmark = struct_layout_mark,
73
+ .dfree = struct_layout_free,
74
+ .dsize = struct_layout_memsize,
75
+ ffi_compact_callback( struct_layout_compact )
76
+ },
77
+ .parent = &rbffi_type_data_type,
78
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
79
+ // macro to update VALUE references, as to trigger write barriers.
80
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
81
+ };
82
+
83
+ const rb_data_type_t rbffi_struct_field_data_type = { /* extern */
84
+ .wrap_struct_name = "FFI::StructField",
85
+ .function = {
86
+ .dmark = struct_field_mark,
87
+ .dfree = RUBY_TYPED_DEFAULT_FREE,
88
+ .dsize = struct_field_memsize,
89
+ ffi_compact_callback( struct_field_compact )
90
+ },
91
+ .parent = &rbffi_type_data_type,
92
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
93
+ // macro to update VALUE references, as to trigger write barriers.
94
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
95
+ };
65
96
 
66
97
  static VALUE
67
98
  struct_field_allocate(VALUE klass)
@@ -69,24 +100,39 @@ struct_field_allocate(VALUE klass)
69
100
  StructField* field;
70
101
  VALUE obj;
71
102
 
72
- obj = Data_Make_Struct(klass, StructField, struct_field_mark, -1, field);
73
- field->rbType = Qnil;
74
- field->rbName = Qnil;
103
+ obj = TypedData_Make_Struct(klass, StructField, &rbffi_struct_field_data_type, field);
104
+ RB_OBJ_WRITE(obj, &field->rbType, Qnil);
105
+ RB_OBJ_WRITE(obj, &field->rbName, Qnil);
75
106
 
76
107
  return obj;
77
108
  }
78
109
 
79
110
  static void
80
- struct_field_mark(StructField* f)
111
+ struct_field_mark(void *data)
81
112
  {
82
- rb_gc_mark(f->rbType);
83
- rb_gc_mark(f->rbName);
113
+ StructField *f = (StructField *)data;
114
+ rb_gc_mark_movable(f->rbType);
115
+ rb_gc_mark_movable(f->rbName);
116
+ }
117
+
118
+ static void
119
+ struct_field_compact(void *data)
120
+ {
121
+ StructField *f = (StructField *)data;
122
+ ffi_gc_location(f->rbType);
123
+ ffi_gc_location(f->rbName);
124
+ }
125
+
126
+ static size_t
127
+ struct_field_memsize(const void *data)
128
+ {
129
+ return sizeof(StructField);
84
130
  }
85
131
 
86
132
  /*
87
133
  * call-seq: initialize(name, offset, type)
88
134
  * @param [String,Symbol] name
89
- * @param [Fixnum] offset
135
+ * @param [Integer] offset
90
136
  * @param [FFI::Type] type
91
137
  * @return [self]
92
138
  * A new FFI::StructLayout::Field instance.
@@ -98,7 +144,7 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
98
144
  StructField* field;
99
145
  int nargs;
100
146
 
101
- Data_Get_Struct(self, StructField, field);
147
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
102
148
 
103
149
  nargs = rb_scan_args(argc, argv, "3", &rbName, &rbOffset, &rbType);
104
150
 
@@ -115,9 +161,9 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
115
161
  }
116
162
 
117
163
  field->offset = NUM2UINT(rbOffset);
118
- field->rbName = (TYPE(rbName) == T_SYMBOL) ? rbName : rb_str_intern(rbName);
119
- field->rbType = rbType;
120
- Data_Get_Struct(field->rbType, Type, field->type);
164
+ RB_OBJ_WRITE(self, &field->rbName, (TYPE(rbName) == T_SYMBOL) ? rbName : rb_str_intern(rbName));
165
+ RB_OBJ_WRITE(self, &field->rbType, rbType);
166
+ TypedData_Get_Struct(field->rbType, Type, &rbffi_type_data_type, field->type);
121
167
  field->memoryOp = get_memory_op(field->type);
122
168
  field->referenceIndex = -1;
123
169
 
@@ -135,45 +181,47 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
135
181
  break;
136
182
  }
137
183
 
184
+ rb_obj_freeze(self);
185
+
138
186
  return self;
139
187
  }
140
188
 
141
189
  /*
142
190
  * call-seq: offset
143
- * @return [Numeric]
191
+ * @return [Integer]
144
192
  * Get the field offset.
145
193
  */
146
194
  static VALUE
147
195
  struct_field_offset(VALUE self)
148
196
  {
149
197
  StructField* field;
150
- Data_Get_Struct(self, StructField, field);
198
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
151
199
  return UINT2NUM(field->offset);
152
200
  }
153
201
 
154
202
  /*
155
203
  * call-seq: size
156
- * @return [Numeric]
204
+ * @return [Integer]
157
205
  * Get the field size.
158
206
  */
159
207
  static VALUE
160
208
  struct_field_size(VALUE self)
161
209
  {
162
210
  StructField* field;
163
- Data_Get_Struct(self, StructField, field);
211
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
164
212
  return UINT2NUM(field->type->ffiType->size);
165
213
  }
166
214
 
167
215
  /*
168
216
  * call-seq: alignment
169
- * @return [Numeric]
217
+ * @return [Integer]
170
218
  * Get the field alignment.
171
219
  */
172
220
  static VALUE
173
221
  struct_field_alignment(VALUE self)
174
222
  {
175
223
  StructField* field;
176
- Data_Get_Struct(self, StructField, field);
224
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
177
225
  return UINT2NUM(field->type->ffiType->alignment);
178
226
  }
179
227
 
@@ -186,7 +234,7 @@ static VALUE
186
234
  struct_field_type(VALUE self)
187
235
  {
188
236
  StructField* field;
189
- Data_Get_Struct(self, StructField, field);
237
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
190
238
 
191
239
  return field->rbType;
192
240
  }
@@ -200,7 +248,7 @@ static VALUE
200
248
  struct_field_name(VALUE self)
201
249
  {
202
250
  StructField* field;
203
- Data_Get_Struct(self, StructField, field);
251
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
204
252
  return field->rbName;
205
253
  }
206
254
 
@@ -215,7 +263,7 @@ struct_field_get(VALUE self, VALUE pointer)
215
263
  {
216
264
  StructField* f;
217
265
 
218
- Data_Get_Struct(self, StructField, f);
266
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
219
267
  if (f->memoryOp == NULL) {
220
268
  rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(f->rbType));
221
269
  return Qnil;
@@ -236,7 +284,7 @@ struct_field_put(VALUE self, VALUE pointer, VALUE value)
236
284
  {
237
285
  StructField* f;
238
286
 
239
- Data_Get_Struct(self, StructField, f);
287
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
240
288
  if (f->memoryOp == NULL) {
241
289
  rb_raise(rb_eArgError, "put not supported for %s", rb_obj_classname(f->rbType));
242
290
  return self;
@@ -258,7 +306,7 @@ function_field_get(VALUE self, VALUE pointer)
258
306
  {
259
307
  StructField* f;
260
308
 
261
- Data_Get_Struct(self, StructField, f);
309
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
262
310
 
263
311
  return rbffi_Function_NewInstance(f->rbType, (*rbffi_AbstractMemoryOps.pointer->get)(MEMORY(pointer), f->offset));
264
312
  }
@@ -278,7 +326,7 @@ function_field_put(VALUE self, VALUE pointer, VALUE proc)
278
326
  StructField* f;
279
327
  VALUE value = Qnil;
280
328
 
281
- Data_Get_Struct(self, StructField, f);
329
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
282
330
 
283
331
  if (NIL_P(proc) || rb_obj_is_kind_of(proc, rbffi_FunctionClass)) {
284
332
  value = proc;
@@ -313,8 +361,8 @@ array_field_get(VALUE self, VALUE pointer)
313
361
  ArrayType* array;
314
362
  VALUE argv[2];
315
363
 
316
- Data_Get_Struct(self, StructField, f);
317
- Data_Get_Struct(f->rbType, ArrayType, array);
364
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
365
+ TypedData_Get_Struct(f->rbType, ArrayType, &rbffi_array_type_data_type, array);
318
366
 
319
367
  argv[0] = pointer;
320
368
  argv[1] = self;
@@ -336,9 +384,8 @@ array_field_put(VALUE self, VALUE pointer, VALUE value)
336
384
  StructField* f;
337
385
  ArrayType* array;
338
386
 
339
-
340
- Data_Get_Struct(self, StructField, f);
341
- Data_Get_Struct(f->rbType, ArrayType, array);
387
+ TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
388
+ TypedData_Get_Struct(f->rbType, ArrayType, &rbffi_array_type_data_type, array);
342
389
 
343
390
  if (isCharArray(array) && rb_obj_is_instance_of(value, rb_cString)) {
344
391
  VALUE argv[2];
@@ -385,12 +432,8 @@ array_field_put(VALUE self, VALUE pointer, VALUE value)
385
432
  VALUE entry = rb_ary_entry(value, i);
386
433
  Struct* s;
387
434
 
388
- if (!rb_obj_is_kind_of(entry, rbffi_StructClass)) {
389
- rb_raise(rb_eTypeError, "array element not an instance of FFI::Struct");
390
- break;
391
- }
435
+ TypedData_Get_Struct(entry, Struct, &rbffi_struct_data_type, s);
392
436
 
393
- Data_Get_Struct(entry, Struct, s);
394
437
  checkRead(s->pointer);
395
438
  checkBounds(s->pointer, 0, array->componentType->ffiType->size);
396
439
 
@@ -416,10 +459,10 @@ struct_layout_allocate(VALUE klass)
416
459
  StructLayout* layout;
417
460
  VALUE obj;
418
461
 
419
- obj = Data_Make_Struct(klass, StructLayout, struct_layout_mark, struct_layout_free, layout);
420
- layout->rbFieldMap = Qnil;
421
- layout->rbFieldNames = Qnil;
422
- layout->rbFields = Qnil;
462
+ obj = TypedData_Make_Struct(klass, StructLayout, &rbffi_struct_layout_data_type, layout);
463
+ RB_OBJ_WRITE(obj, &layout->rbFieldMap, Qnil);
464
+ RB_OBJ_WRITE(obj, &layout->rbFieldNames, Qnil);
465
+ RB_OBJ_WRITE(obj, &layout->rbFields, Qnil);
423
466
  layout->base.ffiType = xcalloc(1, sizeof(*layout->base.ffiType));
424
467
  layout->base.ffiType->size = 0;
425
468
  layout->base.ffiType->alignment = 0;
@@ -431,8 +474,8 @@ struct_layout_allocate(VALUE klass)
431
474
  /*
432
475
  * call-seq: initialize(fields, size, align)
433
476
  * @param [Array<StructLayout::Field>] fields
434
- * @param [Numeric] size
435
- * @param [Numeric] align
477
+ * @param [Integer] size
478
+ * @param [Integer] align
436
479
  * @return [self]
437
480
  * A new StructLayout instance.
438
481
  */
@@ -443,15 +486,15 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
443
486
  ffi_type* ltype;
444
487
  int i;
445
488
 
446
- Data_Get_Struct(self, StructLayout, layout);
447
- layout->fieldCount = (int) RARRAY_LEN(fields);
448
- layout->rbFieldMap = rb_hash_new();
449
- layout->rbFieldNames = rb_ary_new2(layout->fieldCount);
489
+ TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
490
+ layout->fieldCount = RARRAY_LENINT(fields);
491
+ RB_OBJ_WRITE(self, &layout->rbFieldMap, rb_hash_new());
492
+ RB_OBJ_WRITE(self, &layout->rbFieldNames, rb_ary_new2(layout->fieldCount));
450
493
  layout->size = (int) FFI_ALIGN(NUM2INT(size), NUM2INT(align));
451
494
  layout->align = NUM2INT(align);
452
495
  layout->fields = xcalloc(layout->fieldCount, sizeof(StructField *));
453
496
  layout->ffiTypes = xcalloc(layout->fieldCount + 1, sizeof(ffi_type *));
454
- layout->rbFields = rb_ary_new2(layout->fieldCount);
497
+ RB_OBJ_WRITE(self, &layout->rbFields, rb_ary_new2(layout->fieldCount));
455
498
  layout->referenceFieldCount = 0;
456
499
  layout->base.ffiType->elements = layout->ffiTypes;
457
500
  layout->base.ffiType->size = layout->size;
@@ -470,7 +513,7 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
470
513
  }
471
514
  rbName = rb_funcall2(rbField, rb_intern("name"), 0, NULL);
472
515
 
473
- Data_Get_Struct(rbField, StructField, field);
516
+ TypedData_Get_Struct(rbField, StructField, &rbffi_struct_field_data_type, field);
474
517
  layout->fields[i] = field;
475
518
 
476
519
  if (field->type == NULL || field->type->ffiType == NULL) {
@@ -497,6 +540,11 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
497
540
  rb_raise(rb_eRuntimeError, "Struct size is zero");
498
541
  }
499
542
 
543
+ rb_obj_freeze(layout->rbFieldMap);
544
+ rb_obj_freeze(layout->rbFields);
545
+ rb_obj_freeze(layout->rbFieldNames);
546
+ rb_obj_freeze(self);
547
+
500
548
  return self;
501
549
  }
502
550
 
@@ -515,7 +563,7 @@ struct_layout_union_bang(VALUE self)
515
563
  ffi_type *t = NULL;
516
564
  int count, i;
517
565
 
518
- Data_Get_Struct(self, StructLayout, layout);
566
+ TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
519
567
 
520
568
  for (i = 0; alignment_types[i] != NULL; ++i) {
521
569
  if (alignment_types[i]->alignment == layout->align) {
@@ -545,7 +593,7 @@ struct_layout_aref(VALUE self, VALUE field)
545
593
  {
546
594
  StructLayout* layout;
547
595
 
548
- Data_Get_Struct(self, StructLayout, layout);
596
+ TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
549
597
 
550
598
  return rb_hash_aref(layout->rbFieldMap, field);
551
599
  }
@@ -560,7 +608,7 @@ struct_layout_fields(VALUE self)
560
608
  {
561
609
  StructLayout* layout;
562
610
 
563
- Data_Get_Struct(self, StructLayout, layout);
611
+ TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
564
612
 
565
613
  return rb_ary_dup(layout->rbFields);
566
614
  }
@@ -575,7 +623,7 @@ struct_layout_members(VALUE self)
575
623
  {
576
624
  StructLayout* layout;
577
625
 
578
- Data_Get_Struct(self, StructLayout, layout);
626
+ TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
579
627
 
580
628
  return rb_ary_dup(layout->rbFieldNames);
581
629
  }
@@ -590,26 +638,37 @@ struct_layout_to_a(VALUE self)
590
638
  {
591
639
  StructLayout* layout;
592
640
 
593
- Data_Get_Struct(self, StructLayout, layout);
641
+ TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
594
642
 
595
643
  return rb_ary_dup(layout->rbFields);
596
644
  }
597
645
 
598
646
  static void
599
- struct_layout_mark(StructLayout *layout)
647
+ struct_layout_mark(void *data)
600
648
  {
601
- rb_gc_mark(layout->rbFieldMap);
602
- rb_gc_mark(layout->rbFieldNames);
603
- rb_gc_mark(layout->rbFields);
604
- /* Clear the cache, to be safe from changes of fieldName VALUE by GC.compact.
605
- * TODO: Move cache clearing to compactation callback provided by Ruby-2.7+.
606
- */
649
+ StructLayout *layout = (StructLayout *)data;
650
+ rb_gc_mark_movable(layout->rbFieldMap);
651
+ rb_gc_mark_movable(layout->rbFieldNames);
652
+ rb_gc_mark_movable(layout->rbFields);
653
+ /* The values stored in layout->cache_row.fieldName are primary stored in layout->rbFieldMap and are marked there */
654
+ }
655
+
656
+ static void
657
+ struct_layout_compact(void *data)
658
+ {
659
+ StructLayout *layout = (StructLayout *)data;
660
+ ffi_gc_location(layout->rbFieldMap);
661
+ ffi_gc_location(layout->rbFieldNames);
662
+ ffi_gc_location(layout->rbFields);
663
+
664
+ /* Clear the cache, to be safe from changes of fieldName VALUE by GC.compact */
607
665
  memset(&layout->cache_row, 0, sizeof(layout->cache_row));
608
666
  }
609
667
 
610
668
  static void
611
- struct_layout_free(StructLayout *layout)
669
+ struct_layout_free(void *data)
612
670
  {
671
+ StructLayout *layout = (StructLayout *)data;
613
672
  xfree(layout->ffiTypes);
614
673
  xfree(layout->base.ffiType);
615
674
  xfree(layout->fields);
@@ -617,6 +676,16 @@ struct_layout_free(StructLayout *layout)
617
676
  }
618
677
 
619
678
 
679
+ static size_t
680
+ struct_layout_memsize(const void * data)
681
+ {
682
+ const StructLayout *layout = (const StructLayout *)data;
683
+ size_t memsize = sizeof(StructLayout);
684
+ memsize += layout->fieldCount * (sizeof(StructField *) + sizeof(ffi_type *));
685
+ memsize += sizeof(*layout->base.ffiType);
686
+ return memsize;
687
+ }
688
+
620
689
  void
621
690
  rbffi_StructLayout_Init(VALUE moduleFFI)
622
691
  {