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
@@ -1,286 +0,0 @@
1
- #
2
- # This file is part of ruby-ffi.
3
- # For licensing, see LICENSE.SPECS
4
- #
5
-
6
- require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
7
-
8
- describe "Library" do
9
- describe ".enum_value" do
10
- m = Module.new do
11
- extend FFI::Library
12
- enum :something, [:one, :two]
13
- end
14
-
15
- it "should return a value for a valid key" do
16
- expect(m.enum_value(:one)).to eq(0)
17
- expect(m.enum_value(:two)).to eq(1)
18
- end
19
-
20
- it "should return nil for an invalid key" do
21
- expect(m.enum_value(:three)).to be nil
22
- end
23
- end
24
-
25
- describe "#ffi_convention" do
26
- it "defaults to :default" do
27
- m = Module.new do
28
- extend FFI::Library
29
- end
30
- expect(m.ffi_convention).to eq(:default)
31
- end
32
-
33
- it "should be settable" do
34
- m = Module.new do
35
- extend FFI::Library
36
- end
37
-
38
- expect(m.ffi_convention).to eq(:default)
39
- m.ffi_convention :stdcall
40
- expect(m.ffi_convention).to eq(:stdcall)
41
- end
42
- end
43
-
44
- if FFI::Platform::OS =~ /windows|cygwin/ && FFI::Platform::ARCH == 'i386'
45
- module LibTestStdcall
46
- extend FFI::Library
47
- ffi_lib TestLibrary::PATH
48
- ffi_convention :stdcall
49
-
50
- class StructUCDP < FFI::Struct
51
- layout :a1, :uchar,
52
- :a2, :double,
53
- :a3, :pointer
54
- end
55
-
56
- attach_function :testStdcallManyParams, [ :pointer, :int8, :int16, :int32, :int64,
57
- StructUCDP.by_value, StructUCDP.by_ref, :float, :double ], :void
58
- end
59
-
60
- it "adds stdcall decoration: testStdcallManyParams@64" do
61
- s = LibTestStdcall::StructUCDP.new
62
- po = FFI::MemoryPointer.new :long
63
- LibTestStdcall.testStdcallManyParams po, 1, 2, 3, 4, s, s, 1.0, 2.0
64
- end
65
- end
66
-
67
- describe "ffi_lib" do
68
- it "empty name list should raise error" do
69
- expect {
70
- Module.new do |m|
71
- m.extend FFI::Library
72
- ffi_lib
73
- end
74
- }.to raise_error(LoadError)
75
- end
76
-
77
- end
78
-
79
- unless RbConfig::CONFIG['target_os'] =~ /mswin|mingw/
80
- it "attach_function with no library specified" do
81
- expect {
82
- Module.new do |m|
83
- m.extend FFI::Library
84
- attach_function :getpid, [ ], :uint
85
- end
86
- }.to raise_error
87
- end
88
-
89
- it "attach_function :getpid from this process" do
90
- expect {
91
- expect(Module.new do |m|
92
- m.extend FFI::Library
93
- ffi_lib FFI::Library::CURRENT_PROCESS
94
- attach_function :getpid, [ ], :uint
95
- end.getpid).to eq(Process.pid)
96
- }.not_to raise_error
97
- end
98
-
99
- it "loads library using symbol" do
100
- expect {
101
- expect(Module.new do |m|
102
- m.extend FFI::Library
103
- ffi_lib :c
104
- attach_function :getpid, [ ], :uint
105
- end.getpid).to eq(Process.pid)
106
- }.not_to raise_error
107
- end
108
-
109
- it "attach_function :getpid from [ 'c', 'libc.so.6'] " do
110
- expect {
111
- expect(Module.new do |m|
112
- m.extend FFI::Library
113
- ffi_lib [ 'c', 'libc.so.6' ]
114
- attach_function :getpid, [ ], :uint
115
- end.getpid).to eq(Process.pid)
116
- }.not_to raise_error
117
- end
118
-
119
- it "attach_function :getpid from [ 'libc.so.6', 'c' ] " do
120
- expect {
121
- expect(Module.new do |m|
122
- m.extend FFI::Library
123
- ffi_lib [ 'libc.so.6', 'c' ]
124
- attach_function :getpid, [ ], :uint
125
- end.getpid).to eq(Process.pid)
126
- }.not_to raise_error
127
- end
128
-
129
- it "attach_function :getpid from [ 'libfubar.so.0xdeadbeef', nil, 'c' ] " do
130
- expect {
131
- expect(Module.new do |m|
132
- m.extend FFI::Library
133
- ffi_lib [ 'libfubar.so.0xdeadbeef', nil, 'c' ]
134
- attach_function :getpid, [ ], :uint
135
- end.getpid).to eq(Process.pid)
136
- }.not_to raise_error
137
- end
138
-
139
- it "attach_function :getpid from [ 'libfubar.so.0xdeadbeef' ] " do
140
- expect {
141
- expect(Module.new do |m|
142
- m.extend FFI::Library
143
- ffi_lib 'libfubar.so.0xdeadbeef'
144
- attach_function :getpid, [ ], :uint
145
- end.getpid).to eq(Process.pid)
146
- }.to raise_error(LoadError)
147
- end
148
-
149
- it "attach_function :bool_return_true from [ File.expand_path(#{TestLibrary::PATH.inspect}) ]" do
150
- mod = Module.new do |m|
151
- m.extend FFI::Library
152
- ffi_lib File.expand_path(TestLibrary::PATH)
153
- attach_function :bool_return_true, [ ], :bool
154
- end
155
- expect(mod.bool_return_true).to be true
156
- end
157
- end
158
-
159
- def gvar_lib(name, type)
160
- Module.new do |m|
161
- m.extend FFI::Library
162
- ffi_lib TestLibrary::PATH
163
- attach_variable :gvar, "gvar_#{name}", type
164
- attach_function :get, "gvar_#{name}_get", [], type
165
- attach_function :set, "gvar_#{name}_set", [ type ], :void
166
- end
167
- end
168
-
169
- def gvar_test(name, type, val)
170
- lib = gvar_lib(name, type)
171
- lib.set(val)
172
- expect(lib.gvar).to eq(val)
173
- lib.set(0)
174
- lib.gvar = val
175
- expect(lib.get).to eq(val)
176
- end
177
-
178
- [ 0, 127, -128, -1 ].each do |i|
179
- it ":char variable" do
180
- gvar_test("s8", :char, i)
181
- end
182
- end
183
-
184
- [ 0, 0x7f, 0x80, 0xff ].each do |i|
185
- it ":uchar variable" do
186
- gvar_test("u8", :uchar, i)
187
- end
188
- end
189
-
190
- [ 0, 0x7fff, -0x8000, -1 ].each do |i|
191
- it ":short variable" do
192
- gvar_test("s16", :short, i)
193
- end
194
- end
195
-
196
- [ 0, 0x7fff, 0x8000, 0xffff ].each do |i|
197
- it ":ushort variable" do
198
- gvar_test("u16", :ushort, i)
199
- end
200
- end
201
-
202
- [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
203
- it ":int variable" do
204
- gvar_test("s32", :int, i)
205
- end
206
- end
207
-
208
- [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
209
- it ":uint variable" do
210
- gvar_test("u32", :uint, i)
211
- end
212
- end
213
-
214
- [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
215
- it ":long_long variable" do
216
- gvar_test("s64", :long_long, i)
217
- end
218
- end
219
-
220
- [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
221
- it ":ulong_long variable" do
222
- gvar_test("u64", :ulong_long, i)
223
- end
224
- end
225
-
226
- if FFI::Platform::LONG_SIZE == 32
227
- [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
228
- it ":long variable" do
229
- gvar_test("long", :long, i)
230
- end
231
- end
232
-
233
- [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
234
- it ":ulong variable" do
235
- gvar_test("ulong", :ulong, i)
236
- end
237
- end
238
- else
239
- [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
240
- it ":long variable" do
241
- gvar_test("long", :long, i)
242
- end
243
- end
244
-
245
- [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
246
- it ":ulong variable" do
247
- gvar_test("ulong", :ulong, i)
248
- end
249
- end
250
- end
251
-
252
- it "Pointer variable" do
253
- lib = gvar_lib("pointer", :pointer)
254
- val = FFI::MemoryPointer.new :long
255
- lib.set(val)
256
- expect(lib.gvar).to eq(val)
257
- lib.set(nil)
258
- lib.gvar = val
259
- expect(lib.get).to eq(val)
260
- end
261
-
262
- [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
263
- it "structure" do
264
- class GlobalStruct < FFI::Struct
265
- layout :data, :long
266
- end
267
-
268
- lib = Module.new do |m|
269
- m.extend FFI::Library
270
- ffi_lib TestLibrary::PATH
271
- attach_variable :gvar, "gvar_gstruct", GlobalStruct
272
- attach_function :get, "gvar_gstruct_get", [], GlobalStruct
273
- attach_function :set, "gvar_gstruct_set", [ GlobalStruct ], :void
274
- end
275
-
276
- val = GlobalStruct.new
277
- val[:data] = i
278
- lib.set(val)
279
- expect(lib.gvar[:data]).to eq(i)
280
- val[:data] = 0
281
- lib.gvar[:data] = i
282
- val = GlobalStruct.new(lib.get)
283
- expect(val[:data]).to eq(i)
284
- end
285
- end
286
- end
@@ -1,30 +0,0 @@
1
- #
2
- # This file is part of ruby-ffi.
3
- # For licensing, see LICENSE.SPECS
4
- #
5
-
6
- require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
7
- require 'bigdecimal'
8
-
9
- describe ":long_double arguments and return values" do
10
- module LibTest
11
- extend FFI::Library
12
- ffi_lib TestLibrary::PATH
13
- attach_function :add_f128, [ :long_double, :long_double ], :long_double
14
- attach_function :ret_f128, [ :long_double ], :long_double
15
- end
16
-
17
- it "returns first parameter" do
18
- expect(LibTest.ret_f128(0.1)).to be_within(0.01).of(0.1)
19
- end
20
-
21
- it "returns first parameter with high precision" do
22
- ld = BigDecimal.new("1.234567890123456789")
23
- tolerance = BigDecimal.new("0.0000000000000000001")
24
- expect(LibTest.ret_f128(ld)).to be_within(tolerance).of(ld)
25
- end
26
-
27
- it "add two long double numbers" do
28
- expect(LibTest.add_f128(0.1, 0.2)).to be_within(0.01).of(0.3)
29
- end
30
- end
@@ -1,68 +0,0 @@
1
- #
2
- # This file is part of ruby-ffi.
3
- # For licensing, see LICENSE.SPECS
4
- #
5
-
6
- require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
7
-
8
- describe "Managed Struct" do
9
- include FFI
10
- module ManagedStructTestLib
11
- extend FFI::Library
12
- ffi_lib TestLibrary::PATH
13
- attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer
14
- end
15
-
16
- it "should raise an error if release() is not defined" do
17
- class NoRelease < FFI::ManagedStruct ; layout :i, :int; end
18
- expect { NoRelease.new(ManagedStructTestLib.ptr_from_address(0x12345678)) }.to raise_error(NoMethodError)
19
- end
20
-
21
- it "should be the right class" do
22
- class WhatClassAmI < FFI::ManagedStruct
23
- layout :i, :int
24
- def self.release
25
- end
26
- end
27
-
28
- expect(WhatClassAmI.new(ManagedStructTestLib.ptr_from_address(0x12345678)).class).to eq(WhatClassAmI)
29
- end
30
-
31
- it "should build with self reference" do
32
- class ClassWithSelfRef < FFI::ManagedStruct
33
- layout :data, self.ptr
34
- def self.release
35
- end
36
- end
37
-
38
- expect(ClassWithSelfRef.new(ManagedStructTestLib.ptr_from_address(0x12345678)).class).to eq(ClassWithSelfRef)
39
- end
40
-
41
- # see #427
42
- it "should release memory properly", :broken => true do
43
- class PleaseReleaseMe < FFI::ManagedStruct
44
- layout :i, :int
45
- @@count = 0
46
- def self.release
47
- @@count += 1
48
- end
49
- def self.wait_gc(count)
50
- loop = 5
51
- while loop > 0 && @@count < count
52
- loop -= 1
53
- TestLibrary.force_gc
54
- sleep 0.05 if @@count < count
55
- end
56
- end
57
- end
58
-
59
- loop_count = 30
60
- wiggle_room = 5
61
-
62
- expect(PleaseReleaseMe).to receive(:release).at_least(loop_count-wiggle_room).times
63
- loop_count.times do
64
- PleaseReleaseMe.new(ManagedStructTestLib.ptr_from_address(0x12345678))
65
- end
66
- PleaseReleaseMe.wait_gc loop_count
67
- end
68
- end
@@ -1,78 +0,0 @@
1
- #
2
- # This file is part of ruby-ffi.
3
- # For licensing, see LICENSE.SPECS
4
- #
5
-
6
- require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
7
-
8
- MemoryPointer = FFI::MemoryPointer
9
-
10
- describe "MemoryPointer#total" do
11
- it "MemoryPointer.new(:char, 1).total == 1" do
12
- expect(MemoryPointer.new(:char, 1).total).to eq 1
13
- end
14
-
15
- it "MemoryPointer.new(:short, 1).total == 2" do
16
- expect(MemoryPointer.new(:short, 1).total).to eq 2
17
- end
18
-
19
- it "MemoryPointer.new(:int, 1).total == 4" do
20
- expect(MemoryPointer.new(:int, 1).total).to eq 4
21
- end
22
-
23
- it "MemoryPointer.new(:long_long, 1).total == 8" do
24
- expect(MemoryPointer.new(:long_long, 1).total).to eq 8
25
- end
26
-
27
- it "MemoryPointer.new(1024).total == 1024" do
28
- expect(MemoryPointer.new(1024).total).to eq 1024
29
- end
30
- end
31
- describe "MemoryPointer#read_array_of_long" do
32
- it "foo" do
33
- ptr = MemoryPointer.new(:long, 1024)
34
- ptr[0].write_long 1234
35
- ptr[1].write_long 5678
36
- l = ptr.read_array_of_long(2)
37
- expect(l[0]).to eq 1234
38
- expect(l[1]).to eq 5678
39
- end
40
- end
41
- describe "MemoryPointer argument" do
42
- module Ptr
43
- extend FFI::Library
44
- ffi_lib FFI::Platform::LIBC
45
- attach_function :memset, [ :pointer, :int, :ulong ], :pointer
46
- attach_function :memcpy, [ :pointer, :pointer, :ulong ], :pointer
47
- end
48
-
49
- it "Pointer passed correctly" do
50
- p = MemoryPointer.new :int, 1
51
- ret = Ptr.memset(p, 0, p.total)
52
- expect(ret).to eq p
53
- end
54
-
55
- it "Data passed to native function" do
56
- p = MemoryPointer.new :int, 1
57
- p2 = MemoryPointer.new :int, 1
58
- p2.put_int(0, 0x5eadbeef)
59
- Ptr.memcpy(p, p2, p.total)
60
- expect(p.get_int(0)).to eq p2.get_int(0)
61
- expect(p2.get_int(0)).not_to eql 0
62
- end
63
- end
64
- describe "MemoryPointer return value" do
65
- module Stdio
66
- extend FFI::Library
67
- ffi_lib FFI::Platform::LIBC
68
- attach_function :fopen, [ :string, :string ], :pointer
69
- attach_function :fclose, [ :pointer ], :int
70
- attach_function :fwrite, [ :pointer, :ulong, :ulong, :string ], :ulong
71
- end
72
-
73
- it "fopen returns non-nil" do
74
- fp = Stdio.fopen("/dev/null", "w")
75
- expect(fp).to_not be_nil
76
- expect(Stdio.fclose(fp)).to eq 0 unless fp.nil? or fp.null?
77
- end
78
- end
@@ -1,247 +0,0 @@
1
- #
2
- # This file is part of ruby-ffi.
3
- # For licensing, see LICENSE.SPECS
4
- #
5
-
6
- require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
7
-
8
- describe "Function with primitive integer arguments" do
9
- module LibTest
10
- extend FFI::Library
11
- ffi_lib TestLibrary::PATH
12
- attach_function :ret_s8, [ :char ], :char
13
- attach_function :ret_u8, [ :uchar ], :uchar
14
- attach_function :ret_s16, [ :short ], :short
15
- attach_function :ret_u16, [ :ushort ], :ushort
16
- attach_function :ret_s32, [ :int ], :int
17
- attach_function :ret_u32, [ :uint ], :uint
18
- attach_function :ret_s64, [ :long_long ], :long_long
19
- attach_function :ret_u64, [ :ulong_long ], :ulong_long
20
- attach_function :ret_long, [ :long ], :long
21
- attach_function :ret_ulong, [ :ulong ], :ulong
22
- attach_function :set_s8, [ :char ], :void
23
- attach_function :get_s8, [ ], :char
24
- attach_function :set_float, [ :float ], :void
25
- attach_function :get_float, [ ], :float
26
- attach_function :set_double, [ :double ], :void
27
- attach_function :get_double, [ ], :double
28
- end
29
-
30
- it "int8.size" do
31
- expect(FFI::TYPE_INT8.size).to eq(1)
32
- end
33
-
34
- it "uint8.size" do
35
- expect(FFI::TYPE_UINT8.size).to eq(1)
36
- end
37
-
38
- it "int16.size" do
39
- expect(FFI::TYPE_INT16.size).to eq(2)
40
- end
41
-
42
- it "uint16.size" do
43
- expect(FFI::TYPE_UINT16.size).to eq(2)
44
- end
45
-
46
- it "int32.size" do
47
- expect(FFI::TYPE_INT32.size).to eq(4)
48
- end
49
-
50
- it "uint32.size" do
51
- expect(FFI::TYPE_UINT32.size).to eq(4)
52
- end
53
-
54
- it "int64.size" do
55
- expect(FFI::TYPE_INT64.size).to eq(8)
56
- end
57
-
58
- it "uint64.size" do
59
- expect(FFI::TYPE_UINT64.size).to eq(8)
60
- end
61
-
62
- it "float.size" do
63
- expect(FFI::TYPE_FLOAT32.size).to eq(4)
64
- end
65
-
66
- it "double.size" do
67
- expect(FFI::TYPE_FLOAT64.size).to eq(8)
68
- end
69
- [ 0, 127, -128, -1 ].each do |i|
70
- it ":char call(:char (#{i}))" do
71
- expect(LibTest.ret_s8(i)).to eq(i)
72
- end
73
- end
74
- [ 0, 0x7f, 0x80, 0xff ].each do |i|
75
- it ":uchar call(:uchar (#{i}))" do
76
- expect(LibTest.ret_u8(i)).to eq(i)
77
- end
78
- end
79
- [ 0, 0x7fff, -0x8000, -1 ].each do |i|
80
- it ":short call(:short (#{i}))" do
81
- expect(LibTest.ret_s16(i)).to eq(i)
82
- end
83
- end
84
- [ 0, 0x7fff, 0x8000, 0xffff ].each do |i|
85
- it ":ushort call(:ushort (#{i}))" do
86
- expect(LibTest.ret_u16(i)).to eq(i)
87
- end
88
- end
89
- [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
90
- it ":int call(:int (#{i}))" do
91
- expect(LibTest.ret_s32(i)).to eq(i)
92
- end
93
- end
94
- [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
95
- it ":uint call(:uint (#{i}))" do
96
- expect(LibTest.ret_u32(i)).to eq(i)
97
- end
98
- end
99
- [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
100
- it ":long_long call(:long_long (#{i}))" do
101
- expect(LibTest.ret_s64(i)).to eq(i)
102
- end
103
- end
104
- [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
105
- it ":ulong_long call(:ulong_long (#{i}))" do
106
- expect(LibTest.ret_u64(i)).to eq(i)
107
- end
108
- end
109
- if FFI::Platform::LONG_SIZE == 32
110
- [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
111
- it ":long call(:long (#{i}))" do
112
- expect(LibTest.ret_long(i)).to eq(i)
113
- end
114
- end
115
- [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
116
- it ":ulong call(:ulong (#{i}))" do
117
- expect(LibTest.ret_ulong(i)).to eq(i)
118
- end
119
- end
120
- else
121
- [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
122
- it ":long call(:long (#{i}))" do
123
- expect(LibTest.ret_long(i)).to eq(i)
124
- end
125
- end
126
- [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
127
- it ":ulong call(:ulong (#{i}))" do
128
- expect(LibTest.ret_ulong(i)).to eq(i)
129
- end
130
- end
131
- [ 0.0, 0.1, 1.1, 1.23 ].each do |f|
132
- it ":float call(:double (#{f}))" do
133
- LibTest.set_float(f)
134
- expect((LibTest.get_float - f).abs).to be < 0.001
135
- end
136
- end
137
- [ 0.0, 0.1, 1.1, 1.23 ].each do |f|
138
- it ":double call(:double (#{f}))" do
139
- LibTest.set_double(f)
140
- expect((LibTest.get_double - f).abs).to be < 0.001
141
- end
142
- end
143
- end
144
- end
145
- describe "Integer parameter range checking" do
146
- [ 128, -129 ].each do |i|
147
- it ":char call(:char (#{i}))" do
148
- expect { expect(LibTest.ret_int8_t(i)).to eq(i) }.to raise_error
149
- end
150
- end
151
- [ -1, 256 ].each do |i|
152
- it ":uchar call(:uchar (#{i}))" do
153
- expect { expect(LibTest.ret_u_int8_t(i)).to eq(i) }.to raise_error
154
- end
155
- end
156
- [ 0x8000, -0x8001 ].each do |i|
157
- it ":short call(:short (#{i}))" do
158
- expect { expect(LibTest.ret_int16_t(i)).to eq(i) }.to raise_error
159
- end
160
- end
161
- [ -1, 0x10000 ].each do |i|
162
- it ":ushort call(:ushort (#{i}))" do
163
- expect { expect(LibTest.ret_u_int16_t(i)).to eq(i) }.to raise_error
164
- end
165
- end
166
- [ 0x80000000, -0x80000001 ].each do |i|
167
- it ":int call(:int (#{i}))" do
168
- expect { expect(LibTest.ret_int32_t(i)).to eq(i) }.to raise_error
169
- end
170
- end
171
- [ -1, 0x100000000 ].each do |i|
172
- it ":ushort call(:ushort (#{i}))" do
173
- expect { expect(LibTest.ret_u_int32_t(i)).to eq(i) }.to raise_error
174
- end
175
- end
176
- end
177
- describe "Three different size Integer arguments" do
178
- TYPE_MAP = {
179
- 's8' => :char, 'u8' => :uchar, 's16' => :short, 'u16' => :ushort,
180
- 's32' => :int, 'u32' => :uint, 's64' => :long_long, 'u64' => :ulong_long,
181
- 'sL' => :long, 'uL' => :ulong, 'f32' => :float, 'f64' => :double
182
- }
183
- TYPES = TYPE_MAP.keys
184
- module LibTest
185
- extend FFI::Library
186
- ffi_lib TestLibrary::PATH
187
-
188
-
189
- [ 's32', 'u32', 's64', 'u64' ].each do |rt|
190
- TYPES.each do |t1|
191
- TYPES.each do |t2|
192
- TYPES.each do |t3|
193
- begin
194
- attach_function "pack_#{t1}#{t2}#{t3}_#{rt}",
195
- [ TYPE_MAP[t1], TYPE_MAP[t2], TYPE_MAP[t3], :buffer_out ], :void
196
- rescue FFI::NotFoundError
197
- end
198
- end
199
- end
200
- end
201
- end
202
- end
203
-
204
- PACK_VALUES = {
205
- 's8' => [ 0x12 ],
206
- 'u8' => [ 0x34 ],
207
- 's16' => [ 0x5678 ],
208
- 'u16' => [ 0x9abc ],
209
- 's32' => [ 0x7654321f ],
210
- 'u32' => [ 0xfee1babe ],
211
- 'sL' => [ 0x1f2e3d4c ],
212
- 'uL' => [ 0xf7e8d9ca ],
213
- 's64' => [ 0x1eafdeadbeefa1b2 ],
214
- # 'f32' => [ 1.234567 ],
215
- 'f64' => [ 9.87654321 ]
216
- }
217
-
218
- def verify(p, off, t, v)
219
- if t == 'f32'
220
- expect(p.get_float32(off)).to eq(v)
221
- elsif t == 'f64'
222
- expect(p.get_float64(off)).to eq(v)
223
- else
224
- expect(p.get_int64(off)).to eq(v)
225
- end
226
- end
227
-
228
- PACK_VALUES.keys.each do |t1|
229
- PACK_VALUES.keys.each do |t2|
230
- PACK_VALUES.keys.each do |t3|
231
- PACK_VALUES[t1].each do |v1|
232
- PACK_VALUES[t2].each do |v2|
233
- PACK_VALUES[t3].each do |v3|
234
- it "call(#{TYPE_MAP[t1]} (#{v1}), #{TYPE_MAP[t2]} (#{v2}), #{TYPE_MAP[t3]} (#{v3}))" do
235
- p = FFI::Buffer.new :long_long, 3
236
- LibTest.send("pack_#{t1}#{t2}#{t3}_s64", v1, v2, v3, p)
237
- verify(p, 0, t1, v1)
238
- verify(p, 8, t2, v2)
239
- verify(p, 16, t3, v3)
240
- end
241
- end
242
- end
243
- end
244
- end
245
- end
246
- end
247
- end