ffi 1.1.5 → 1.15.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (629) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +338 -0
  3. data/COPYING +49 -0
  4. data/Gemfile +14 -0
  5. data/LICENSE +21 -11
  6. data/LICENSE.SPECS +22 -0
  7. data/README.md +136 -0
  8. data/Rakefile +149 -154
  9. data/ext/ffi_c/AbstractMemory.c +133 -57
  10. data/ext/ffi_c/AbstractMemory.h +21 -12
  11. data/ext/ffi_c/ArrayType.c +27 -14
  12. data/ext/ffi_c/ArrayType.h +21 -12
  13. data/ext/ffi_c/Buffer.c +29 -25
  14. data/ext/ffi_c/Call.c +154 -125
  15. data/ext/ffi_c/Call.h +43 -20
  16. data/ext/ffi_c/ClosurePool.c +100 -42
  17. data/ext/ffi_c/ClosurePool.h +24 -13
  18. data/ext/ffi_c/DynamicLibrary.c +47 -28
  19. data/ext/ffi_c/DynamicLibrary.h +70 -12
  20. data/ext/ffi_c/Function.c +119 -167
  21. data/ext/ffi_c/Function.h +23 -19
  22. data/ext/ffi_c/FunctionInfo.c +55 -25
  23. data/ext/ffi_c/LastError.c +70 -21
  24. data/ext/ffi_c/LastError.h +21 -12
  25. data/ext/ffi_c/LongDouble.c +15 -9
  26. data/ext/ffi_c/LongDouble.h +21 -16
  27. data/ext/ffi_c/MappedType.c +22 -15
  28. data/ext/ffi_c/MappedType.h +21 -12
  29. data/ext/ffi_c/MemoryPointer.c +58 -33
  30. data/ext/ffi_c/MemoryPointer.h +22 -19
  31. data/ext/ffi_c/MethodHandle.c +49 -50
  32. data/ext/ffi_c/MethodHandle.h +24 -14
  33. data/ext/ffi_c/Platform.c +28 -62
  34. data/ext/ffi_c/Platform.h +21 -12
  35. data/ext/ffi_c/Pointer.c +63 -46
  36. data/ext/ffi_c/Pointer.h +22 -19
  37. data/ext/ffi_c/Struct.c +198 -80
  38. data/ext/ffi_c/Struct.h +33 -18
  39. data/ext/ffi_c/StructByValue.c +23 -20
  40. data/ext/ffi_c/StructByValue.h +21 -12
  41. data/ext/ffi_c/StructLayout.c +184 -39
  42. data/ext/ffi_c/Thread.c +73 -270
  43. data/ext/ffi_c/Thread.h +32 -35
  44. data/ext/ffi_c/Type.c +26 -32
  45. data/ext/ffi_c/Type.h +24 -10
  46. data/ext/ffi_c/Types.c +28 -20
  47. data/ext/ffi_c/Types.h +25 -16
  48. data/ext/ffi_c/Variadic.c +78 -39
  49. data/ext/ffi_c/compat.h +25 -17
  50. data/ext/ffi_c/extconf.rb +68 -31
  51. data/ext/ffi_c/ffi.c +27 -20
  52. data/ext/ffi_c/libffi/.appveyor.yml +66 -0
  53. data/ext/ffi_c/libffi/.gitattributes +4 -0
  54. data/ext/ffi_c/libffi/.github/issue_template.md +10 -0
  55. data/ext/ffi_c/libffi/.gitignore +38 -0
  56. data/ext/ffi_c/libffi/.travis/ar-lib +270 -0
  57. data/ext/ffi_c/libffi/.travis/bfin-sim.exp +58 -0
  58. data/ext/ffi_c/libffi/.travis/build-cross-in-container.sh +14 -0
  59. data/ext/ffi_c/libffi/.travis/build-in-container.sh +12 -0
  60. data/ext/ffi_c/libffi/.travis/build.sh +142 -0
  61. data/ext/ffi_c/libffi/.travis/compile +351 -0
  62. data/ext/ffi_c/libffi/.travis/install.sh +71 -0
  63. data/ext/ffi_c/libffi/.travis/m32r-sim.exp +58 -0
  64. data/ext/ffi_c/libffi/.travis/moxie-sim.exp +60 -0
  65. data/ext/ffi_c/libffi/.travis/or1k-sim.exp +58 -0
  66. data/ext/ffi_c/libffi/.travis/powerpc-eabisim.exp +58 -0
  67. data/ext/ffi_c/libffi/.travis/site.exp +27 -0
  68. data/ext/ffi_c/libffi/.travis/wine-sim.exp +55 -0
  69. data/ext/ffi_c/libffi/.travis.yml +83 -0
  70. data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.old} +6366 -3559
  71. data/ext/ffi_c/libffi/LICENSE +1 -1
  72. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +353 -0
  73. data/ext/ffi_c/libffi/Makefile.am +123 -169
  74. data/ext/ffi_c/libffi/Makefile.in +1243 -1003
  75. data/ext/ffi_c/libffi/README.md +486 -0
  76. data/ext/ffi_c/libffi/acinclude.m4 +387 -0
  77. data/ext/ffi_c/libffi/autogen.sh +2 -0
  78. data/ext/ffi_c/libffi/config.guess +690 -504
  79. data/ext/ffi_c/libffi/config.sub +1353 -1207
  80. data/ext/ffi_c/libffi/configure +7308 -2449
  81. data/ext/ffi_c/libffi/configure.ac +178 -259
  82. data/ext/ffi_c/libffi/configure.host +311 -4
  83. data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
  84. data/ext/ffi_c/libffi/doc/Makefile.in +815 -0
  85. data/ext/ffi_c/libffi/doc/libffi.texi +455 -58
  86. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  87. data/ext/ffi_c/libffi/fficonfig.h.in +37 -13
  88. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +201 -0
  89. data/ext/ffi_c/libffi/include/Makefile.am +3 -3
  90. data/ext/ffi_c/libffi/include/Makefile.in +196 -75
  91. data/ext/ffi_c/libffi/include/ffi.h.in +163 -67
  92. data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
  93. data/ext/ffi_c/libffi/include/ffi_common.h +39 -12
  94. data/ext/ffi_c/libffi/install-sh +207 -209
  95. data/ext/ffi_c/libffi/libffi.map.in +76 -0
  96. data/ext/ffi_c/libffi/libffi.pc.in +3 -2
  97. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +997 -0
  98. data/ext/ffi_c/libffi/libtool-ldflags +106 -0
  99. data/ext/ffi_c/libffi/libtool-version +1 -1
  100. data/ext/ffi_c/libffi/ltmain.sh +3641 -2026
  101. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  102. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +50 -0
  103. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +32 -14
  104. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +33 -106
  105. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +53 -0
  106. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +38 -13
  107. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +8 -29
  108. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +11 -9
  109. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +104 -52
  110. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +18 -8
  111. data/ext/ffi_c/libffi/m4/ax_require_defined.m4 +37 -0
  112. data/ext/ffi_c/libffi/make_sunver.pl +333 -0
  113. data/ext/ffi_c/libffi/man/Makefile.am +2 -2
  114. data/ext/ffi_c/libffi/man/Makefile.in +151 -55
  115. data/ext/ffi_c/libffi/man/ffi.3 +10 -0
  116. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
  117. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  118. data/ext/ffi_c/libffi/missing +153 -314
  119. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
  120. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
  121. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
  122. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
  123. data/ext/ffi_c/libffi/{include/ffi.h.vc64 → msvc_build/aarch64/aarch64_include/ffi.h} +151 -67
  124. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/fficonfig.h +219 -0
  125. data/ext/ffi_c/libffi/msvcc.sh +176 -20
  126. data/ext/ffi_c/libffi/src/aarch64/ffi.c +1025 -0
  127. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +97 -0
  128. data/ext/ffi_c/libffi/src/aarch64/internal.h +68 -0
  129. data/ext/ffi_c/libffi/src/aarch64/sysv.S +451 -0
  130. data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +506 -0
  131. data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
  132. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
  133. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  134. data/ext/ffi_c/libffi/src/alpha/osf.S +161 -266
  135. data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
  136. data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
  137. data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
  138. data/ext/ffi_c/libffi/src/arm/ffi.c +663 -515
  139. data/ext/ffi_c/libffi/src/arm/ffitarget.h +32 -8
  140. data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
  141. data/ext/ffi_c/libffi/src/arm/sysv.S +305 -417
  142. data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
  143. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
  144. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  145. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  146. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  147. data/ext/ffi_c/libffi/src/closures.c +465 -59
  148. data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
  149. data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
  150. data/ext/ffi_c/libffi/src/csky/ffi.c +395 -0
  151. data/ext/ffi_c/libffi/src/csky/ffitarget.h +63 -0
  152. data/ext/ffi_c/libffi/src/csky/sysv.S +371 -0
  153. data/ext/ffi_c/libffi/src/debug.c +6 -1
  154. data/ext/ffi_c/libffi/src/dlmalloc.c +17 -12
  155. data/ext/ffi_c/libffi/src/frv/ffi.c +2 -2
  156. data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
  157. data/ext/ffi_c/libffi/src/ia64/ffi.c +35 -13
  158. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +8 -2
  159. data/ext/ffi_c/libffi/src/ia64/unix.S +8 -1
  160. data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
  161. data/ext/ffi_c/libffi/src/kvx/asm.h +5 -0
  162. data/ext/ffi_c/libffi/src/kvx/ffi.c +273 -0
  163. data/ext/ffi_c/libffi/src/kvx/ffitarget.h +75 -0
  164. data/ext/ffi_c/libffi/src/kvx/sysv.S +127 -0
  165. data/ext/ffi_c/libffi/src/m32r/ffi.c +1 -1
  166. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
  167. data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
  168. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
  169. data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
  170. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  171. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  172. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  173. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  174. data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
  175. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  176. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  177. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  178. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  179. data/ext/ffi_c/libffi/src/mips/ffi.c +135 -37
  180. data/ext/ffi_c/libffi/src/mips/ffitarget.h +16 -14
  181. data/ext/ffi_c/libffi/src/mips/n32.S +128 -56
  182. data/ext/ffi_c/libffi/src/mips/o32.S +150 -27
  183. data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
  184. data/ext/ffi_c/libffi/src/moxie/ffi.c +55 -46
  185. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  186. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  187. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  188. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  189. data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
  190. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  191. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  192. data/ext/ffi_c/libffi/src/pa/ffi.c +46 -91
  193. data/ext/ffi_c/libffi/src/pa/ffitarget.h +9 -7
  194. data/ext/ffi_c/libffi/src/pa/hpux32.S +4 -2
  195. data/ext/ffi_c/libffi/src/pa/linux.S +27 -4
  196. data/ext/ffi_c/libffi/src/powerpc/aix.S +245 -7
  197. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +253 -4
  198. data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
  199. data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
  200. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
  201. data/ext/ffi_c/libffi/src/powerpc/ffi.c +105 -1378
  202. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +123 -30
  203. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1153 -0
  204. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +105 -0
  205. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  206. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +110 -45
  207. data/ext/ffi_c/libffi/src/powerpc/linux64.S +189 -85
  208. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +436 -108
  209. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  210. data/ext/ffi_c/libffi/src/powerpc/sysv.S +73 -119
  211. data/ext/ffi_c/libffi/src/prep_cif.c +111 -25
  212. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  213. data/ext/ffi_c/libffi/src/riscv/ffi.c +481 -0
  214. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +69 -0
  215. data/ext/ffi_c/libffi/src/riscv/sysv.S +293 -0
  216. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  217. data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
  218. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  219. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  220. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  221. data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
  222. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  223. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
  224. data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
  225. data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
  226. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
  227. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  228. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  229. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  230. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  231. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  232. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  233. data/ext/ffi_c/libffi/src/types.c +46 -15
  234. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  235. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  236. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  237. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  238. data/ext/ffi_c/libffi/src/x86/ffi.c +624 -498
  239. data/ext/ffi_c/libffi/src/x86/ffi64.c +379 -119
  240. data/ext/ffi_c/libffi/src/x86/ffitarget.h +74 -35
  241. data/ext/ffi_c/libffi/src/x86/ffiw64.c +318 -0
  242. data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
  243. data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
  244. data/ext/ffi_c/libffi/src/x86/sysv.S +1070 -400
  245. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +995 -0
  246. data/ext/ffi_c/libffi/src/x86/unix64.S +494 -299
  247. data/ext/ffi_c/libffi/src/x86/win64.S +231 -458
  248. data/ext/ffi_c/libffi/src/x86/win64_intel.S +238 -0
  249. data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
  250. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
  251. data/ext/ffi_c/libffi/src/xtensa/sysv.S +258 -0
  252. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  253. data/ext/ffi_c/libffi/testsuite/Makefile.am +115 -73
  254. data/ext/ffi_c/libffi/testsuite/Makefile.in +262 -114
  255. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +334 -24
  256. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +21 -1
  257. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +28 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +78 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +50 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +63 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1745 -0
  262. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2885 -0
  263. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +743 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +46 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +28 -6
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +25 -40
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +15 -12
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  274. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  276. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  277. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  278. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  282. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  283. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  284. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +2 -2
  285. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +57 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  292. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  293. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  298. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
  304. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +0 -0
  305. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +0 -0
  306. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +0 -0
  307. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +0 -0
  308. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +0 -0
  309. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +0 -0
  310. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +0 -0
  311. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +0 -0
  312. data/ext/ffi_c/libffi/testsuite/{libffi.call/closure_stdcall.c → libffi.closures/closure_simple.c} +7 -16
  313. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +4 -4
  314. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +4 -4
  315. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +4 -4
  316. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +4 -4
  317. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +4 -4
  318. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +4 -4
  319. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +4 -4
  320. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +5 -5
  321. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +4 -4
  322. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +4 -4
  323. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +4 -4
  324. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +4 -4
  325. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +95 -0
  326. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +4 -4
  327. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +4 -4
  328. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +4 -4
  329. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +4 -4
  330. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +5 -5
  331. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +4 -4
  332. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +4 -4
  333. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +4 -4
  334. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +4 -4
  335. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +4 -4
  336. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +4 -4
  337. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +4 -4
  338. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +4 -4
  339. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +4 -4
  340. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +4 -4
  341. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +4 -6
  342. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +4 -6
  343. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +4 -4
  344. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +4 -4
  345. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +4 -4
  346. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +4 -4
  347. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +4 -4
  348. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +4 -4
  349. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +4 -4
  350. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +4 -4
  351. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
  352. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +10 -9
  353. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +0 -0
  354. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +3 -3
  355. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +10 -9
  356. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c +70 -0
  357. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c +55 -0
  358. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +0 -0
  359. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +0 -0
  360. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +0 -0
  361. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +0 -0
  362. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +0 -0
  363. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +0 -0
  364. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +1 -1
  365. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +11 -9
  366. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +0 -0
  367. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +0 -0
  368. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +0 -0
  369. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +114 -0
  370. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +0 -0
  371. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c +44 -0
  372. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +0 -0
  373. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +45 -0
  374. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +45 -0
  375. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +5 -5
  376. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +0 -0
  377. data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c +44 -0
  378. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +0 -0
  379. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +138 -0
  380. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +20 -19
  381. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +6 -6
  382. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +8 -8
  383. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +7 -6
  384. data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +121 -0
  385. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct2.c +5 -5
  386. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +5 -5
  387. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +5 -5
  388. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +5 -5
  389. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +6 -6
  390. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +5 -5
  391. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +6 -6
  392. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +6 -6
  393. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
  394. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large.c +7 -7
  395. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +7 -7
  396. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +5 -5
  397. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +5 -5
  398. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +2 -2
  399. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest.cc +3 -10
  400. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest_ffi_call.cc +3 -2
  401. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  402. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  403. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  404. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  405. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  406. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  407. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  408. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  409. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  410. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  411. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  412. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  413. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  414. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  415. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  416. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  417. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
  418. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  419. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  420. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  421. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  422. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  423. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  424. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  425. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  426. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  427. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  428. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  429. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  430. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  431. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  432. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  433. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  434. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  435. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  436. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  437. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  438. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  439. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  440. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  441. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  442. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  443. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  444. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  445. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  446. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  447. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  448. data/ext/ffi_c/libffi.bsd.mk +12 -6
  449. data/ext/ffi_c/libffi.darwin.mk +21 -9
  450. data/ext/ffi_c/libffi.gnu.mk +3 -2
  451. data/ext/ffi_c/libffi.mk +11 -6
  452. data/ext/ffi_c/libffi.vc.mk +1 -1
  453. data/ext/ffi_c/libffi.vc64.mk +1 -1
  454. data/ext/ffi_c/rbffi.h +22 -14
  455. data/ext/ffi_c/rbffi_endian.h +11 -2
  456. data/ffi.gemspec +42 -0
  457. data/lib/ffi/abstract_memory.rb +44 -0
  458. data/lib/ffi/autopointer.rb +70 -50
  459. data/lib/ffi/data_converter.rb +67 -0
  460. data/lib/ffi/enum.rb +159 -24
  461. data/lib/ffi/errno.rb +21 -11
  462. data/lib/ffi/ffi.rb +25 -11
  463. data/lib/ffi/io.rb +24 -14
  464. data/lib/ffi/library.rb +174 -67
  465. data/lib/ffi/managedstruct.rb +63 -34
  466. data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
  467. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  468. data/lib/ffi/platform/aarch64-freebsd12/types.conf +181 -0
  469. data/lib/ffi/platform/aarch64-linux/types.conf +104 -0
  470. data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
  471. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  472. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  473. data/lib/ffi/platform/arm-linux/types.conf +110 -82
  474. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  475. data/lib/ffi/platform/i386-darwin/types.conf +63 -63
  476. data/lib/ffi/platform/i386-freebsd/types.conf +89 -89
  477. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  478. data/lib/ffi/platform/{i486-gnu → i386-gnu}/types.conf +84 -84
  479. data/lib/ffi/platform/i386-linux/types.conf +77 -77
  480. data/lib/ffi/platform/i386-netbsd/types.conf +87 -87
  481. data/lib/ffi/platform/i386-openbsd/types.conf +89 -87
  482. data/lib/ffi/platform/i386-solaris/types.conf +96 -96
  483. data/lib/ffi/platform/i386-windows/types.conf +43 -96
  484. data/lib/ffi/platform/ia64-linux/types.conf +79 -79
  485. data/lib/ffi/platform/mips-linux/types.conf +79 -79
  486. data/lib/ffi/platform/mips64-linux/types.conf +104 -0
  487. data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
  488. data/lib/ffi/platform/mipsel-linux/types.conf +79 -79
  489. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
  490. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
  491. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
  492. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -0
  493. data/lib/ffi/platform/powerpc-aix/types.conf +155 -155
  494. data/lib/ffi/platform/powerpc-darwin/types.conf +63 -63
  495. data/lib/ffi/platform/powerpc-linux/types.conf +108 -78
  496. data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
  497. data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
  498. data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
  499. data/lib/ffi/platform/riscv64-linux/types.conf +104 -0
  500. data/lib/ffi/platform/s390-linux/types.conf +79 -79
  501. data/lib/ffi/platform/s390x-linux/types.conf +79 -79
  502. data/lib/ffi/platform/sparc-linux/types.conf +79 -79
  503. data/lib/ffi/platform/sparc-solaris/types.conf +103 -103
  504. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  505. data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
  506. data/lib/ffi/platform/sparcv9-solaris/types.conf +103 -103
  507. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  508. data/lib/ffi/platform/x86_64-darwin/types.conf +93 -63
  509. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
  510. data/lib/ffi/platform/x86_64-freebsd/types.conf +90 -88
  511. data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
  512. data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
  513. data/lib/ffi/platform/x86_64-linux/types.conf +107 -77
  514. data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
  515. data/lib/ffi/platform/x86_64-netbsd/types.conf +89 -87
  516. data/lib/ffi/platform/x86_64-openbsd/types.conf +100 -92
  517. data/lib/ffi/platform/x86_64-solaris/types.conf +96 -96
  518. data/lib/ffi/platform/x86_64-windows/types.conf +52 -0
  519. data/lib/ffi/platform.rb +81 -26
  520. data/lib/ffi/pointer.rb +72 -27
  521. data/lib/ffi/struct.rb +99 -66
  522. data/lib/ffi/struct_by_reference.rb +72 -0
  523. data/lib/ffi/struct_layout.rb +96 -0
  524. data/lib/ffi/struct_layout_builder.rb +82 -17
  525. data/lib/ffi/tools/const_generator.rb +11 -8
  526. data/lib/ffi/tools/generator.rb +48 -1
  527. data/lib/ffi/tools/generator_task.rb +13 -16
  528. data/lib/ffi/tools/struct_generator.rb +6 -5
  529. data/lib/ffi/tools/types_generator.rb +14 -10
  530. data/lib/ffi/types.rb +31 -14
  531. data/lib/ffi/union.rb +23 -12
  532. data/lib/ffi/variadic.rb +25 -21
  533. data/lib/ffi/version.rb +3 -0
  534. data/lib/ffi.rb +20 -8
  535. data/rakelib/ffi_gem_helper.rb +65 -0
  536. data/samples/getlogin.rb +8 -0
  537. data/samples/getpid.rb +8 -0
  538. data/samples/gettimeofday.rb +18 -0
  539. data/samples/hello.rb +8 -0
  540. data/samples/inotify.rb +60 -0
  541. data/samples/pty.rb +75 -0
  542. data/samples/qsort.rb +20 -0
  543. metadata +413 -263
  544. data/History.txt +0 -1
  545. data/README.rdoc +0 -102
  546. data/ext/ffi_c/DataConverter.c +0 -91
  547. data/ext/ffi_c/Ffi_c.iml +0 -12
  548. data/ext/ffi_c/StructByReference.c +0 -158
  549. data/ext/ffi_c/StructByReference.h +0 -50
  550. data/ext/ffi_c/libffi/ChangeLog.libffi +0 -584
  551. data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
  552. data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
  553. data/ext/ffi_c/libffi/Makefile.vc +0 -141
  554. data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
  555. data/ext/ffi_c/libffi/README +0 -342
  556. data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
  557. data/ext/ffi_c/libffi/build-ios.sh +0 -67
  558. data/ext/ffi_c/libffi/compile +0 -143
  559. data/ext/ffi_c/libffi/depcomp +0 -630
  560. data/ext/ffi_c/libffi/doc/libffi.info +0 -593
  561. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  562. data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
  563. data/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 +0 -76
  564. data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7831
  565. data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
  566. data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
  567. data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
  568. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -98
  569. data/ext/ffi_c/libffi/mdate-sh +0 -201
  570. data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
  571. data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
  572. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  573. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  574. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  575. data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
  576. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  577. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  578. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  579. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
  580. data/ext/ffi_c/libffi/texinfo.tex +0 -7210
  581. data/ext/ffi_c/win32/stdint.h +0 -199
  582. data/gen/Rakefile +0 -30
  583. data/gen/log +0 -1
  584. data/lib/Lib.iml +0 -13
  585. data/spec/ffi/Ffi.iml +0 -12
  586. data/spec/ffi/async_callback_spec.rb +0 -46
  587. data/spec/ffi/bool_spec.rb +0 -40
  588. data/spec/ffi/buffer_spec.rb +0 -215
  589. data/spec/ffi/callback_spec.rb +0 -668
  590. data/spec/ffi/custom_param_type.rb +0 -47
  591. data/spec/ffi/custom_type_spec.rb +0 -85
  592. data/spec/ffi/dup_spec.rb +0 -65
  593. data/spec/ffi/enum_spec.rb +0 -227
  594. data/spec/ffi/errno_spec.rb +0 -29
  595. data/spec/ffi/ffi_spec.rb +0 -40
  596. data/spec/ffi/function_spec.rb +0 -87
  597. data/spec/ffi/library_spec.rb +0 -208
  598. data/spec/ffi/long_double.rb +0 -41
  599. data/spec/ffi/managed_struct_spec.rb +0 -72
  600. data/spec/ffi/number_spec.rb +0 -247
  601. data/spec/ffi/pointer_spec.rb +0 -214
  602. data/spec/ffi/rbx/attach_function_spec.rb +0 -28
  603. data/spec/ffi/rbx/memory_pointer_spec.rb +0 -115
  604. data/spec/ffi/rbx/spec_helper.rb +0 -1
  605. data/spec/ffi/rbx/struct_spec.rb +0 -13
  606. data/spec/ffi/spec_helper.rb +0 -35
  607. data/spec/ffi/string_spec.rb +0 -119
  608. data/spec/ffi/strptr_spec.rb +0 -61
  609. data/spec/ffi/struct_callback_spec.rb +0 -80
  610. data/spec/ffi/struct_initialize_spec.rb +0 -46
  611. data/spec/ffi/struct_packed_spec.rb +0 -62
  612. data/spec/ffi/struct_spec.rb +0 -719
  613. data/spec/ffi/typedef_spec.rb +0 -89
  614. data/spec/ffi/union_spec.rb +0 -76
  615. data/spec/ffi/variadic_spec.rb +0 -103
  616. data/spec/spec.opts +0 -4
  617. data/tasks/ann.rake +0 -80
  618. data/tasks/extension.rake +0 -32
  619. data/tasks/gem.rake +0 -199
  620. data/tasks/git.rake +0 -41
  621. data/tasks/notes.rake +0 -27
  622. data/tasks/post_load.rake +0 -34
  623. data/tasks/rdoc.rake +0 -50
  624. data/tasks/rubyforge.rake +0 -55
  625. data/tasks/setup.rb +0 -301
  626. data/tasks/spec.rake +0 -54
  627. data/tasks/svn.rake +0 -47
  628. data/tasks/test.rake +0 -40
  629. data/tasks/yard.rake +0 -11
