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
@@ -573,6 +573,94 @@ L(UW31):
573
573
  # cfi_endproc
574
574
  ENDF(C(ffi_closure_STDCALL))
575
575
 
576
+ #if defined(FFI_EXEC_STATIC_TRAMP)
577
+ .balign 16
578
+ .globl C(ffi_closure_i386_alt)
579
+ FFI_HIDDEN(C(ffi_closure_i386_alt))
580
+ C(ffi_closure_i386_alt):
581
+ /* See the comments above trampoline_code_table. */
582
+ _CET_ENDBR
583
+ movl 4(%esp), %eax /* Load closure in eax */
584
+ add $8, %esp /* Restore the stack */
585
+ jmp C(ffi_closure_i386)
586
+ ENDF(C(ffi_closure_i386_alt))
587
+
588
+ .balign 16
589
+ .globl C(ffi_closure_REGISTER_alt)
590
+ FFI_HIDDEN(C(ffi_closure_REGISTER_alt))
591
+ C(ffi_closure_REGISTER_alt):
592
+ /* See the comments above trampoline_code_table. */
593
+ _CET_ENDBR
594
+ movl (%esp), %eax /* Restore eax */
595
+ add $4, %esp /* Leave closure on stack */
596
+ jmp C(ffi_closure_REGISTER)
597
+ ENDF(C(ffi_closure_REGISTER_alt))
598
+
599
+ .balign 16
600
+ .globl C(ffi_closure_STDCALL_alt)
601
+ FFI_HIDDEN(C(ffi_closure_STDCALL_alt))
602
+ C(ffi_closure_STDCALL_alt):
603
+ /* See the comments above trampoline_code_table. */
604
+ _CET_ENDBR
605
+ movl 4(%esp), %eax /* Load closure in eax */
606
+ add $8, %esp /* Restore the stack */
607
+ jmp C(ffi_closure_STDCALL)
608
+ ENDF(C(ffi_closure_STDCALL_alt))
609
+
610
+ /*
611
+ * Below is the definition of the trampoline code table. Each element in
612
+ * the code table is a trampoline.
613
+ *
614
+ * Because we jump to the trampoline, we place a _CET_ENDBR at the
615
+ * beginning of the trampoline to mark it as a valid branch target. This is
616
+ * part of the the Intel CET (Control Flow Enforcement Technology).
617
+ */
618
+ /*
619
+ * The trampoline uses register eax. It saves the original value of eax on
620
+ * the stack.
621
+ *
622
+ * The trampoline has two parameters - target code to jump to and data for
623
+ * the target code. The trampoline extracts the parameters from its parameter
624
+ * block (see tramp_table_map()). The trampoline saves the data address on
625
+ * the stack. Finally, it jumps to the target code.
626
+ *
627
+ * The target code can choose to:
628
+ *
629
+ * - restore the value of eax
630
+ * - load the data address in a register
631
+ * - restore the stack pointer to what it was when the trampoline was invoked.
632
+ */
633
+ #ifdef ENDBR_PRESENT
634
+ #define X86_DATA_OFFSET 4081
635
+ #define X86_CODE_OFFSET 4070
636
+ #else
637
+ #define X86_DATA_OFFSET 4085
638
+ #define X86_CODE_OFFSET 4074
639
+ #endif
640
+
641
+ .align X86_TRAMP_MAP_SIZE
642
+ .globl C(trampoline_code_table)
643
+ FFI_HIDDEN(C(trampoline_code_table))
644
+ C(trampoline_code_table):
645
+ .rept X86_TRAMP_MAP_SIZE / X86_TRAMP_SIZE
646
+ _CET_ENDBR
647
+ sub $8, %esp
648
+ movl %eax, (%esp) /* Save %eax on stack */
649
+ call 1f /* Get next PC into %eax */
650
+ movl X86_DATA_OFFSET(%eax), %eax /* Copy data into %eax */
651
+ movl %eax, 4(%esp) /* Save data on stack */
652
+ call 1f /* Get next PC into %eax */
653
+ movl X86_CODE_OFFSET(%eax), %eax /* Copy code into %eax */
654
+ jmp *%eax /* Jump to code */
655
+ 1:
656
+ mov (%esp), %eax
657
+ ret
658
+ .align 4
659
+ .endr
660
+ ENDF(C(trampoline_code_table))
661
+ .align X86_TRAMP_MAP_SIZE
662
+ #endif /* FFI_EXEC_STATIC_TRAMP */
663
+
576
664
  #if !FFI_NO_RAW_API
577
665
 
578
666
  #define raw_closure_S_FS (16+16+12)
@@ -800,10 +888,27 @@ ENDF(C(ffi_closure_raw_THISCALL))
800
888
  #endif /* !FFI_NO_RAW_API */
