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,114 +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 "FFI::Platform::LIBSUFFIX" do
9
- case OS
10
- when "linux"
11
- it "returns 'so'" do
12
- expect(FFI::Platform::LIBSUFFIX).to eq('so')
13
- end
14
- when "windows"
15
- it "returns 'dll'" do
16
- expect(FFI::Platform::LIBSUFFIX).to eq('dll')
17
- end
18
- when "darwin"
19
- it "returns 'dylib'" do
20
- expect(FFI::Platform::LIBSUFFIX).to eq('dylib')
21
- end
22
- end
23
- end
24
-
25
- describe "FFI::Platform::IS_WINDOWS" do
26
- case OS
27
- when "linux"
28
- it "returns false" do
29
- expect(FFI::Platform::IS_WINDOWS).to be false
30
- end
31
- when "windows"
32
- it "returns true" do
33
- expect(FFI::Platform::IS_WINDOWS).to be true
34
- end
35
- when "darwin"
36
- it "returns false" do
37
- expect(FFI::Platform::IS_WINDOWS).to be false
38
- end
39
- end
40
- end
41
-
42
- describe "FFI::Platform::ARCH" do
43
- it "returns the architecture type" do
44
- expect(FFI::Platform::ARCH).to eq(CPU)
45
- end
46
- end
47
-
48
- describe "FFI::Platform::OS" do
49
- case OS
50
- when "linux"
51
- it "returns 'linux' as a string" do
52
- expect(FFI::Platform::OS).to eq('linux')
53
- end
54
- when "windows"
55
- it "returns 'windows' as a string" do
56
- expect(FFI::Platform::OS).to eq('windows')
57
- end
58
- when "darwin"
59
- it "returns 'darwin' as a string" do
60
- expect(FFI::Platform::OS).to eq('darwin')
61
- end
62
- end
63
- end
64
-
65
- describe "FFI::Platform.windows?" do
66
- case OS
67
- when "linux"
68
- it "returns false" do
69
- expect(FFI::Platform.windows?).to be false
70
- end
71
- when "windows"
72
- it "returns true" do
73
- expect(FFI::Platform.windows?).to be true
74
- end
75
- when "darwin"
76
- it "returns false" do
77
- expect(FFI::Platform.windows?).to be false
78
- end
79
- end
80
- end
81
-
82
- describe "FFI::Platform.mac?" do
83
- case OS
84
- when "linux"
85
- it "returns false" do
86
- expect(FFI::Platform.mac?).to be false
87
- end
88
- when "windows"
89
- it "returns false" do
90
- expect(FFI::Platform.mac?).to be false
91
- end
92
- when "darwin"
93
- it "returns true" do
94
- expect(FFI::Platform.mac?).to be true
95
- end
96
- end
97
- end
98
-
99
- describe "FFI::Platform.unix?" do
100
- case OS
101
- when "linux"
102
- it "returns true" do
103
- expect(FFI::Platform.unix?).to be true
104
- end
105
- when "windows"
106
- it "returns false" do
107
- expect(FFI::Platform.unix?).to be false
108
- end
109
- when "darwin"
110
- it "returns true" do
111
- expect(FFI::Platform.unix?).to be true
112
- end
113
- end
114
- end
@@ -1,285 +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 'delegate'
8
-
9
- module PointerTestLib
10
- extend FFI::Library
11
- ffi_lib TestLibrary::PATH
12
- begin
13
- attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int
14
- rescue FFI::NotFoundError
15
- # NetBSD uses #define instead of typedef for these
16
- attach_function :ptr_ret_int32_t, :ptr_ret___int32_t, [ :pointer, :int ], :int
17
- end
18
- attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer
19
- attach_function :ptr_set_pointer, [ :pointer, :int, :pointer ], :void
20
- attach_function :ptr_ret_pointer, [ :pointer, :int ], :pointer
21
- end
22
- describe "Pointer" do
23
- include FFI
24
- class ToPtrTest
25
- def initialize(ptr)
26
- @ptr = ptr
27
- end
28
- def to_ptr
29
- @ptr
30
- end
31
- end
32
-
33
- it "Any object implementing #to_ptr can be passed as a :pointer parameter" do
34
- memory = FFI::MemoryPointer.new :long_long
35
- magic = 0x12345678
36
- memory.put_int32(0, magic)
37
- tp = ToPtrTest.new(memory)
38
- expect(PointerTestLib.ptr_ret_int32_t(tp, 0)).to eq(magic)
39
- end
40
- class PointerDelegate < DelegateClass(FFI::Pointer)
41
- def initialize(ptr)
42
- @ptr = ptr
43
- end
44
- def to_ptr
45
- @ptr
46
- end
47
- end
48
-
49
- it "A DelegateClass(Pointer) can be passed as a :pointer parameter" do
50
- memory = FFI::MemoryPointer.new :long_long
51
- magic = 0x12345678
52
- memory.put_int32(0, magic)
53
- ptr = PointerDelegate.new(memory)
54
- expect(PointerTestLib.ptr_ret_int32_t(ptr, 0)).to eq(magic)
55
- end
56
-
57
- it "Fixnum cannot be used as a Pointer argument" do
58
- expect { PointerTestLib.ptr_ret_int32(0, 0) }.to raise_error
59
- end
60
-
61
- it "Bignum cannot be used as a Pointer argument" do
62
- expect { PointerTestLib.ptr_ret_int32(0xfee1deadbeefcafebabe, 0) }.to raise_error
63
- end
64
-
65
- it "#to_ptr" do
66
- memory = FFI::MemoryPointer.new :pointer
67
- expect(memory.to_ptr).to eq(memory)
68
-
69
- expect(FFI::Pointer::NULL.to_ptr).to eq(FFI::Pointer::NULL)
70
- end
71
-
72
- describe "pointer type methods" do
73
-
74
- it "#read_pointer" do
75
- memory = FFI::MemoryPointer.new :pointer
76
- PointerTestLib.ptr_set_pointer(memory, 0, PointerTestLib.ptr_from_address(0xdeadbeef))
77
- expect(memory.read_pointer.address).to eq(0xdeadbeef)
78
- end
79
-
80
- it "#write_pointer" do
81
- memory = FFI::MemoryPointer.new :pointer
82
- memory.write_pointer(PointerTestLib.ptr_from_address(0xdeadbeef))
83
- expect(PointerTestLib.ptr_ret_pointer(memory, 0).address).to eq(0xdeadbeef)
84
- end
85
-
86
- it "#read_array_of_pointer" do
87
- values = [0x12345678, 0xfeedf00d, 0xdeadbeef]
88
- memory = FFI::MemoryPointer.new :pointer, values.size
89
- values.each_with_index do |address, j|
90
- PointerTestLib.ptr_set_pointer(memory, j * FFI.type_size(:pointer), PointerTestLib.ptr_from_address(address))
91
- end
92
- array = memory.read_array_of_pointer(values.size)
93
- values.each_with_index do |address, j|
94
- expect(array[j].address).to eq(address)
95
- end
96
- end
97
-
98
- end
99
-
100
- describe 'NULL' do
101
- it 'should be obtained using Pointer::NULL constant' do
102
- null_ptr = FFI::Pointer::NULL
103
- expect(null_ptr).to be_null
104
- end
105
- it 'should be obtained passing address 0 to constructor' do
106
- expect(FFI::Pointer.new(0)).to be_null
107
- end
108
- it 'should raise an error when attempting read/write operations on it' do
109
- null_ptr = FFI::Pointer::NULL
110
- expect { null_ptr.read_int }.to raise_error(FFI::NullPointerError)
111
- expect { null_ptr.write_int(0xff1) }.to raise_error(FFI::NullPointerError)
112
- end
113
- it 'returns true when compared with nil' do
114
- expect((FFI::Pointer::NULL == nil)).to be true
115
- end
116
- end
117
-
118
- it "Pointer.size returns sizeof pointer on platform" do
119
- expect(FFI::Pointer.size).to eq((FFI::Platform::ADDRESS_SIZE / 8))
120
- end
121
-
122
- describe "#slice" do
123
- before(:each) do
124
- @mptr = FFI::MemoryPointer.new(:char, 12)
125
- @mptr.put_uint(0, 0x12345678)
126
- @mptr.put_uint(4, 0xdeadbeef)
127
- end
128
-
129
- it "contents of sliced pointer matches original pointer at offset" do
130
- expect(@mptr.slice(4, 4).get_uint(0)).to eq(0xdeadbeef)
131
- end
132
-
133
- it "modifying sliced pointer is reflected in original pointer" do
134
- @mptr.slice(4, 4).put_uint(0, 0xfee1dead)
135
- expect(@mptr.get_uint(4)).to eq(0xfee1dead)
136
- end
137
-
138
- it "access beyond bounds should raise IndexError" do
139
- expect { @mptr.slice(4, 4).get_int(4) }.to raise_error(IndexError)
140
- end
141
- end
142
-
143
- describe "#type_size" do
144
- it "should be same as FFI.type_size(type)" do
145
- expect(FFI::MemoryPointer.new(:int, 1).type_size).to eq(FFI.type_size(:int))
146
- end
147
- end
148
- end
149
-
150
- describe "AutoPointer" do
151
- loop_count = 30
152
- wiggle_room = 5 # GC rarely cleans up all objects. we can get most of them, and that's enough to determine if the basic functionality is working.
153
- magic = 0x12345678
154
-
155
- class AutoPointerTestHelper
156
- @@count = 0
157
- def self.release
158
- @@count += 1 if @@count > 0
159
- end
160
- def self.reset
161
- @@count = 0
162
- end
163
- def self.gc_everything(count)
164
- loop = 5
165
- while @@count < count && loop > 0
166
- loop -= 1
167
- TestLibrary.force_gc
168
- sleep 0.05 unless @@count == count
169
- end
170
- @@count = 0
171
- end
172
- def self.finalizer
173
- self.method(:release).to_proc
174
- end
175
- end
176
- class AutoPointerSubclass < FFI::AutoPointer
177
- def self.release(ptr); end
178
- end
179
-
180
- # see #427
181
- it "cleanup via default release method", :broken => true do
182
- expect(AutoPointerSubclass).to receive(:release).at_least(loop_count-wiggle_room).times
183
- AutoPointerTestHelper.reset
184
- loop_count.times do
185
- # note that if we called
186
- # AutoPointerTestHelper.method(:release).to_proc inline, we'd
187
- # have a reference to the pointer and it would never get GC'd.
188
- AutoPointerSubclass.new(PointerTestLib.ptr_from_address(magic))
189
- end
190
- AutoPointerTestHelper.gc_everything loop_count
191
- end
192
-
193
- # see #427
194
- it "cleanup when passed a proc", :broken => true do
195
- # NOTE: passing a proc is touchy, because it's so easy to create a memory leak.
196
- #
197
- # specifically, if we made an inline call to
198
- #
199
- # AutoPointerTestHelper.method(:release).to_proc
200
- #
201
- # we'd have a reference to the pointer and it would
202
- # never get GC'd.
203
- expect(AutoPointerTestHelper).to receive(:release).at_least(loop_count-wiggle_room).times
204
- AutoPointerTestHelper.reset
205
- loop_count.times do
206
- FFI::AutoPointer.new(PointerTestLib.ptr_from_address(magic),
207
- AutoPointerTestHelper.finalizer)
208
- end
209
- AutoPointerTestHelper.gc_everything loop_count
210
- end
211
-
212
- # see #427
213
- it "cleanup when passed a method", :broken => true do
214
- expect(AutoPointerTestHelper).to receive(:release).at_least(loop_count-wiggle_room).times
215
- AutoPointerTestHelper.reset
216
- loop_count.times do
217
- FFI::AutoPointer.new(PointerTestLib.ptr_from_address(magic),
218
- AutoPointerTestHelper.method(:release))
219
- end
220
- AutoPointerTestHelper.gc_everything loop_count
221
- end
222
-
223
- it "can be used as the return type of a function" do
224
- expect do
225
- Module.new do
226
- extend FFI::Library
227
- ffi_lib TestLibrary::PATH
228
- class CustomAutoPointer < FFI::AutoPointer
229
- def self.release(ptr); end
230
- end
231
- attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], CustomAutoPointer
232
- end
233
- end.not_to raise_error
234
- end
235
-
236
- describe "#new" do
237
- it "MemoryPointer argument raises TypeError" do
238
- expect { FFI::AutoPointer.new(FFI::MemoryPointer.new(:int))}.to raise_error(::TypeError)
239
- end
240
- it "AutoPointer argument raises TypeError" do
241
- expect { AutoPointerSubclass.new(AutoPointerSubclass.new(PointerTestLib.ptr_from_address(0))) }.to raise_error(::TypeError)
242
- end
243
- it "Buffer argument raises TypeError" do
244
- expect { FFI::AutoPointer.new(FFI::Buffer.new(:int))}.to raise_error(::TypeError)
245
- end
246
-
247
- end
248
-
249
- describe "#autorelease?" do
250
- ptr_class = Class.new(FFI::AutoPointer) do
251
- def self.release(ptr); end
252
- end
253
-
254
- it "should be true by default" do
255
- expect(ptr_class.new(FFI::Pointer.new(0xdeadbeef)).autorelease?).to be true
256
- end
257
-
258
- it "should return false when autorelease=(false)" do
259
- ptr = ptr_class.new(FFI::Pointer.new(0xdeadbeef))
260
- ptr.autorelease = false
261
- expect(ptr.autorelease?).to be false
262
- end
263
- end
264
-
265
- describe "#type_size" do
266
- ptr_class = Class.new(FFI::AutoPointer) do
267
- def self.release(ptr); end
268
- end
269
-
270
- it "type_size of AutoPointer should match wrapped Pointer" do
271
- aptr = ptr_class.new(FFI::Pointer.new(:int, 0xdeadbeef))
272
- expect(aptr.type_size).to eq(FFI.type_size(:int))
273
- end
274
-
275
- it "[] offset should match wrapped Pointer" do
276
- mptr = FFI::MemoryPointer.new(:int, 1024)
277
- aptr = ptr_class.new(FFI::Pointer.new(:int, mptr))
278
- aptr[0].write_uint(0xfee1dead)
279
- aptr[1].write_uint(0xcafebabe)
280
- expect(mptr[0].read_uint).to eq(0xfee1dead)
281
- expect(mptr[1].read_uint).to eq(0xcafebabe)
282
- end
283
- end
284
- end
285
-
@@ -1,34 +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
- unless FFI::Platform.windows?
9
- class Timeval < FFI::Struct
10
- layout :tv_sec, :ulong, 0, :tv_usec, :ulong, 4
11
- end
12
-
13
- module LibC
14
- extend FFI::Library
15
- ffi_lib FFI::Library::LIBC
16
-
17
- attach_function :gettimeofday, [:pointer, :pointer], :int
18
- end
19
-
20
- describe FFI::Library, "#attach_function" do
21
- it "correctly returns a value for gettimeofday" do
22
- t = Timeval.new
23
- time = LibC.gettimeofday(t.pointer, nil)
24
- expect(time).to be_kind_of(Integer)
25
- end
26
-
27
- it "correctly populates a struct for gettimeofday" do
28
- t = Timeval.new
29
- LibC.gettimeofday(t.pointer, nil)
30
- expect(t[:tv_sec]).to be_kind_of(Numeric)
31
- expect(t[:tv_usec]).to be_kind_of(Numeric)
32
- end
33
- end
34
- end
@@ -1,194 +0,0 @@
1
- # coding: utf-8
2
- #
3
- # This file is part of ruby-ffi.
4
- # For licensing, see LICENSE.SPECS
5
- #
6
-
7
- require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
8
-
9
- module CTest
10
- extend FFI::Library
11
- ffi_lib FFI::Library::LIBC
12
-
13
- attach_function :strcat, [:pointer, :pointer], :pointer
14
- end
15
-
16
- describe "MemoryPointer" do
17
- it "makes a pointer from a string" do
18
- m = FFI::MemoryPointer.from_string("FFI is Awesome")
19
- expect(m.total).to eq(15)
20
- expect(m.type_size).to eq(1)
21
- end
22
-
23
- it "does not make a pointer from non-strings" do
24
- expect { FFI::MemoryPointer.from_string(nil) }.to raise_error(TypeError)
25
- end
26
-
27
- it "makes a pointer from a string with multibyte characters" do
28
- m = FFI::MemoryPointer.from_string("ぱんだ")
29
- expect(m.total).to eq(10)
30
- expect(m.type_size).to eq(1)
31
- end
32
-
33
- it "reads back a string" do
34
- m = FFI::MemoryPointer.from_string("FFI is Awesome")
35
- expect(m.read_string).to eq("FFI is Awesome")
36
- end
37
-
38
- it "makes a pointer for a certain number of bytes" do
39
- m = FFI::MemoryPointer.new(8)
40
- m.write_array_of_int([1,2])
41
- expect(m.read_array_of_int(2)).to eq([1,2])
42
- end
43
-
44
- it "allows access to an element of the pointer (as an array)" do
45
- m = FFI::MemoryPointer.new(:int, 2)
46
- m.write_array_of_int([1,2])
47
- expect(m[0].read_int).to eq(1)
48
- expect(m[1].read_int).to eq(2)
49
- end
50
-
51
- it "allows writing as an int" do
52
- m = FFI::MemoryPointer.new(:int)
53
- m.write_int(1)
54
- expect(m.read_int).to eq(1)
55
- expect(m.read :int).to eq(1)
56
- expect(m.read FFI::Type::INT).to eq(1)
57
- end
58
-
59
- it "allows writing as a sized int" do
60
- m = FFI::MemoryPointer.new(:uint32)
61
- m.write_uint32(1)
62
- expect(m.read_uint32).to eq(1)
63
- expect(m.read :uint32).to eq(1)
64
- expect(m.read FFI::Type::UINT32).to eq(1)
65
-
66
- m = FFI::MemoryPointer.new(:uint32)
67
- m.write :uint32, 1
68
- expect(m.read :uint32).to eq(1)
69
-
70
- m = FFI::MemoryPointer.new(:int64)
71
- m.write_int64(1)
72
- expect(m.read_int64).to eq(1)
73
- expect(m.read :int64).to eq(1)
74
- expect(m.read FFI::Type::INT64).to eq(1)
75
-
76
- m = FFI::MemoryPointer.new(:int64)
77
- m.write :int64, 1
78
- expect(m.read :int64).to eq(1)
79
- end
80
-
81
- it "allows writing as a long" do
82
- m = FFI::MemoryPointer.new(:long)
83
- m.write_long(10)
84
- expect(m.read_long).to eq(10)
85
- expect(m.read :long).to eq(10)
86
- expect(m.read FFI::Type::LONG).to eq(10)
87
-
88
- m.write :long, 10
89
- expect(m.read :long).to eq(10)
90
- end
91
-
92
- it "allows writing as a size_t" do
93
- m = FFI::MemoryPointer.new(:size_t)
94
- m.write(:size_t, 10)
95
- expect(m.read :size_t).to eq(10)
96
- end
97
-
98
- it "allows writing as a bool" do
99
- m = FFI::MemoryPointer.new(:bool)
100
- m.write(:bool, true)
101
- expect(m.read :bool).to eq(true)
102
- expect(m.read FFI::Type::BOOL).to eq(true)
103
-
104
- m.write(:bool, false)
105
- expect(m.read :bool).to eq(false)
106
- expect(m.read FFI::Type::BOOL).to eq(false)
107
- end
108
-
109
- it "allows writing a custom typedef" do
110
- FFI.typedef :uint, :fubar_t
111
- FFI.typedef :size_t, :fubar2_t
112
-
113
- m = FFI::MemoryPointer.new(:fubar_t)
114
- m.write(:fubar_t, 10)
115
- expect(m.read :fubar_t).to eq(10)
116
-
117
- m = FFI::MemoryPointer.new(:fubar2_t)
118
- m.write(:fubar2_t, 10)
119
- expect(m.read :fubar2_t).to eq(10)
120
- end
121
-
122
- it "raises an error if you try to read an undefined type" do
123
- m = FFI::MemoryPointer.new(:long)
124
- expect { m.read(:undefined_type) }.to raise_error(ArgumentError)
125
- end
126
-
127
- it "raises an error if you try putting a long into a pointer of size 1" do
128
- m = FFI::MemoryPointer.new(1)
129
- expect { m.write_long(10) }.to raise_error
130
- end
131
-
132
- it "raises an error if you try putting an int into a pointer of size 1" do
133
- m = FFI::MemoryPointer.new(1)
134
- expect { m.write_int(10) }.to raise_error
135
- end
136
- # it "does not raise IndexError for opaque pointers" do
137
- # m = FFI::MemoryPointer.new(8)
138
- # p2 = FFI::MemoryPointer.new(1024)
139
- # m.write_long(p2.address)
140
- # p = m.read_pointer
141
- # lambda { p.write_int(10) }.should_not raise_error
142
- # end
143
-
144
- it "makes a pointer for a certain type" do
145
- m = FFI::MemoryPointer.new(:int)
146
- m.write_int(10)
147
- expect(m.read_int).to eq(10)
148
- end
149
-
150
- it "makes a memory pointer for a number of a certain type" do
151
- m = FFI::MemoryPointer.new(:int, 2)
152
- m.write_array_of_int([1,2])
153
- expect(m.read_array_of_int(2)).to eq([1,2])
154
- end
155
-
156
- it "makes a pointer for an object responding to #size" do
157
- m = FFI::MemoryPointer.new(Struct.new(:size).new(8))
158
- m.write_array_of_int([1,2])
159
- expect(m.read_array_of_int(2)).to eq([1,2])
160
- end
161
-
162
- it "makes a pointer for a number of an object responding to #size" do
163
- m = FFI::MemoryPointer.new(Struct.new(:size).new(4), 2)
164
- m.write_array_of_int([1,2])
165
- expect(m.read_array_of_int(2)).to eq([1,2])
166
- end
167
-
168
- it "MemoryPointer#address returns correct value" do
169
- m = FFI::MemoryPointer.new(:long_long)
170
- magic = 0x12345678
171
- m.write_long(magic)
172
- expect(m.read_pointer.address).to eq(magic)
173
- end
174
-
175
- it "MemoryPointer#null? returns true for zero value" do
176
- m = FFI::MemoryPointer.new(:long_long)
177
- m.write_long(0)
178
- expect(m.read_pointer.null?).to be true
179
- end
180
-
181
- it "MemoryPointer#null? returns false for non-zero value" do
182
- m = FFI::MemoryPointer.new(:long_long)
183
- m.write_long(0x12345678)
184
- expect(m.read_pointer.null?).to be false
185
- end
186
-
187
- it "initialize with block should execute block" do
188
- block_executed = false
189
- FFI::MemoryPointer.new(:pointer) do |ptr|
190
- block_executed = true
191
- end
192
- expect(block_executed).to be true
193
- end
194
- end
@@ -1,6 +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"))
@@ -1,18 +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
- class Timeval < FFI::Struct
9
- layout :tv_sec, :ulong, 0, :tv_usec, :ulong, 4
10
- end
11
-
12
- describe FFI::Struct do
13
- it "allows setting fields" do
14
- t = Timeval.new
15
- t[:tv_sec] = 12
16
- expect(t[:tv_sec]).to eq(12)
17
- end
18
- end