@@ -1,5 +1,6 @@
1
1
  /* -----------------------------------------------------------------------
2
- closures.c - Copyright (c) 2007, 2009, 2010 Red Hat, Inc.
2
+ closures.c - Copyright (c) 2019 Anthony Green
3
+ Copyright (c) 2007, 2009, 2010 Red Hat, Inc.
3
4
  Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc
4
5
  Copyright (c) 2011 Plausible Labs Cooperative, Inc.
5
6
 
@@ -30,11 +31,91 @@
30
31
  #define _GNU_SOURCE 1
31
32
  #endif
32
33
 
34
+ #include <fficonfig.h>
33
35
  #include <ffi.h>
34
36
  #include <ffi_common.h>
35
37
 
38
+ #ifdef __NetBSD__
39
+ #include <sys/param.h>
40
+ #endif
41
+
42
+ #if __NetBSD_Version__ - 0 >= 799007200
43
+ /* NetBSD with PROT_MPROTECT */
44
+ #include <sys/mman.h>
45
+
46
+ #include <stddef.h>
47
+ #include <unistd.h>
48
+ #ifdef HAVE_SYS_MEMFD_H
49
+ #include <sys/memfd.h>
50
+ #endif
51
+
52
+ static const size_t overhead =
53
+ (sizeof(max_align_t) > sizeof(void *) + sizeof(size_t)) ?
54
+ sizeof(max_align_t)
55
+ : sizeof(void *) + sizeof(size_t);
56
+
57
+ #define ADD_TO_POINTER(p, d) ((void *)((uintptr_t)(p) + (d)))
58
+
59
+ void *
60
+ ffi_closure_alloc (size_t size, void **code)
61
+ {
62
+ static size_t page_size;
63
+ size_t rounded_size;
64
+ void *codeseg, *dataseg;
65
+ int prot;
66
+
67
+ /* Expect that PAX mprotect is active and a separate code mapping is necessary. */
68
+ if (!code)
69
+ return NULL;
70
+
71
+ /* Obtain system page size. */
72
+ if (!page_size)
73
+ page_size = sysconf(_SC_PAGESIZE);
74
+
75
+ /* Round allocation size up to the next page, keeping in mind the size field and pointer to code map. */
76
+ rounded_size = (size + overhead + page_size - 1) & ~(page_size - 1);
77
+
78
+ /* Primary mapping is RW, but request permission to switch to PROT_EXEC later. */
79
+ prot = PROT_READ | PROT_WRITE | PROT_MPROTECT(PROT_EXEC);
80
+ dataseg = mmap(NULL, rounded_size, prot, MAP_ANON | MAP_PRIVATE, -1, 0);
81
+ if (dataseg == MAP_FAILED)
82
+ return NULL;
83
+
84
+ /* Create secondary mapping and switch it to RX. */
85
+ codeseg = mremap(dataseg, rounded_size, NULL, rounded_size, MAP_REMAPDUP);
86
+ if (codeseg == MAP_FAILED) {
87
+ munmap(dataseg, rounded_size);
88
+ return NULL;
89
+ }
90
+ if (mprotect(codeseg, rounded_size, PROT_READ | PROT_EXEC) == -1) {
91
+ munmap(codeseg, rounded_size);
92
+ munmap(dataseg, rounded_size);
93
+ return NULL;
94
+ }
95
+
96
+ /* Remember allocation size and location of the secondary mapping for ffi_closure_free. */
97
+ memcpy(dataseg, &rounded_size, sizeof(rounded_size));
98
+ memcpy(ADD_TO_POINTER(dataseg, sizeof(size_t)), &codeseg, sizeof(void *));
99
+ *code = ADD_TO_POINTER(codeseg, overhead);
100
+ return ADD_TO_POINTER(dataseg, overhead);
101
+ }
102
+
103
+ void
104
+ ffi_closure_free (void *ptr)
105
+ {
106
+ void *codeseg, *dataseg;
107
+ size_t rounded_size;
108
+
109
+ dataseg = ADD_TO_POINTER(ptr, -overhead);
110
+ memcpy(&rounded_size, dataseg, sizeof(rounded_size));
111
+ memcpy(&codeseg, ADD_TO_POINTER(dataseg, sizeof(size_t)), sizeof(void *));
112
+ munmap(dataseg, rounded_size);
113
+ munmap(codeseg, rounded_size);
114
+ }
115
+ #else /* !NetBSD with PROT_MPROTECT */
116
+
36
117
  #if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE
