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
data/ext/ffi_c/Pointer.c CHANGED
@@ -33,16 +33,33 @@
33
33
  #include <ruby.h>
34
34
  #include "rbffi.h"
35
35
  #include "rbffi_endian.h"
36
+ #include "compat.h"
36
37
  #include "AbstractMemory.h"
37
38
  #include "Pointer.h"
38
39
 
39
- #define POINTER(obj) rbffi_AbstractMemory_Cast((obj), rbffi_PointerClass)
40
+ #define POINTER(obj) rbffi_AbstractMemory_Cast((obj), &rbffi_pointer_data_type)
40
41
 
41
42
  VALUE rbffi_PointerClass = Qnil;
42
43
  VALUE rbffi_NullPointerSingleton = Qnil;
43
44
 
44
- static void ptr_release(Pointer* ptr);
45
- static void ptr_mark(Pointer* ptr);
45
+ static void ptr_release(void *data);
46
+ static void ptr_mark(void *data);
47
+ static void ptr_compact(void *data);
48
+ static size_t ptr_memsize(const void *data);
49
+
50
+ const rb_data_type_t rbffi_pointer_data_type = { /* extern */
51
+ .wrap_struct_name = "FFI::Pointer",
52
+ .function = {
53
+ .dmark = ptr_mark,
54
+ .dfree = ptr_release,
55
+ .dsize = ptr_memsize,
56
+ ffi_compact_callback( ptr_compact )
57
+ },
58
+ .parent = &rbffi_abstract_memory_data_type,
59
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
60
+ // macro to update VALUE references, as to trigger write barriers.
61
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
62
+ };
46
63
 
47
64
  VALUE
48
65
  rbffi_Pointer_NewInstance(void* addr)
@@ -54,12 +71,12 @@ rbffi_Pointer_NewInstance(void* addr)
54
71
  return rbffi_NullPointerSingleton;
55
72
  }
56
73
 
57
- obj = Data_Make_Struct(rbffi_PointerClass, Pointer, NULL, -1, p);
74
+ obj = TypedData_Make_Struct(rbffi_PointerClass, Pointer, &rbffi_pointer_data_type, p);
58
75
  p->memory.address = addr;
59
76
  p->memory.size = LONG_MAX;
60
77
  p->memory.flags = (addr == NULL) ? 0 : (MEM_RD | MEM_WR);
61
78
  p->memory.typeSize = 1;
62
- p->rbParent = Qnil;
79
+ RB_OBJ_WRITE(obj, &p->rbParent, Qnil);
63
80
 
64
81
  return obj;
65
82
  }
@@ -70,20 +87,18 @@ ptr_allocate(VALUE klass)
70
87
  Pointer* p;
71
88
  VALUE obj;
72
89
 
73
- obj = Data_Make_Struct(klass, Pointer, ptr_mark, ptr_release, p);
74
- p->rbParent = Qnil;
90
+ obj = TypedData_Make_Struct(klass, Pointer, &rbffi_pointer_data_type, p);
91
+ RB_OBJ_WRITE(obj, &p->rbParent, Qnil);
75
92
  p->memory.flags = MEM_RD | MEM_WR;
76
93
 
77
94
  return obj;
78
95
  }
79
96
 
