ffi 1.9.24 → 1.16.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (457) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +348 -0
  4. data/Gemfile +4 -5
  5. data/README.md +44 -17
  6. data/Rakefile +74 -148
  7. data/ext/ffi_c/AbstractMemory.c +89 -70
  8. data/ext/ffi_c/AbstractMemory.h +3 -2
  9. data/ext/ffi_c/ArrayType.c +49 -13
  10. data/ext/ffi_c/ArrayType.h +1 -0
  11. data/ext/ffi_c/Buffer.c +90 -38
  12. data/ext/ffi_c/Call.c +55 -56
  13. data/ext/ffi_c/Call.h +12 -6
  14. data/ext/ffi_c/ClosurePool.c +333 -0
  15. data/ext/ffi_c/{Closure.h → ClosurePool.h} +25 -13
  16. data/ext/ffi_c/DynamicLibrary.c +91 -33
  17. data/ext/ffi_c/Function.c +306 -235
  18. data/ext/ffi_c/Function.h +3 -5
  19. data/ext/ffi_c/FunctionInfo.c +87 -32
  20. data/ext/ffi_c/LastError.c +74 -15
  21. data/ext/ffi_c/LongDouble.c +12 -10
  22. data/ext/ffi_c/LongDouble.h +0 -4
  23. data/ext/ffi_c/MappedType.c +66 -23
  24. data/ext/ffi_c/MappedType.h +0 -2
  25. data/ext/ffi_c/MemoryPointer.c +37 -15
  26. data/ext/ffi_c/MemoryPointer.h +0 -4
  27. data/ext/ffi_c/MethodHandle.c +265 -38
  28. data/ext/ffi_c/MethodHandle.h +3 -2
  29. data/ext/ffi_c/Platform.c +5 -56
  30. data/ext/ffi_c/Pointer.c +93 -55
  31. data/ext/ffi_c/Pointer.h +1 -4
  32. data/ext/ffi_c/Struct.c +202 -134
  33. data/ext/ffi_c/Struct.h +18 -9
  34. data/ext/ffi_c/StructByValue.c +50 -23
  35. data/ext/ffi_c/StructLayout.c +135 -64
  36. data/ext/ffi_c/Thread.c +4 -228
  37. data/ext/ffi_c/Thread.h +1 -20
  38. data/ext/ffi_c/Type.c +105 -55
  39. data/ext/ffi_c/Type.h +3 -2
  40. data/ext/ffi_c/Types.c +8 -9
  41. data/ext/ffi_c/Types.h +3 -4
  42. data/ext/ffi_c/Variadic.c +88 -47
  43. data/ext/ffi_c/compat.h +26 -22
  44. data/ext/ffi_c/extconf.rb +75 -32
  45. data/ext/ffi_c/ffi.c +9 -10
  46. data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
  47. data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
  48. data/ext/ffi_c/libffi/.appveyor.yml +53 -19
  49. data/ext/ffi_c/libffi/.ci/bfin-sim.exp +58 -0
  50. data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
  51. data/ext/ffi_c/libffi/.ci/build-in-container.sh +10 -0
  52. data/ext/ffi_c/libffi/.ci/build.sh +124 -0
  53. data/ext/ffi_c/libffi/.ci/install.sh +78 -0
  54. data/ext/ffi_c/libffi/.ci/m32r-sim.exp +58 -0
  55. data/ext/ffi_c/libffi/{.travis → .ci}/moxie-sim.exp +1 -1
  56. data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
  57. data/ext/ffi_c/libffi/.ci/or1k-sim.exp +58 -0
  58. data/ext/ffi_c/libffi/.ci/powerpc-eabisim.exp +58 -0
  59. data/ext/ffi_c/libffi/.ci/site.exp +29 -0
  60. data/ext/ffi_c/libffi/.ci/wine-sim.exp +55 -0
  61. data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
  62. data/ext/ffi_c/libffi/.gitattributes +4 -0
  63. data/ext/ffi_c/libffi/.github/workflows/build.yml +460 -0
  64. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +171 -0
  65. data/ext/ffi_c/libffi/.gitignore +10 -2
  66. data/ext/ffi_c/libffi/{ChangeLog.libffi-3.1 → ChangeLog.old} +1407 -0
  67. data/ext/ffi_c/libffi/LICENSE +1 -1
  68. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +5 -4
  69. data/ext/ffi_c/libffi/Makefile.am +64 -73
  70. data/ext/ffi_c/libffi/Makefile.in +553 -235
  71. data/ext/ffi_c/libffi/README.md +165 -100
  72. data/ext/ffi_c/libffi/acinclude.m4 +10 -112
  73. data/ext/ffi_c/libffi/compile +348 -0
  74. data/ext/ffi_c/libffi/config.guess +950 -662
  75. data/ext/ffi_c/libffi/config.sub +1362 -1306
  76. data/ext/ffi_c/libffi/configure +4909 -4096
  77. data/ext/ffi_c/libffi/configure.ac +93 -32
  78. data/ext/ffi_c/libffi/configure.host +76 -28
  79. data/ext/ffi_c/libffi/doc/Makefile.in +15 -8
  80. data/ext/ffi_c/libffi/doc/libffi.texi +107 -46
  81. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  82. data/ext/ffi_c/libffi/fficonfig.h.in +22 -44
  83. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +165 -56
  84. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  85. data/ext/ffi_c/libffi/include/Makefile.in +17 -12
  86. data/ext/ffi_c/libffi/include/ffi.h.in +64 -48
  87. data/ext/ffi_c/libffi/include/ffi_cfi.h +21 -0
  88. data/ext/ffi_c/libffi/include/ffi_common.h +34 -1
  89. data/ext/ffi_c/libffi/include/tramp.h +45 -0
  90. data/ext/ffi_c/libffi/install-sh +107 -74
  91. data/ext/ffi_c/libffi/libffi.map.in +8 -12
  92. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +2 -48
  93. data/ext/ffi_c/libffi/libtool-version +2 -2
  94. data/ext/ffi_c/libffi/ltmain.sh +576 -284
  95. data/ext/ffi_c/libffi/m4/asmcfi.m4 +1 -1
  96. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +5 -26
  97. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +18 -14
  98. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +108 -72
  99. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +5 -26
  100. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +76 -44
  101. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +5 -26
  102. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +7 -3
  103. data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
  104. data/ext/ffi_c/libffi/make_sunver.pl +333 -0
  105. data/ext/ffi_c/libffi/man/Makefile.in +15 -8
  106. data/ext/ffi_c/libffi/missing +8 -8
  107. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
  108. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
  109. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
  110. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
  111. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +511 -0
  112. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/fficonfig.h +219 -0
  113. data/ext/ffi_c/libffi/msvcc.sh +39 -14
  114. data/ext/ffi_c/libffi/src/aarch64/ffi.c +286 -98
  115. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +19 -3
  116. data/ext/ffi_c/libffi/src/aarch64/internal.h +33 -0
  117. data/ext/ffi_c/libffi/src/aarch64/sysv.S +142 -37
  118. data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +506 -0
  119. data/ext/ffi_c/libffi/src/arc/arcompact.S +169 -94
  120. data/ext/ffi_c/libffi/src/arc/ffi.c +325 -148
  121. data/ext/ffi_c/libffi/src/arc/ffitarget.h +14 -0
  122. data/ext/ffi_c/libffi/src/arm/ffi.c +112 -10
  123. data/ext/ffi_c/libffi/src/arm/ffitarget.h +8 -1
  124. data/ext/ffi_c/libffi/src/arm/internal.h +10 -0
  125. data/ext/ffi_c/libffi/src/arm/sysv.S +117 -44
  126. data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
  127. data/ext/ffi_c/libffi/src/closures.c +189 -48
  128. data/ext/ffi_c/libffi/src/csky/ffi.c +395 -0
  129. data/ext/ffi_c/libffi/src/csky/ffitarget.h +63 -0
  130. data/ext/ffi_c/libffi/src/csky/sysv.S +371 -0
  131. data/ext/ffi_c/libffi/src/dlmalloc.c +6 -1
  132. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  133. data/ext/ffi_c/libffi/src/ia64/ffi.c +12 -0
  134. data/ext/ffi_c/libffi/src/ia64/unix.S +20 -2
  135. data/ext/ffi_c/libffi/src/kvx/asm.h +5 -0
  136. data/ext/ffi_c/libffi/src/kvx/ffi.c +273 -0
  137. data/ext/ffi_c/libffi/src/kvx/ffitarget.h +75 -0
  138. data/ext/ffi_c/libffi/src/kvx/sysv.S +127 -0
  139. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +621 -0
  140. data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
  141. data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
  142. data/ext/ffi_c/libffi/src/m32r/ffi.c +31 -14
  143. data/ext/ffi_c/libffi/src/metag/ffi.c +1 -1
  144. data/ext/ffi_c/libffi/src/mips/ffi.c +245 -66
  145. data/ext/ffi_c/libffi/src/mips/ffitarget.h +8 -1
  146. data/ext/ffi_c/libffi/src/mips/n32.S +137 -28
  147. data/ext/ffi_c/libffi/src/mips/o32.S +63 -4
  148. data/ext/ffi_c/libffi/src/moxie/ffi.c +48 -23
  149. data/ext/ffi_c/libffi/src/or1k/ffi.c +25 -12
  150. data/ext/ffi_c/libffi/src/pa/ffi.c +62 -108
  151. data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
  152. data/ext/ffi_c/libffi/src/pa/ffitarget.h +20 -11
  153. data/ext/ffi_c/libffi/src/pa/hpux32.S +87 -38
  154. data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
  155. data/ext/ffi_c/libffi/src/pa/linux.S +109 -39
  156. data/ext/ffi_c/libffi/src/powerpc/ffi.c +6 -4
  157. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +13 -1
  158. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +211 -32
  159. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +18 -7
  160. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +10 -4
  161. data/ext/ffi_c/libffi/src/powerpc/linux64.S +93 -28
  162. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +83 -5
  163. data/ext/ffi_c/libffi/src/powerpc/sysv.S +5 -7
  164. data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
  165. data/ext/ffi_c/libffi/src/prep_cif.c +26 -4
  166. data/ext/ffi_c/libffi/src/riscv/ffi.c +79 -10
  167. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +1 -0
  168. data/ext/ffi_c/libffi/src/riscv/sysv.S +86 -7
  169. data/ext/ffi_c/libffi/src/sparc/ffi64.c +16 -0
  170. data/ext/ffi_c/libffi/src/tramp.c +716 -0
  171. data/ext/ffi_c/libffi/src/wasm32/ffi.c +934 -0
  172. data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
  173. data/ext/ffi_c/libffi/src/x86/ffi.c +128 -49
  174. data/ext/ffi_c/libffi/src/x86/ffi64.c +89 -23
  175. data/ext/ffi_c/libffi/src/x86/ffitarget.h +21 -4
  176. data/ext/ffi_c/libffi/src/x86/ffiw64.c +63 -10
  177. data/ext/ffi_c/libffi/src/x86/internal.h +14 -0
  178. data/ext/ffi_c/libffi/src/x86/internal64.h +14 -0
  179. data/ext/ffi_c/libffi/src/x86/sysv.S +274 -45
  180. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +998 -0
  181. data/ext/ffi_c/libffi/src/x86/unix64.S +190 -4
  182. data/ext/ffi_c/libffi/src/x86/win64.S +32 -10
  183. data/ext/ffi_c/libffi/src/x86/win64_intel.S +3 -2
  184. data/ext/ffi_c/libffi/src/xtensa/ffi.c +16 -8
  185. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +4 -0
  186. data/ext/ffi_c/libffi/src/xtensa/sysv.S +26 -16
  187. data/ext/ffi_c/libffi/testsuite/Makefile.am +127 -109
  188. data/ext/ffi_c/libffi/testsuite/Makefile.in +144 -88
  189. data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
  190. data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
  191. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +80 -0
  192. data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
  193. data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
  194. data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
  195. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +71 -25
  196. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +2 -2
  197. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +7 -2
  198. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +5 -4
  199. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2 -2
  200. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +5 -1
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +12 -1
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +28 -3
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +9 -8
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +3 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +5 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +8 -9
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +2 -2
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +2 -2
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +2 -2
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +1 -1
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +1 -119
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +13 -0
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +11 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +15 -0
  230. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
  231. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +3 -2
  232. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +2 -0
  233. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +2 -0
  234. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +21 -1
  235. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +2 -0
  236. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +2 -0
  237. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +2 -0
  238. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +7 -6
  239. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_simple.c +6 -0
  240. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +18 -0
  241. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +22 -0
  242. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +24 -0
  243. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +29 -0
  244. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +4 -0
  245. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +19 -1
  246. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +21 -1
  247. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +35 -3
  248. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +13 -0
  249. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +19 -0
  250. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +13 -0
  251. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +13 -0
  252. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3float.c +18 -0
  253. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +22 -0
  254. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +13 -0
  255. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +29 -1
  256. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +19 -1
  257. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +24 -0
  258. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +28 -1
  259. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +24 -2
  260. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +39 -1
  261. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +25 -1
  262. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +14 -0
  263. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +14 -1
  264. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +14 -2
  265. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +19 -1
  266. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +19 -1
  267. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +20 -1
  268. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +40 -25
  269. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +40 -3
  270. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +19 -1
  271. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +18 -1
  272. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +18 -3
  273. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +18 -1
  274. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +18 -1
  275. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +19 -1
  276. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +19 -1
  277. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +3 -1
  278. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +9 -1
  279. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +4 -0
  280. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +11 -1
  281. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +22 -3
  282. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +5 -1
  283. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +6 -1
  284. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +9 -1
  285. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +9 -1
  286. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +6 -2
  287. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +9 -1
  288. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +5 -0
  289. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +10 -0
  290. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +3 -0
  291. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +2 -0
  292. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +3 -0
  293. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_struct_va1.c +11 -0
  294. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +3 -0
  295. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +4 -0
  296. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint_va.c +4 -0
  297. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulong_va.c +4 -0
  298. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +2 -0
  299. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +3 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -0
  301. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +24 -22
  302. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +32 -9
  303. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +1 -1
  304. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +12 -0
  305. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct11.c +21 -5
  306. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
  308. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct2.c +10 -1
  309. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +10 -1
  310. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +9 -0
  311. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +9 -0
  312. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +11 -0
  313. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +9 -0
  314. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +11 -0
  315. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +11 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
  319. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +1 -1
  320. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +1 -1
  321. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +6 -1
  322. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/unwindtest.cc +2 -1
  323. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/unwindtest_ffi_call.cc +1 -0
  324. data/ext/ffi_c/libffi.bsd.mk +2 -2
  325. data/ext/ffi_c/libffi.darwin.mk +1 -1
  326. data/ext/ffi_c/libffi.gnu.mk +2 -2
  327. data/ext/ffi_c/rbffi.h +1 -3
  328. data/ffi.gemspec +15 -9
  329. data/lib/ffi/abstract_memory.rb +44 -0
  330. data/lib/ffi/autopointer.rb +8 -23
  331. data/lib/ffi/compat.rb +43 -0
  332. data/lib/ffi/data_converter.rb +67 -0
  333. data/lib/ffi/dynamic_library.rb +89 -0
  334. data/lib/ffi/enum.rb +18 -11
  335. data/lib/ffi/ffi.rb +6 -0
  336. data/lib/ffi/function.rb +71 -0
  337. data/lib/ffi/io.rb +3 -3
  338. data/lib/ffi/library.rb +65 -77
  339. data/lib/ffi/library_path.rb +109 -0
  340. data/lib/ffi/managedstruct.rb +3 -3
  341. data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
  342. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  343. data/lib/ffi/platform/aarch64-freebsd12/types.conf +181 -0
  344. data/lib/ffi/platform/aarch64-linux/types.conf +81 -81
  345. data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
  346. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  347. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  348. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  349. data/lib/ffi/platform/arm-linux/types.conf +110 -82
  350. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  351. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  352. data/lib/ffi/platform/i386-cygwin/types.conf +1 -1
  353. data/lib/ffi/platform/i386-darwin/types.conf +63 -63
  354. data/lib/ffi/platform/i386-freebsd/types.conf +89 -89
  355. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  356. data/lib/ffi/platform/i386-gnu/types.conf +84 -84
  357. data/lib/ffi/platform/i386-linux/types.conf +77 -77
  358. data/lib/ffi/platform/i386-netbsd/types.conf +87 -87
  359. data/lib/ffi/platform/i386-openbsd/types.conf +89 -89
  360. data/lib/ffi/platform/i386-solaris/types.conf +96 -96
  361. data/lib/ffi/platform/i386-windows/types.conf +43 -96
  362. data/lib/ffi/platform/ia64-linux/types.conf +79 -79
  363. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  364. data/lib/ffi/platform/mips-linux/types.conf +79 -79
  365. data/lib/ffi/platform/mips64-linux/types.conf +81 -81
  366. data/lib/ffi/platform/mips64el-linux/types.conf +81 -81
  367. data/lib/ffi/platform/mipsel-linux/types.conf +79 -79
  368. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +79 -79
  369. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +79 -79
  370. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +81 -81
  371. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +81 -81
  372. data/lib/ffi/platform/powerpc-aix/types.conf +155 -155
  373. data/lib/ffi/platform/powerpc-darwin/types.conf +63 -63
  374. data/lib/ffi/platform/powerpc-linux/types.conf +108 -78
  375. data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
  376. data/lib/ffi/platform/powerpc64-linux/types.conf +81 -81
  377. data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
  378. data/lib/ffi/platform/riscv64-linux/types.conf +104 -0
  379. data/lib/ffi/platform/s390-linux/types.conf +79 -79
  380. data/lib/ffi/platform/s390x-linux/types.conf +79 -79
  381. data/lib/ffi/platform/sparc-linux/types.conf +79 -79
  382. data/lib/ffi/platform/sparc-solaris/types.conf +103 -103
  383. data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
  384. data/lib/ffi/platform/sparcv9-solaris/types.conf +103 -103
  385. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  386. data/lib/ffi/platform/x86_64-cygwin/types.conf +1 -1
  387. data/lib/ffi/platform/x86_64-darwin/types.conf +88 -84
  388. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
  389. data/lib/ffi/platform/x86_64-freebsd/types.conf +90 -90
  390. data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
  391. data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
  392. data/lib/ffi/platform/x86_64-linux/types.conf +107 -77
  393. data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
  394. data/lib/ffi/platform/x86_64-netbsd/types.conf +89 -89
  395. data/lib/ffi/platform/x86_64-openbsd/types.conf +86 -86
  396. data/lib/ffi/platform/x86_64-solaris/types.conf +96 -96
  397. data/lib/ffi/platform/x86_64-windows/types.conf +42 -110
  398. data/lib/ffi/platform.rb +43 -20
  399. data/lib/ffi/pointer.rb +26 -20
  400. data/lib/ffi/struct.rb +14 -68
  401. data/lib/ffi/struct_by_reference.rb +72 -0
  402. data/lib/ffi/struct_layout.rb +96 -0
  403. data/lib/ffi/struct_layout_builder.rb +1 -1
  404. data/lib/ffi/tools/const_generator.rb +11 -8
  405. data/lib/ffi/tools/generator.rb +47 -2
  406. data/lib/ffi/tools/generator_task.rb +13 -17
  407. data/lib/ffi/tools/struct_generator.rb +6 -5
  408. data/lib/ffi/tools/types_generator.rb +7 -4
  409. data/lib/ffi/types.rb +33 -7
  410. data/lib/ffi/variadic.rb +20 -18
  411. data/lib/ffi/version.rb +1 -1
  412. data/lib/ffi.rb +10 -3
  413. data/rakelib/ffi_gem_helper.rb +65 -0
  414. data/samples/getlogin.rb +1 -1
  415. data/samples/getpid.rb +1 -1
  416. data/samples/gettimeofday.rb +8 -8
  417. data/samples/hello.rb +2 -1
  418. data/samples/hello_ractor.rb +11 -0
  419. data/samples/inotify.rb +1 -1
  420. data/samples/pty.rb +1 -2
  421. data/samples/qsort.rb +0 -1
  422. data/samples/qsort_ractor.rb +28 -0
  423. data.tar.gz.sig +0 -0
  424. metadata +252 -153
  425. metadata.gz.sig +0 -0
  426. data/.gitignore +0 -22
  427. data/.gitmodules +0 -3
  428. data/.travis.yml +0 -52
  429. data/.yardopts +0 -5
  430. data/appveyor.yml +0 -22
  431. data/ext/ffi_c/Closure.c +0 -54
  432. data/ext/ffi_c/DataConverter.c +0 -91
  433. data/ext/ffi_c/StructByReference.c +0 -190
  434. data/ext/ffi_c/StructByReference.h +0 -50
  435. data/ext/ffi_c/libffi/.travis/build.sh +0 -34
  436. data/ext/ffi_c/libffi/.travis/install.sh +0 -22
  437. data/ext/ffi_c/libffi/.travis/site.exp +0 -18
  438. data/ext/ffi_c/libffi/.travis.yml +0 -34
  439. data/ext/ffi_c/libffi/ChangeLog.libffi +0 -584
  440. data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
  441. data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
  442. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +0 -44
  443. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +0 -44
  444. data/ext/ffi_c/win32/stdbool.h +0 -8
  445. data/ext/ffi_c/win32/stdint.h +0 -201
  446. data/samples/sample_helper.rb +0 -6
  447. data/ext/ffi_c/libffi/{.travis → .ci}/ar-lib +0 -0
  448. data/ext/ffi_c/libffi/{.travis → .ci}/compile +0 -0
  449. data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
  450. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
  451. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_many_mixed_args.c +0 -0
  452. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_many_mixed_float_double.c +0 -0
  453. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +0 -0
  454. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
  455. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large.c +0 -0
  456. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +0 -0
  457. data/lib/ffi/platform/{sparc64-linux → sparcv9-linux}/types.conf +79 -79