37
- # if __gnu_linux__
118
+ # if __linux__ && !defined(__ANDROID__)
38
119
  /* This macro indicates it may be forbidden to map anonymous memory
39
120
  with both write and execute permission. Code compiled when this
40
121
  option is defined will attempt to map such pages once, but if it
@@ -45,7 +126,7 @@
45
126
  # define FFI_MMAP_EXEC_WRIT 1
46
127
  # define HAVE_MNTENT 1
47
128
  # endif
48
- # if defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)
129
+ # if defined(_WIN32) || defined(__OS2__)
49
130
  /* Windows systems may have Data Execution Protection (DEP) enabled,
50
131
  which requires the use of VirtualMalloc/VirtualFree to alloc/free
51
132
  executable memory. */
@@ -54,7 +135,7 @@
54
135
  #endif
55
136
 
56
137
  #if FFI_MMAP_EXEC_WRIT && !defined FFI_MMAP_EXEC_SELINUX
57
- # ifdef __linux__
138
+ # if defined(__linux__) && !defined(__ANDROID__)
58
139
  /* When defined to 1 check for SELinux and if SELinux is active,
59
140
  don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that
60
141
  might cause audit messages. */
@@ -64,11 +145,222 @@
64
145
 
65
146
  #if FFI_CLOSURES