801
889
 
802
890
  #ifdef X86_DARWIN
803
- # define COMDAT(X) \
804
- .section __TEXT,__text,coalesced,pure_instructions; \
891
+ /* The linker in use on earlier Darwin needs weak definitions to be
892
+ placed in a coalesced section. That section should not be called
893
+ __TEXT,__text since that would be re-defining the attributes of the
894
+ .text section (which is an error for earlier tools). Here we use
895
+ '__textcoal_nt' which is what GCC emits for this.
896
+ Later linker versions are happy to use a normal section and, after
897
+ Darwin12 / OSX 10.8, the tools warn that using coalesced sections
898
+ for this is deprecated so we must switch to avoid build fails and/or
899
+ deprecation warnings. */
900
+ # if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \
901
+ __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1080
902
+ # define COMDAT(X) \
903
+ .section __TEXT,__textcoal_nt,coalesced,pure_instructions; \
805
904
  .weak_definition X; \
806
905
  FFI_HIDDEN(X)
906
+ # else
907
+ # define COMDAT(X) \
908
+ .text; \
909
+ .weak_definition X; \
910
+ FFI_HIDDEN(X)
911
+ # endif
807
912
  #elif defined __ELF__ && !(defined(__sun__) && defined(__svr4__))
808
913
  # define COMDAT(X) \
809
914
  .section .text.X,"axG",@progbits,X,comdat; \
@@ -828,7 +933,37 @@ ENDF(C(__x86.get_pc_thunk.dx))
828
933
  #endif /* DARWIN || HIDDEN */
829
934
  #endif /* __PIC__ */
830
935
 
831
- /* Sadly, OSX cctools-as doesn't understand .cfi directives at all. */
936
+ /* Sadly, OSX cctools-as does not understand .cfi directives at all so
937
+ we build an eh frame by hand. */
938
+
939
+ #ifdef __APPLE__
940
+ /* The cctools assembler will try to make a difference between two local
941
+ symbols into a relocation against, which will not work in the eh (produces
942
+ link-time fails).
943
+ To avoid this, we compute the symbol difference with a .set directive and
944
+ then substitute this value. */
945
+ # define LEN(N, P) .set Llen$N$P,L(N)-L(P); .long Llen$N$P
946
+ /* Note, this assume DW_CFA_advance_loc1 fits into 7 bits. */
947
+ # define ADV(N, P) .set Ladv$N$P,L(N)-L(P); .byte 2, Ladv$N$P
948
+ /* For historical reasons, the EH reg numbers for SP and FP are swapped from
949
+ the DWARF ones for 32b Darwin. */
950
+ # define SP 5
951
+ # define FP 4
952
+ # define ENC 0x10
953
+ #else
954
+ # define LEN(N, P) .long L(N)-L(P)
955
+ /* Assume DW_CFA_advance_loc1 fits. */
956
+ # define ADV(N, P) .byte 2, L(N)-L(P)
957
+ # define SP 4
958
+ # define FP 5
959
+ # define ENC 0x1b
960
+ #endif
961
+
962
+ #ifdef HAVE_AS_X86_PCREL
963
+ # define PCREL(X) X-.
964
+ #else
965
+ # define PCREL(X) X@rel
966
+ #endif
832
967
 
833
968
  #ifdef __APPLE__
834
969
  .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
@@ -840,17 +975,11 @@ EHFrame0:
840
975
  #else
841
976
  .section .eh_frame,EH_FRAME_FLAGS,@progbits
842
977
  #endif
843
-
844
- #ifdef HAVE_AS_X86_PCREL
845
- # define PCREL(X) X - .
846
- #else
847
- # define PCREL(X) X@rel
978
+ #ifndef __APPLE__
979
+ /* EH sections are already suitably aligned on Darwin. */
980
+ .balign 4
848
981
  #endif
849
982
 
850
- /* Simplify advancing between labels. Assume DW_CFA_advance_loc1 fits. */
851
- #define ADV(N, P) .byte 2, L(N)-L(P)
852
-
853
- .balign 4
854
983
  L(CIE):
855
984
  .set L(set0),L(ECIE)-L(SCIE)
856
985
  .long L(set0) /* CIE Length */
@@ -862,8 +991,8 @@ L(SCIE):
862
991
  .byte 0x7c /* CIE Data Alignment Factor */
863
992
  .byte 0x8 /* CIE RA Column */
864
993
  .byte 1 /* Augmentation size */
865
- .byte 0x1b /* FDE Encoding (pcrel sdata4) */
866
- .byte 0xc, 4, 4 /* DW_CFA_def_cfa, %esp offset 4 */
994
+ .byte ENC /* FDE Encoding (pcrel abs/4byte) */
995
+ .byte 0xc, SP, 4 /* DW_CFA_def_cfa, %esp offset 4 */
867
996
  .byte 0x80+8, 1 /* DW_CFA_offset, %eip offset 1*-4 */