@@ -31,6 +31,15 @@ static B B_fn(struct A b2, struct B b3)
31
31
  (int)b3.x.a, b3.x.b, b3.y,
32
32
  (int)result.x.a, result.x.b, result.y);
33
33
 
34
+ CHECK((int)b2.a == 1);
35
+ CHECK(b2.b == 7);
36
+ CHECK((int)b3.x.a == 12);
37
+ CHECK(b3.x.b == 127);
38
+ CHECK(b3.y == 99);
39
+ CHECK((int)result.x.a == 13);
40
+ CHECK(result.x.b == 233);
41
+ CHECK(result.y == 134);
42
+
34
43
  return result;
35
44
  }
36
45
 
@@ -36,6 +36,17 @@ static B B_fn(struct A b2, struct B b3, struct C b4)
36
36
  (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e,
37
37
  (int)result.x.a, result.x.b, result.y);
38
38
 
39
+ CHECK((int)b2.a == 1);
40
+ CHECK(b2.b == 7);
41
+ CHECK((int)b3.x.a == 12);
42
+ CHECK(b3.x.b == 127);
43
+ CHECK(b3.y == 99);
44
+ CHECK((int)b4.d == 2);
45
+ CHECK(b4.e == 9);
46
+ CHECK((int)result.x.a == 15);
47
+ CHECK(result.x.b == 242);
48
+ CHECK(result.y == 143);
49
+
39
50
  return result;