80
97
  /*
81
- * @overload initialize(pointer)
82
- * @param [Pointer] pointer another pointer to initialize from
83
- * Create a new pointer from another {Pointer}.
98
+ * @overload initialize(address)
84
99
  * @overload initialize(type, address)
85
- * @param [Type] type type for pointer
86
- * @param [Integer] address base address for pointer
100
+ * @param [Type] type Optional type for pointer (defaults to byte)
101
+ * @param [Pointer, Integer] address base address for pointer
87
102
  * Create a new pointer from a {Type} and a base address
88
103
  * @return [self]
89
104
  * A new instance of Pointer.
@@ -95,7 +110,7 @@ ptr_initialize(int argc, VALUE* argv, VALUE self)
95
110
  VALUE rbType = Qnil, rbAddress = Qnil;
96
111
  int typeSize = 1;
97
112
 
98
- Data_Get_Struct(self, Pointer, p);
113
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, p);
99
114
 
100
115
  switch (rb_scan_args(argc, argv, "11", &rbType, &rbAddress)) {
101
116
  case 1:
@@ -112,7 +127,7 @@ ptr_initialize(int argc, VALUE* argv, VALUE self)
112
127
  switch (TYPE(rbAddress)) {
113
128
  case T_FIXNUM:
114
129
  case T_BIGNUM:
115
- p->memory.address = (void*) (uintptr_t) NUM2LL(rbAddress);
130
+ p->memory.address = (void*) (uintptr_t) NUM2ULL(rbAddress);
116
131
  p->memory.size = LONG_MAX;
117
132
  if (p->memory.address == NULL) {
118
133
  p->memory.flags = 0;
@@ -123,8 +138,8 @@ ptr_initialize(int argc, VALUE* argv, VALUE self)
123
138
  if (rb_obj_is_kind_of(rbAddress, rbffi_PointerClass)) {
124
139
  Pointer* orig;
125
140
 
126
- p->rbParent = rbAddress;
127
- Data_Get_Struct(rbAddress, Pointer, orig);
141
+ RB_OBJ_WRITE(self, &p->rbParent, rbAddress);
142
+ TypedData_Get_Struct(rbAddress, Pointer, &rbffi_pointer_data_type, orig);
128
143
  p->memory = orig->memory;
129
144
  } else {
130
145
  rb_raise(rb_eTypeError, "wrong argument type, expected Integer or FFI::Pointer");
@@ -153,7 +168,7 @@ ptr_initialize_copy(VALUE self, VALUE other)
153
168
  AbstractMemory* src;
154
169
  Pointer* dst;
155
170
 
156
- Data_Get_Struct(self, Pointer, dst);
171
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, dst);
157
172
  src = POINTER(other);
158
173
  if (src->size == LONG_MAX) {
159
174
  rb_raise(rb_eRuntimeError, "cannot duplicate unbounded memory area");
@@ -195,16 +210,16 @@ slice(VALUE self, long offset, long size)
195
210
  Pointer* p;
196
211
  VALUE retval;
197
212
 
198
- Data_Get_Struct(self, AbstractMemory, ptr);
213
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
199
214
  checkBounds(ptr, offset, size == LONG_MAX ? 1 : size);
200
215
 
201
- retval = Data_Make_Struct(rbffi_PointerClass, Pointer, ptr_mark, -1, p);
216
+ retval = TypedData_Make_Struct(rbffi_PointerClass, Pointer, &rbffi_pointer_data_type, p);
202
217
 
203
218
  p->memory.address = ptr->address + offset;
204
219
  p->memory.size = size;
205
220
  p->memory.flags = ptr->flags;
206
221
  p->memory.typeSize = ptr->typeSize;
207
- p->rbParent = self;
222
+ RB_OBJ_WRITE(retval, &p->rbParent, self);
208
223
 
209
224
  return retval;
210
225
  }
@@ -212,7 +227,7 @@ slice(VALUE self, long offset, long size)
212
227
  /*
213
228
  * Document-method: +
214
229
  * call-seq: ptr + offset
215
- * @param [Numeric] offset
230
+ * @param [Integer] offset
216
231
  * @return [Pointer]
217
232
  * Return a new {Pointer} from an existing pointer and an +offset+.
218
233
  */
@@ -222,15 +237,15 @@ ptr_plus(VALUE self, VALUE offset)
222
237
  AbstractMemory* ptr;
223
238
  long off = NUM2LONG(offset);
224
239
 
225
- Data_Get_Struct(self, AbstractMemory, ptr);
240
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
226
241
 
227
242
  return slice(self, off, ptr->size == LONG_MAX ? LONG_MAX : ptr->size - off);
228
243
  }
229
244
 
230
245
  /*
231
246
  * call-seq: ptr.slice(offset, length)
232
- * @param [Numeric] offset
233
- * @param [Numeric] length
247
+ * @param [Integer] offset
248
+ * @param [Integer] length
234
249
  * @return [Pointer]
235
250
  * Return a new {Pointer} from an existing one. This pointer points on same contents
236
251
  * from +offset+ for a length +length+.
@@ -252,7 +267,7 @@ ptr_inspect(VALUE self)
252
267
  char buf[100];
253
268
  Pointer* ptr;
254
269
 
255
- Data_Get_Struct(self, Pointer, ptr);
270
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
256
271
 
257
272
  if (ptr->memory.size != LONG_MAX) {
258
273
  snprintf(buf, sizeof(buf), "#<%s address=%p size=%lu>",
@@ -275,7 +290,7 @@ ptr_null_p(VALUE self)
275
290
  {
276
291
  Pointer* ptr;
277
292
 
278
- Data_Get_Struct(self, Pointer, ptr);
293
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
279
294
 
280
295
  return ptr->memory.address == NULL ? Qtrue : Qfalse;
281
296
  }
@@ -291,18 +306,23 @@ ptr_equals(VALUE self, VALUE other)
291
306
  {
292
307
  Pointer* ptr;
293
308
 
294
- Data_Get_Struct(self, Pointer, ptr);
309
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
295
310
 
296
311
  if (NIL_P(other)) {
297
312
  return ptr->memory.address == NULL ? Qtrue : Qfalse;
298
313
  }
299
314
 
300
- return ptr->memory.address == POINTER(other)->address ? Qtrue : Qfalse;
315
+ if (!rb_obj_is_kind_of(other, rbffi_PointerClass)) {
316
+ return Qfalse;
317
+ }
318
+ else {
319
+ return ptr->memory.address == POINTER(other)->address ? Qtrue : Qfalse;
320
+ }
301
321
  }
302
322
 
303
323
  /*
304
324
  * call-seq: ptr.address
305
- * @return [Numeric] pointer's base address
325
+ * @return [Integer] pointer's base address
306
326
  * Return +self+'s base address (alias: #to_i).
307
327
  */
