ffi 1.15.5 → 1.16.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 (308) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +54 -0
  4. data/Gemfile +1 -1
  5. data/README.md +3 -2
  6. data/Rakefile +10 -7
  7. data/ext/ffi_c/AbstractMemory.c +56 -34
  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 +86 -29
  12. data/ext/ffi_c/Call.c +13 -5
  13. data/ext/ffi_c/DynamicLibrary.c +89 -26
  14. data/ext/ffi_c/Function.c +238 -98
  15. data/ext/ffi_c/Function.h +1 -0
  16. data/ext/ffi_c/FunctionInfo.c +78 -24
  17. data/ext/ffi_c/LastError.c +25 -7
  18. data/ext/ffi_c/MappedType.c +66 -23
  19. data/ext/ffi_c/MappedType.h +0 -2
  20. data/ext/ffi_c/MemoryPointer.c +34 -7
  21. data/ext/ffi_c/MethodHandle.c +3 -1
  22. data/ext/ffi_c/Pointer.c +68 -29
  23. data/ext/ffi_c/Pointer.h +1 -0
  24. data/ext/ffi_c/Struct.c +151 -80
  25. data/ext/ffi_c/Struct.h +7 -4
  26. data/ext/ffi_c/StructByValue.c +48 -16
  27. data/ext/ffi_c/StructLayout.c +117 -48
  28. data/ext/ffi_c/Type.c +104 -36
  29. data/ext/ffi_c/Type.h +3 -1
  30. data/ext/ffi_c/Types.c +1 -1
  31. data/ext/ffi_c/Variadic.c +65 -23
  32. data/ext/ffi_c/compat.h +22 -22
  33. data/ext/ffi_c/extconf.rb +19 -2
  34. data/ext/ffi_c/ffi.c +4 -0
  35. data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
  36. data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
  37. data/ext/ffi_c/libffi/.appveyor.yml +27 -9
  38. data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
  39. data/ext/ffi_c/libffi/{.travis → .ci}/build-in-container.sh +4 -6
  40. data/ext/ffi_c/libffi/.ci/build.sh +124 -0
  41. data/ext/ffi_c/libffi/{.travis → .ci}/install.sh +14 -7
  42. data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
  43. data/ext/ffi_c/libffi/{.travis → .ci}/site.exp +5 -3
  44. data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
  45. data/ext/ffi_c/libffi/.github/workflows/build.yml +460 -0
  46. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +171 -0
  47. data/ext/ffi_c/libffi/.gitignore +10 -2
  48. data/ext/ffi_c/libffi/LICENSE +1 -1
  49. data/ext/ffi_c/libffi/Makefile.am +12 -5
  50. data/ext/ffi_c/libffi/Makefile.in +118 -51
  51. data/ext/ffi_c/libffi/README.md +144 -104
  52. data/ext/ffi_c/libffi/acinclude.m4 +10 -112
  53. data/ext/ffi_c/libffi/config.guess +623 -556
  54. data/ext/ffi_c/libffi/config.sub +75 -34
  55. data/ext/ffi_c/libffi/configure +4571 -3830
  56. data/ext/ffi_c/libffi/configure.ac +64 -28
  57. data/ext/ffi_c/libffi/configure.host +25 -6
  58. data/ext/ffi_c/libffi/doc/Makefile.in +9 -6
  59. data/ext/ffi_c/libffi/doc/libffi.texi +82 -33
  60. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  61. data/ext/ffi_c/libffi/fficonfig.h.in +12 -47
  62. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +163 -52
  63. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  64. data/ext/ffi_c/libffi/include/Makefile.in +10 -9
  65. data/ext/ffi_c/libffi/include/ffi.h.in +54 -50
  66. data/ext/ffi_c/libffi/include/ffi_cfi.h +21 -0
  67. data/ext/ffi_c/libffi/include/ffi_common.h +29 -0
  68. data/ext/ffi_c/libffi/include/tramp.h +45 -0
  69. data/ext/ffi_c/libffi/install-sh +92 -69
  70. data/ext/ffi_c/libffi/libtool-version +2 -2
  71. data/ext/ffi_c/libffi/ltmain.sh +512 -315
  72. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +18 -14
  73. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +108 -72
  74. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +76 -45
  75. data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
  76. data/ext/ffi_c/libffi/man/Makefile.in +9 -6
  77. data/ext/ffi_c/libffi/missing +1 -1
  78. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +1 -1
  79. data/ext/ffi_c/libffi/msvcc.sh +1 -1
  80. data/ext/ffi_c/libffi/src/aarch64/ffi.c +146 -42
  81. data/ext/ffi_c/libffi/src/aarch64/internal.h +32 -0
  82. data/ext/ffi_c/libffi/src/aarch64/sysv.S +134 -42
  83. data/ext/ffi_c/libffi/src/arc/arcompact.S +169 -94
  84. data/ext/ffi_c/libffi/src/arc/ffi.c +325 -148
  85. data/ext/ffi_c/libffi/src/arc/ffitarget.h +14 -0
  86. data/ext/ffi_c/libffi/src/arm/ffi.c +62 -17
  87. data/ext/ffi_c/libffi/src/arm/ffitarget.h +3 -3
  88. data/ext/ffi_c/libffi/src/arm/internal.h +10 -0
  89. data/ext/ffi_c/libffi/src/arm/sysv.S +113 -42
  90. data/ext/ffi_c/libffi/src/closures.c +133 -47
  91. data/ext/ffi_c/libffi/src/dlmalloc.c +5 -0
  92. data/ext/ffi_c/libffi/src/ia64/ffi.c +12 -0
  93. data/ext/ffi_c/libffi/src/ia64/unix.S +20 -2
  94. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +621 -0
  95. data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
  96. data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
  97. data/ext/ffi_c/libffi/src/m32r/ffi.c +31 -14
  98. data/ext/ffi_c/libffi/src/mips/ffi.c +240 -65
  99. data/ext/ffi_c/libffi/src/mips/ffitarget.h +7 -0
  100. data/ext/ffi_c/libffi/src/mips/n32.S +137 -28
  101. data/ext/ffi_c/libffi/src/mips/o32.S +61 -4
  102. data/ext/ffi_c/libffi/src/moxie/ffi.c +47 -22
  103. data/ext/ffi_c/libffi/src/or1k/ffi.c +25 -12
  104. data/ext/ffi_c/libffi/src/pa/ffi.c +32 -33
  105. data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
  106. data/ext/ffi_c/libffi/src/pa/ffitarget.h +22 -8
  107. data/ext/ffi_c/libffi/src/pa/hpux32.S +83 -36
  108. data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
  109. data/ext/ffi_c/libffi/src/pa/linux.S +82 -35
  110. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1 -1
  111. data/ext/ffi_c/libffi/src/powerpc/linux64.S +2 -0
  112. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +2 -0
  113. data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
  114. data/ext/ffi_c/libffi/src/prep_cif.c +22 -2
  115. data/ext/ffi_c/libffi/src/riscv/ffi.c +37 -4
  116. data/ext/ffi_c/libffi/src/sparc/ffi64.c +16 -0
  117. data/ext/ffi_c/libffi/src/tramp.c +716 -0
  118. data/ext/ffi_c/libffi/src/wasm32/ffi.c +934 -0
  119. data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
  120. data/ext/ffi_c/libffi/src/x86/ffi.c +99 -37
  121. data/ext/ffi_c/libffi/src/x86/ffi64.c +67 -12
  122. data/ext/ffi_c/libffi/src/x86/ffitarget.h +9 -5
  123. data/ext/ffi_c/libffi/src/x86/ffiw64.c +43 -0
  124. data/ext/ffi_c/libffi/src/x86/internal.h +14 -0
  125. data/ext/ffi_c/libffi/src/x86/internal64.h +14 -0
  126. data/ext/ffi_c/libffi/src/x86/sysv.S +172 -38
  127. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +91 -88
  128. data/ext/ffi_c/libffi/src/x86/unix64.S +96 -6
  129. data/ext/ffi_c/libffi/src/x86/win64.S +20 -7
  130. data/ext/ffi_c/libffi/src/xtensa/ffi.c +16 -8
  131. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +4 -0
  132. data/ext/ffi_c/libffi/src/xtensa/sysv.S +26 -16
  133. data/ext/ffi_c/libffi/testsuite/Makefile.am +127 -114
  134. data/ext/ffi_c/libffi/testsuite/Makefile.in +137 -121
  135. data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
  136. data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
  137. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +80 -0
  138. data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
  139. data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
  140. data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
  141. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +43 -21
  142. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +2 -2
  143. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1 -0
  144. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +5 -1
  145. data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
  146. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +28 -3
  147. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +3 -0
  148. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +5 -0
  149. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
  150. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
  151. data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
  152. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +8 -9
  153. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +2 -2
  154. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +2 -2
  155. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +2 -2
  156. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +1 -1
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +1 -119
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +13 -0
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +11 -0
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +15 -0
  172. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c +3 -2
  173. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c +2 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c +2 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c +21 -1
  176. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c +2 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c +2 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c +2 -0
  179. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c +7 -6
  180. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c +6 -0
  181. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c +18 -0
  182. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c +22 -0
  183. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c +24 -0
  184. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c +29 -0
  185. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c +4 -0
  186. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c +19 -1
  187. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c +21 -1
  188. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c +35 -3
  189. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c +13 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c +19 -0
  191. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c +13 -0
  192. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c +13 -0
  193. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +18 -0
  194. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c +22 -0
  195. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c +13 -0
  196. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c +29 -1
  197. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c +19 -1
  198. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c +24 -0
  199. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c +28 -1
  200. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c +24 -2
  201. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c +39 -1
  202. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c +25 -1
  203. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c +14 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c +14 -1
  205. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c +14 -2
  206. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c +19 -1
  207. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c +19 -1
  208. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c +20 -1
  209. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c +40 -25
  210. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c +40 -3
  211. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c +19 -1
  212. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c +18 -1
  213. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c +18 -3
  214. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c +18 -1
  215. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c +18 -1
  216. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c +19 -1
  217. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c +19 -1
  218. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c +3 -1
  219. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c +9 -1
  220. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c +4 -0
  221. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c +11 -1
  222. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c +22 -3
  223. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c +5 -1
  224. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c +6 -1
  225. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c +9 -1
  226. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c +9 -1
  227. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c +6 -2
  228. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c +9 -1
  229. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c +5 -0
  230. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c +10 -0
  231. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c +3 -0
  232. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c +2 -0
  233. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c +3 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +11 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c +3 -0
  236. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c +4 -0
  237. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +4 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +4 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c +2 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c +3 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -138
  242. data/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c +21 -21
  243. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c +32 -9
  244. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c +1 -1
  245. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c +12 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +21 -5
  247. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c +10 -1
  250. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c +10 -1
  251. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c +9 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c +9 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c +11 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c +9 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c +11 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c +11 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c +1 -1
  261. data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c +1 -1
  262. data/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c +6 -1
  263. data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc +2 -1
  264. data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc +1 -0
  265. data/ext/ffi_c/libffi.bsd.mk +2 -2
  266. data/ext/ffi_c/libffi.gnu.mk +2 -2
  267. data/ext/ffi_c/rbffi.h +1 -1
  268. data/ffi.gemspec +2 -2
  269. data/lib/ffi/autopointer.rb +7 -22
  270. data/lib/ffi/compat.rb +43 -0
  271. data/lib/ffi/data_converter.rb +2 -2
  272. data/lib/ffi/dynamic_library.rb +89 -0
  273. data/lib/ffi/enum.rb +18 -11
  274. data/lib/ffi/ffi.rb +3 -0
  275. data/lib/ffi/function.rb +71 -0
  276. data/lib/ffi/library.rb +55 -71
  277. data/lib/ffi/library_path.rb +109 -0
  278. data/lib/ffi/managedstruct.rb +1 -1
  279. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  280. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  281. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  282. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  283. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  284. data/lib/ffi/platform.rb +15 -13
  285. data/lib/ffi/struct.rb +2 -1
  286. data/lib/ffi/struct_layout.rb +1 -1
  287. data/lib/ffi/struct_layout_builder.rb +1 -1
  288. data/lib/ffi/types.rb +30 -5
  289. data/lib/ffi/variadic.rb +19 -8
  290. data/lib/ffi/version.rb +1 -1
  291. data.tar.gz.sig +0 -0
  292. metadata +97 -25
  293. metadata.gz.sig +1 -0
  294. data/ext/ffi_c/libffi/.travis/build-cross-in-container.sh +0 -14
  295. data/ext/ffi_c/libffi/.travis/build.sh +0 -142
  296. data/ext/ffi_c/libffi/.travis.yml +0 -83
  297. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c +0 -44
  298. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c +0 -44
  299. /data/ext/ffi_c/libffi/{.travis → .ci}/ar-lib +0 -0
  300. /data/ext/ffi_c/libffi/{.travis → .ci}/bfin-sim.exp +0 -0
  301. /data/ext/ffi_c/libffi/{.travis → .ci}/compile +0 -0
  302. /data/ext/ffi_c/libffi/{.travis → .ci}/m32r-sim.exp +0 -0
  303. /data/ext/ffi_c/libffi/{.travis → .ci}/moxie-sim.exp +0 -0
  304. /data/ext/ffi_c/libffi/{.travis → .ci}/or1k-sim.exp +0 -0
  305. /data/ext/ffi_c/libffi/{.travis → .ci}/powerpc-eabisim.exp +0 -0
  306. /data/ext/ffi_c/libffi/{.travis → .ci}/wine-sim.exp +0 -0
  307. /data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
  308. /data/lib/ffi/platform/{sparc64-linux → sparcv9-linux}/types.conf +0 -0
