ffi 1.9.18 → 1.9.23

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 (468) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +22 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +52 -0
  5. data/.yardopts +5 -0
  6. data/Gemfile +15 -0
  7. data/{spec/ffi/LICENSE.SPECS → LICENSE.SPECS} +1 -1
  8. data/README.md +3 -4
  9. data/Rakefile +41 -5
  10. data/appveyor.yml +22 -0
  11. data/ext/ffi_c/AbstractMemory.c +6 -1
  12. data/ext/ffi_c/Call.c +1 -22
  13. data/ext/ffi_c/Call.h +0 -9
  14. data/ext/ffi_c/Closure.c +54 -0
  15. data/ext/ffi_c/{ClosurePool.h → Closure.h} +13 -23
  16. data/ext/ffi_c/Function.c +16 -25
  17. data/ext/ffi_c/Function.h +1 -2
  18. data/ext/ffi_c/FunctionInfo.c +0 -4
  19. data/ext/ffi_c/MethodHandle.c +33 -268
  20. data/ext/ffi_c/Platform.c +10 -2
  21. data/ext/ffi_c/extconf.rb +10 -5
  22. data/ext/ffi_c/ffi.c +2 -2
  23. data/ext/ffi_c/libffi/.appveyor.yml +48 -0
  24. data/ext/ffi_c/libffi/.gitignore +36 -0
  25. data/ext/ffi_c/libffi/.travis/install.sh +14 -0
  26. data/ext/ffi_c/libffi/.travis.yml +30 -0
  27. data/ext/ffi_c/libffi/ChangeLog.libffi +2 -2
  28. data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.libffi-3.1} +1402 -2
  29. data/ext/ffi_c/libffi/ChangeLog.v1 +1 -1
  30. data/ext/ffi_c/libffi/LICENSE +1 -1
  31. data/ext/ffi_c/libffi/Makefile.am +169 -158
  32. data/ext/ffi_c/libffi/Makefile.in +927 -938
  33. data/ext/ffi_c/libffi/README +164 -52
  34. data/ext/ffi_c/libffi/acinclude.m4 +387 -0
  35. data/ext/ffi_c/libffi/autogen.sh +2 -0
  36. data/ext/ffi_c/libffi/config.guess +336 -371
  37. data/ext/ffi_c/libffi/config.sub +246 -115
  38. data/ext/ffi_c/libffi/configure +6976 -2189
  39. data/ext/ffi_c/libffi/configure.ac +148 -256
  40. data/ext/ffi_c/libffi/configure.host +277 -4
  41. data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
  42. data/ext/ffi_c/libffi/doc/Makefile.in +811 -0
  43. data/ext/ffi_c/libffi/doc/libffi.texi +430 -45
  44. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  45. data/ext/ffi_c/libffi/fficonfig.h.in +24 -13
  46. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +203 -0
  47. data/ext/ffi_c/libffi/include/Makefile.am +3 -3
  48. data/ext/ffi_c/libffi/include/Makefile.in +188 -71
  49. data/ext/ffi_c/libffi/include/ffi.h.in +112 -50
  50. data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
  51. data/ext/ffi_c/libffi/include/ffi_common.h +32 -11
  52. data/ext/ffi_c/libffi/install-sh +190 -202
  53. data/ext/ffi_c/libffi/libffi.map.in +80 -0
  54. data/ext/ffi_c/libffi/libffi.pc.in +3 -2
  55. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +1043 -0
  56. data/ext/ffi_c/libffi/libtool-ldflags +106 -0
  57. data/ext/ffi_c/libffi/libtool-version +1 -1
  58. data/ext/ffi_c/libffi/ltmain.sh +3553 -2033
  59. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  60. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +69 -0
  61. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +13 -8
  62. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +31 -104
  63. data/ext/ffi_c/libffi/m4/{ax_check_compiler_flags.m4 → ax_check_compile_flag.m4} +30 -34
  64. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +32 -11
  65. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +6 -5
  66. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +31 -21
  67. data/ext/ffi_c/libffi/man/Makefile.am +2 -2
  68. data/ext/ffi_c/libffi/man/Makefile.in +141 -49
  69. data/ext/ffi_c/libffi/man/ffi.3 +10 -0
  70. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
  71. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  72. data/ext/ffi_c/libffi/missing +150 -311
  73. data/ext/ffi_c/libffi/msvcc.sh +72 -9
  74. data/ext/ffi_c/libffi/src/aarch64/ffi.c +964 -0
  75. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +81 -0
  76. data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
  77. data/ext/ffi_c/libffi/src/aarch64/sysv.S +438 -0
  78. data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
  79. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
  80. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  81. data/ext/ffi_c/libffi/src/alpha/osf.S +161 -266
  82. data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
  83. data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
  84. data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
  85. data/ext/ffi_c/libffi/src/arm/ffi.c +608 -517
  86. data/ext/ffi_c/libffi/src/arm/ffitarget.h +24 -7
  87. data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
  88. data/ext/ffi_c/libffi/src/arm/sysv.S +303 -417
  89. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
  90. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  91. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  92. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  93. data/ext/ffi_c/libffi/src/closures.c +366 -45
  94. data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
  95. data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
  96. data/ext/ffi_c/libffi/src/debug.c +6 -1
  97. data/ext/ffi_c/libffi/src/dlmalloc.c +16 -11
  98. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  99. data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
  100. data/ext/ffi_c/libffi/src/ia64/ffi.c +11 -7
  101. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +6 -1
  102. data/ext/ffi_c/libffi/src/ia64/unix.S +2 -0
  103. data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
  104. data/ext/ffi_c/libffi/src/m32r/ffi.c +1 -1
  105. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
  106. data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
  107. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
  108. data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
  109. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  110. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  111. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  112. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  113. data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
  114. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  115. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  116. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  117. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  118. data/ext/ffi_c/libffi/src/mips/ffi.c +103 -28
  119. data/ext/ffi_c/libffi/src/mips/ffitarget.h +10 -3
  120. data/ext/ffi_c/libffi/src/mips/n32.S +128 -56
  121. data/ext/ffi_c/libffi/src/mips/o32.S +148 -27
  122. data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
  123. data/ext/ffi_c/libffi/src/moxie/ffi.c +40 -44
  124. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  125. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  126. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  127. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  128. data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
  129. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  130. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  131. data/ext/ffi_c/libffi/src/pa/ffitarget.h +8 -1
  132. data/ext/ffi_c/libffi/src/powerpc/aix.S +245 -7
  133. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +253 -4
  134. data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
  135. data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
  136. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
  137. data/ext/ffi_c/libffi/src/powerpc/ffi.c +103 -1378
  138. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +111 -30
  139. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +945 -0
  140. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
  141. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  142. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +103 -44
  143. data/ext/ffi_c/libffi/src/powerpc/linux64.S +100 -59
  144. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +360 -108
  145. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
  146. data/ext/ffi_c/libffi/src/powerpc/sysv.S +68 -112
  147. data/ext/ffi_c/libffi/src/prep_cif.c +108 -24
  148. data/ext/ffi_c/libffi/src/raw_api.c +18 -5
  149. data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
  150. data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
  151. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  152. data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
  153. data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
  154. data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
  155. data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
  156. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
  157. data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
  158. data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
  159. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
  160. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  161. data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
  162. data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
  163. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  164. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  165. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  166. data/ext/ffi_c/libffi/src/types.c +43 -14
  167. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  168. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  169. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  170. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  171. data/ext/ffi_c/libffi/src/x86/ffi.c +591 -500
  172. data/ext/ffi_c/libffi/src/x86/ffi64.c +359 -116
  173. data/ext/ffi_c/libffi/src/x86/ffitarget.h +55 -35
  174. data/ext/ffi_c/libffi/src/x86/ffiw64.c +287 -0
  175. data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
  176. data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
  177. data/ext/ffi_c/libffi/src/x86/sysv.S +975 -400
  178. data/ext/ffi_c/libffi/src/x86/unix64.S +398 -299
  179. data/ext/ffi_c/libffi/src/x86/win64.S +222 -458
  180. data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
  181. data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
  182. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
  183. data/ext/ffi_c/libffi/src/xtensa/sysv.S +253 -0
  184. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  185. data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -73
  186. data/ext/ffi_c/libffi/testsuite/Makefile.in +219 -111
  187. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +121 -25
  188. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +21 -1
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -6
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/{closure_stdcall.c → closure_simple.c} +7 -16
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -4
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -4
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -4
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -4
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -4
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -4
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -4
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +5 -5
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -4
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -4
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -4
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -4
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c +95 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -4
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -4
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -4
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -4
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +5 -5
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -4
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -4
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -4
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -4
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -4
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -4
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -4
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -4
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -4
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -4
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +4 -6
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +4 -6
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +4 -4
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -4
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -4
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +4 -4
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -4
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -4
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +4 -4
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +4 -4
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +10 -9
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +3 -3
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +10 -9
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +1 -1
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +11 -9
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +5 -5
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +23 -40
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +6 -4
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +18 -19
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +6 -6
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +8 -8
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +6 -6
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +5 -5
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +5 -5
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +5 -5
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +5 -5
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +6 -6
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +5 -5
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +6 -6
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +6 -6
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +7 -7
  274. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +7 -7
  275. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +5 -5
  276. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +5 -5
  277. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +2 -2
  278. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
  282. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
  283. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
  284. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
  285. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
  286. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
  287. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
  288. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +2 -2
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  292. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest.cc +3 -10
  293. data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest_ffi_call.cc +2 -1
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  314. data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
  315. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  326. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  327. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  328. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  329. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  330. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  331. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  332. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  333. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  345. data/ext/ffi_c/libffi.bsd.mk +11 -5
  346. data/ext/ffi_c/libffi.darwin.mk +14 -4
  347. data/ext/ffi_c/libffi.gnu.mk +3 -2
  348. data/ext/ffi_c/libffi.mk +10 -5
  349. data/ext/ffi_c/libffi.vc.mk +1 -1
  350. data/ext/ffi_c/libffi.vc64.mk +1 -1
  351. data/ffi.gemspec +16 -3
  352. data/lib/ffi/enum.rb +124 -0
  353. data/lib/ffi/library.rb +66 -14
  354. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  355. data/lib/ffi/platform/x86_64-windows/types.conf +113 -20
  356. data/lib/ffi/platform.rb +7 -2
  357. data/lib/ffi/pointer.rb +1 -0
  358. data/lib/ffi/struct.rb +0 -2
  359. data/lib/ffi/version.rb +1 -2
  360. data/samples/getlogin.rb +8 -0
  361. data/samples/getpid.rb +8 -0
  362. data/samples/gettimeofday.rb +18 -0
  363. data/samples/hello.rb +7 -0
  364. data/samples/inotify.rb +60 -0
  365. data/samples/pty.rb +76 -0
  366. data/samples/qsort.rb +21 -0
  367. data/samples/sample_helper.rb +6 -0
  368. metadata +164 -115
  369. data/ext/ffi_c/ClosurePool.c +0 -283
  370. data/ext/ffi_c/libffi/Makefile.vc +0 -141
  371. data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
  372. data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
  373. data/ext/ffi_c/libffi/build-ios.sh +0 -67
  374. data/ext/ffi_c/libffi/compile +0 -143
  375. data/ext/ffi_c/libffi/depcomp +0 -630
  376. data/ext/ffi_c/libffi/doc/libffi.info +0 -593
  377. data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
  378. data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
  379. data/ext/ffi_c/libffi/include/ffi.h.vc64 +0 -427
  380. data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7831
  381. data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
  382. data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
  383. data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
  384. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -98
  385. data/ext/ffi_c/libffi/mdate-sh +0 -201
  386. data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
  387. data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
  388. data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
  389. data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
  390. data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
  391. data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
  392. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
  393. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
  394. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
  395. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
  396. data/ext/ffi_c/libffi/texinfo.tex +0 -7210
  397. data/gen/Rakefile +0 -30
  398. data/libtest/Benchmark.c +0 -52
  399. data/libtest/BoolTest.c +0 -34
  400. data/libtest/BufferTest.c +0 -31
  401. data/libtest/ClosureTest.c +0 -205
  402. data/libtest/EnumTest.c +0 -51
  403. data/libtest/FunctionTest.c +0 -70
  404. data/libtest/GNUmakefile +0 -149
  405. data/libtest/GlobalVariable.c +0 -62
  406. data/libtest/LastErrorTest.c +0 -21
  407. data/libtest/NumberTest.c +0 -132
  408. data/libtest/PointerTest.c +0 -63
  409. data/libtest/ReferenceTest.c +0 -23
  410. data/libtest/StringTest.c +0 -34
  411. data/libtest/StructTest.c +0 -243
  412. data/libtest/UnionTest.c +0 -43
  413. data/libtest/VariadicTest.c +0 -99
  414. data/spec/ffi/async_callback_spec.rb +0 -35
  415. data/spec/ffi/bool_spec.rb +0 -32
  416. data/spec/ffi/buffer_spec.rb +0 -279
  417. data/spec/ffi/callback_spec.rb +0 -773
  418. data/spec/ffi/custom_param_type.rb +0 -37
  419. data/spec/ffi/custom_type_spec.rb +0 -74
  420. data/spec/ffi/dup_spec.rb +0 -52
  421. data/spec/ffi/enum_spec.rb +0 -423
  422. data/spec/ffi/errno_spec.rb +0 -20
  423. data/spec/ffi/ffi_spec.rb +0 -28
  424. data/spec/ffi/fixtures/Benchmark.c +0 -52
  425. data/spec/ffi/fixtures/BoolTest.c +0 -34
  426. data/spec/ffi/fixtures/BufferTest.c +0 -31
  427. data/spec/ffi/fixtures/ClosureTest.c +0 -205
  428. data/spec/ffi/fixtures/EnumTest.c +0 -51
  429. data/spec/ffi/fixtures/FunctionTest.c +0 -142
  430. data/spec/ffi/fixtures/GNUmakefile +0 -149
  431. data/spec/ffi/fixtures/GlobalVariable.c +0 -62
  432. data/spec/ffi/fixtures/LastErrorTest.c +0 -21
  433. data/spec/ffi/fixtures/NumberTest.c +0 -132
  434. data/spec/ffi/fixtures/PipeHelper.h +0 -21
  435. data/spec/ffi/fixtures/PipeHelperPosix.c +0 -41
  436. data/spec/ffi/fixtures/PipeHelperWindows.c +0 -72
  437. data/spec/ffi/fixtures/PointerTest.c +0 -63
  438. data/spec/ffi/fixtures/ReferenceTest.c +0 -23
  439. data/spec/ffi/fixtures/StringTest.c +0 -34
  440. data/spec/ffi/fixtures/StructTest.c +0 -243
  441. data/spec/ffi/fixtures/UnionTest.c +0 -43
  442. data/spec/ffi/fixtures/VariadicTest.c +0 -99
  443. data/spec/ffi/fixtures/classes.rb +0 -438
  444. data/spec/ffi/function_spec.rb +0 -97
  445. data/spec/ffi/io_spec.rb +0 -16
  446. data/spec/ffi/library_spec.rb +0 -286
  447. data/spec/ffi/long_double.rb +0 -30
  448. data/spec/ffi/managed_struct_spec.rb +0 -68
  449. data/spec/ffi/memorypointer_spec.rb +0 -78
  450. data/spec/ffi/number_spec.rb +0 -247
  451. data/spec/ffi/platform_spec.rb +0 -114
  452. data/spec/ffi/pointer_spec.rb +0 -285
  453. data/spec/ffi/rbx/attach_function_spec.rb +0 -34
  454. data/spec/ffi/rbx/memory_pointer_spec.rb +0 -194
  455. data/spec/ffi/rbx/spec_helper.rb +0 -6
  456. data/spec/ffi/rbx/struct_spec.rb +0 -18
  457. data/spec/ffi/spec_helper.rb +0 -93
  458. data/spec/ffi/string_spec.rb +0 -118
  459. data/spec/ffi/strptr_spec.rb +0 -50
  460. data/spec/ffi/struct_by_ref_spec.rb +0 -43
  461. data/spec/ffi/struct_callback_spec.rb +0 -69
  462. data/spec/ffi/struct_initialize_spec.rb +0 -35
  463. data/spec/ffi/struct_packed_spec.rb +0 -50
  464. data/spec/ffi/struct_spec.rb +0 -886
  465. data/spec/ffi/typedef_spec.rb +0 -91
  466. data/spec/ffi/union_spec.rb +0 -67
  467. data/spec/ffi/variadic_spec.rb +0 -132
  468. data/spec/spec.opts +0 -4