66
147
 
67
- # if FFI_EXEC_TRAMPOLINE_TABLE
148
+ #if FFI_EXEC_TRAMPOLINE_TABLE
149
+
150
+ #ifdef __MACH__
151
+
152
+ #include <mach/mach.h>
153
+ #include <pthread.h>
154
+ #ifdef HAVE_PTRAUTH
155
+ #include <ptrauth.h>
156
+ #endif
157
+ #include <stdio.h>
158
+ #include <stdlib.h>
159
+
160
+ extern void *ffi_closure_trampoline_table_page;
161
+
162
+ typedef struct ffi_trampoline_table ffi_trampoline_table;
163
+ typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry;
164
+
165
+ struct ffi_trampoline_table
166
+ {
167
+ /* contiguous writable and executable pages */
168
+ vm_address_t config_page;
169
+ vm_address_t trampoline_page;
170
+
171
+ /* free list tracking */
172
+ uint16_t free_count;
173
+ ffi_trampoline_table_entry *free_list;
174
+ ffi_trampoline_table_entry *free_list_pool;
175
+
176
+ ffi_trampoline_table *prev;
177
+ ffi_trampoline_table *next;
178
+ };
179
+
180
+ struct ffi_trampoline_table_entry
181
+ {
182
+ void *(*trampoline) (void);
183
+ ffi_trampoline_table_entry *next;
184
+ };
185
+
186
+ /* Total number of trampolines that fit in one trampoline table */
187
+ #define FFI_TRAMPOLINE_COUNT (PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE)
188
+
189
+ static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER;
190
+ static ffi_trampoline_table *ffi_trampoline_tables = NULL;
191
+
192
+ static ffi_trampoline_table *
193
+ ffi_trampoline_table_alloc (void)
194
+ {
195
+ ffi_trampoline_table *table;
196
+ vm_address_t config_page;
197
+ vm_address_t trampoline_page;
198
+ vm_address_t trampoline_page_template;
199
+ vm_prot_t cur_prot;
200
+ vm_prot_t max_prot;
201
+ kern_return_t kt;
202
+ uint16_t i;
203
+
204
+ /* Allocate two pages -- a config page and a placeholder page */
205
+ config_page = 0x0;
206
+ kt = vm_allocate (mach_task_self (), &config_page, PAGE_MAX_SIZE * 2,
207
+ VM_FLAGS_ANYWHERE);
208
+ if (kt != KERN_SUCCESS)
209
+ return NULL;
210
+
211
+ /* Remap the trampoline table on top of the placeholder page */
212
+ trampoline_page = config_page + PAGE_MAX_SIZE;
213
+ trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page;
214
+ #ifdef __arm__
215
+ /* ffi_closure_trampoline_table_page can be thumb-biased on some ARM archs */
216
+ trampoline_page_template &= ~1UL;
217
+ #endif
218
+ kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_MAX_SIZE, 0x0,
219
+ VM_FLAGS_OVERWRITE, mach_task_self (), trampoline_page_template,
220
+ FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE);
221
+ if (kt != KERN_SUCCESS)
222
+ {
223
+ vm_deallocate (mach_task_self (), config_page, PAGE_MAX_SIZE * 2);
224
+ return NULL;
225
+ }
226
+
227
+ /* We have valid trampoline and config pages */
228
+ table = calloc (1, sizeof (ffi_trampoline_table));
229
+ table->free_count = FFI_TRAMPOLINE_COUNT;
230
+ table->config_page = config_page;
231
+ table->trampoline_page = trampoline_page;
232
+
233
+ /* Create and initialize the free list */
234
+ table->free_list_pool =
235
+ calloc (FFI_TRAMPOLINE_COUNT, sizeof (ffi_trampoline_table_entry));
236
+
237
+ for (i = 0; i < table->free_count; i++)
238
+ {
239
+ ffi_trampoline_table_entry *entry = &table->free_list_pool[i];
240
+ entry->trampoline =
241
+ (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE));
242
+
243
+ if (i < table->free_count - 1)
244
+ entry->next = &table->free_list_pool[i + 1];
245
+ }
246
+
247
+ table->free_list = table->free_list_pool;
248
+
249
+ return table;
250
+ }
251
+
252
+ static void
253
+ ffi_trampoline_table_free (ffi_trampoline_table *table)
254
+ {
255
+ /* Remove from the list */
256
+ if (table->prev != NULL)
257
+ table->prev->next = table->next;
258
+
259
+ if (table->next != NULL)
260
+ table->next->prev = table->prev;
261
+
262
+ /* Deallocate pages */
263
+ vm_deallocate (mach_task_self (), table->config_page, PAGE_MAX_SIZE * 2);
264
+
265
+ /* Deallocate free list */
266
+ free (table->free_list_pool);
267
+ free (table);
268
+ }
269
+
270
+ void *
271
+ ffi_closure_alloc (size_t size, void **code)
272
+ {
273
+ /* Create the closure */
274
+ ffi_closure *closure = malloc (size);
275
+ if (closure == NULL)
276
+ return NULL;
277
+
278
+ pthread_mutex_lock (&ffi_trampoline_lock);
279
+
280
+ /* Check for an active trampoline table with available entries. */
281
+ ffi_trampoline_table *table = ffi_trampoline_tables;
282
+ if (table == NULL || table->free_list == NULL)
283
+ {
284
+ table = ffi_trampoline_table_alloc ();
285
+ if (table == NULL)
286
+ {
287
+ pthread_mutex_unlock (&ffi_trampoline_lock);
288
+ free (closure);
289
+ return NULL;
290
+ }
291
+
292
+ /* Insert the new table at the top of the list */
293
+ table->next = ffi_trampoline_tables;
294
+ if (table->next != NULL)
295
+ table->next->prev = table;
296
+
297
+ ffi_trampoline_tables = table;
298
+ }
299
+
300
+ /* Claim the free entry */
301
+ ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list;
302
+ ffi_trampoline_tables->free_list = entry->next;
303
+ ffi_trampoline_tables->free_count--;
304
+ entry->next = NULL;
305
+
306
+ pthread_mutex_unlock (&ffi_trampoline_lock);
307
+
308
+ /* Initialize the return values */
309
+ *code = entry->trampoline;
310
+ #ifdef HAVE_PTRAUTH
311
+ *code = ptrauth_sign_unauthenticated (*code, ptrauth_key_asia, 0);
312
+ #endif
313
+ closure->trampoline_table = table;
314
+ closure->trampoline_table_entry = entry;
315
+
316
+ return closure;
317
+ }
318
+
319
+ void
320
+ ffi_closure_free (void *ptr)
321
+ {
322
+ ffi_closure *closure = ptr;
323
+
324
+ pthread_mutex_lock (&ffi_trampoline_lock);
325
+
326
+ /* Fetch the table and entry references */
327
+ ffi_trampoline_table *table = closure->trampoline_table;
328
+ ffi_trampoline_table_entry *entry = closure->trampoline_table_entry;
329
+
330
+ /* Return the entry to the free list */
331
+ entry->next = table->free_list;
332
+ table->free_list = entry;
333
+ table->free_count++;
334
+
335
+ /* If all trampolines within this table are free, and at least one other table exists, deallocate
336
+ * the table */
337
+ if (table->free_count == FFI_TRAMPOLINE_COUNT
338
+ && ffi_trampoline_tables != table)
339
+ {
340
+ ffi_trampoline_table_free (table);
341
+ }
342
+ else if (ffi_trampoline_tables != table)
343
+ {
344
+ /* Otherwise, bump this table to the top of the list */
345
+ table->prev = NULL;
346
+ table->next = ffi_trampoline_tables;
347
+ if (ffi_trampoline_tables != NULL)
348
+ ffi_trampoline_tables->prev = table;
349
+
350
+ ffi_trampoline_tables = table;
351
+ }
352
+
353
+ pthread_mutex_unlock (&ffi_trampoline_lock);
354
+
355
+ /* Free the closure */
356
+ free (closure);
357
+ }
358
+
359
+ #endif
68
360
 