data/ext/ffi_c/Pointer.c CHANGED
@@ -33,16 +33,33 @@
33
33
  #include <ruby.h>
34
34
  #include "rbffi.h"
35
35
  #include "rbffi_endian.h"
36
+ #include "compat.h"
36
37
  #include "AbstractMemory.h"
37
38
  #include "Pointer.h"
38
39
 
39
- #define POINTER(obj) rbffi_AbstractMemory_Cast((obj), rbffi_PointerClass)
40
+ #define POINTER(obj) rbffi_AbstractMemory_Cast((obj), &rbffi_pointer_data_type)
40
41
 
41
42
  VALUE rbffi_PointerClass = Qnil;
42
43
  VALUE rbffi_NullPointerSingleton = Qnil;
43
44
 
44
- static void ptr_release(Pointer* ptr);
45
- static void ptr_mark(Pointer* ptr);
45
+ static void ptr_release(void *data);
46
+ static void ptr_mark(void *data);
47
+ static void ptr_compact(void *data);
48
+ static size_t ptr_memsize(const void *data);
49
+
50
+ const rb_data_type_t rbffi_pointer_data_type = { /* extern */
51
+ .wrap_struct_name = "FFI::Pointer",
52
+ .function = {
53
+ .dmark = ptr_mark,
54
+ .dfree = ptr_release,
55
+ .dsize = ptr_memsize,
56
+ ffi_compact_callback( ptr_compact )
57
+ },
58
+ .parent = &rbffi_abstract_memory_data_type,
59
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
60
+ // macro to update VALUE references, as to trigger write barriers.
61
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
62
+ };
46
63
 