@@ -30,11 +30,88 @@
30
30
  #define _GNU_SOURCE 1
31
31
  #endif
32
32
 
33
+ #include <fficonfig.h>
33
34
  #include <ffi.h>
34
35
  #include <ffi_common.h>
35
36
 
37
+ #ifdef __NetBSD__
38
+ #include <sys/param.h>
39
+ #endif
40
+
41
+ #if __NetBSD_Version__ - 0 >= 799007200
42
+ /* NetBSD with PROT_MPROTECT */
43
+ #include <sys/mman.h>
44
+
45
+ #include <stddef.h>
46
+ #include <unistd.h>
47
+
48
+ static const size_t overhead =
49
+ (sizeof(max_align_t) > sizeof(void *) + sizeof(size_t)) ?
50
+ sizeof(max_align_t)
51
+ : sizeof(void *) + sizeof(size_t);
52
+
53
+ #define ADD_TO_POINTER(p, d) ((void *)((uintptr_t)(p) + (d)))
54
+
55
+ void *
56
+ ffi_closure_alloc (size_t size, void **code)
57
+ {
58
+ static size_t page_size;
59
+ size_t rounded_size;
60
+ void *codeseg, *dataseg;
61
+ int prot;
62
+
63
+ /* Expect that PAX mprotect is active and a separate code mapping is necessary. */
64
+ if (!code)
65
+ return NULL;
66
+
67
+ /* Obtain system page size. */
68
+ if (!page_size)
69
+ page_size = sysconf(_SC_PAGESIZE);
70
+
71
+ /* Round allocation size up to the next page, keeping in mind the size field and pointer to code map. */
72
+ rounded_size = (size + overhead + page_size - 1) & ~(page_size - 1);
73
+
74
+ /* Primary mapping is RW, but request permission to switch to PROT_EXEC later. */
75
+ prot = PROT_READ | PROT_WRITE | PROT_MPROTECT(PROT_EXEC);
76
+ dataseg = mmap(NULL, rounded_size, prot, MAP_ANON | MAP_PRIVATE, -1, 0);
77
+ if (dataseg == MAP_FAILED)
78
+ return NULL;
79
+
80
+ /* Create secondary mapping and switch it to RX. */
81
+ codeseg = mremap(dataseg, rounded_size, NULL, rounded_size, MAP_REMAPDUP);
82
+ if (codeseg == MAP_FAILED) {
83
+ munmap(dataseg, rounded_size);
84
+ return NULL;
85
+ }
86
+ if (mprotect(codeseg, rounded_size, PROT_READ | PROT_EXEC) == -1) {
87
+ munmap(codeseg, rounded_size);
88
+ munmap(dataseg, rounded_size);
89
+ return NULL;
90
+ }
91
+
92
+ /* Remember allocation size and location of the secondary mapping for ffi_closure_free. */
93
+ memcpy(dataseg, &rounded_size, sizeof(rounded_size));
94
+ memcpy(ADD_TO_POINTER(dataseg, sizeof(size_t)), &codeseg, sizeof(void *));
95
+ *code = ADD_TO_POINTER(codeseg, overhead);
96
+ return ADD_TO_POINTER(dataseg, overhead);
97
+ }
98
+
99
+ void
100
+ ffi_closure_free (void *ptr)
101
+ {
102
+ void *codeseg, *dataseg;
103
+ size_t rounded_size;
104
+
105
+ dataseg = ADD_TO_POINTER(ptr, -overhead);
106
+ memcpy(&rounded_size, dataseg, sizeof(rounded_size));
107
+ memcpy(&codeseg, ADD_TO_POINTER(dataseg, sizeof(size_t)), sizeof(void *));
108
+ munmap(dataseg, rounded_size);
109
+ munmap(codeseg, rounded_size);
110
+ }
111
+ #else /* !NetBSD with PROT_MPROTECT */
112
+
36
113
  #if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE
37
- # if __gnu_linux__
114
+ # if __linux__ && !defined(__ANDROID__)
38
115
  /* This macro indicates it may be forbidden to map anonymous memory
39
116
  with both write and execute permission. Code compiled when this
40
117
  option is defined will attempt to map such pages once, but if it
@@ -54,7 +131,7 @@
54
131
  #endif
55
132
 
56
133
  #if FFI_MMAP_EXEC_WRIT && !defined FFI_MMAP_EXEC_SELINUX
57
- # ifdef __linux__
134
+ # if defined(__linux__) && !defined(__ANDROID__)
58
135
  /* When defined to 1 check for SELinux and if SELinux is active,
59
136
  don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that
60
137
  might cause audit messages. */
@@ -64,11 +141,216 @@
64
141
 
65
142
  #if FFI_CLOSURES
66
143
 
67
- # if FFI_EXEC_TRAMPOLINE_TABLE
144
+ #if FFI_EXEC_TRAMPOLINE_TABLE
145
+
146
+ #ifdef __MACH__
147
+
148
+ #include <mach/mach.h>
149
+ #include <pthread.h>
150
+ #include <stdio.h>
151
+ #include <stdlib.h>
152
+
153
+ extern void *ffi_closure_trampoline_table_page;
154
+
155
+ typedef struct ffi_trampoline_table ffi_trampoline_table;
156
+ typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry;
157
+
158
+ struct ffi_trampoline_table
159
+ {
160
+ /* contiguous writable and executable pages */
161
+ vm_address_t config_page;
162
+ vm_address_t trampoline_page;
163
+
164
+ /* free list tracking */
165
+ uint16_t free_count;
166
+ ffi_trampoline_table_entry *free_list;
167
+ ffi_trampoline_table_entry *free_list_pool;
168
+
169
+ ffi_trampoline_table *prev;
170
+ ffi_trampoline_table *next;
171
+ };
172
+
173
+ struct ffi_trampoline_table_entry
174
+ {
175
+ void *(*trampoline) ();
176
+ ffi_trampoline_table_entry *next;
177
+ };
178
+
179
+ /* Total number of trampolines that fit in one trampoline table */
180
+ #define FFI_TRAMPOLINE_COUNT (PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE)
181
+
182
+ static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER;
183
+ static ffi_trampoline_table *ffi_trampoline_tables = NULL;
184
+
185
+ static ffi_trampoline_table *
186
+ ffi_trampoline_table_alloc (void)
187
+ {
188
+ ffi_trampoline_table *table;
189
+ vm_address_t config_page;
190
+ vm_address_t trampoline_page;
191
+ vm_address_t trampoline_page_template;
192
+ vm_prot_t cur_prot;
193
+ vm_prot_t max_prot;
194
+ kern_return_t kt;
195
+ uint16_t i;
196
+
197
+ /* Allocate two pages -- a config page and a placeholder page */
198
+ config_page = 0x0;
199
+ kt = vm_allocate (mach_task_self (), &config_page, PAGE_MAX_SIZE * 2,
200
+ VM_FLAGS_ANYWHERE);
201
+ if (kt != KERN_SUCCESS)
202
+ return NULL;
203
+
204
+ /* Remap the trampoline table on top of the placeholder page */
205
+ trampoline_page = config_page + PAGE_MAX_SIZE;
206
+ trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page;
207
+ #ifdef __arm__
208
+ /* ffi_closure_trampoline_table_page can be thumb-biased on some ARM archs */
209
+ trampoline_page_template &= ~1UL;
210
+ #endif
211
+ kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_MAX_SIZE, 0x0,
212
+ VM_FLAGS_OVERWRITE, mach_task_self (), trampoline_page_template,
213
+ FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE);
214
+ if (kt != KERN_SUCCESS)
215
+ {
216
+ vm_deallocate (mach_task_self (), config_page, PAGE_MAX_SIZE * 2);
217
+ return NULL;
218
+ }
219
+
220
+ /* We have valid trampoline and config pages */
221
+ table = calloc (1, sizeof (ffi_trampoline_table));
222
+ table->free_count = FFI_TRAMPOLINE_COUNT;
223
+ table->config_page = config_page;
224
+ table->trampoline_page = trampoline_page;
225
+
226
+ /* Create and initialize the free list */
227
+ table->free_list_pool =
228
+ calloc (FFI_TRAMPOLINE_COUNT, sizeof (ffi_trampoline_table_entry));
229
+
230
+ for (i = 0; i < table->free_count; i++)
231
+ {
232
+ ffi_trampoline_table_entry *entry = &table->free_list_pool[i];
233
+ entry->trampoline =
234
+ (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE));
235
+
236
+ if (i < table->free_count - 1)
237
+ entry->next = &table->free_list_pool[i + 1];
238
+ }
239
+
240
+ table->free_list = table->free_list_pool;
241
+
242
+ return table;
243
+ }
244
+
245
+ static void
246
+ ffi_trampoline_table_free (ffi_trampoline_table *table)
247
+ {
248
+ /* Remove from the list */
249
+ if (table->prev != NULL)
250
+ table->prev->next = table->next;
251
+
252
+ if (table->next != NULL)
253
+ table->next->prev = table->prev;
254
+
255
+ /* Deallocate pages */
256
+ vm_deallocate (mach_task_self (), table->config_page, PAGE_MAX_SIZE * 2);
257
+
258
+ /* Deallocate free list */
259
+ free (table->free_list_pool);
260
+ free (table);
261
+ }
262
+
263
+ void *
264
+ ffi_closure_alloc (size_t size, void **code)
265
+ {
266
+ /* Create the closure */
267
+ ffi_closure *closure = malloc (size);
268
+ if (closure == NULL)
269
+ return NULL;
270
+
271
+ pthread_mutex_lock (&ffi_trampoline_lock);
272
+
273
+ /* Check for an active trampoline table with available entries. */
274
+ ffi_trampoline_table *table = ffi_trampoline_tables;
275
+ if (table == NULL || table->free_list == NULL)
276
+ {
277
+ table = ffi_trampoline_table_alloc ();
278
+ if (table == NULL)
279
+ {
280
+ pthread_mutex_unlock (&ffi_trampoline_lock);
281
+ free (closure);
282
+ return NULL;
283
+ }
284
+
285
+ /* Insert the new table at the top of the list */
286
+ table->next = ffi_trampoline_tables;
287
+ if (table->next != NULL)
288
+ table->next->prev = table;
289
+
290
+ ffi_trampoline_tables = table;
291
+ }
292
+
293
+ /* Claim the free entry */
294
+ ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list;
295
+ ffi_trampoline_tables->free_list = entry->next;
296
+ ffi_trampoline_tables->free_count--;
297
+ entry->next = NULL;
298
+
299
+ pthread_mutex_unlock (&ffi_trampoline_lock);
300
+
301
+ /* Initialize the return values */
302
+ *code = entry->trampoline;
303
+ closure->trampoline_table = table;
304
+ closure->trampoline_table_entry = entry;
305
+
306
+ return closure;
307
+ }
308
+
309
+ void
310
+ ffi_closure_free (void *ptr)
311
+ {
312
+ ffi_closure *closure = ptr;
313
+
314
+ pthread_mutex_lock (&ffi_trampoline_lock);
315
+
316
+ /* Fetch the table and entry references */
317
+ ffi_trampoline_table *table = closure->trampoline_table;
318
+ ffi_trampoline_table_entry *entry = closure->trampoline_table_entry;
319
+
320
+ /* Return the entry to the free list */
321
+ entry->next = table->free_list;
322
+ table->free_list = entry;
323
+ table->free_count++;
324
+
325
+ /* If all trampolines within this table are free, and at least one other table exists, deallocate
326
+ * the table */
327
+ if (table->free_count == FFI_TRAMPOLINE_COUNT
328
+ && ffi_trampoline_tables != table)
329
+ {
330
+ ffi_trampoline_table_free (table);
331
+ }
332
+ else if (ffi_trampoline_tables != table)
333
+ {
334
+ /* Otherwise, bump this table to the top of the list */
335
+ table->prev = NULL;
336
+ table->next = ffi_trampoline_tables;
337
+ if (ffi_trampoline_tables != NULL)
338
+ ffi_trampoline_tables->prev = table;
339
+
340
+ ffi_trampoline_tables = table;
341
+ }
342
+
343
+ pthread_mutex_unlock (&ffi_trampoline_lock);
344
+
345
+ /* Free the closure */
346
+ free (closure);
347
+ }
348
+
349
+ #endif
68
350
 