40
51
  }
41
52
 
@@ -31,6 +31,15 @@ static B B_fn(struct A b2, struct B b3)
31
31
  (int)b3.x.a, b3.x.b, b3.y,
32
32
  (int)result.x.a, result.x.b, result.y);
33
33
 
34
+ CHECK((int)b2.a == 1);
35
+ CHECK(b2.b == 7);
36
+ CHECK((int)b3.x.a == 12);
37
+ CHECK(b3.x.b == 127);
38
+ CHECK(b3.y == 99);
39
+ CHECK((int)result.x.a == 13);
40
+ CHECK(result.x.b == 233);
41
+ CHECK(result.y == 134);
42
+
34
43
  return result;
35
44
  }
36
45
 
@@ -36,6 +36,17 @@ static B B_fn(struct A b2, struct B b3, struct C b4)
36
36
  (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e,
37
37
  (int)result.x.a, result.x.b, result.y);
38
38
 
39
+ CHECK((int)b2.a == 1);
40
+ CHECK(b2.b == 7);
41
+ CHECK((int)b3.x.a == 12);
42
+ CHECK(b3.x.b == 127);
43
+ CHECK(b3.y == 99);
44
+ CHECK((int)b4.d == 2);
45
+ CHECK(b4.e == 9);
46
+ CHECK((int)result.x.a == 15);
47
+ CHECK(result.x.b == 242);
48
+ CHECK(result.y == 143);
49
+
39
50
  return result;
