ffi 1.17.0 → 1.17.4

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 (359) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +51 -0
  4. data/Gemfile +8 -3
  5. data/README.md +1 -0
  6. data/Rakefile +8 -5
  7. data/Steepfile +8 -0
  8. data/ext/ffi_c/DynamicLibrary.c +1 -1
  9. data/ext/ffi_c/Function.c +54 -34
  10. data/ext/ffi_c/MethodHandle.c +4 -2
  11. data/ext/ffi_c/StructLayout.c +129 -12
  12. data/ext/ffi_c/libffi/LICENSE +1 -1
  13. data/ext/ffi_c/libffi/Makefile.am +20 -15
  14. data/ext/ffi_c/libffi/Makefile.in +41 -54
  15. data/ext/ffi_c/libffi/README.md +40 -4
  16. data/ext/ffi_c/libffi/acinclude.m4 +6 -0
  17. data/ext/ffi_c/libffi/config.guess +80 -22
  18. data/ext/ffi_c/libffi/config.sub +161 -80
  19. data/ext/ffi_c/libffi/configure +135 -135
  20. data/ext/ffi_c/libffi/configure.ac +28 -14
  21. data/ext/ffi_c/libffi/configure.host +6 -6
  22. data/ext/ffi_c/libffi/doc/Makefile.in +4 -0
  23. data/ext/ffi_c/libffi/doc/libffi.texi +27 -4
  24. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  25. data/ext/ffi_c/libffi/fficonfig.h.in +3 -3
  26. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +1 -28
  27. data/ext/ffi_c/libffi/include/Makefile.in +4 -0
  28. data/ext/ffi_c/libffi/include/ffi.h.in +19 -1
  29. data/ext/ffi_c/libffi/include/ffi_cfi.h +2 -0
  30. data/ext/ffi_c/libffi/include/ffi_common.h +17 -0
  31. data/ext/ffi_c/libffi/libffi.map.in +13 -1
  32. data/ext/ffi_c/libffi/libtool-version +1 -1
  33. data/ext/ffi_c/libffi/m4/asmcfi.m4 +28 -11
  34. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +13 -3
  35. data/ext/ffi_c/libffi/man/Makefile.in +4 -0
  36. data/ext/ffi_c/libffi/src/aarch64/ffi.c +7 -4
  37. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +2 -2
  38. data/ext/ffi_c/libffi/src/aarch64/internal.h +63 -17
  39. data/ext/ffi_c/libffi/src/aarch64/sysv.S +22 -12
  40. data/ext/ffi_c/libffi/src/arc/arcompact.S +2 -2
  41. data/ext/ffi_c/libffi/src/arc/ffi.c +6 -2
  42. data/ext/ffi_c/libffi/src/arm/sysv.S +1 -1
  43. data/ext/ffi_c/libffi/src/closures.c +3 -3
  44. data/ext/ffi_c/libffi/src/dlmalloc.c +1 -0
  45. data/ext/ffi_c/libffi/src/mips/ffitarget.h +2 -4
  46. data/ext/ffi_c/libffi/src/mips/n32.S +4 -0
  47. data/ext/ffi_c/libffi/src/mips/o32.S +4 -0
  48. data/ext/ffi_c/libffi/src/or1k/ffi.c +2 -2
  49. data/ext/ffi_c/libffi/src/pa/linux.S +4 -0
  50. data/ext/ffi_c/libffi/src/powerpc/ffi.c +19 -0
  51. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +26 -19
  52. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +26 -16
  53. data/ext/ffi_c/libffi/src/powerpc/internal.h +10 -0
  54. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +47 -0
  55. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +24 -0
  56. data/ext/ffi_c/libffi/src/prep_cif.c +1 -4
  57. data/ext/ffi_c/libffi/src/riscv/ffi.c +39 -16
  58. data/ext/ffi_c/libffi/src/riscv/internal.h +7 -0
  59. data/ext/ffi_c/libffi/src/riscv/sysv.S +24 -0
  60. data/ext/ffi_c/libffi/src/s390/ffi.c +28 -1
  61. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  62. data/ext/ffi_c/libffi/src/s390/sysv.S +38 -0
  63. data/ext/ffi_c/libffi/src/sparc/ffi.c +16 -0
  64. data/ext/ffi_c/libffi/src/tramp.c +6 -1
  65. data/ext/ffi_c/libffi/src/types.c +23 -1
  66. data/ext/ffi_c/libffi/src/{wasm32 → wasm}/ffi.c +166 -315
  67. data/ext/ffi_c/libffi/src/{wasm32 → wasm}/ffitarget.h +17 -0
  68. data/ext/ffi_c/libffi/src/x86/ffi.c +4 -1
  69. data/ext/ffi_c/libffi/src/x86/ffi64.c +4 -1
  70. data/ext/ffi_c/libffi/src/x86/ffitarget.h +0 -3
  71. data/ext/ffi_c/libffi/src/x86/sysv.S +1 -3
  72. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +1 -3
  73. data/ext/ffi_c/libffi/testsuite/Makefile.in +10 -4
  74. data/ext/ffi_c/libffi.mk +5 -0
  75. data/ffi.gemspec +7 -6
  76. data/lib/ffi/autopointer.rb +6 -0
  77. data/lib/ffi/compat.rb +11 -0
  78. data/lib/ffi/ffi.rb +59 -0
  79. data/lib/ffi/function.rb +23 -0
  80. data/lib/ffi/library.rb +19 -3
  81. data/lib/ffi/struct_by_reference.rb +1 -1
  82. data/lib/ffi/version.rb +1 -1
  83. data/samples/hello_ractor.rb +9 -1
  84. data/samples/qsort_ractor.rb +9 -1
  85. data/sig/ffi/auto_pointer.rbs +1 -2
  86. data/sig/ffi/errno.rbs +8 -0
  87. data/sig/ffi/library.rbs +1 -1
  88. data/sig/ffi/platform.rbs +49 -0
  89. data/sig/ffi/struct.rbs +2 -2
  90. data/sig/ffi/struct_by_reference.rbs +1 -1
  91. data/sig/ffi.rbs +4 -1
  92. data.tar.gz.sig +0 -0
  93. metadata +25 -339
  94. metadata.gz.sig +0 -0
  95. data/ext/ffi_c/libffi/.allow-ai-service +0 -0
  96. data/ext/ffi_c/libffi/.appveyor/site.exp +0 -16
  97. data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +0 -7
  98. data/ext/ffi_c/libffi/.appveyor.yml +0 -84
  99. data/ext/ffi_c/libffi/.ci/ar-lib +0 -270
  100. data/ext/ffi_c/libffi/.ci/bfin-sim.exp +0 -58
  101. data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +0 -18
  102. data/ext/ffi_c/libffi/.ci/build-in-container.sh +0 -10
  103. data/ext/ffi_c/libffi/.ci/build.sh +0 -124
  104. data/ext/ffi_c/libffi/.ci/compile +0 -351
  105. data/ext/ffi_c/libffi/.ci/install.sh +0 -78
  106. data/ext/ffi_c/libffi/.ci/m32r-sim.exp +0 -58
  107. data/ext/ffi_c/libffi/.ci/moxie-sim.exp +0 -60
  108. data/ext/ffi_c/libffi/.ci/msvs-detect +0 -1103
  109. data/ext/ffi_c/libffi/.ci/or1k-sim.exp +0 -58
  110. data/ext/ffi_c/libffi/.ci/powerpc-eabisim.exp +0 -58
  111. data/ext/ffi_c/libffi/.ci/site.exp +0 -29
  112. data/ext/ffi_c/libffi/.ci/wine-sim.exp +0 -55
  113. data/ext/ffi_c/libffi/.circleci/config.yml +0 -156
  114. data/ext/ffi_c/libffi/.gitattributes +0 -4
  115. data/ext/ffi_c/libffi/.github/issue_template.md +0 -10
  116. data/ext/ffi_c/libffi/.github/workflows/build.yml +0 -479
  117. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +0 -172
  118. data/ext/ffi_c/libffi/.gitignore +0 -46
  119. data/ext/ffi_c/libffi/src/nios2/ffi.c +0 -304
  120. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +0 -52
  121. data/ext/ffi_c/libffi/src/nios2/sysv.S +0 -136
  122. data/ext/ffi_c/libffi/testsuite/Makefile.am +0 -87
  123. data/ext/ffi_c/libffi/testsuite/config/default.exp +0 -1
  124. data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +0 -54
  125. data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +0 -63
  126. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +0 -86
  127. data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +0 -48
  128. data/ext/ffi_c/libffi/testsuite/emscripten/test.html +0 -7
  129. data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +0 -51
  130. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +0 -682
  131. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +0 -283
  132. data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +0 -45
  133. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +0 -28
  134. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +0 -78
  135. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +0 -50
  136. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +0 -63
  137. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +0 -1746
  138. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +0 -2885
  139. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +0 -747
  140. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +0 -46
  141. data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +0 -46
  142. data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +0 -41
  143. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +0 -54
  144. data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +0 -99
  145. data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +0 -108
  146. data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +0 -114
  147. data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +0 -119
  148. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +0 -26
  149. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +0 -163
  150. data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +0 -59
  151. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +0 -60
  152. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +0 -61
  153. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +0 -74
  154. data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +0 -62
  155. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +0 -110
  156. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +0 -59
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +0 -57
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +0 -70
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +0 -78
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -52
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +0 -46
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +0 -127
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +0 -59
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc_tc.c +0 -114
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +0 -36
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +0 -43
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +0 -42
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +0 -35
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +0 -36
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +0 -49
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +0 -42
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +0 -34
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +0 -41
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +0 -48
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +0 -36
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +0 -42
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +0 -38
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +0 -42
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +0 -60
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +0 -43
  181. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +0 -49
  182. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +0 -49
  183. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +0 -55
  184. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +0 -67
  185. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +0 -57
  186. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +0 -67
  187. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +0 -60
  188. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +0 -64
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +0 -66
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +0 -64
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +0 -74
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +0 -81
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +0 -68
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +0 -63
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +0 -65
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +0 -65
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +0 -67
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +0 -67
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +0 -93
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +0 -61
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +0 -63
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +0 -90
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +0 -61
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +0 -78
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +0 -220
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +0 -154
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +0 -134
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +0 -134
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +0 -140
  210. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +0 -67
  211. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c +0 -90
  212. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c +0 -83
  213. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c +0 -83
  214. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c +0 -102
  215. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c +0 -91
  216. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c +0 -94
  217. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c +0 -92
  218. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c +0 -96
  219. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c +0 -61
  220. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c +0 -112
  221. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c +0 -117
  222. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c +0 -120
  223. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c +0 -131
  224. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c +0 -93
  225. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c +0 -109
  226. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c +0 -113
  227. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c +0 -145
  228. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c +0 -103
  229. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c +0 -114
  230. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c +0 -103
  231. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c +0 -103
  232. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +0 -113
  233. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c +0 -120
  234. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c +0 -103
  235. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c +0 -137
  236. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c +0 -116
  237. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c +0 -148
  238. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c +0 -140
  239. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c +0 -121
  240. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c +0 -155
  241. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c +0 -121
  242. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c +0 -102
  243. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c +0 -103
  244. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c +0 -103
  245. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c +0 -111
  246. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c +0 -109
  247. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c +0 -111
  248. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c +0 -147
  249. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c +0 -152
  250. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c +0 -113
  251. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c +0 -108
  252. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c +0 -106
  253. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c +0 -109
  254. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c +0 -108
  255. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c +0 -109
  256. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c +0 -111
  257. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c +0 -68
  258. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double.c +0 -43
  259. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c +0 -69
  260. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c +0 -46
  261. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c +0 -115
  262. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c +0 -80
  263. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c +0 -70
  264. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c +0 -55
  265. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c +0 -78
  266. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c +0 -79
  267. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c +0 -94
  268. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c +0 -99
  269. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c +0 -78
  270. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c +0 -94
  271. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c +0 -79
  272. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c +0 -152
  273. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c +0 -47
  274. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c +0 -44
  275. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c +0 -45
  276. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +0 -125
  277. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c +0 -45
  278. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c +0 -47
  279. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +0 -49
  280. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +0 -49
  281. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c +0 -49
  282. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c +0 -46
  283. data/ext/ffi_c/libffi/testsuite/libffi.closures/err_bad_abi.c +0 -36
  284. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +0 -1
  285. data/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c +0 -343
  286. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c +0 -175
  287. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c +0 -161
  288. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c +0 -146
  289. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +0 -137
  290. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +0 -86
  291. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +0 -115
  292. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c +0 -119
  293. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c +0 -120
  294. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c +0 -120
  295. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c +0 -121
  296. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c +0 -142
  297. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c +0 -120
  298. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c +0 -142
  299. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c +0 -142
  300. data/ext/ffi_c/libffi/testsuite/libffi.closures/problem1.c +0 -90
  301. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +0 -86
  302. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +0 -102
  303. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +0 -101
  304. data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large.c +0 -145
  305. data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large2.c +0 -148
  306. data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c +0 -124
  307. data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c +0 -125
  308. data/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c +0 -75
  309. data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc +0 -118
  310. data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc +0 -55
  311. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +0 -91
  312. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +0 -10
  313. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +0 -10
  314. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +0 -10
  315. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +0 -42
  316. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +0 -10
  317. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +0 -10
  318. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +0 -10
  319. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +0 -71
  320. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +0 -10
  321. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +0 -10
  322. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +0 -10
  323. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +0 -80
  324. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +0 -10
  325. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +0 -16
  326. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +0 -10
  327. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp +0 -36
  328. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +0 -51
  329. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +0 -7
  330. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +0 -7
  331. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +0 -7
  332. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +0 -10
  333. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +0 -10
  334. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +0 -86
  335. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +0 -10
  336. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +0 -1
  337. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +0 -78
  338. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +0 -10
  339. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +0 -10
  340. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +0 -10
  341. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +0 -37
  342. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +0 -41
  343. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +0 -10
  344. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +0 -10
  345. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +0 -10
  346. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +0 -44
  347. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +0 -10
  348. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +0 -10
  349. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +0 -10
  350. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +0 -10
  351. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +0 -10
  352. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +0 -10
  353. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +0 -34
  354. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +0 -28
  355. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +0 -1
  356. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +0 -36
  357. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +0 -19
  358. data/lib/ffi/tools/types_generator.rb +0 -137
  359. data/rakelib/ffi_gem_helper.rb +0 -65