69
361
  // Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations.
70
362
 
71
- # elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */
363
+ #elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */
72
364
 
73
365
  #define USE_LOCKS 1
74
366
  #define USE_DL_PREFIX 1
@@ -94,14 +386,6 @@
94
386
  /* Don't allocate more than a page unless needed. */
95
387
  #define DEFAULT_GRANULARITY ((size_t)malloc_getpagesize)
96
388
 
97
- #if FFI_CLOSURE_TEST
98
- /* Don't release single pages, to avoid a worst-case scenario of
99
- continuously allocating and releasing single pages, but release
100
- pairs of pages, which should do just as well given that allocations
101
- are likely to be small. */
102
- #define DEFAULT_TRIM_THRESHOLD ((size_t)malloc_getpagesize)
103
- #endif
104
-
105
389
  #include <sys/types.h>
106
390
  #include <sys/stat.h>
107
391
  #include <fcntl.h>
@@ -111,7 +395,7 @@
111
395
  #endif
112
396
  #include <string.h>
113
397
  #include <stdio.h>
114
- #if !defined(X86_WIN32) && !defined(X86_WIN64)
398
+ #if !defined(_WIN32)
115
399
  #ifdef HAVE_MNTENT
116
400
  #include <mntent.h>
117
401
  #endif /* HAVE_MNTENT */