868
997
  .balign 4
869
998
  L(ECIE):
@@ -871,20 +1000,20 @@ L(ECIE):
871
1000
  .set L(set1),L(EFDE1)-L(SFDE1)
872
1001
  .long L(set1) /* FDE Length */
873
1002
  L(SFDE1):
874
- .long L(SFDE1)-L(CIE) /* FDE CIE offset */
1003
+ LEN(SFDE1, CIE) /* FDE CIE offset */
875
1004
  .long PCREL(L(UW0)) /* Initial location */
876
- .long L(UW5)-L(UW0) /* Address range */
1005
+ LEN(UW5, UW0) /* Address range */
877
1006
  .byte 0 /* Augmentation size */
878
1007
  ADV(UW1, UW0)
879
- .byte 0xc, 5, 8 /* DW_CFA_def_cfa, %ebp 8 */
880
- .byte 0x80+5, 2 /* DW_CFA_offset, %ebp 2*-4 */
1008
+ .byte 0xc, FP, 8 /* DW_CFA_def_cfa, %ebp 8 */
1009
+ .byte 0x80+FP, 2 /* DW_CFA_offset, %ebp 2*-4 */
881
1010
  ADV(UW2, UW1)
882
1011
  .byte 0x80+3, 0 /* DW_CFA_offset, %ebx 0*-4 */
883
1012
  ADV(UW3, UW2)
884
1013
  .byte 0xa /* DW_CFA_remember_state */
885
- .byte 0xc, 4, 4 /* DW_CFA_def_cfa, %esp 4 */
1014
+ .byte 0xc, SP, 4 /* DW_CFA_def_cfa, %esp 4 */
886
1015
  .byte 0xc0+3 /* DW_CFA_restore, %ebx */
887
- .byte 0xc0+5 /* DW_CFA_restore, %ebp */
1016
+ .byte 0xc0+FP /* DW_CFA_restore, %ebp */
888
1017
  ADV(UW4, UW3)
889
1018
  .byte 0xb /* DW_CFA_restore_state */
890
1019
  .balign 4
@@ -893,9 +1022,9 @@ L(EFDE1):
893
1022
  .set L(set2),L(EFDE2)-L(SFDE2)
894
1023
  .long L(set2) /* FDE Length */
895
1024
  L(SFDE2):
896
- .long L(SFDE2)-L(CIE) /* FDE CIE offset */
1025
+ LEN(SFDE2, CIE) /* FDE CIE offset */
897
1026
  .long PCREL(L(UW6)) /* Initial location */
898
- .long L(UW8)-L(UW6) /* Address range */
1027
+ LEN(UW8,UW6) /* Address range */
899
1028
  .byte 0 /* Augmentation size */
900
1029
  ADV(UW7, UW6)
901
1030
  .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */
@@ -905,9 +1034,9 @@ L(EFDE2):
905
1034
  .set L(set3),L(EFDE3)-L(SFDE3)
906
1035
  .long L(set3) /* FDE Length */
907
1036
  L(SFDE3):
908
- .long L(SFDE3)-L(CIE) /* FDE CIE offset */
1037
+ LEN(SFDE3, CIE) /* FDE CIE offset */
909
1038
  .long PCREL(L(UW9)) /* Initial location */
910
- .long L(UW11)-L(UW9) /* Address range */
1039
+ LEN(UW11, UW9) /* Address range */
911
1040
  .byte 0 /* Augmentation size */
912
1041
  ADV(UW10, UW9)
913
1042
  .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */
@@ -917,9 +1046,9 @@ L(EFDE3):
917
1046
  .set L(set4),L(EFDE4)-L(SFDE4)
918
1047
  .long L(set4) /* FDE Length */
919
1048
  L(SFDE4):
920
- .long L(SFDE4)-L(CIE) /* FDE CIE offset */
1049
+ LEN(SFDE4, CIE) /* FDE CIE offset */
921
1050
  .long PCREL(L(UW12)) /* Initial location */
922
- .long L(UW20)-L(UW12) /* Address range */
1051
+ LEN(UW20, UW12) /* Address range */
923
1052
  .byte 0 /* Augmentation size */
924
1053
  ADV(UW13, UW12)
925
1054
  .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */
@@ -945,9 +1074,9 @@ L(EFDE4):
945
1074
  .set L(set5),L(EFDE5)-L(SFDE5)
946
1075
  .long L(set5) /* FDE Length */
947
1076
  L(SFDE5):
948
- .long L(SFDE5)-L(CIE) /* FDE CIE offset */
1077
+ LEN(SFDE5, CIE) /* FDE CIE offset */
949
1078
  .long PCREL(L(UW21)) /* Initial location */