@@ -42,14 +42,31 @@ typedef void (*ffi_fp)(void);
42
42
 
43
43
  typedef enum ffi_abi {
44
44
  FFI_FIRST_ABI = 0,
45
+ #if __SIZEOF_POINTER__ == 4
45
46
  FFI_WASM32, // "raw", no structures, varargs, or closures (not implemented!)
46
47
  FFI_WASM32_EMSCRIPTEN, // structures, varargs, and split 64-bit params
48
+ #elif __SIZEOF_POINTER__ == 8
49
+ FFI_WASM64,
50
+ FFI_WASM64_EMSCRIPTEN,
51
+ #else
52
+ #error "Unknown pointer size"
53
+ #endif
47
54
  FFI_LAST_ABI,
55
+ #if __SIZEOF_POINTER__ == 4
48
56
  #ifdef __EMSCRIPTEN__
49
57
  FFI_DEFAULT_ABI = FFI_WASM32_EMSCRIPTEN
50
58
  #else
51
59
  FFI_DEFAULT_ABI = FFI_WASM32
52
60
  #endif
61
+ #elif __SIZEOF_POINTER__ == 8
62
+ #ifdef __EMSCRIPTEN__
63
+ FFI_DEFAULT_ABI = FFI_WASM64_EMSCRIPTEN
64
+ #else
65
+ FFI_DEFAULT_ABI = FFI_WASM64
66
+ #endif
67
+ #else
68
+ #error "Unknown pointer size"
69
+ #endif
53
70
  } ffi_abi;