47
64
  VALUE
48
65
  rbffi_Pointer_NewInstance(void* addr)
@@ -54,12 +71,12 @@ rbffi_Pointer_NewInstance(void* addr)
54
71
  return rbffi_NullPointerSingleton;
55
72
  }
56
73
 
57
- obj = Data_Make_Struct(rbffi_PointerClass, Pointer, NULL, -1, p);
74
+ obj = TypedData_Make_Struct(rbffi_PointerClass, Pointer, &rbffi_pointer_data_type, p);
58
75
  p->memory.address = addr;
59
76
  p->memory.size = LONG_MAX;
60
77
  p->memory.flags = (addr == NULL) ? 0 : (MEM_RD | MEM_WR);
61
78
  p->memory.typeSize = 1;
62
- p->rbParent = Qnil;
79
+ RB_OBJ_WRITE(obj, &p->rbParent, Qnil);
63
80
 
64
81
  return obj;
65
82
  }
@@ -70,8 +87,8 @@ ptr_allocate(VALUE klass)
70
87
  Pointer* p;
71
88
  VALUE obj;
72
89
 
73
- obj = Data_Make_Struct(klass, Pointer, ptr_mark, ptr_release, p);
74
- p->rbParent = Qnil;
90
+ obj = TypedData_Make_Struct(klass, Pointer, &rbffi_pointer_data_type, p);
91
+ RB_OBJ_WRITE(obj, &p->rbParent, Qnil);
75
92
  p->memory.flags = MEM_RD | MEM_WR;