69
351
  // Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations.
70
352
 
71
- # elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */
353
+ #elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */
72
354
 
73
355
  #define USE_LOCKS 1
74
356
  #define USE_DL_PREFIX 1
@@ -94,14 +376,6 @@
94
376
  /* Don't allocate more than a page unless needed. */
95
377
  #define DEFAULT_GRANULARITY ((size_t)malloc_getpagesize)
96
378
 
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
379
  #include <sys/types.h>
106
380
  #include <sys/stat.h>
107
381
  #include <fcntl.h>
@@ -172,6 +446,41 @@ selinux_enabled_check (void)
172
446
 
173
447
  #endif /* !FFI_MMAP_EXEC_SELINUX */
174
448
 
449
+ /* On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. */
450
+ #ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX
451
+ #include <stdlib.h>
452
+
453
+ static int emutramp_enabled = -1;
454
+
455
+ static int
456
+ emutramp_enabled_check (void)
457
+ {
458
+ char *buf = NULL;
459
+ size_t len = 0;
460
+ FILE *f;
461
+ int ret;
462
+ f = fopen ("/proc/self/status", "r");
463
+ if (f == NULL)
464
+ return 0;
465
+ ret = 0;
466
+
467
+ while (getline (&buf, &len, f) != -1)
468
+ if (!strncmp (buf, "PaX:", 4))
469
+ {
470
+ char emutramp;
471
+ if (sscanf (buf, "%*s %*c%c", &emutramp) == 1)
472
+ ret = (emutramp == 'E');
473
+ break;
474
+ }
475
+ free (buf);
476
+ fclose (f);
477
+ return ret;
478
+ }
479
+
480
+ #define is_emutramp_enabled() (emutramp_enabled >= 0 ? emutramp_enabled \
481
+ : (emutramp_enabled = emutramp_enabled_check ()))
482
+ #endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */
483
+
175
484
  #elif defined (__CYGWIN__) || defined(__INTERIX)