@@ -172,6 +456,41 @@ selinux_enabled_check (void)
172
456
 
173
457
  #endif /* !FFI_MMAP_EXEC_SELINUX */
174
458
 
459
+ /* On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. */
460
+ #ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX
461
+ #include <stdlib.h>
462
+
463
+ static int emutramp_enabled = -1;
464
+
465
+ static int
466
+ emutramp_enabled_check (void)
467
+ {
468
+ char *buf = NULL;
469
+ size_t len = 0;
470
+ FILE *f;
471
+ int ret;
472
+ f = fopen ("/proc/self/status", "r");
473
+ if (f == NULL)
474
+ return 0;
475
+ ret = 0;
476
+
477
+ while (getline (&buf, &len, f) != -1)
478
+ if (!strncmp (buf, "PaX:", 4))
479
+ {
480
+ char emutramp;
481
+ if (sscanf (buf, "%*s %*c%c", &emutramp) == 1)
482
+ ret = (emutramp == 'E');
483
+ break;
484
+ }
485
+ free (buf);
486
+ fclose (f);
487
+ return ret;
488
+ }
489
+
490
+ #define is_emutramp_enabled() (emutramp_enabled >= 0 ? emutramp_enabled \
491
+ : (emutramp_enabled = emutramp_enabled_check ()))
492
+ #endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */
493
+
175
494
  #elif defined (__CYGWIN__) || defined(__INTERIX)