54
71
 
55
72
  #define FFI_CLOSURES 1
@@ -118,7 +118,7 @@ ffi_prep_cif_machdep(ffi_cif *cif)
118
118
  break;
119
119
  case FFI_TYPE_STRUCT:
120
120
  {
121
- #ifdef X86_WIN32
121
+ #if defined(X86_WIN32) || defined(X86_DARWIN)
122
122
  size_t size = cif->rtype->size;
123
123
  if (size == 1)
124
124
  flags = X86_RET_STRUCT_1B;
@@ -270,6 +270,9 @@ extern void FFI_DECLARE_FASTCALL ffi_call_i386(struct call_frame *, char *) FFI_
270
270
  #if defined(_MSC_VER)
271
271
  #pragma runtime_checks("s", off)
272
272
  #endif
273
+ /* n.b. ffi_call_unix64 will steal the alloca'd `stack` variable here for use
274
+ _as its own stack_ - so we need to compile this function without ASAN */
275
+ FFI_ASAN_NO_SANITIZE
273
276
  static void
274
277
  ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
275
278
  void **avalue, void *closure)
@@ -557,6 +557,9 @@ ffi_prep_cif_machdep (ffi_cif *cif)
557
557
  return FFI_OK;
558
558
  }
559
559
 
560
+ /* n.b. ffi_call_unix64 will steal the alloca'd `stack` variable here for use
561
+ _as its own stack_ - so we need to compile this function without ASAN */
562
+ FFI_ASAN_NO_SANITIZE
560
563
  static void