76
93
 
77
94
  return obj;
@@ -95,7 +112,7 @@ ptr_initialize(int argc, VALUE* argv, VALUE self)
95
112
  VALUE rbType = Qnil, rbAddress = Qnil;
96
113
  int typeSize = 1;
97
114
 
98
- Data_Get_Struct(self, Pointer, p);
115
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, p);
99
116
 
100
117
  switch (rb_scan_args(argc, argv, "11", &rbType, &rbAddress)) {
101
118
  case 1:
@@ -112,7 +129,7 @@ ptr_initialize(int argc, VALUE* argv, VALUE self)
112
129
  switch (TYPE(rbAddress)) {
113
130
  case T_FIXNUM:
114
131
  case T_BIGNUM:
115
- p->memory.address = (void*) (uintptr_t) NUM2LL(rbAddress);
132
+ p->memory.address = (void*) (uintptr_t) NUM2ULL(rbAddress);
116
133
  p->memory.size = LONG_MAX;
117
134
  if (p->memory.address == NULL) {
118
135
  p->memory.flags = 0;
@@ -123,8 +140,8 @@ ptr_initialize(int argc, VALUE* argv, VALUE self)
123
140
  if (rb_obj_is_kind_of(rbAddress, rbffi_PointerClass)) {
124
141
  Pointer* orig;
125
142
 
126
- p->rbParent = rbAddress;
127
- Data_Get_Struct(rbAddress, Pointer, orig);
143
+ RB_OBJ_WRITE(self, &p->rbParent, rbAddress);
144
+ TypedData_Get_Struct(rbAddress, Pointer, &rbffi_pointer_data_type, orig);
128
145
  p->memory = orig->memory;
129
146
  } else {
130
147
  rb_raise(rb_eTypeError, "wrong argument type, expected Integer or FFI::Pointer");
@@ -153,7 +170,7 @@ ptr_initialize_copy(VALUE self, VALUE other)
153
170
  AbstractMemory* src;
154
171
  Pointer* dst;
155
172
 
156
- Data_Get_Struct(self, Pointer, dst);
173
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, dst);
157
174
  src = POINTER(other);
158
175
  if (src->size == LONG_MAX) {
159
176
  rb_raise(rb_eRuntimeError, "cannot duplicate unbounded memory area");
@@ -195,16 +212,16 @@ slice(VALUE self, long offset, long size)
195
212
  Pointer* p;
196
213
  VALUE retval;
197
214
 
198
- Data_Get_Struct(self, AbstractMemory, ptr);
215
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
199
216
  checkBounds(ptr, offset, size == LONG_MAX ? 1 : size);
200
217
 
201
- retval = Data_Make_Struct(rbffi_PointerClass, Pointer, ptr_mark, -1, p);
218
+ retval = TypedData_Make_Struct(rbffi_PointerClass, Pointer, &rbffi_pointer_data_type, p);
202
219
 
203
220
  p->memory.address = ptr->address + offset;
204
221
  p->memory.size = size;
205
222
  p->memory.flags = ptr->flags;
206
223
  p->memory.typeSize = ptr->typeSize;
207
- p->rbParent = self;
224
+ RB_OBJ_WRITE(retval, &p->rbParent, self);
208
225
 
209
226
  return retval;
210
227
  }
@@ -222,7 +239,7 @@ ptr_plus(VALUE self, VALUE offset)
222
239
  AbstractMemory* ptr;
223
240
  long off = NUM2LONG(offset);
224
241
 
225
- Data_Get_Struct(self, AbstractMemory, ptr);
242
+ TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
226
243
 
227
244
  return slice(self, off, ptr->size == LONG_MAX ? LONG_MAX : ptr->size - off);
228
245
  }
@@ -252,7 +269,7 @@ ptr_inspect(VALUE self)
252
269
  char buf[100];
253
270
  Pointer* ptr;
254
271
 
255
- Data_Get_Struct(self, Pointer, ptr);
272
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
256
273
 
257
274
  if (ptr->memory.size != LONG_MAX) {
258
275
  snprintf(buf, sizeof(buf), "#<%s address=%p size=%lu>",
@@ -275,7 +292,7 @@ ptr_null_p(VALUE self)
275
292
  {
276
293
  Pointer* ptr;
277
294
 
278
- Data_Get_Struct(self, Pointer, ptr);
295
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
279
296
 
280
297
  return ptr->memory.address == NULL ? Qtrue : Qfalse;
281
298
  }
@@ -291,7 +308,7 @@ ptr_equals(VALUE self, VALUE other)
291
308
  {
292
309
  Pointer* ptr;
293
310
 
294
- Data_Get_Struct(self, Pointer, ptr);
311
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
295
312
 
296
313
  if (NIL_P(other)) {
297
314
  return ptr->memory.address == NULL ? Qtrue : Qfalse;
@@ -310,7 +327,7 @@ ptr_address(VALUE self)
310
327
  {
311
328
  Pointer* ptr;
312
329
 
313
- Data_Get_Struct(self, Pointer, ptr);
330
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
314
331
 
315
332
  return ULL2NUM((uintptr_t) ptr->memory.address);
316
333
  }
@@ -335,7 +352,7 @@ ptr_order(int argc, VALUE* argv, VALUE self)
335
352
  {
336
353
  Pointer* ptr;
337
354
 
338
- Data_Get_Struct(self, Pointer, ptr);
355
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
339
356
  if (argc == 0) {
340
357
  int order = (ptr->memory.flags & MEM_SWAP) == 0 ? BYTE_ORDER : SWAPPED_ORDER;
341
358
  return order == BIG_ENDIAN ? ID2SYM(rb_intern("big")) : ID2SYM(rb_intern("little"));
@@ -361,7 +378,7 @@ ptr_order(int argc, VALUE* argv, VALUE self)
361
378
  Pointer* p2;
362
379
  VALUE retval = slice(self, 0, ptr->memory.size);
363
380
 
364
- Data_Get_Struct(retval, Pointer, p2);
381
+ TypedData_Get_Struct(retval, Pointer, &rbffi_pointer_data_type, p2);
365
382
  p2->memory.flags |= MEM_SWAP;
366
383
  return retval;
367
384
  }
@@ -381,7 +398,8 @@ ptr_free(VALUE self)
381
398
  {
382
399
  Pointer* ptr;
383
400
 
384
- Data_Get_Struct(self, Pointer, ptr);
401
+ rb_check_frozen(self);
402
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
385
403
 
386
404
  if (ptr->allocated) {
387
405
  if (ptr->storage != NULL) {
@@ -404,7 +422,7 @@ ptr_type_size(VALUE self)
404
422
  {
405
423
  Pointer* ptr;
406
424
 
407
- Data_Get_Struct(self, Pointer, ptr);
425
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
408
426
 
409
427
  return INT2NUM(ptr->memory.typeSize);
410
428
  }
@@ -420,7 +438,8 @@ ptr_autorelease(VALUE self, VALUE autorelease)
420
438
  {
421
439
  Pointer* ptr;
422
440
 
423
- Data_Get_Struct(self, Pointer, ptr);
441
+ rb_check_frozen(self);
442
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
424
443
  ptr->autorelease = autorelease == Qtrue;
425
444
 
426
445
  return autorelease;
@@ -436,15 +455,16 @@ ptr_autorelease_p(VALUE self)
436
455
  {
437
456
  Pointer* ptr;
438
457
 
439
- Data_Get_Struct(self, Pointer, ptr);
458
+ TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
440
459
 
441
460
  return ptr->autorelease ? Qtrue : Qfalse;
442
461
  }
443
462
 
444
463
 
445
464
  static void
446
- ptr_release(Pointer* ptr)
465
+ ptr_release(void *data)
447
466
  {
467
+ Pointer *ptr = (Pointer *)data;
448
468
  if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) {
449
469
  xfree(ptr->storage);
450
470
  ptr->storage = NULL;
@@ -453,9 +473,28 @@ ptr_release(Pointer* ptr)
453
473
  }
454
474
 
455
475
  static void
456
- ptr_mark(Pointer* ptr)
476
+ ptr_mark(void *data)
457
477
  {
458
- rb_gc_mark(ptr->rbParent);
478
+ Pointer *ptr = (Pointer *)data;
479
+ rb_gc_mark_movable(ptr->rbParent);
480
+ }
481
+
482
+ static void
483
+ ptr_compact(void *data)
484
+ {
485
+ Pointer *ptr = (Pointer *)data;
486
+ ffi_gc_location(ptr->rbParent);
487
+ }
488
+
489
+ static size_t
490
+ ptr_memsize(const void *data)
491
+ {
492
+ const Pointer *ptr = (const Pointer *)data;
493
+ size_t memsize = sizeof(Pointer);
494
+ if (ptr->allocated) {
495
+ memsize += ptr->memory.size;
496
+ }
497
+ return memsize;
459
498
  }
460
499
 
461
500
  void
data/ext/ffi_c/Pointer.h CHANGED
@@ -40,6 +40,7 @@ extern "C" {
40
40
 
41
41
  extern void rbffi_Pointer_Init(VALUE moduleFFI);
42
42
  extern VALUE rbffi_Pointer_NewInstance(void* addr);
43
+ extern const rb_data_type_t rbffi_pointer_data_type;
43
44
  extern VALUE rbffi_PointerClass;
44
45
  extern VALUE rbffi_NullPointerSingleton;
45
46