40
51
  }
41
52
 
@@ -36,6 +36,17 @@ static B B_fn(struct A b2, struct B b3, struct C b4)
36
36
  b3.x.a, (int)b3.x.b, b3.y, (int)b4.d, b4.e,
37
37
  result.x.a, (int)result.x.b, result.y);
38
38
 
39
+ CHECK((int)b2.a == 1);
40
+ CHECK(b2.b == 7);
41
+ CHECK((int)b3.x.a == 12);
42
+ CHECK(b3.x.b == 127);
43
+ CHECK(b3.y == 99);
44
+ CHECK((int)b4.d == 2);
45
+ CHECK(b4.e == 9);
46
+ CHECK((int)result.x.a == 15);
47
+ CHECK(result.x.b == 242);
48
+ CHECK(result.y == 143);
49
+
39
50
  return result;
40
51
  }
41
52
 
@@ -0,0 +1,86 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Single argument structs have a different ABI in emscripten.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <hood@mit.edu> */
6
+
7
+ /* { dg-do run } */
8
+ #include "ffitest.h"
9
+
10
+ typedef struct A {
11
+ int a;
12
+ } A;
13
+
14
+ static struct A A_fn(int b0, struct A b1)
15
+ {
16
+ b1.a += b0;
17
+ return b1;
18
+ }
19
+
20
+ static void
21
+ A_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
22
+ void* userdata __UNUSED__)
23
+ {
24
+ int b0;
25
+ struct A b1;
26
+
27
+ b0 = *(int*)(args[0]);
28
+ b1 = *(struct A*)(args[1]);
29
+
30
+ *(A*)resp = A_fn(b0, b1);
31
+ }
32
+
33
+ int main (void)
34
+ {
35
+ printf("123\n");
36
+ ffi_cif cif;
37
+ void *code;
38
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
39
+ void* args_dbl[3];
40
+ ffi_type* cls_struct_fields[2];
41
+ ffi_type cls_struct_type;
42
+ ffi_type* dbl_arg_types[3];
43
+
44
+ int e_dbl = 12125;
45
+ struct A f_dbl = { 31625 };
46
+
47
+ struct A res_dbl;
48
+
49
+ cls_struct_type.size = 0;
50
+ cls_struct_type.alignment = 0;
51
+ cls_struct_type.type = FFI_TYPE_STRUCT;
52
+ cls_struct_type.elements = cls_struct_fields;
53
+
54
+ cls_struct_fields[0] = &ffi_type_sint;
55
+ cls_struct_fields[1] = NULL;
56
+
57
+ dbl_arg_types[0] = &ffi_type_sint;
58
+ dbl_arg_types[1] = &cls_struct_type;
59
+ dbl_arg_types[2] = NULL;
60
+
61
+ res_dbl = A_fn(e_dbl, f_dbl);
62
+ printf("0 res: %d\n", res_dbl.a);
63
+ /* { dg-output "0 res: 43750" } */
64
+
65
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
66
+ dbl_arg_types) == FFI_OK);
67
+
68
+ args_dbl[0] = &e_dbl;
69
+ args_dbl[1] = &f_dbl;
70
+ args_dbl[2] = NULL;
71
+
72
+
73
+ ffi_call(&cif, FFI_FN(A_fn), &res_dbl, args_dbl);
74
+ printf("1 res: %d\n", res_dbl.a);
75
+ /* { dg-output "\n1 res: 43750" } */
76
+ CHECK( res_dbl.a == (e_dbl + f_dbl.a));
77
+
78
+ CHECK(ffi_prep_closure_loc(pcl, &cif, A_gn, NULL, code) == FFI_OK);
79
+
80
+ res_dbl = ((A(*)(int, A))(code))(e_dbl, f_dbl);
81
+ printf("2 res: %d\n", res_dbl.a);
82
+ /* { dg-output "\n2 res: 43750" } */
83
+ CHECK( res_dbl.a == (e_dbl + f_dbl.a));
84
+
85
+ exit(0);
86
+ }
@@ -0,0 +1,102 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Single argument structs have a different ABI in emscripten.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <hood@mit.edu> */
6
+
7
+ /* { dg-do run } */
8
+ #include "ffitest.h"
9
+
10
+ typedef struct A {
11
+ int a, b;
12
+ } A;
13
+
14
+ typedef struct B {
15
+ struct A y;
16
+ } B;
17
+
18
+ static struct B B_fn(int b0, struct B b1)
19
+ {
20
+ b1.y.a += b0;
21
+ b1.y.b -= b0;
22
+ return b1;
23
+ }
24
+
25
+ static void
26
+ B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
27
+ void* userdata __UNUSED__)
28
+ {
29
+ int b0;
30
+ struct B b1;
31
+
32
+ b0 = *(int*)(args[0]);
33
+ b1 = *(struct B*)(args[1]);
34
+
35
+ *(B*)resp = B_fn(b0, b1);
36
+ }
37
+
38
+ int main (void)
39
+ {
40
+ ffi_cif cif;
41
+ void *code;
42
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
43
+ void* args_dbl[3];
44
+ ffi_type* cls_struct_fields[3];
45
+ ffi_type* cls_struct_fields1[2];
46
+ ffi_type cls_struct_type, cls_struct_type1;
47
+ ffi_type* dbl_arg_types[3];
48
+
49
+ int e_dbl = 12125;
50
+ struct B f_dbl = { { 31625, 16723 } };
51
+
52
+ struct B res_dbl;
53
+
54
+ cls_struct_type.size = 0;
55
+ cls_struct_type.alignment = 0;
56
+ cls_struct_type.type = FFI_TYPE_STRUCT;
57
+ cls_struct_type.elements = cls_struct_fields;
58
+
59
+ cls_struct_type1.size = 0;
60
+ cls_struct_type1.alignment = 0;
61
+ cls_struct_type1.type = FFI_TYPE_STRUCT;
62
+ cls_struct_type1.elements = cls_struct_fields1;
63
+
64
+ cls_struct_fields[0] = &ffi_type_sint;
65
+ cls_struct_fields[1] = &ffi_type_sint;
66
+ cls_struct_fields[2] = NULL;
67
+
68
+ cls_struct_fields1[0] = &cls_struct_type;
69
+ cls_struct_fields1[1] = NULL;
70
+
71
+
72
+ dbl_arg_types[0] = &ffi_type_sint;
73
+ dbl_arg_types[1] = &cls_struct_type1;
74
+ dbl_arg_types[2] = NULL;
75
+
76
+ res_dbl = B_fn(e_dbl, f_dbl);
77
+ printf("0 res: %d %d\n", res_dbl.y.a, res_dbl.y.b);
78
+ /* { dg-output "0 res: 43750 4598" } */
79
+
80
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1,
81
+ dbl_arg_types) == FFI_OK);
82
+
83
+ args_dbl[0] = &e_dbl;
84
+ args_dbl[1] = &f_dbl;
85
+ args_dbl[2] = NULL;
86
+
87
+ ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
88
+ printf("1 res: %d %d\n", res_dbl.y.a, res_dbl.y.b);
89
+ /* { dg-output "\n1 res: 43750 4598" } */
90
+ CHECK( res_dbl.y.a == (f_dbl.y.a + e_dbl));
91
+ CHECK( res_dbl.y.b == (f_dbl.y.b - e_dbl));
92
+
93
+ CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
94
+
95
+ res_dbl = ((B(*)(int, B))(code))(e_dbl, f_dbl);
96
+ printf("2 res: %d %d\n", res_dbl.y.a, res_dbl.y.b);
97
+ /* { dg-output "\n2 res: 43750 4598" } */
98
+ CHECK( res_dbl.y.a == (f_dbl.y.a + e_dbl));
99
+ CHECK( res_dbl.y.b == (f_dbl.y.b - e_dbl));
100
+
101
+ exit(0);
102
+ }
@@ -0,0 +1,101 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Single argument structs have a different ABI in emscripten.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <hood@mit.edu> */
6
+
7
+ /* { dg-do run } */
8
+ #include "ffitest.h"
9
+
10
+ typedef struct A {
11
+ int a;
12
+ } A;
13
+
14
+ typedef struct B {
15
+ struct A y;
16
+ } B;
17
+
18
+ static struct B B_fn(int b0, struct B b1)
19
+ {
20
+ b1.y.a += b0;
21
+ return b1;
22
+ }
23
+
24
+ static void
25
+ B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
26
+ void* userdata __UNUSED__)
27
+ {
28
+ int b0;
29
+ struct B b1;
30
+
31
+ b0 = *(int*)(args[0]);
32
+ b1 = *(struct B*)(args[1]);
33
+
34
+ *(B*)resp = B_fn(b0, b1);
35
+ }
36
+
37
+ int main (void)
38
+ {
39
+ printf("123\n");
40
+ ffi_cif cif;
41
+ void *code;
42
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
43
+ void* args_dbl[3];
44
+ ffi_type* cls_struct_fields[2];
45
+ ffi_type* cls_struct_fields1[2];
46
+ ffi_type cls_struct_type, cls_struct_type1;
47
+ ffi_type* dbl_arg_types[3];
48
+
49
+ int e_dbl = 12125;
50
+ struct B f_dbl = { { 31625 } };
51
+
52
+ struct B res_dbl;
53
+
54
+ cls_struct_type.size = 0;
55
+ cls_struct_type.alignment = 0;
56
+ cls_struct_type.type = FFI_TYPE_STRUCT;
57
+ cls_struct_type.elements = cls_struct_fields;
58
+
59
+ cls_struct_type1.size = 0;
60
+ cls_struct_type1.alignment = 0;
61
+ cls_struct_type1.type = FFI_TYPE_STRUCT;
62
+ cls_struct_type1.elements = cls_struct_fields1;
63
+
64
+ cls_struct_fields[0] = &ffi_type_sint;
65
+ cls_struct_fields[1] = NULL;
66
+
67
+ cls_struct_fields1[0] = &cls_struct_type;
68
+ cls_struct_fields1[1] = NULL;
69
+
70
+
71
+ dbl_arg_types[0] = &ffi_type_sint;
72
+ dbl_arg_types[1] = &cls_struct_type1;
73
+ dbl_arg_types[2] = NULL;
74
+
75
+ res_dbl = B_fn(e_dbl, f_dbl);
76
+ printf("0 res: %d\n", res_dbl.y.a);
77
+ /* { dg-output "0 res: 43750" } */
78
+
79
+
80
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1,
81
+ dbl_arg_types) == FFI_OK);
82
+
83
+ args_dbl[0] = &e_dbl;
84
+ args_dbl[1] = &f_dbl;
85
+ args_dbl[2] = NULL;
86
+
87
+
88
+ ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
89
+ printf("1 res: %d\n", res_dbl.y.a);
90
+ /* { dg-output "\n1 res: 43750" } */
91
+ CHECK( res_dbl.y.a == (e_dbl + f_dbl.y.a));
92
+
93
+ CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
94
+
95
+ res_dbl = ((B(*)(int, B))(code))(e_dbl, f_dbl);
96
+ printf("2 res: %d\n", res_dbl.y.a);
97
+ /* { dg-output "\n2 res: 43750" } */
98
+ CHECK( res_dbl.y.a == (e_dbl + f_dbl.y.a));
99
+
100
+ exit(0);
101
+ }
@@ -21,7 +21,7 @@ typedef struct struct_72byte {
21
21
  double i;
22
22
  } struct_72byte;