176
495
 
177
496
  #include <sys/mman.h>
@@ -181,6 +500,10 @@ selinux_enabled_check (void)
181
500
 
182
501
  #endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */
183
502
 
503
+ #ifndef FFI_MMAP_EXEC_EMUTRAMP_PAX
504
+ #define is_emutramp_enabled() 0
505
+ #endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */
506
+
184
507
  /* Declare all functions defined in dlmalloc.c as static. */
185
508
  static void *dlmalloc(size_t);
186
509
  static void dlfree(void*);
@@ -198,11 +521,11 @@ static int dlmalloc_trim(size_t) MAYBE_UNUSED;
198
521
  static size_t dlmalloc_usable_size(void*) MAYBE_UNUSED;
199
522
  static void dlmalloc_stats(void) MAYBE_UNUSED;
200
523
 
201
- #if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX)
524
+ #if !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX)
202
525
  /* Use these for mmap and munmap within dlmalloc.c. */
203
526
  static void *dlmmap(void *, size_t, int, int, int, off_t);
204
527
  static int dlmunmap(void *, size_t);
205
- #endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */
528
+ #endif /* !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */
206
529
 
207
530
  #define mmap dlmmap
208
531
  #define munmap dlmunmap
@@ -212,7 +535,7 @@ static int dlmunmap(void *, size_t);
212
535
  #undef mmap
213
536
  #undef munmap
214
537
 
215
- #if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX)
538
+ #if !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX)
216
539
 
217
540
  /* A mutex used to synchronize access to *exec* variables in this file. */
218
541
  static pthread_mutex_t open_temp_exec_file_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -224,11 +547,28 @@ static int execfd = -1;
224
547
  /* The amount of space already allocated from the temporary file. */
225
548
  static size_t execsize = 0;
226
549
 
550
+ #ifdef HAVE_MEMFD_CREATE
227
551
  /* Open a temporary file name, and immediately unlink it. */
228
552
  static int
229
- open_temp_exec_file_name (char *name)
553
+ open_temp_exec_file_memfd (const char *name)
230
554
  {
231
- int fd = mkstemp (name);
555
+ int fd;
556
+ fd = memfd_create (name, MFD_CLOEXEC);
557
+ return fd;
558
+ }
559
+ #endif
560
+
561
+ /* Open a temporary file name, and immediately unlink it. */
562
+ static int
563
+ open_temp_exec_file_name (char *name, int flags)
564
+ {
565
+ int fd;
566
+
567
+ #ifdef HAVE_MKOSTEMP
568
+ fd = mkostemp (name, flags);
569
+ #else
570
+ fd = mkstemp (name);
571
+ #endif
232
572
 
233
573
  if (fd != -1)
234
574
  unlink (name);
@@ -241,8 +581,30 @@ static int
241
581
  open_temp_exec_file_dir (const char *dir)
242
582
  {
243
583
  static const char suffix[] = "/ffiXXXXXX";
244
- int lendir = strlen (dir);
245
- char *tempname = __builtin_alloca (lendir + sizeof (suffix));
584
+ int lendir, flags;
585
+ char *tempname;
586
+ #ifdef O_TMPFILE
587
+ int fd;
588
+ #endif
589
+
590
+ #ifdef O_CLOEXEC
591
+ flags = O_CLOEXEC;
592
+ #else
593
+ flags = 0;
594
+ #endif
595
+
596
+ #ifdef O_TMPFILE
597
+ fd = open (dir, flags | O_RDWR | O_EXCL | O_TMPFILE, 0700);
598
+ /* If the running system does not support the O_TMPFILE flag then retry without it. */
599
+ if (fd != -1 || (errno != EINVAL && errno != EISDIR && errno != EOPNOTSUPP)) {
600
+ return fd;
601
+ } else {
602
+ errno = 0;
603
+ }
604
+ #endif
605
+
606
+ lendir = (int) strlen (dir);
607
+ tempname = __builtin_alloca (lendir + sizeof (suffix));
246
608
 
247
609
  if (!tempname)
248
610
  return -1;
@@ -250,7 +612,7 @@ open_temp_exec_file_dir (const char *dir)
250
612
  memcpy (tempname, dir, lendir);
251
613
  memcpy (tempname + lendir, suffix, sizeof (suffix));
252
614
 
253
- return open_temp_exec_file_name (tempname);
615
+ return open_temp_exec_file_name (tempname, flags);
254
616
  }
255
617
 
256
618
  /* Open a temporary file in the directory in the named environment
@@ -323,6 +685,9 @@ static struct
323
685
  const char *arg;
324
686
  int repeat;
325
687
  } open_temp_exec_file_opts[] = {
688
+ #ifdef HAVE_MEMFD_CREATE
689
+ { open_temp_exec_file_memfd, "libffi", 0 },
690
+ #endif
326
691
  { open_temp_exec_file_env, "TMPDIR", 0 },
327
692
  { open_temp_exec_file_dir, "/tmp", 0 },
328
693
  { open_temp_exec_file_dir, "/var/tmp", 0 },
@@ -359,7 +724,7 @@ open_temp_exec_file_opts_next (void)
359
724
  }
360
725
 
361
726
  /* Return a file descriptor of a temporary zero-sized file in a
362
- writable and exexutable filesystem. */
727
+ writable and executable filesystem. */
363
728
  static int
364
729
  open_temp_exec_file (void)
365
730
  {
@@ -382,6 +747,36 @@ open_temp_exec_file (void)
382
747
  return fd;
383
748
  }
384
749
 
750
+ /* We need to allocate space in a file that will be backing a writable
751
+ mapping. Several problems exist with the usual approaches:
752
+ - fallocate() is Linux-only
753
+ - posix_fallocate() is not available on all platforms
754
+ - ftruncate() does not allocate space on filesystems with sparse files
755
+ Failure to allocate the space will cause SIGBUS to be thrown when
756
+ the mapping is subsequently written to. */
757
+ static int
758
+ allocate_space (int fd, off_t offset, off_t len)
759
+ {
760
+ static size_t page_size;
761
+
762
+ /* Obtain system page size. */
763
+ if (!page_size)
764
+ page_size = sysconf(_SC_PAGESIZE);
765
+
766
+ unsigned char buf[page_size];
767
+ memset (buf, 0, page_size);
768
+
769
+ while (len > 0)
770
+ {
771
+ off_t to_write = (len < page_size) ? len : page_size;
772
+ if (write (fd, buf, to_write) < to_write)
773
+ return -1;
774
+ len -= to_write;
775
+ }
776
+
777
+ return 0;
778
+ }
779
+
385
780
  /* Map in a chunk of memory from the temporary exec file into separate
386
781
  locations in the virtual memory address space, one writable and one
387
782
  executable. Returns the address of the writable portion, after
@@ -403,7 +798,7 @@ dlmmap_locked (void *start, size_t length, int prot, int flags, off_t offset)
403
798
 
404
799
  offset = execsize;
405
800
 
406
- if (ftruncate (execfd, offset + length))
801
+ if (allocate_space (execfd, offset, length))
407
802
  return MFAIL;
408
803
 
409
804
  flags &= ~(MAP_PRIVATE | MAP_ANONYMOUS);
@@ -418,7 +813,13 @@ dlmmap_locked (void *start, size_t length, int prot, int flags, off_t offset)
418
813
  close (execfd);
419
814
  goto retry_open;
420
815
  }
421
- ftruncate (execfd, offset);
816
+ if (ftruncate (execfd, offset) != 0)
817
+ {
818
+ /* Fixme : Error logs can be added here. Returning an error for
819
+ * ftruncte() will not add any advantage as it is being
820
+ * validating in the error case. */
821
+ }
822
+
422
823
  return MFAIL;