950
- .long L(UW23)-L(UW21) /* Address range */
1079
+ LEN(UW23, UW21) /* Address range */
951
1080
  .byte 0 /* Augmentation size */
952
1081
  ADV(UW22, UW21)
953
1082
  .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */
@@ -957,9 +1086,9 @@ L(EFDE5):
957
1086
  .set L(set6),L(EFDE6)-L(SFDE6)
958
1087
  .long L(set6) /* FDE Length */
959
1088
  L(SFDE6):
960
- .long L(SFDE6)-L(CIE) /* FDE CIE offset */
1089
+ LEN(SFDE6, CIE) /* FDE CIE offset */
961
1090
  .long PCREL(L(UW24)) /* Initial location */
962
- .long L(UW26)-L(UW24) /* Address range */
1091
+ LEN(UW26, UW24) /* Address range */
963
1092
  .byte 0 /* Augmentation size */
964
1093
  .byte 0xe, 8 /* DW_CFA_def_cfa_offset */
965
1094
  .byte 0x80+8, 2 /* DW_CFA_offset %eip, 2*-4 */
@@ -971,9 +1100,9 @@ L(EFDE6):
971
1100
  .set L(set7),L(EFDE7)-L(SFDE7)
972
1101
  .long L(set7) /* FDE Length */
973
1102
  L(SFDE7):
974
- .long L(SFDE7)-L(CIE) /* FDE CIE offset */
1103
+ LEN(SFDE7, CIE) /* FDE CIE offset */
975
1104
  .long PCREL(L(UW27)) /* Initial location */
976
- .long L(UW31)-L(UW27) /* Address range */
1105
+ LEN(UW31, UW27) /* Address range */
977
1106
  .byte 0 /* Augmentation size */
978
1107
  ADV(UW28, UW27)
979
1108
  .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */
@@ -985,14 +1114,13 @@ L(SFDE7):
985
1114
  #endif
986
1115
  .balign 4
987
1116
  L(EFDE7):
988
-
989
1117
  #if !FFI_NO_RAW_API
990
1118
  .set L(set8),L(EFDE8)-L(SFDE8)
991
1119
  .long L(set8) /* FDE Length */
992
1120
  L(SFDE8):
993
- .long L(SFDE8)-L(CIE) /* FDE CIE offset */
1121
+ LEN(SFDE8, CIE) /* FDE CIE offset */
994
1122
  .long PCREL(L(UW32)) /* Initial location */
995
- .long L(UW40)-L(UW32) /* Address range */
1123
+ LEN(UW40, UW32) /* Address range */
996
1124
  .byte 0 /* Augmentation size */
997
1125
  ADV(UW33, UW32)
998
1126
  .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */
@@ -1014,9 +1142,9 @@ L(EFDE8):
1014
1142
  .set L(set9),L(EFDE9)-L(SFDE9)
1015
1143
  .long L(set9) /* FDE Length */
1016
1144
  L(SFDE9):
1017
- .long L(SFDE9)-L(CIE) /* FDE CIE offset */
1145
+ LEN(SFDE9, CIE) /* FDE CIE offset */
1018
1146
  .long PCREL(L(UW41)) /* Initial location */
1019
- .long L(UW52)-L(UW41) /* Address range */
1147
+ LEN(UW52, UW41) /* Address range */
1020
1148
  .byte 0 /* Augmentation size */
1021
1149
  ADV(UW42, UW41)
1022
1150
  .byte 0xe, 0 /* DW_CFA_def_cfa_offset */
@@ -1053,8 +1181,12 @@ L(EFDE9):
1053
1181
  @feat.00 = 1
1054
1182
  #endif
1055
1183
 
1056
- #ifdef __APPLE__
1184
+ #if defined(__APPLE__)
1057
1185
  .subsections_via_symbols
1186
+ # if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \
1187
+ __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1070 && __clang__
1188
+ /* compact unwind is not used with GCC at present, was not present before 10.6
1189
+ but has some bugs there, so do not emit until 10.7. */
1058
1190
  .section __LD,__compact_unwind,regular,debug
1059
1191
 
1060
1192
  /* compact unwind for ffi_call_i386 */
@@ -1128,9 +1260,11 @@ L(EFDE9):
1128
1260
  .long 0x04000000 /* use dwarf unwind info */
1129
1261
  .long 0
1130
1262
  .long 0
1263
+ #endif /* use compact unwind */
1131
1264
  #endif /* __APPLE__ */
1132
1265
 
1133
1266
  #endif /* ifndef _MSC_VER */
1267
+
1134
1268
  #endif /* ifdef __i386__ */
1135
1269
 
1136
1270
  #if defined __ELF__ && defined __linux__