23
23
 
24
- struct_72byte cls_struct_72byte_fn(
24
+ static struct_72byte cls_struct_72byte_fn(
25
25
  struct_72byte b0,
26
26
  struct_72byte b1,
27
27
  struct_72byte b2,
@@ -22,7 +22,7 @@ typedef struct struct_72byte {
22
22
  long long i;
23
23
  } struct_72byte;
24
24
 
25
- struct_72byte cls_struct_72byte_fn(
25
+ static struct_72byte cls_struct_72byte_fn(
26
26
  struct_72byte b0,
27
27
  struct_72byte b1,
28
28
  struct_72byte b2,
@@ -14,12 +14,17 @@ typedef struct cls_struct_combined {
14
14
  float d;
15
15
  } cls_struct_combined;
16
16
 
17
- void cls_struct_combined_fn(struct cls_struct_combined arg)
17
+ static void cls_struct_combined_fn(struct cls_struct_combined arg)
18
18
  {
19
19
  printf("%g %g %g %g\n",
20
20
  arg.a, arg.b,
21
21
  arg.c, arg.d);
22
22
  fflush(stdout);
23
+
24
+ CHECK_FLOAT_EQ(arg.a, 4);
25
+ CHECK_FLOAT_EQ(arg.b, 5);
26
+ CHECK_FLOAT_EQ(arg.c, 1);
27
+ CHECK_FLOAT_EQ(arg.d, 8);
23
28
  }
24
29
 
25
30
  static void
@@ -4,7 +4,7 @@
4
4
  PR: none.
5
5
  Originator: Jeff Sturm <jsturm@one-point.com> */
6
6
 
7
- /* { dg-do run { xfail x86_64-apple-darwin* moxie*-*-* } } */
7
+ /* { dg-do run { xfail moxie*-*-* } } */
8
8
 
9
9
  #include "ffitest.h"
10
10
 
@@ -48,6 +48,7 @@ typedef int (*closure_test_type1)(float, float, float, float, signed short,
48
48
  float, float, int, double, int, int, float,
49
49
  int, int, int, int);
50
50
 
51
+ extern "C"
51
52
  int main (void)
52
53
  {
53
54
  ffi_cif cif;
@@ -14,6 +14,7 @@ static int checking(int a __UNUSED__, short b __UNUSED__,
14
14
  throw 9;
15
15
  }
16
16
 
17
+ extern "C"
17
18
  int main (void)
18
19
  {
19
20
  ffi_cif cif;
@@ -18,8 +18,8 @@ INCFLAGS := -I${LIBFFI_BUILD_DIR}/include -I${INCFLAGS}
18
18
 
19
19
  LIBFFI = ${LIBFFI_BUILD_DIR}/.libs/libffi_convenience.a
20
20
  LIBFFI_AUTOGEN = ${LIBFFI_SRC_DIR}/autogen.sh
21
- LIBFFI_CONFIGURE = ${LIBFFI_SRC_DIR}/configure --disable-static \
22
- --with-pic=yes --disable-dependency-tracking --disable-docs
21
+ LIBFFI_CONFIGURE = ${LIBFFI_SRC_DIR}/configure --disable-shared --enable-static \
22
+ --with-pic=yes --disable-dependency-tracking --disable-docs $(LIBFFI_DEBUG)
23
23
 
24
24
  $(OBJS): ${LIBFFI}
25
25
 
@@ -58,7 +58,7 @@ build_ffi = \
58
58
  env CC="$(CCACHE) $(CC)" CFLAGS="-arch $(1) $(LIBFFI_CFLAGS)" LDFLAGS="-arch $(1)" \
59
59
  $(LIBFFI_CONFIGURE) --host=$(1)-apple-darwin > /dev/null; \
60
60
  fi); \
61
- env MACOSX_DEPLOYMENT_TARGET=10.4 $(MAKE) -C "$(BUILD_DIR)"/libffi-$(1)
61
+ $(MAKE) -C "$(BUILD_DIR)"/libffi-$(1)
62
62
 
63
63
  target_ffi = "$(BUILD_DIR)"/libffi-$(1)/.libs/libffi_convenience.a:; $(call build_ffi,$(1))
64
64
 
@@ -21,8 +21,8 @@ endif
21
21
 
22
22
  LIBFFI = "$(LIBFFI_BUILD_DIR)"/.libs/libffi_convenience.a
23
23
  LIBFFI_AUTOGEN = ${LIBFFI_SRC_DIR}/autogen.sh
24
- LIBFFI_CONFIGURE = "$(LIBFFI_SRC_DIR)"/configure --disable-static \
25
- --with-pic=yes --disable-dependency-tracking --disable-docs
24
+ LIBFFI_CONFIGURE = "$(LIBFFI_SRC_DIR)"/configure --disable-shared --enable-static \
25
+ --with-pic=yes --disable-dependency-tracking --disable-docs $(LIBFFI_DEBUG)
26
26
 
27
27
  $(OBJS): $(LIBFFI)
28
28
 
data/ext/ffi_c/rbffi.h CHANGED
@@ -39,12 +39,11 @@ extern "C" {
39
39
  #define MAX_PARAMETERS (32)
40
40
 
41
41
  extern VALUE rbffi_FFIModule;
42
-
42
+
43
43
  extern void rbffi_Type_Init(VALUE ffiModule);
44
44
  extern void rbffi_Buffer_Init(VALUE ffiModule);
45
45
  extern void rbffi_Invoker_Init(VALUE ffiModule);
46
46
  extern void rbffi_Variadic_Init(VALUE ffiModule);
47
- extern void rbffi_DataConverter_Init(VALUE ffiModule);
48
47
  extern VALUE rbffi_AbstractMemoryClass, rbffi_InvokerClass;
49
48
  extern int rbffi_type_size(VALUE type);
50
49
  extern void rbffi_Thread_Init(VALUE moduleFFI);
@@ -54,4 +53,3 @@ extern void rbffi_Thread_Init(VALUE moduleFFI);
54
53
  #endif
55
54
 
56
55
  #endif /* RBFFI_RBFFI_H */
57
-
data/ffi.gemspec CHANGED
@@ -5,17 +5,25 @@ Gem::Specification.new do |s|
5
5
  s.version = FFI::VERSION
6
6
  s.author = 'Wayne Meissner'
7
7
  s.email = 'wmeissner@gmail.com'
8
- s.homepage = 'http://wiki.github.com/ffi/ffi'
8
+ s.homepage = 'https://github.com/ffi/ffi/wiki'
9
9
  s.summary = 'Ruby FFI'
10
10
  s.description = 'Ruby FFI library'
11
+ if s.respond_to?(:metadata)
12
+ s.metadata['bug_tracker_uri'] = 'https://github.com/ffi/ffi/issues'
13
+ s.metadata['changelog_uri'] = 'https://github.com/ffi/ffi/blob/master/CHANGELOG.md'
14
+ s.metadata['documentation_uri'] = 'https://github.com/ffi/ffi/wiki'
15
+ s.metadata['wiki_uri'] = 'https://github.com/ffi/ffi/wiki'
16
+ s.metadata['source_code_uri'] = 'https://github.com/ffi/ffi/'
17
+ s.metadata['mailing_list_uri'] = 'http://groups.google.com/group/ruby-ffi'
18
+ end
11
19
  s.files = `git ls-files -z`.split("\x0").reject do |f|
12
- f =~ /^(bench|gen|libtest|nbproject|spec)/
20
+ f =~ /^(\.|bench|gen|libtest|nbproject|spec)/
13
21
  end
14
22
 
15
23
  # Add libffi git files
16
24
  lfs = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0")
17
25
  # Add autoconf generated files of libffi
18
- lfs += %w[ configure config.guess config.sub install-sh ltmain.sh missing fficonfig.h.in ]
26
+ lfs += %w[ compile configure config.guess config.sub install-sh ltmain.sh missing fficonfig.h.in ]
19
27
  # Add automake generated files of libffi
20
28
  lfs += `git --git-dir ext/ffi_c/libffi/.git ls-files -z *.am */*.am`.gsub(".am\0", ".in\0").split("\x0")
21
29
  s.files += lfs.map do |f|
@@ -23,14 +31,12 @@ Gem::Specification.new do |s|
23
31
  end
24
32
 
25
33
  s.extensions << 'ext/ffi_c/extconf.rb'
26
- s.has_rdoc = false
27
34
  s.rdoc_options = %w[--exclude=ext/ffi_c/.*\.o$ --exclude=ffi_c\.(bundle|so)$]
28
35
  s.license = 'BSD-3-Clause'
29
36
  s.require_paths << 'ext/ffi_c'
30
- s.required_ruby_version = '>= 1.9'
31
- s.add_development_dependency 'rake', '~> 10.1'
32
- s.add_development_dependency 'rake-compiler', '~> 1.0'
33
- s.add_development_dependency 'rake-compiler-dock', '~> 0.6.2'
37
+ 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'
34
41
  s.add_development_dependency 'rspec', '~> 2.14.1'
35
- s.add_development_dependency 'rubygems-tasks', "~> 0.2.4"
36
42
  end
@@ -0,0 +1,44 @@
1
+ #
2
+ # Copyright (C) 2020 Lars Kanis
3
+ #
4
+ # This file is part of ruby-ffi.
5
+ #
6
+ # All rights reserved.
7
+ #
8
+ # Redistribution and use in source and binary forms, with or without
9
+ # modification, are permitted provided that the following conditions are met:
10
+ #
11
+ # * Redistributions of source code must retain the above copyright notice, this
12
+ # list of conditions and the following disclaimer.
13
+ # * Redistributions in binary form must reproduce the above copyright notice
14
+ # this list of conditions and the following disclaimer in the documentation
15
+ # and/or other materials provided with the distribution.
16
+ # * Neither the name of the Ruby FFI project nor the names of its contributors
17
+ # may be used to endorse or promote products derived from this software
18
+ # without specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
24
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.#
30
+
31
+
32
+ module FFI
33
+ class AbstractMemory
34
+ LONG_MAX = FFI::Pointer.new(1).size
35
+ private_constant :LONG_MAX
36
+
37
+ # Return +true+ if +self+ has a size limit.
38
+ #
39
+ # @return [Boolean]
40
+ def size_limit?
41
+ size != LONG_MAX
42
+ end
43
+ end
44
+ end
@@ -76,21 +76,21 @@ module FFI
76
76
  # going to be useful if you subclass {AutoPointer}, and override
77
77
  # #release, which by default does nothing.
78
78
  def initialize(ptr, proc=nil, &block)
79
+ raise TypeError, "Invalid pointer" if ptr.nil? || !ptr.kind_of?(Pointer) ||
80
+ ptr.kind_of?(MemoryPointer) || ptr.kind_of?(AutoPointer)
79
81
  super(ptr.type_size, ptr)
80
- raise TypeError, "Invalid pointer" if ptr.nil? || !ptr.kind_of?(Pointer) \
81
- || ptr.kind_of?(MemoryPointer) || ptr.kind_of?(AutoPointer)
82
82
 
83
83
  @releaser = if proc
84
84
  if not proc.respond_to?(:call)
85
85
  raise RuntimeError.new("proc must be callable")
86
86
  end
87
- CallableReleaser.new(ptr, proc)
87
+ Releaser.new(ptr, proc)
88
88
 
89
89
  else
90
- if not self.class.respond_to?(:release)
90
+ if not self.class.respond_to?(:release, true)
91
91
  raise RuntimeError.new("no release method defined")
92
92
  end
93
- DefaultReleaser.new(ptr, self.class)
93
+ Releaser.new(ptr, self.class.method(:release))
94
94
  end
95
95
 
96
96
  ObjectSpace.define_finalizer(self, @releaser)
@@ -107,6 +107,7 @@ module FFI
107
107
  # @return [Boolean] +autorelease+
108
108
  # Set +autorelease+ property. See {Pointer Autorelease section at Pointer}.
109
109
  def autorelease=(autorelease)
110
+ raise FrozenError.new("can't modify frozen #{self.class}") if frozen?
110
111
  @releaser.autorelease=(autorelease)
111
112
  end
112
113
 
@@ -117,7 +118,7 @@ module FFI
117
118
  end
118
119
 
119
120
  # @abstract Base class for {AutoPointer}'s releasers.
120
- #
121
+ #
121
122
  # All subclasses of Releaser should define a +#release(ptr)+ method.
122
123
  # A releaser is an object in charge of release an {AutoPointer}.
123
124
  class Releaser
@@ -149,23 +150,7 @@ module FFI
149
150
  def call(*args)
150
151
  release(@ptr) if @autorelease && @ptr
151
152
  end
152
- end
153
-
154
- # DefaultReleaser is a {Releaser} used when an {AutoPointer} is defined
155
- # without Proc or Method. In this case, the pointer to release must be of
156
- # a class derived from AutoPointer with a {release} class method.
157
- class DefaultReleaser < Releaser
158
- # @param [Pointer] ptr
159
- # @return [nil]
160
- # Release +ptr+ using the {release} class method of its class.
161
- def release(ptr)
162
- @proc.release(ptr)
163
- end
164
- end
165
153
 
166
- # CallableReleaser is a {Releaser} used when an {AutoPointer} is defined with a
167
- # Proc or a Method.
168
- class CallableReleaser < Releaser
169
154
  # Release +ptr+ by using Proc or Method defined at +ptr+
170
155
  # {AutoPointer#initialize initialization}.
171
156
  #
@@ -182,7 +167,7 @@ module FFI
182
167
  # @return [Type::POINTER]
183
168
  # @raise {RuntimeError} if class does not implement a +#release+ method
184
169
  def self.native_type
185
- if not self.respond_to?(:release)
170
+ if not self.respond_to?(:release, true)
186
171
  raise RuntimeError.new("no release method defined for #{self.inspect}")
187
172
  end
188
173
  Type::POINTER