176
485
 
177
486
  #include <sys/mman.h>
@@ -181,6 +490,10 @@ selinux_enabled_check (void)
181
490
 
182
491
  #endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */
183
492
 
493
+ #ifndef FFI_MMAP_EXEC_EMUTRAMP_PAX
494
+ #define is_emutramp_enabled() 0
495
+ #endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */
496
+
184
497
  /* Declare all functions defined in dlmalloc.c as static. */
185
498
  static void *dlmalloc(size_t);
186
499
  static void dlfree(void*);
@@ -226,9 +539,15 @@ static size_t execsize = 0;
226
539
 
227
540
  /* Open a temporary file name, and immediately unlink it. */
228
541
  static int
229
- open_temp_exec_file_name (char *name)
542
+ open_temp_exec_file_name (char *name, int flags)
230
543
  {
231
- int fd = mkstemp (name);
544
+ int fd;
545
+
546
+ #ifdef HAVE_MKOSTEMP
547
+ fd = mkostemp (name, flags);
548
+ #else
549
+ fd = mkstemp (name);
550
+ #endif
232
551
 
233
552
  if (fd != -1)
234
553
  unlink (name);
@@ -241,8 +560,30 @@ static int
241
560
  open_temp_exec_file_dir (const char *dir)
242
561
  {
243
562
  static const char suffix[] = "/ffiXXXXXX";
244
- int lendir = strlen (dir);
245
- char *tempname = __builtin_alloca (lendir + sizeof (suffix));
563
+ int lendir, flags;
564
+ char *tempname;
565
+ #ifdef O_TMPFILE
566
+ int fd;
567
+ #endif
568
+
569
+ #ifdef O_CLOEXEC
570
+ flags = O_CLOEXEC;
571
+ #else
572
+ flags = 0;
573
+ #endif
574
+
575
+ #ifdef O_TMPFILE
576
+ fd = open (dir, flags | O_RDWR | O_EXCL | O_TMPFILE, 0700);
577
+ /* If the running system does not support the O_TMPFILE flag then retry without it. */
578
+ if (fd != -1 || (errno != EINVAL && errno != EISDIR && errno != EOPNOTSUPP)) {
579
+ return fd;
580
+ } else {
581
+ errno = 0;
582
+ }
583
+ #endif
584
+
585
+ lendir = (int) strlen (dir);
586
+ tempname = __builtin_alloca (lendir + sizeof (suffix));
246
587
 
247
588
  if (!tempname)
248
589
  return -1;
@@ -250,7 +591,7 @@ open_temp_exec_file_dir (const char *dir)
250
591
  memcpy (tempname, dir, lendir);
251
592
  memcpy (tempname + lendir, suffix, sizeof (suffix));
252
593
 
253
- return open_temp_exec_file_name (tempname);
594
+ return open_temp_exec_file_name (tempname, flags);
254
595
  }
255
596
 
256
597
  /* Open a temporary file in the directory in the named environment
@@ -359,7 +700,7 @@ open_temp_exec_file_opts_next (void)
359
700
  }
360
701
 
361
702
  /* Return a file descriptor of a temporary zero-sized file in a
362
- writable and exexutable filesystem. */
703
+ writable and executable filesystem. */
363
704
  static int
364
705
  open_temp_exec_file (void)
365
706
  {
@@ -454,9 +795,11 @@ dlmmap (void *start, size_t length, int prot,
454
795
  && flags == (MAP_PRIVATE | MAP_ANONYMOUS)
455
796
  && fd == -1 && offset == 0);
456
797
 
457
- #if FFI_CLOSURE_TEST
458
- printf ("mapping in %zi\n", length);
459
- #endif
798
+ if (execfd == -1 && is_emutramp_enabled ())
799
+ {
800
+ ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset);
801
+ return ptr;
802
+ }
460
803
 
461
804
  if (execfd == -1 && !is_selinux_enabled ())
462
805
  {
@@ -497,10 +840,6 @@ dlmunmap (void *start, size_t length)
497
840
  msegmentptr seg = segment_holding (gm, start);
498
841
  void *code;
499
842
 
500
- #if FFI_CLOSURE_TEST
501
- printf ("unmapping %zi\n", length);
502
- #endif
503
-
504
843
  if (seg && (code = add_segment_exec_offset (start, seg)) != start)
505
844
  {
506
845
  int ret = munmap (code, length);
@@ -569,26 +908,6 @@ ffi_closure_free (void *ptr)
569
908
  dlfree (ptr);
570
909
  }
571
910
 
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
911
  # else /* ! FFI_MMAP_EXEC_WRIT */
593
912
 
594
913
  /* On many systems, memory returned by malloc is writable and
@@ -613,3 +932,5 @@ ffi_closure_free (void *ptr)
613
932
 
614
933
  # endif /* ! FFI_MMAP_EXEC_WRIT */
615
934
  #endif /* FFI_CLOSURES */
935
+
936
+ #endif /* NetBSD with PROT_MPROTECT */
@@ -29,7 +29,7 @@
29
29
  #include <ffi.h>
30
30
  #include <ffi_common.h>
31
31
 
32
- #define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG)
32
+ #define STACK_ARG_SIZE(x) FFI_ALIGN(x, FFI_SIZEOF_ARG)
33
33
 
34
34
  static ffi_status
35
35
  initialize_aggregate_packed_struct (ffi_type * arg)
@@ -153,21 +153,24 @@ ffi_prep_args (char *stack, extended_cif * ecif)
153
153
  return (struct_count);
154
154
  }
155
155
 
156
- ffi_status
157
- ffi_prep_cif (ffi_cif * cif,
158
- ffi_abi abi, unsigned int nargs,
159
- ffi_type * rtype, ffi_type ** atypes)
156
+ ffi_status FFI_HIDDEN
157
+ ffi_prep_cif_core (ffi_cif * cif,
158
+ ffi_abi abi, unsigned int isvariadic,
159
+ unsigned int nfixedargs, unsigned int ntotalargs,
160
+ ffi_type * rtype, ffi_type ** atypes)
160
161
  {
161
162
  unsigned bytes = 0;
162
163
  unsigned int i;
163
164
  ffi_type **ptr;
164
165
 
165
166
  FFI_ASSERT (cif != NULL);
167
+ FFI_ASSERT((!isvariadic) || (nfixedargs >= 1));
168
+ FFI_ASSERT(nfixedargs <= ntotalargs);
166
169
  FFI_ASSERT (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI);
167
170
 
168
171
  cif->abi = abi;
169
172
  cif->arg_types = atypes;
170
- cif->nargs = nargs;
173
+ cif->nargs = ntotalargs;
171
174
  cif->rtype = rtype;
172
175
 
173
176
  cif->flags = 0;
@@ -187,7 +190,7 @@ ffi_prep_cif (ffi_cif * cif,
187
190
  FFI_ASSERT_VALID_TYPE (*ptr);
188
191
 
189
192
  if (((*ptr)->alignment - 1) & bytes)
190
- bytes = ALIGN (bytes, (*ptr)->alignment);
193
+ bytes = FFI_ALIGN (bytes, (*ptr)->alignment);
191
194
  if ((*ptr)->type == FFI_TYPE_STRUCT)
192
195
  {
193
196
  if ((*ptr)->size > 8)
@@ -1,5 +1,6 @@
1
1
  /* -----------------------------------------------------------------*-C-*-
2
- ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc.
2
+ ffitarget.h - Copyright (c) 2012 Anthony Green
3
+ Copyright (c) 1996-2003 Red Hat, Inc.
3
4
  Target configuration macros for CRIS.
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining
@@ -27,6 +28,10 @@
27
28
  #ifndef LIBFFI_TARGET_H
28
29
  #define LIBFFI_TARGET_H
29
30
 
31
+ #ifndef LIBFFI_H
32
+ #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
33
+ #endif
34
+
30
35
  #ifndef LIBFFI_ASM
31
36
  typedef unsigned long ffi_arg;
32
37
  typedef signed long ffi_sarg;
@@ -54,6 +54,11 @@ void ffi_type_test(ffi_type *a, char *file, int line)
54
54
  FFI_ASSERT_AT(a->type <= FFI_TYPE_LAST, file, line);
55
55
  FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->size > 0, file, line);
56
56
  FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->alignment > 0, file, line);
57
- FFI_ASSERT_AT(a->type != FFI_TYPE_STRUCT || a->elements != NULL, file, line);
57
+ FFI_ASSERT_AT((a->type != FFI_TYPE_STRUCT && a->type != FFI_TYPE_COMPLEX)
58
+ || a->elements != NULL, file, line);
59
+ FFI_ASSERT_AT(a->type != FFI_TYPE_COMPLEX
60
+ || (a->elements != NULL
61
+ && a->elements[0] != NULL && a->elements[1] == NULL),
62
+ file, line);
58
63
 
59
64
  }
@@ -438,6 +438,11 @@ DEFAULT_MMAP_THRESHOLD default: 256K
438
438
 
439
439
  */
440
440
 
441
+ #if defined __linux__ && !defined _GNU_SOURCE
442
+ /* mremap() on Linux requires this via sys/mman.h */
443
+ #define _GNU_SOURCE 1
444
+ #endif
445
+
441
446
  #ifndef WIN32
442
447
  #ifdef _WIN32
443
448
  #define WIN32 1
@@ -1255,7 +1260,7 @@ extern void* sbrk(ptrdiff_t);
1255
1260
  #define SIZE_T_BITSIZE (sizeof(size_t) << 3)
1256
1261
 
1257
1262
  /* Some constants coerced to size_t */
1258
- /* Annoying but necessary to avoid errors on some plaftorms */
1263
+ /* Annoying but necessary to avoid errors on some platforms */
1259
1264
  #define SIZE_T_ZERO ((size_t)0)
1260
1265
  #define SIZE_T_ONE ((size_t)1)
1261
1266
  #define SIZE_T_TWO ((size_t)2)
@@ -1409,7 +1414,7 @@ static int win32munmap(void* ptr, size_t size) {
1409
1414
  #define CALL_MORECORE(S) MFAIL
1410
1415
  #endif /* HAVE_MORECORE */
1411
1416
 
1412
- /* mstate bit set if continguous morecore disabled or failed */
1417
+ /* mstate bit set if contiguous morecore disabled or failed */
1413
1418
  #define USE_NONCONTIGUOUS_BIT (4U)
1414
1419
 
1415
1420
  /* segment bit set in create_mspace_with_base */
@@ -1661,7 +1666,7 @@ struct malloc_chunk {
1661
1666
  typedef struct malloc_chunk mchunk;
1662
1667
  typedef struct malloc_chunk* mchunkptr;
1663
1668
  typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */
1664
- typedef unsigned int bindex_t; /* Described below */
1669
+ typedef size_t bindex_t; /* Described below */
1665
1670
  typedef unsigned int binmap_t; /* Described below */
1666
1671
  typedef unsigned int flag_t; /* The type of various bit flag sets */
1667
1672
 
@@ -2291,7 +2296,7 @@ static size_t traverse_and_check(mstate m);
2291
2296
  #define treebin_at(M,i) (&((M)->treebins[i]))
2292
2297
 
2293
2298
  /* assign tree index for size S to variable I */
2294
- #if defined(__GNUC__) && defined(i386)
2299
+ #if defined(__GNUC__) && defined(__i386__)
2295
2300
  #define compute_tree_index(S, I)\
2296
2301
  {\
2297
2302
  size_t X = S >> TREEBIN_SHIFT;\
@@ -2356,7 +2361,7 @@ static size_t traverse_and_check(mstate m);
2356
2361
 
2357
2362
  /* index corresponding to given bit */
2358
2363
 
2359
- #if defined(__GNUC__) && defined(i386)
2364
+ #if defined(__GNUC__) && defined(__i386__)
2360
2365
  #define compute_bit2idx(X, I)\
2361
2366
  {\
2362
2367
  unsigned int J;\
@@ -3090,8 +3095,8 @@ static void internal_malloc_stats(mstate m) {
3090
3095
  and choose its bk node as its replacement.
3091
3096
  2. If x was the last node of its size, but not a leaf node, it must
3092
3097
  be replaced with a leaf node (not merely one with an open left or
3093
- right), to make sure that lefts and rights of descendents
3094
- correspond properly to bit masks. We use the rightmost descendent
3098
+ right), to make sure that lefts and rights of descendants
3099
+ correspond properly to bit masks. We use the rightmost descendant
3095
3100
  of x. We could use any other leaf, but this is easy to locate and
3096
3101
  tends to counteract removal of leftmosts elsewhere, and so keeps
3097
3102
  paths shorter than minimally guaranteed. This doesn't loop much
@@ -3388,7 +3393,7 @@ static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) {
3388
3393
  *ss = m->seg; /* Push current record */
3389
3394
  m->seg.base = tbase;
3390
3395
  m->seg.size = tsize;
3391
- set_segment_flags(&m->seg, mmapped);
3396
+ (void)set_segment_flags(&m->seg, mmapped);
3392
3397
  m->seg.next = ss;
3393
3398
 
3394
3399
  /* Insert trailing fenceposts */
@@ -3548,7 +3553,7 @@ static void* sys_alloc(mstate m, size_t nb) {
3548
3553
  if (!is_initialized(m)) { /* first-time initialization */
3549
3554
  m->seg.base = m->least_addr = tbase;
3550
3555
  m->seg.size = tsize;
3551
- set_segment_flags(&m->seg, mmap_flag);
3556
+ (void)set_segment_flags(&m->seg, mmap_flag);
3552
3557
  m->magic = mparams.magic;
3553
3558
  init_bins(m);
3554
3559
  if (is_global(m))
@@ -5091,10 +5096,10 @@ History:
5091
5096
  Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
5092
5097
  * Use last_remainder in more cases.
5093
5098
  * Pack bins using idea from colin@nyx10.cs.du.edu
5094
- * Use ordered bins instead of best-fit threshhold
5099
+ * Use ordered bins instead of best-fit threshold
5095
5100
  * Eliminate block-local decls to simplify tracing and debugging.
5096
5101
  * Support another case of realloc via move into top
5097
- * Fix error occuring when initial sbrk_base not word-aligned.
5102
+ * Fix error occurring when initial sbrk_base not word-aligned.
5098
5103
  * Rely on page size for units instead of SBRK_UNIT to
5099
5104
  avoid surprises about sbrk alignment conventions.
5100
5105
  * Add mallinfo, mallopt. Thanks to Raymond Nijssen
@@ -118,7 +118,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
118
118
  else
119
119
  cif->flags = cif->rtype->size;
120
120
 
121
- cif->bytes = ALIGN (cif->bytes, 8);
121
+ cif->bytes = FFI_ALIGN (cif->bytes, 8);
122
122
 
123
123
  return FFI_OK;
124
124
  }