561
564
  ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
562
565
  void **avalue, void *closure)
@@ -651,7 +654,7 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
651
654
  break;
652
655
  default:
653
656
  reg_args->gpr[gprcount] = 0;
654
- memcpy (&reg_args->gpr[gprcount], a, size);
657
+ memcpy (&reg_args->gpr[gprcount], a, size <= 8 ? size : 8);
655
658
  }
656
659
  gprcount++;
657
660
  break;
@@ -41,9 +41,6 @@
41
41
 
42
42
  #if defined (X86_64) && defined (__i386__)
43
43
  #undef X86_64
44
- #warning ******************************************************
45
- #warning ********** X86 IS DEFINED ****************************
46
- #warning ******************************************************
47
44
  #define X86
48
45
  #endif
49
46
 
@@ -458,9 +458,7 @@ L(UW24):
458
458
  L(UW25):
459
459
  # cfi_def_cfa_offset(closure_FS + 4)
460
460
  FFI_CLOSURE_SAVE_REGS
461
- movl closure_FS-4(%esp), %ecx /* load retaddr */
462
- movl closure_FS(%esp), %eax /* load closure */
463
- movl %ecx, closure_FS(%esp) /* move retaddr */
461
+ movl closure_FS-4(%esp), %eax /* load closure */
464
462
  jmp L(do_closure_REGISTER)
465
463
  L(UW26):
466
464
  # cfi_endproc
@@ -394,9 +394,7 @@ L(UW24):
394
394
  L(UW25):
395
395
  /* cfi_def_cfa_offset(closure_FS + 4) */
396
396
  FFI_CLOSURE_SAVE_REGS
397
- mov ecx, [esp+closure_FS-4] /* load retaddr */
398
- mov eax, [esp+closure_FS] /* load closure */
399
- mov [esp+closure_FS], ecx /* move retaddr */
397
+ mov eax, [esp+closure_FS-4] /* load closure */
400
398
  jmp L(do_closure_REGISTER)
401
399
  L(UW26):
402
400
  /* cfi_endproc */
@@ -174,6 +174,8 @@ EGREP = @EGREP@
174
174
  ETAGS = @ETAGS@
175
175
  EXEEXT = @EXEEXT@
176
176
  FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
177
+ FFI_VERSION_NUMBER = @FFI_VERSION_NUMBER@
178
+ FFI_VERSION_STRING = @FFI_VERSION_STRING@
177
179
  FGREP = @FGREP@
178
180
  FILECMD = @FILECMD@
179
181
  GREP = @GREP@
@@ -224,6 +226,7 @@ TARGET = @TARGET@
224
226
  TARGETDIR = @TARGETDIR@
225
227
  TARGET_OBJ = @TARGET_OBJ@
226
228
  VERSION = @VERSION@
229
+ WASM64_MEMORY64 = @WASM64_MEMORY64@
227
230
  abs_builddir = @abs_builddir@
228
231
  abs_srcdir = @abs_srcdir@
229
232
  abs_top_builddir = @abs_top_builddir@