308
328
  static VALUE
@@ -310,7 +330,7 @@ ptr_address(VALUE self)
310
330
  {
311
331
  Pointer* ptr;
312
332
 
313
- Data_Get_Struct(self, Pointer, ptr);
333
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
314
334
 
315
335
  return ULL2NUM((uintptr_t) ptr->memory.address);
316
336
  }
@@ -335,7 +355,7 @@ ptr_order(int argc, VALUE* argv, VALUE self)
335
355
  {
336
356
  Pointer* ptr;
337
357
 
338
- Data_Get_Struct(self, Pointer, ptr);
358
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
339
359
  if (argc == 0) {
340
360
  int order = (ptr->memory.flags & MEM_SWAP) == 0 ? BYTE_ORDER : SWAPPED_ORDER;
341
361
  return order == BIG_ENDIAN ? ID2SYM(rb_intern("big")) : ID2SYM(rb_intern("little"));
@@ -361,7 +381,7 @@ ptr_order(int argc, VALUE* argv, VALUE self)
361
381
  Pointer* p2;
362
382
  VALUE retval = slice(self, 0, ptr->memory.size);
363
383
 
364
- Data_Get_Struct(retval, Pointer, p2);
384
+ TypedData_Get_Struct(retval, Pointer, &rbffi_pointer_data_type, p2);
365
385
  p2->memory.flags |= MEM_SWAP;
366
386
  return retval;
367
387
  }
@@ -381,7 +401,8 @@ ptr_free(VALUE self)
381
401
  {
382
402
  Pointer* ptr;
383
403
 
384
- Data_Get_Struct(self, Pointer, ptr);
404
+ rb_check_frozen(self);
405
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
385
406
 
386
407
  if (ptr->allocated) {
387
408
  if (ptr->storage != NULL) {
@@ -404,7 +425,7 @@ ptr_type_size(VALUE self)
404
425
  {
405
426
  Pointer* ptr;
406
427
 
407
- Data_Get_Struct(self, Pointer, ptr);
428
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
408
429
 
409
430
  return INT2NUM(ptr->memory.typeSize);
410
431
  }
@@ -420,8 +441,9 @@ ptr_autorelease(VALUE self, VALUE autorelease)
420
441
  {
421
442
  Pointer* ptr;
422
443
 
423
- Data_Get_Struct(self, Pointer, ptr);
424
- ptr->autorelease = autorelease == Qtrue;
444
+ rb_check_frozen(self);
445
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
446
+ ptr->autorelease = RB_TEST(autorelease);
425
447
 
426
448
  return autorelease;
427
449
  }
@@ -436,15 +458,16 @@ ptr_autorelease_p(VALUE self)
436
458
  {
437
459
  Pointer* ptr;
438
460
 
439
- Data_Get_Struct(self, Pointer, ptr);
461
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
440
462
 
441
463
  return ptr->autorelease ? Qtrue : Qfalse;
442
464
  }
443
465
 
444
466
 
445
467
  static void
446
- ptr_release(Pointer* ptr)
468
+ ptr_release(void *data)
447
469
  {
470
+ Pointer *ptr = (Pointer *)data;
448
471
  if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) {
449
472
  xfree(ptr->storage);
450
473
  ptr->storage = NULL;
@@ -453,9 +476,28 @@ ptr_release(Pointer* ptr)
453
476
  }
454
477
 
455
478
  static void
456
- ptr_mark(Pointer* ptr)
479
+ ptr_mark(void *data)
480
+ {
481
+ Pointer *ptr = (Pointer *)data;
482
+ rb_gc_mark_movable(ptr->rbParent);
483
+ }
484
+
485
+ static void
486
+ ptr_compact(void *data)
457
487
  {
458
- rb_gc_mark(ptr->rbParent);
488
+ Pointer *ptr = (Pointer *)data;
489
+ ffi_gc_location(ptr->rbParent);
490
+ }
491
+
492
+ static size_t
493
+ ptr_memsize(const void *data)
494
+ {
495
+ const Pointer *ptr = (const Pointer *)data;
496
+ size_t memsize = sizeof(Pointer);
497
+ if (ptr->allocated) {
498
+ memsize += ptr->memory.size;
499
+ }
500
+ return memsize;
459
501
  }
460
502
 
461
503
  void
data/ext/ffi_c/Pointer.h CHANGED
@@ -40,6 +40,7 @@ extern "C" {
40
40
 
41
41
  extern void rbffi_Pointer_Init(VALUE moduleFFI);
42
42
  extern VALUE rbffi_Pointer_NewInstance(void* addr);
43
+ extern const rb_data_type_t rbffi_pointer_data_type;
43
44
  extern VALUE rbffi_PointerClass;
44
45
  extern VALUE rbffi_NullPointerSingleton;
45
46