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
@@ -26,30 +26,6 @@
26
26
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
27
  */
28
28
 
29
- #ifndef _MSC_VER
30
- #include <sys/param.h>
31
- #endif
32
- #include <sys/types.h>
33
- #ifndef _WIN32
34
- # include <sys/mman.h>
35
- #endif
36
- #include <stdio.h>
37
- #ifndef _MSC_VER
38
- # include <stdint.h>
39
- # include <stdbool.h>
40
- #else
41
- # include "win32/stdint.h"
42
- # include "win32/stdbool.h"
43
- #endif
44
- #ifndef _WIN32
45
- # include <unistd.h>
46
- #endif
47
- #include <errno.h>
48
- #include <ruby.h>
49
- #if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) && !defined(__WIN32__)
50
- # include <pthread.h>
51
- #endif
52
-
53
29
  #include <ffi.h>
54
30
  #include "rbffi.h"
55
31
  #include "compat.h"
@@ -59,79 +35,16 @@
59
35
  #include "Type.h"
60
36
  #include "LastError.h"
61
37
  #include "Call.h"
62
- #include "ClosurePool.h"
38
+ #include "Closure.h"
63
39
  #include "MethodHandle.h"
64
40
 
65
-
66
- #define MAX_METHOD_FIXED_ARITY (6)
67
-
68
- #ifndef roundup
69
- # define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
70
- #endif
71
- #ifdef _WIN32
72
- typedef char* caddr_t;
73
- #endif
74
-
75
- #ifdef USE_RAW
76
- # define METHOD_CLOSURE ffi_raw_closure
77
- # define METHOD_PARAMS ffi_raw*
78
- #else
79
- # define METHOD_CLOSURE ffi_closure
80
- # define METHOD_PARAMS void**
81
- #endif
82
-
83
-
84
-
85
- static bool prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize);
86
- static long trampoline_size(void);
87
-
88
- #if defined(__x86_64__) && (defined(__linux__) || defined(__APPLE__))
89
- # define CUSTOM_TRAMPOLINE 1
90
- #endif
91
-
41
+ #define METHOD_CLOSURE ffi_closure
42
+ #define METHOD_PARAMS void**
92
43
 
93
44
  struct MethodHandle {
94
45
  Closure* closure;
95
46
  };
96
47
 