@@ -232,6 +235,7 @@ ac_ct_AR = @ac_ct_AR@
232
235
  ac_ct_CC = @ac_ct_CC@
233
236
  ac_ct_CXX = @ac_ct_CXX@
234
237
  ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
238
+ ac_ct_READELF = @ac_ct_READELF@
235
239
  am__include = @am__include@
236
240
  am__leading_dot = @am__leading_dot@
237
241
  am__quote = @am__quote@
@@ -301,8 +305,8 @@ EXTRA_DIST = config/default.exp emscripten/build.sh emscripten/conftest.py \
301
305
  libffi.call/float1.c libffi.call/float2.c libffi.call/float3.c \
302
306
  libffi.call/float4.c libffi.call/float_va.c libffi.call/many.c \
303
307
  libffi.call/many2.c libffi.call/many_double.c libffi.call/many_mixed.c \
304
- libffi.call/negint.c libffi.call/offsets.c libffi.call/pr1172638.c \
305
- libffi.call/promotion.c libffi.call/pyobjc_tc.c libffi.call/return_dbl.c \
308
+ libffi.call/negint.c libffi.call/offsets.c libffi.call/overread.c \
309
+ libffi.call/pr1172638.c libffi.call/promotion.c libffi.call/pyobjc_tc.c libffi.call/return_dbl.c \
306
310
  libffi.call/return_dbl1.c libffi.call/return_dbl2.c libffi.call/return_fl.c \
307
311
  libffi.call/return_fl1.c libffi.call/return_fl2.c libffi.call/return_fl3.c \
308
312
  libffi.call/return_ldl.c libffi.call/return_ll.c libffi.call/return_ll1.c \
@@ -315,10 +319,11 @@ EXTRA_DIST = config/default.exp emscripten/build.sh emscripten/conftest.py \
315
319
  libffi.call/struct9.c libffi.call/struct_by_value_2.c libffi.call/struct_by_value_3.c \
316
320
  libffi.call/struct_by_value_3f.c libffi.call/struct_by_value_4.c libffi.call/struct_by_value_4f.c \
317
321
  libffi.call/struct_by_value_big.c libffi.call/struct_by_value_small.c libffi.call/struct_return_2H.c \
322
+ libffi.call/struct_int_float.c libffi.call/longjmp.c \
318
323
  libffi.call/struct_return_8H.c libffi.call/uninitialized.c libffi.call/va_1.c \
319
324
  libffi.call/va_2.c libffi.call/va_3.c libffi.call/va_struct1.c \
320
325
  libffi.call/va_struct2.c libffi.call/va_struct3.c libffi.call/callback.c \
321
- libffi.call/callback2.c libffi.call/callback3.c libffi.call/callback4.c \
326
+ libffi.call/callback2.c libffi.call/callback3.c libffi.call/callback4.c libffi.call/x32.c \
322
327
  libffi.closures/closure.exp libffi.closures/closure_fn0.c libffi.closures/closure_fn1.c \
323
328
  libffi.closures/closure_fn2.c libffi.closures/closure_fn3.c libffi.closures/closure_fn4.c \
324
329
  libffi.closures/closure_fn5.c libffi.closures/closure_fn6.c libffi.closures/closure_loc_fn0.c \
@@ -368,7 +373,8 @@ EXTRA_DIST = config/default.exp emscripten/build.sh emscripten/conftest.py \
368
373
  libffi.complex/return_complex2_float.c libffi.complex/return_complex2_longdouble.c libffi.complex/return_complex_double.c \
369
374
  libffi.complex/return_complex_float.c libffi.complex/return_complex_longdouble.c libffi.go/aa-direct.c \
370
375
  libffi.go/closure1.c libffi.go/ffitest.h libffi.go/go.exp \
371
- libffi.go/static-chain.h Makefile.am Makefile.in
376
+ libffi.go/static-chain.h Makefile.am Makefile.in \
377
+ libffi.threads/ffitest.h libffi.threads/threads.exp libffi.threads/tsan.c
372
378
 
373
379
  all: all-am
374
380
 
data/ext/ffi_c/libffi.mk CHANGED
@@ -16,3 +16,8 @@ $(LIBFFI):
16
16
  sh $(LIBFFI_CONFIGURE) $(LIBFFI_HOST) > /dev/null; \
17
17
  fi
18
18
  $(MAKE) -C "$(LIBFFI_BUILD_DIR)"
19
+
20
+ install: install-cleanup
21
+
22
+ install-cleanup: $(DLLIB)
23
+ rm -rf "$(LIBFFI_BUILD_DIR)"
data/ffi.gemspec CHANGED
@@ -15,13 +15,16 @@ Gem::Specification.new do |s|
15
15
  s.metadata['wiki_uri'] = 'https://github.com/ffi/ffi/wiki'
16
16
  s.metadata['source_code_uri'] = 'https://github.com/ffi/ffi/'
17
17
  s.metadata['mailing_list_uri'] = 'http://groups.google.com/group/ruby-ffi'
18
+ s.metadata['rubygems_mfa_required'] = 'true'
18
19
  end
19
20
  s.files = `git ls-files -z`.split("\x0").reject do |f|
20
- f =~ /^(\.|bench|gen|libtest|nbproject|spec)/
21
+ f =~ /^(\.|bench|gen|libtest|nbproject|spec|rakelib)/
21
22
  end