423
824
  }
424
825
  else if (!offset
@@ -430,7 +831,12 @@ dlmmap_locked (void *start, size_t length, int prot, int flags, off_t offset)
430
831
  if (start == MFAIL)
431
832
  {
432
833
  munmap (ptr, length);
433
- ftruncate (execfd, offset);
834
+ if (ftruncate (execfd, offset) != 0)
835
+ {
836
+ /* Fixme : Error logs can be added here. Returning an error for
837
+ * ftruncte() will not add any advantage as it is being
838
+ * validating in the error case. */
839
+ }
434
840
  return start;
435
841
  }
436
842
 
@@ -454,9 +860,11 @@ dlmmap (void *start, size_t length, int prot,
454
860
  && flags == (MAP_PRIVATE | MAP_ANONYMOUS)
455
861
  && fd == -1 && offset == 0);
456
862
 
457
- #if FFI_CLOSURE_TEST
458
- printf ("mapping in %zi\n", length);
459
- #endif
863
+ if (execfd == -1 && is_emutramp_enabled ())
864
+ {
865
+ ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset);
866
+ return ptr;
867
+ }
460
868
 
461
869
  if (execfd == -1 && !is_selinux_enabled ())
462
870
  {
@@ -497,10 +905,6 @@ dlmunmap (void *start, size_t length)
497
905
  msegmentptr seg = segment_holding (gm, start);
498
906
  void *code;
499
907
 
500
- #if FFI_CLOSURE_TEST
501
- printf ("unmapping %zi\n", length);
502
- #endif
503
-
504
908
  if (seg && (code = add_segment_exec_offset (start, seg)) != start)
505
909
  {
506
910
  int ret = munmap (code, length);
@@ -527,7 +931,7 @@ segment_holding_code (mstate m, char* addr)
527
931
  }
528
932
  #endif
529
933
 
530
- #endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */
934
+ #endif /* !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */
531
935
 
532
936
  /* Allocate a chunk of memory with the given size. Returns a pointer
533
937
  to the writable address, and sets *CODE to the executable
@@ -540,7 +944,7 @@ ffi_closure_alloc (size_t size, void **code)
540
944
  if (!code)
541
945
  return NULL;
542
946
 
543
- ptr = dlmalloc (size);
947
+ ptr = FFI_CLOSURE_PTR (dlmalloc (size));
544
948
 
545
949
  if (ptr)
546
950
  {
@@ -552,6 +956,20 @@ ffi_closure_alloc (size_t size, void **code)
552
956
  return ptr;
553
957
  }
554
958
 
959
+ void *
960
+ ffi_data_to_code_pointer (void *data)
961
+ {
962
+ msegmentptr seg = segment_holding (gm, data);
963
+ /* We expect closures to be allocated with ffi_closure_alloc(), in
964
+ which case seg will be non-NULL. However, some users take on the
965
+ burden of managing this memory themselves, in which case this
966
+ we'll just return data. */
967
+ if (seg)
968
+ return add_segment_exec_offset (data, seg);
969
+ else
970
+ return data;
971
+ }
972
+
555
973
  /* Release a chunk of memory allocated with ffi_closure_alloc. If
556
974
  FFI_CLOSURE_FREE_CODE is nonzero, the given address can be the
557
975
  writable or the executable address given. Otherwise, only the
@@ -566,29 +984,9 @@ ffi_closure_free (void *ptr)
566
984
  ptr = sub_segment_exec_offset (ptr, seg);
567
985
  #endif
568
986
 
569
- dlfree (ptr);
987
+ dlfree (FFI_RESTORE_PTR (ptr));
570
988
  }
571
989
 
572
-
573
- #if FFI_CLOSURE_TEST
574
- /* Do some internal sanity testing to make sure allocation and
575
- deallocation of pages are working as intended. */
576
- int main ()
577
- {
578
- void *p[3];
579
- #define GET(idx, len) do { p[idx] = dlmalloc (len); printf ("allocated %zi for p[%i]\n", (len), (idx)); } while (0)
580
- #define PUT(idx) do { printf ("freeing p[%i]\n", (idx)); dlfree (p[idx]); } while (0)
581
- GET (0, malloc_getpagesize / 2);
582
- GET (1, 2 * malloc_getpagesize - 64 * sizeof (void*));
583
- PUT (1);
584
- GET (1, 2 * malloc_getpagesize);
585
- GET (2, malloc_getpagesize / 2);
586
- PUT (1);
587
- PUT (0);
588
- PUT (2);
589
- return 0;
590
- }
591
- #endif /* FFI_CLOSURE_TEST */
592
990
  # else /* ! FFI_MMAP_EXEC_WRIT */
593
991
 
594
992
  /* On many systems, memory returned by malloc is writable and
@@ -602,14 +1000,22 @@ ffi_closure_alloc (size_t size, void **code)
602
1000
  if (!code)
603
1001
  return NULL;
604
1002
 
605
- return *code = malloc (size);
1003
+ return *code = FFI_CLOSURE_PTR (malloc (size));
606
1004
  }
607
1005
 
608
1006
  void
609
1007
  ffi_closure_free (void *ptr)
610
1008
  {
611
- free (ptr);
1009
+ free (FFI_RESTORE_PTR (ptr));
1010
+ }
1011
+
1012
+ void *
1013
+ ffi_data_to_code_pointer (void *data)
1014
+ {
1015
+ return data;
612
1016
  }
613
1017
 
614
1018
  # endif /* ! FFI_MMAP_EXEC_WRIT */
615
1019
  #endif /* FFI_CLOSURES */
1020
+
1021
+ #endif /* NetBSD with PROT_MPROTECT */