97
- static ClosurePool* defaultClosurePool;
98
-
99
-
100
- MethodHandle*
101
- rbffi_MethodHandle_Alloc(FunctionType* fnInfo, void* function)
102
- {
103
- MethodHandle* handle;
104
- Closure* closure = rbffi_Closure_Alloc(defaultClosurePool);
105
- if (closure == NULL) {
106
- rb_raise(rb_eNoMemError, "failed to allocate closure from pool");
107
- return NULL;
108
- }
109
-
110
- handle = xcalloc(1, sizeof(*handle));
111
- handle->closure = closure;
112
- closure->info = fnInfo;
113
- closure->function = function;
114
-
115
- return handle;
116
- }
117
-
118
- void
119
- rbffi_MethodHandle_Free(MethodHandle* handle)
120
- {
121
- if (handle != NULL) {
122
- rbffi_Closure_Free(handle->closure);
123
- }
124
- }
125
-
126
- void*
127
- rbffi_MethodHandle_CodeAddress(MethodHandle* handle)
128
- {
129
- return handle->closure->code;
130
- }
131
-
132
- #ifndef CUSTOM_TRAMPOLINE
133
- static void attached_method_invoke(ffi_cif* cif, void* retval, METHOD_PARAMS parameters, void* user_data);
134
-
135
48
  static ffi_type* methodHandleParamTypes[] = {
136
49
  &ffi_type_sint,
137
50
  &ffi_type_pointer,
@@ -140,219 +53,71 @@ static ffi_type* methodHandleParamTypes[] = {
140
53
 
141
54
  static ffi_cif mh_cif;
142
55
 
143
- static bool
144
- prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize)
145
- {
146
- ffi_status ffiStatus;
147
-
148
- #if defined(USE_RAW)
149
- ffiStatus = ffi_prep_raw_closure(code, &mh_cif, attached_method_invoke, closure);
150
- #else
151
- ffiStatus = ffi_prep_closure(code, &mh_cif, attached_method_invoke, closure);
152
- #endif
153
- if (ffiStatus != FFI_OK) {
154
- snprintf(errmsg, errmsgsize, "ffi_prep_closure failed. status=%#x", ffiStatus);
155
- return false;
156
- }
157
-
158
- return true;
159
- }
160
-
161
-
162
- static long
163
- trampoline_size(void)
164
- {
165
- return sizeof(METHOD_CLOSURE);
166
- }
167
-
168
- /*
169
- * attached_method_invoke is used functions with more than 6 parameters, or
170
- * with struct param or return values
171
- */
172
56
  static void
173
57
  attached_method_invoke(ffi_cif* cif, void* mretval, METHOD_PARAMS parameters, void* user_data)
174
58
  {
175
59
  Closure* handle = (Closure *) user_data;
176
60
  FunctionType* fnInfo = (FunctionType *) handle->info;
177
61
 
178
- #ifdef USE_RAW
179
- int argc = parameters[0].sint;
180
- VALUE* argv = *(VALUE **) &parameters[1];
181
- #else
182
62
  int argc = *(int *) parameters[0];
183
63
  VALUE* argv = *(VALUE **) parameters[1];
184
- #endif
185
64
 
186
65
  *(VALUE *) mretval = (*fnInfo->invoke)(argc, argv, handle->function, fnInfo);
187
66
  }
188
67
 
189
- #endif
190
-
191
-
192
-
193
- #if defined(CUSTOM_TRAMPOLINE)
194
- #if defined(__x86_64__)
195
-
196
- static VALUE custom_trampoline(int argc, VALUE* argv, VALUE self, Closure*);
197
-
198
- #define TRAMPOLINE_CTX_MAGIC (0xfee1deadcafebabe)
199
- #define TRAMPOLINE_FUN_MAGIC (0xfeedfacebeeff00d)
200
-
201
- /*
202
- * This is a hand-coded trampoline to speedup entry from ruby to the FFI translation
203
- * layer for x86_64 arches.
204
- *
205
- * Since a ruby function has exactly 3 arguments, and the first 6 arguments are
206
- * passed in registers for x86_64, we can tack on a context pointer by simply
207
- * putting a value in %rcx, then jumping to the C trampoline code.
208
- *
209
- * This results in approx a 30% speedup for x86_64 FFI dispatch
210
- */
211
- __asm__(
212
- ".text\n\t"
213
- ".globl ffi_trampoline\n\t"
214
- ".globl _ffi_trampoline\n\t"
215
- "ffi_trampoline:\n\t"
216
- "_ffi_trampoline:\n\t"
217
- "movabsq $0xfee1deadcafebabe, %rcx\n\t"
218
- "movabsq $0xfeedfacebeeff00d, %r11\n\t"
219
- "jmpq *%r11\n\t"
220
- ".globl ffi_trampoline_end\n\t"
221
- "ffi_trampoline_end:\n\t"
222
- ".globl _ffi_trampoline_end\n\t"
223
- "_ffi_trampoline_end:\n\t"
224
- );
225
-
226
- static VALUE
227
- custom_trampoline(int argc, VALUE* argv, VALUE self, Closure* handle)
228
- {
229
- FunctionType* fnInfo = (FunctionType *) handle->info;
230
- VALUE rbReturnValue;
231
-
232
- RB_GC_GUARD(rbReturnValue) = (*fnInfo->invoke)(argc, argv, handle->function, fnInfo);
233
- RB_GC_GUARD(self);
234
-
235
- return rbReturnValue;
236
- }
237
-
238
- #elif defined(__i386__) && 0
239
-
240
- static VALUE custom_trampoline(caddr_t args, Closure*);
241
- #define TRAMPOLINE_CTX_MAGIC (0xfee1dead)
242
- #define TRAMPOLINE_FUN_MAGIC (0xbeefcafe)
243
-
244
- /*
245
- * This is a hand-coded trampoline to speed-up entry from ruby to the FFI translation
246
- * layer for i386 arches.
247
- *
248
- * This does not make a discernible difference vs a raw closure, so for now,
249
- * it is not enabled.
250
- */
251
- __asm__(
252
- ".text\n\t"
253
- ".globl ffi_trampoline\n\t"
254
- ".globl _ffi_trampoline\n\t"
255
- "ffi_trampoline:\n\t"
256
- "_ffi_trampoline:\n\t"
257
- "subl $12, %esp\n\t"
258
- "leal 16(%esp), %eax\n\t"
259
- "movl %eax, (%esp)\n\t"
260
- "movl $0xfee1dead, 4(%esp)\n\t"
261
- "movl $0xbeefcafe, %eax\n\t"
262
- "call *%eax\n\t"
263
- "addl $12, %esp\n\t"
264
- "ret\n\t"
265
- ".globl ffi_trampoline_end\n\t"
266
- "ffi_trampoline_end:\n\t"
267
- ".globl _ffi_trampoline_end\n\t"
268
- "_ffi_trampoline_end:\n\t"
269
- );
270
-
271
- static VALUE
272
- custom_trampoline(caddr_t args, Closure* handle)
68
+ MethodHandle*
69
+ rbffi_MethodHandle_Alloc(FunctionType* fnInfo, void* function)
273
70
  {
274
- FunctionType* fnInfo = (FunctionType *) handle->info;
275
- return (*fnInfo->invoke)(*(int *) args, *(VALUE **) (args + 4), handle->function, fnInfo);
276
- }
277
-
278
- #endif /* __x86_64__ else __i386__ */
279
-
280
- extern void ffi_trampoline(int argc, VALUE* argv, VALUE self);
281
- extern void ffi_trampoline_end(void);
282
- static int trampoline_offsets(long *, long *);
283
-
284
- static long trampoline_ctx_offset, trampoline_func_offset;
71
+ ffi_status ffiStatus;
72
+ MethodHandle* handle;
73
+ Closure* closure;
285
74
 
286
- static long
287
- trampoline_offset(int off, const long value)
288
- {
289
- caddr_t ptr;
290
- for (ptr = (caddr_t) &ffi_trampoline + off; ptr < (caddr_t) &ffi_trampoline_end; ++ptr) {
291
- if (*(long *) ptr == value) {
292
- return ptr - (caddr_t) &ffi_trampoline;
293
- }
75
+ closure = rbffi_Closure_Alloc();
76
+ if (closure == NULL) {
77
+ rb_raise(rb_eNoMemError, "failed to allocate closure from pool");
78
+ return NULL;
294
79
  }
80
+ closure->info = fnInfo;
81
+ closure->function = function;
295
82
 
296
- return -1;
297
- }
298
-
299
- static int
300
- trampoline_offsets(long* ctxOffset, long* fnOffset)
301
- {
302
- *ctxOffset = trampoline_offset(0, TRAMPOLINE_CTX_MAGIC);
303
- if (*ctxOffset == -1) {
304
- return -1;
83
+ ffiStatus = ffi_prep_closure_loc(closure->libffi_closure,
84
+ &mh_cif, /* method signature */
85
+ attached_method_invoke,
86
+ closure, /* user_data for attached_method_invoke */
87
+ closure->libffi_trampoline);
88
+ if (ffiStatus != FFI_OK) {
89
+ rb_raise(rb_eRuntimeError, "ffi_prep_closure_loc failed. status=%#x", ffiStatus);
90
+ return false;
305
91
  }
306
92
 
307
- *fnOffset = trampoline_offset(0, TRAMPOLINE_FUN_MAGIC);
308
- if (*fnOffset == -1) {
309
- return -1;
310
- }
93
+ handle = xcalloc(1, sizeof(*handle));
94
+ handle->closure = closure;
311
95
 
312
- return 0;
96
+ return handle;
313
97
  }
314
98
 
315
- static bool
316
- prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize)
99
+ void
100
+ rbffi_MethodHandle_Free(MethodHandle* handle)
317
101
  {
318
- caddr_t ptr = (caddr_t) code;
319
-
320
- memcpy(ptr, &ffi_trampoline, trampoline_size());
321
- /* Patch the context and function addresses into the stub code */
322
- *(intptr_t *)(ptr + trampoline_ctx_offset) = (intptr_t) closure;
323
- *(intptr_t *)(ptr + trampoline_func_offset) = (intptr_t) custom_trampoline;
324
-
325
- return true;
102
+ if (handle != NULL) {
103
+ rbffi_Closure_Free(handle->closure);
104
+ }
326
105
  }
327
106
 
328
- static long
329
- trampoline_size(void)
107
+ void*
108
+ rbffi_MethodHandle_CodeAddress(MethodHandle* handle)
330
109
  {
331
- return (caddr_t) &ffi_trampoline_end - (caddr_t) &ffi_trampoline;
110
+ return handle->closure->libffi_trampoline;
332
111
  }
333
112
 
334
- #endif /* CUSTOM_TRAMPOLINE */
335
-
336
-
337
113
  void
338
114
  rbffi_MethodHandle_Init(VALUE module)
339
115
  {
340
- #ifndef CUSTOM_TRAMPOLINE
341
116
  ffi_status ffiStatus;
342
- #endif
343
117
 
344
- defaultClosurePool = rbffi_ClosurePool_New((int) trampoline_size(), prep_trampoline, NULL);
345
-
346
- #if defined(CUSTOM_TRAMPOLINE)
347
- if (trampoline_offsets(&trampoline_ctx_offset, &trampoline_func_offset) != 0) {
348
- rb_raise(rb_eFatal, "Could not locate offsets in trampoline code");
349
- }
350
- #else
351
118
  ffiStatus = ffi_prep_cif(&mh_cif, FFI_DEFAULT_ABI, 3, &ffi_type_ulong,
352
119
  methodHandleParamTypes);
353
120
  if (ffiStatus != FFI_OK) {
354
121
  rb_raise(rb_eFatal, "ffi_prep_cif failed. status=%#x", ffiStatus);
355
122
  }
356
-
357
- #endif
358
123
  }
data/ext/ffi_c/Platform.c CHANGED
@@ -66,12 +66,20 @@ static VALUE PlatformModule = Qnil;
66
66
  #elif defined(__ppc__) || defined(__powerpc__) || defined(__powerpc)
67
67
  # define CPU "ppc"
68
68
 
69
- /* Need to check for __sparcv9 first, because __sparc will be defined either way. */
69
+ /*
70
+ * Need to check for __sparcv9 first, because __sparc will be defined either way.
71
+ * Note that __sparcv9 seems to only be set for Solaris. On Linux, __sparc will
72
+ * be set, along with __arch64__ if a 64-bit platform.
73
+ */
70
74
  #elif defined(__sparcv9__) || defined(__sparcv9)
71
75
  # define CPU "sparcv9"
72
76
 
73
77
  #elif defined(__sparc__) || defined(__sparc)
74
- # define CPU "sparc"
78
+ # if defined(__arch64__)
79
+ # define CPU "sparcv9"
80
+ # else
81
+ # define CPU "sparc"
82
+ # endif
75
83
 
76
84
  #elif defined(__arm__) || defined(__arm)
77
85
  # define CPU "arm"
data/ext/ffi_c/extconf.rb CHANGED
@@ -11,15 +11,15 @@ if !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
11
11
  $CFLAGS.gsub!(/[\s+]-std=[^\s]+/, '')
12
12
  # solaris 10 needs -c99 for <stdbool.h>
13
13
  $CFLAGS << " -std=c99" if RbConfig::CONFIG['host_os'] =~ /solaris(!?2\.11)/
14
-
14
+
15
15
  if ENV['RUBY_CC_VERSION'].nil? && (pkg_config("libffi") ||
16
16
  have_header("ffi.h") ||
17
17
  find_header("ffi.h", "/usr/local/include", "/usr/include/ffi"))
18
18
 
19
- # We need at least ffi_call and ffi_prep_closure
19
+ # We need at least ffi_call and ffi_closure_alloc
20
20
  libffi_ok = have_library("ffi", "ffi_call", [ "ffi.h" ]) ||
21
21
  have_library("libffi", "ffi_call", [ "ffi.h" ])
22
- libffi_ok &&= have_func("ffi_prep_closure")
22
+ libffi_ok &&= have_func("ffi_closure_alloc")
23
23
 
24
24
  # Check if the raw api is available.
25
25
  $defs << "-DHAVE_RAW_API" if have_func("ffi_raw_call") && have_func("ffi_prep_raw_closure")
@@ -29,8 +29,13 @@ if !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
29
29
  have_func('rb_thread_blocking_region')
30
30
  have_func('rb_thread_call_with_gvl')
31
31
  have_func('rb_thread_call_without_gvl')
32
- have_func('ffi_prep_cif_var')
33
-
32
+
33
+ if libffi_ok
34
+ have_func('ffi_prep_cif_var')
35
+ else
36
+ $defs << "-DHAVE_FFI_PREP_CIF_VAR"
37
+ end
38
+
34
39
  $defs << "-DHAVE_EXTCONF_H" if $defs.empty? # needed so create_header works
35
40
  $defs << "-DUSE_INTERNAL_LIBFFI" unless libffi_ok
36
41
  $defs << "-DRUBY_1_9" if RUBY_VERSION >= "1.9.0"
data/ext/ffi_c/ffi.c CHANGED
@@ -46,7 +46,7 @@
46
46
  #include "Types.h"
47
47
  #include "LastError.h"
48
48
  #include "Function.h"
49
- #include "ClosurePool.h"
49
+ #include "Closure.h"
50
50
  #include "MethodHandle.h"
51
51
  #include "Call.h"
52
52
  #include "ArrayType.h"
@@ -79,7 +79,7 @@ Init_ffi_c(void)
79
79
  rbffi_ArrayType_Init(moduleFFI);
80
80
  rbffi_LastError_Init(moduleFFI);
81
81
  rbffi_Call_Init(moduleFFI);
82
- rbffi_ClosurePool_Init(moduleFFI);
82
+ rbffi_Closure_Init(moduleFFI);
83
83
  rbffi_MethodHandle_Init(moduleFFI);
84
84
  rbffi_Platform_Init(moduleFFI);
85
85
  rbffi_AbstractMemory_Init(moduleFFI);
@@ -0,0 +1,48 @@
1
+ shallow_clone: true
2
+
3
+ # We're currently only testing 64-bit libffi built with Microsoft's
4
+ # tools.
5
+ # This matrix should be expanded to include at least:
6
+ # 32- and 64-bit gcc/cygwin
7
+ # 32- and 64-bit gcc/mingw
8
+ # 32- and 64-bit clang/mingw
9
+ # and perhaps more.
10
+
11
+ image: Visual Studio 2013
12
+ platform:
13
+ - x64
14
+
15
+ environment:
16
+ global:
17
+ CYG_ROOT: C:/cygwin
18
+ CYG_CACHE: C:/cygwin/var/cache/setup
19
+ CYG_MIRROR: http://mirrors.kernel.org/sourceware/cygwin/
20
+ matrix:
21
+ - VSVER: 12
22
+
23
+ install:
24
+ - ps: >-
25
+ If ($env:Platform -Match "x86") {
26
+ $env:VCVARS_PLATFORM="x86"
27
+ $env:BUILD="x86-pc-cygwin"
28
+ $env:HOST="x86-pc-windows"
29
+ } Else {
30
+ $env:VCVARS_PLATFORM="amd64"
31
+ $env:BUILD="x86_64-pc-cygwin"
32
+ $env:HOST="x86_64-pc-winnt"
33
+ }
34
+ - 'appveyor DownloadFile http://cygwin.com/setup-x86.exe -FileName setup.exe'
35
+ - 'setup.exe -qnNdO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_CACHE%" -P dejagnu >NUL'
36
+ - '%CYG_ROOT%/bin/bash -lc "cygcheck -dc cygwin"'
37
+ - ps: $env:VSCOMNTOOLS=(Get-Content ("env:VS" + "$env:VSVER" + "0COMNTOOLS"))
38
+ - echo "Using Visual Studio %VSVER%.0 at %VSCOMNTOOLS%"
39
+ - call "%VSCOMNTOOLS%\..\..\VC\vcvarsall.bat" %VCVARS_PLATFORM%
40
+
41
+ build_script:
42
+ - c:\cygwin\bin\sh -lc "(cd $OLDPWD; ./autogen.sh;)"
43
+ - c:\cygwin\bin\sh -lc "(cd $OLDPWD; ./configure CC='/cygdrive/c/projects/libffi/msvcc.sh -m64' CXX='/cygdrive/c/projects/libffi/msvcc.sh -m64' LD=link CPP='cl -nologo -EP' --build=$BUILD --host=$HOST; cp src/x86/ffitarget.h include; make;)"
44
+
45
+ # FIXME: "make check" currently fails. It just looks like msvcc needs
46
+ # to learn about -L and -l options. If you add "make check; cat `find
47
+ # ./ -name libffi.log" to the end of that build command you'll see
48
+ # what I mean.
@@ -0,0 +1,36 @@
1
+ .libs
2
+ .deps
3
+ *.o
4
+ *.lo
5
+ .dirstamp
6
+ *.la
7
+ Makefile
8
+ Makefile.in
9
+ aclocal.m4
10
+ compile
11
+ configure
12
+ depcomp
13
+ doc/libffi.info
14
+ *~
15
+ fficonfig.h.in
16
+ fficonfig.h
17
+ include/ffi.h
18
+ include/ffitarget.h
19
+ install-sh
20
+ libffi.pc
21
+ libtool
22
+ libtool-ldflags
23
+ ltmain.sh
24
+ m4/libtool.m4
25
+ m4/lt*.m4
26
+ mdate-sh
27
+ missing
28
+ stamp-h1
29
+ libffi*gz
30
+ autom4te.cache
31
+ libffi.xcodeproj/xcuserdata
32
+ libffi.xcodeproj/project.xcworkspace
33
+ build_*/
34
+ darwin_*/
35
+ src/arm/trampoline.S
36
+ **/texinfo.tex
@@ -0,0 +1,14 @@
1
+ #!/bin/bash
2
+
3
+ if [[ $TRAVIS_OS_NAME != 'linux' ]]; then
4
+ brew update
5
+ # fix an issue with libtool on travis by reinstalling it
6
+ brew uninstall libtool;
7
+ brew install libtool dejagnu;
8
+ else
9
+ sudo apt-get update
10
+ sudo apt-get install dejagnu texinfo
11
+ if [ "$HOST" = i386-pc-linux-gnu ] ; then
12
+ sudo apt-get install gcc-multilib g++-multilib;
13
+ fi
14
+ fi
@@ -0,0 +1,30 @@
1
+ ---
2
+ sudo: required
3
+
4
+ language: cpp
5
+
6
+ os:
7
+ - linux
8
+ compiler:
9
+ - gcc
10
+ - clang
11
+ env:
12
+ - CONFIGURE_OPTIONS=--disable-shared
13
+ - CONFIGURE_OPTIONS=
14
+ matrix:
15
+ include:
16
+ - os: linux
17
+ compiler: gcc
18
+ env: HOST=i386-pc-linux-gnu
19
+
20
+ install:
21
+ - ./.travis/install.sh
22
+
23
+ script:
24
+ - ./autogen.sh
25
+ - if test x"$HOST" = x"i386-pc-linux-gnu"; then CC="$CC -m32"; CXX="$CXX -m32"; fi
26
+ - ./configure ${HOST+--host=$HOST} ${CONFIGURE_OPTIONS}
27
+ - make
28
+ - make dist
29
+ - make check
30
+ - cat */testsuite/libffi.log
@@ -574,8 +574,8 @@
574
574
  * Makefile.am, include/Makefile.am: Move headers to
575
575
  libffi_la_SOURCES for new automake.
576
576
  * Makefile.in, include/Makefile.in: Rebuilt.
577
-
578
- * testsuite/lib/wrapper.exp: Copied from gcc tree to allow for
577
+
578
+ * testsuite/lib/wrapper.exp: Copied from gcc tree to allow for
579
579
  execution outside of gcc tree.
580
580
  * testsuite/lib/target-libpath.exp: Ditto.
581
581