22
23
 
23
24
  # Add libffi git files
24
- lfs = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0")
25
+ lfs = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0").reject do |f|
26
+ f =~ /^(\.|testsuite)/
27
+ end
25
28
  # Add autoconf generated files of libffi
26
29
  lfs += %w[ compile configure config.guess config.sub install-sh ltmain.sh missing fficonfig.h.in ]
27
30
  # Add automake generated files of libffi
@@ -35,8 +38,6 @@ Gem::Specification.new do |s|
35
38
  s.license = 'BSD-3-Clause'
36
39
  s.require_paths << 'ext/ffi_c'
37
40
  s.required_ruby_version = '>= 2.5'
38
- s.add_development_dependency 'rake', '~> 13.0'
39
- s.add_development_dependency 'rake-compiler', '~> 1.1'
40
- s.add_development_dependency 'rake-compiler-dock', '~> 1.0'
41
- s.add_development_dependency 'rspec', '~> 2.14.1'
41
+
42
+ s.metadata['msys2_mingw_dependencies'] = 'libffi'
42
43
  end
@@ -89,6 +89,12 @@ module FFI
89
89
  self
90
90
  end
91
91
 
92
+ def dup
93
+ raise RuntimeError, "cannot duplicate FFI::AutoPointer"
94
+ end
95
+
96
+ alias clone dup
97
+
92
98
  # @return [nil]
93
99
  # Free the pointer.
94
100
  def free
data/lib/ffi/compat.rb CHANGED
@@ -40,4 +40,15 @@ module FFI
40
40
  obj.freeze
41
41
  end
42
42
  end
43
+
44
+ if defined?(Ractor.shareable_proc)
45
+ # This is for FFI internal use only.
46
+ def self.shareable_proc(**kwargs, &block)
47
+ Ractor.shareable_proc(**kwargs, &block)
48
+ end
49
+ else
50
+ def self.shareable_proc(**_kwargs, &block)
51
+ block
52
+ end
53
+ end
43
54
  end
data/lib/ffi/ffi.rb CHANGED
@@ -48,3 +48,62 @@ require 'ffi/variadic'
48
48
  require 'ffi/enum'
49
49
  require 'ffi/version'
50
50
  require 'ffi/function'
51
+
52
+ module FFI
53
+ module ModernForkTracking
54
+ def _fork
55
+ pid = super
56
+ if pid == 0
57
+ FFI._async_cb_dispatcher_atfork_child
58
+ end
59
+ pid
60
+ end
61
+ end
62
+
63
+ module LegacyForkTracking
64
+ module KernelExt
65
+ def fork
66
+ if block_given?
67
+ super do
68
+ FFI._async_cb_dispatcher_atfork_child
69
+ yield
70
+ end
71
+ else
72
+ pid = super
73
+ FFI._async_cb_dispatcher_atfork_child if pid.nil?
74
+ pid
75
+ end
76
+ end
77
+ end
78
+
79
+ module KernelExtPrivate
80
+ include KernelExt
81
+ private :fork
82
+ end
83
+
84
+ module IOExt
85
+ def popen(*args)
86
+ return super unless args[0] == '-'
87
+
88
+ super(*args) do |pipe|
89
+ FFI._async_cb_dispatcher_atfork_child if pipe.nil?
90
+ yield pipe
91
+ end
92
+ end
93
+ ruby2_keywords :popen if respond_to?(:ruby2_keywords)
94
+ end
95
+ end
96
+
97
+ if Process.respond_to?(:_fork)
98
+ # The nice Ruby 3.1+ way of doing things
99
+ ::Process.singleton_class.prepend(ModernForkTracking)
100
+ elsif Process.respond_to?(:fork)
101
+ # Barf. Old CRuby.
102
+ # Most of the inspiration for how to do this was stolen from ActiveSupport.
103
+ ::Object.prepend(LegacyForkTracking::KernelExtPrivate)
104
+ ::Object.singleton_class.prepend(LegacyForkTracking::KernelExt)
105
+ ::Kernel.prepend(LegacyForkTracking::KernelExtPrivate)
106
+ ::Kernel.singleton_class.prepend(LegacyForkTracking::KernelExt)
107
+ ::IO.singleton_class.prepend(LegacyForkTracking::IOExt)
108
+ end
109
+ end
data/lib/ffi/function.rb CHANGED
@@ -51,6 +51,29 @@ module FFI
51
51
  end
52
52
  end
53
53
 
54
+ if RUBY_PLATFORM == 'aarch64-mingw-ucrt'
55
+ # Use a workaround for https://github.com/libffi/libffi/issues/905
56
+ def attach(mod, name)
57
+ this = self
58
+ body = proc do |*args, &block|
59
+ this.call(*args, &block)
60
+ end
61
+
62
+ mod.define_method(name, body)
63
+ mod.define_singleton_method(name, body)
64
+
65
+ # Store function Proc's for re-definition as Ractor-shareable in Library#freeze
66
+ funcs = mod.instance_variable_get("@ffi_function_procs")
67
+ unless funcs
68
+ funcs = {}
69
+ mod.instance_variable_set("@ffi_function_procs", funcs)
70
+ end
71
+ funcs[name] = self
72
+
73
+ self
74
+ end
75
+ end
76
+
54
77
  # Stash the Function in a module variable so it can be inspected by attached_functions.
55
78
  # On CRuby it also ensures that it does not get garbage collected.
56
79
  module RegisterAttach
data/lib/ffi/library.rb CHANGED
@@ -287,7 +287,7 @@ module FFI
287
287
  if type.is_a?(Class) && type < FFI::Struct
288
288
  # If it is a global struct, just attach directly to the pointer
289
289
  s = s = type.new(address) # Assigning twice to suppress unused variable warning
290
- self.module_eval <<-code, __FILE__, __LINE__
290
+ self.module_eval(<<-code, __FILE__, __LINE__)
291
291
  @ffi_gsvars = {} unless defined?(@ffi_gsvars)
292
292
  @ffi_gsvars[#{mname.inspect}] = s
293
293
  def self.#{mname}
@@ -302,7 +302,7 @@ module FFI
302
302
  #
303
303
  # Attach to this module as mname/mname=
304
304
  #
305
- self.module_eval <<-code, __FILE__, __LINE__
305
+ self.module_eval(<<-code, __FILE__, __LINE__)
306
306
  @ffi_gvars = {} unless defined?(@ffi_gvars)
307
307
  @ffi_gvars[#{mname.inspect}] = s
308
308
  def self.#{mname}
@@ -564,12 +564,28 @@ module FFI
564
564
  # Freeze all definitions of the module
565
565
  #
566
566
  # This freezes the module's definitions, so that it can be used in a Ractor.
567
- # No further methods or variables can be attached and no further enums or typedefs can be created in this module afterwards.
567
+ # No further functions or variables can be attached and no further enums or typedefs can be created in this module afterwards.
568
568
  def freeze
569
+ # @ffi_function_procs is only used on aarch64-mingw-ucrt
570
+ instance_variable_get("@ffi_function_procs")&.each do |name, func|
571
+ # Redefine attached functions as Ractor-shareable.
572
+ # The function Proc can't be shareable from the beginning, since it references enums and typedefs.
573
+ this = FFI.make_shareable(func)
574
+ body = FFI.shareable_proc(self: nil) do |*args, &block|
575
+ this.call(*args, &block)
576
+ end
577
+ undef_method(name)
578
+ singleton_class.undef_method(name)
579
+
580
+ define_method(name, body)
581
+ define_singleton_method(name, body)
582
+ end
583
+
569
584
  instance_variables.each do |name|
570
585
  var = instance_variable_get(name)
571
586
  FFI.make_shareable(var)
572
587
  end
588
+ super
573
589
  nil
574
590
  end
575
591
  end
@@ -44,7 +44,7 @@ module FFI
44
44
  end
45
45
 
46
46
  # Always get {FFI::Type}::POINTER.
47
- def native_type
47
+ def native_type(_type = nil)
48
48
  FFI::Type::POINTER
49
49
  end
50
50
 
data/lib/ffi/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module FFI
2
- VERSION = '1.17.0'
2
+ VERSION = '1.17.4'
3
3
  end
@@ -1,5 +1,13 @@
1
+ # See the ffi wiki for how to use FFI with Ractors:
2
+ # https://github.com/ffi/ffi/wiki/Ractors
3
+
1
4
  require 'ffi'
2
5
 
6
+ class Ractor
7
+ # compat with Ruby-3.4 and older
8
+ alias value take unless method_defined? :value
9
+ end
10
+
3
11
  module Foo
4
12
  extend FFI::Library
5
13
  ffi_lib FFI::Library::LIBC
@@ -8,4 +16,4 @@ module Foo
8
16
  end
9
17
  Ractor.new do
10
18
  Foo.cputs("Hello, World via libc puts using FFI in a Ractor")
11
- end.take
19
+ end.value
@@ -1,5 +1,13 @@
1
+ # See the ffi wiki for how to use FFI with Ractors:
2
+ # https://github.com/ffi/ffi/wiki/Ractors
3
+
1
4
  require 'ffi'
2
5
 
6
+ class Ractor
7
+ # compat with Ruby-3.4 and older
8
+ alias value take unless method_defined? :value
9
+ end
10
+
3
11
  module LibC
4
12
  extend FFI::Library
5
13
  ffi_lib FFI::Library::LIBC
@@ -23,6 +31,6 @@ res = Ractor.new(p) do |p|
23
31
  i1 < i2 ? -1 : i1 > i2 ? 1 : 0
24
32
  end
25
33
  puts "After qsort #{p.get_array_of_int32(0, 3).join(', ')}"
26
- end.take
34
+ end.value
27
35
 
28
36
  puts "After ractor termination #{p.get_array_of_int32(0, 3).join(', ')}"
@@ -12,8 +12,7 @@ module FFI
12
12
  def release: (Pointer ptr) -> void
13
13
  end
14
14
 
15
- def initialize: (Pointer pointer, Method | ^(self) -> void | Releaser::_Proc[self] callable) -> self
16
- # | (Pointer pointer) { (self) -> void } -> self # https://github.com/ffi/ffi/issues/1071
15
+ def initialize: (Pointer pointer, Method | ^(instance) -> void | Releaser::_Proc[instance] callable) -> self
17
16
  | (Pointer pointer) -> self # where class < `def self.release: (instance pointer) -> void`
18
17
 
19
18
  extend DataConverter[Pointer, instance, nil]
data/sig/ffi/errno.rbs ADDED
@@ -0,0 +1,8 @@
1
+ module FFI
2
+ module LastError
3
+ def self?.error: () -> Integer
4
+ def self?.error=: (Integer) -> Integer
5
+ def self?.winapi_error: () -> Integer?
6
+ def self?.winapi_error=: (Integer? error) -> void
7
+ end
8
+ end
data/sig/ffi/library.rbs CHANGED
@@ -33,7 +33,7 @@ module FFI
33
33
  def find_type: (ffi_lib_type t) -> Type
34
34
  def freeze: () -> void
35
35
  def function_names: (_ToS name, Array[Type | singleton(Struct)] arg_types) -> Array[String]
36
- def typedef: [T < Type] (T old, Symbol | DataConverter add, ?untyped) -> T
36
+ def typedef: [T < Type, N, R, C] (T old, Symbol | DataConverter[N, R, C] add, ?untyped) -> T
37
37
  | (Symbol old, Symbol add, ?untyped) -> (Type | Enum)
38
38
  | [X < DataConverter[N, R, C], N, R, C] (X old, Symbol add, ?untyped) -> Type::Mapped[X, N, R, C]
39
39
  | (:enum old, Array[Symbol | Integer] add, ?untyped) -> Enum
@@ -0,0 +1,49 @@
1
+ module FFI
2
+ class PlatformError < LoadError
3
+ end
4
+
5
+ module Platform
6
+ OS: String
7
+
8
+ OSVERSION: Integer
9
+
10
+ CPU: String
11
+
12
+ ARCH: String
13
+
14
+ IS_GNU: bool
15
+ IS_LINUX: bool
16
+ IS_MAC: bool
17
+ IS_FREEBSD: bool
18
+ IS_NETBSD: bool
19
+ IS_OPENBSD: bool
20
+ IS_DRAGONFLYBSD: bool
21
+ IS_SOLARIS: bool
22
+ IS_WINDOWS: bool
23
+ IS_BSD: bool
24
+
25
+ NAME: String
26
+
27
+ CONF_DIR: String
28
+
29
+ LIBPREFIX: String
30
+
31
+ LIBSUFFIX: String
32
+
33
+ LIBC: String
34
+
35
+ LITTLE_ENDIAN: Integer
36
+
37
+ BIG_ENDIAN: Integer
38
+
39
+ def self.bsd?: () -> bool
40
+ def self.windows?: () -> bool
41
+ def self.mac?: () -> bool
42
+ def self.solaris?: () -> bool
43
+ def self.unix?: () -> bool
44
+
45
+ private
46
+
47
+ def self.is_os: (String os) -> bool
48
+ end
49
+ end
data/sig/ffi/struct.rbs CHANGED
@@ -4,7 +4,7 @@ module FFI
4
4
 
5
5
  type ptr = Type::Mapped[
6
6
  StructByReference[Struct[AbstractMemory, untyped], AbstractMemory],
7
- AbstractMemory, instance, untyped
7
+ AbstractMemory, Struct[AbstractMemory, untyped], untyped
8
8
  ]
9
9
  def self.ptr: (?untyped flags) -> ptr # https://github.com/ffi/ffi/issues/1073
10
10
  alias self.by_ref self.ptr
@@ -22,7 +22,7 @@ module FFI
22
22
 
23
23
  def self.auto_ptr: () -> Type::Mapped[
24
24
  ManagedStructConverter[ManagedStruct[AutoPointer, untyped], AutoPointer],
25
- Pointer, instance, untyped
25
+ Pointer, ManagedStruct[AutoPointer, untyped], untyped
26
26
  ]
27
27
  def self.layout: (*layout | Integer) -> StructLayout
28
28
  | (Hash[Symbol, layout]) -> StructLayout
@@ -5,7 +5,7 @@ module FFI
5
5
 
6
6
  def initialize: (S struct_class) -> void
7
7
  def from_native: (P value, untyped ctx) -> S
8
- def native_type: () -> Type::Builtin
8
+ def native_type: (?ffi_auto_type? type) -> Type
9
9
  def to_native: (S? value, untyped ctx) -> P
10
10
  end
11
11
  end
data/sig/ffi.rbs CHANGED
@@ -14,9 +14,12 @@ module FFI
14
14
  CURRENT_PROCESS: current_process
15
15
  USE_THIS_PROCESS_AS_LIBRARY: current_process
16
16
 
17
+ class NotFoundError < LoadError
18
+ end
19
+
17
20
  private def self.custom_typedefs: () -> type_map
18
21
  def self.errno: () -> Integer
19
- def self.errno=: (Integer) -> nil
22
+ def self.errno=: (Integer) -> Integer
20
23
  def self.find_type: (ffi_auto_type name, ?type_map? type_map) -> Type
21
24
  def self.make_shareable: [T] (T obj) -> T
22
25
  def self.map_library_name: (_ToS lib) -> String
data.tar.gz.sig CHANGED
Binary file