ffi 1.9.3-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ffi might be problematic. Click here for more details.

Files changed (436) hide show
  1. data/COPYING +49 -0
  2. data/LICENSE +24 -0
  3. data/README.md +109 -0
  4. data/Rakefile +220 -0
  5. data/ext/ffi_c/AbstractMemory.c +1032 -0
  6. data/ext/ffi_c/AbstractMemory.h +175 -0
  7. data/ext/ffi_c/ArrayType.c +162 -0
  8. data/ext/ffi_c/ArrayType.h +59 -0
  9. data/ext/ffi_c/Buffer.c +365 -0
  10. data/ext/ffi_c/Call.c +465 -0
  11. data/ext/ffi_c/Call.h +93 -0
  12. data/ext/ffi_c/ClosurePool.c +283 -0
  13. data/ext/ffi_c/ClosurePool.h +57 -0
  14. data/ext/ffi_c/DataConverter.c +91 -0
  15. data/ext/ffi_c/DynamicLibrary.c +333 -0
  16. data/ext/ffi_c/DynamicLibrary.h +49 -0
  17. data/ext/ffi_c/Function.c +999 -0
  18. data/ext/ffi_c/Function.h +87 -0
  19. data/ext/ffi_c/FunctionInfo.c +271 -0
  20. data/ext/ffi_c/LastError.c +184 -0
  21. data/ext/ffi_c/LastError.h +47 -0
  22. data/ext/ffi_c/LongDouble.c +63 -0
  23. data/ext/ffi_c/LongDouble.h +51 -0
  24. data/ext/ffi_c/MappedType.c +168 -0
  25. data/ext/ffi_c/MappedType.h +59 -0
  26. data/ext/ffi_c/MemoryPointer.c +197 -0
  27. data/ext/ffi_c/MemoryPointer.h +53 -0
  28. data/ext/ffi_c/MethodHandle.c +360 -0
  29. data/ext/ffi_c/MethodHandle.h +55 -0
  30. data/ext/ffi_c/Platform.c +121 -0
  31. data/ext/ffi_c/Platform.h +45 -0
  32. data/ext/ffi_c/Pointer.c +508 -0
  33. data/ext/ffi_c/Pointer.h +63 -0
  34. data/ext/ffi_c/Struct.c +828 -0
  35. data/ext/ffi_c/Struct.h +106 -0
  36. data/ext/ffi_c/StructByReference.c +190 -0
  37. data/ext/ffi_c/StructByReference.h +50 -0
  38. data/ext/ffi_c/StructByValue.c +150 -0
  39. data/ext/ffi_c/StructByValue.h +55 -0
  40. data/ext/ffi_c/StructLayout.c +698 -0
  41. data/ext/ffi_c/Thread.c +352 -0
  42. data/ext/ffi_c/Thread.h +95 -0
  43. data/ext/ffi_c/Type.c +397 -0
  44. data/ext/ffi_c/Type.h +62 -0
  45. data/ext/ffi_c/Types.c +139 -0
  46. data/ext/ffi_c/Types.h +89 -0
  47. data/ext/ffi_c/Variadic.c +276 -0
  48. data/ext/ffi_c/compat.h +83 -0
  49. data/ext/ffi_c/extconf.rb +64 -0
  50. data/ext/ffi_c/ffi.c +98 -0
  51. data/ext/ffi_c/libffi.bsd.mk +34 -0
  52. data/ext/ffi_c/libffi.darwin.mk +95 -0
  53. data/ext/ffi_c/libffi.gnu.mk +31 -0
  54. data/ext/ffi_c/libffi.mk +13 -0
  55. data/ext/ffi_c/libffi.vc.mk +26 -0
  56. data/ext/ffi_c/libffi.vc64.mk +26 -0
  57. data/ext/ffi_c/libffi/ChangeLog +4600 -0
  58. data/ext/ffi_c/libffi/ChangeLog.libffi +584 -0
  59. data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
  60. data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
  61. data/ext/ffi_c/libffi/LICENSE +21 -0
  62. data/ext/ffi_c/libffi/Makefile.am +196 -0
  63. data/ext/ffi_c/libffi/Makefile.in +1820 -0
  64. data/ext/ffi_c/libffi/Makefile.vc +141 -0
  65. data/ext/ffi_c/libffi/Makefile.vc64 +141 -0
  66. data/ext/ffi_c/libffi/README +342 -0
  67. data/ext/ffi_c/libffi/acinclude.m4 +92 -0
  68. data/ext/ffi_c/libffi/aclocal.m4 +1873 -0
  69. data/ext/ffi_c/libffi/build-ios.sh +67 -0
  70. data/ext/ffi_c/libffi/compile +143 -0
  71. data/ext/ffi_c/libffi/config.guess +1501 -0
  72. data/ext/ffi_c/libffi/config.sub +1705 -0
  73. data/ext/ffi_c/libffi/configure +17191 -0
  74. data/ext/ffi_c/libffi/configure.ac +496 -0
  75. data/ext/ffi_c/libffi/configure.host +11 -0
  76. data/ext/ffi_c/libffi/depcomp +630 -0
  77. data/ext/ffi_c/libffi/doc/libffi.info +593 -0
  78. data/ext/ffi_c/libffi/doc/libffi.texi +600 -0
  79. data/ext/ffi_c/libffi/doc/stamp-vti +4 -0
  80. data/ext/ffi_c/libffi/doc/version.texi +4 -0
  81. data/ext/ffi_c/libffi/fficonfig.h.in +199 -0
  82. data/ext/ffi_c/libffi/fficonfig.hw +57 -0
  83. data/ext/ffi_c/libffi/include/Makefile.am +9 -0
  84. data/ext/ffi_c/libffi/include/Makefile.in +487 -0
  85. data/ext/ffi_c/libffi/include/ffi.h.in +427 -0
  86. data/ext/ffi_c/libffi/include/ffi.h.vc +427 -0
  87. data/ext/ffi_c/libffi/include/ffi.h.vc64 +427 -0
  88. data/ext/ffi_c/libffi/include/ffi_common.h +126 -0
  89. data/ext/ffi_c/libffi/install-sh +520 -0
  90. data/ext/ffi_c/libffi/libffi.pc.in +10 -0
  91. data/ext/ffi_c/libffi/libtool-version +29 -0
  92. data/ext/ffi_c/libffi/ltmain.sh +9636 -0
  93. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +176 -0
  94. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +195 -0
  95. data/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 +76 -0
  96. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +63 -0
  97. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +70 -0
  98. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +300 -0
  99. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +215 -0
  100. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +79 -0
  101. data/ext/ffi_c/libffi/m4/libtool.m4 +7831 -0
  102. data/ext/ffi_c/libffi/m4/ltoptions.m4 +369 -0
  103. data/ext/ffi_c/libffi/m4/ltsugar.m4 +123 -0
  104. data/ext/ffi_c/libffi/m4/ltversion.m4 +23 -0
  105. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +98 -0
  106. data/ext/ffi_c/libffi/man/Makefile.am +8 -0
  107. data/ext/ffi_c/libffi/man/Makefile.in +466 -0
  108. data/ext/ffi_c/libffi/man/ffi.3 +31 -0
  109. data/ext/ffi_c/libffi/man/ffi_call.3 +103 -0
  110. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +66 -0
  111. data/ext/ffi_c/libffi/mdate-sh +201 -0
  112. data/ext/ffi_c/libffi/missing +376 -0
  113. data/ext/ffi_c/libffi/msvcc.sh +197 -0
  114. data/ext/ffi_c/libffi/src/alpha/ffi.c +284 -0
  115. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +48 -0
  116. data/ext/ffi_c/libffi/src/alpha/osf.S +387 -0
  117. data/ext/ffi_c/libffi/src/arm/ffi.c +728 -0
  118. data/ext/ffi_c/libffi/src/arm/ffitarget.h +65 -0
  119. data/ext/ffi_c/libffi/src/arm/gentramp.sh +118 -0
  120. data/ext/ffi_c/libffi/src/arm/sysv.S +497 -0
  121. data/ext/ffi_c/libffi/src/arm/trampoline.S +4450 -0
  122. data/ext/ffi_c/libffi/src/avr32/ffi.c +423 -0
  123. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +50 -0
  124. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  125. data/ext/ffi_c/libffi/src/closures.c +615 -0
  126. data/ext/ffi_c/libffi/src/cris/ffi.c +383 -0
  127. data/ext/ffi_c/libffi/src/cris/ffitarget.h +51 -0
  128. data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
  129. data/ext/ffi_c/libffi/src/debug.c +59 -0
  130. data/ext/ffi_c/libffi/src/dlmalloc.c +5161 -0
  131. data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
  132. data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
  133. data/ext/ffi_c/libffi/src/frv/ffitarget.h +57 -0
  134. data/ext/ffi_c/libffi/src/ia64/ffi.c +582 -0
  135. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +50 -0
  136. data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
  137. data/ext/ffi_c/libffi/src/ia64/unix.S +560 -0
  138. data/ext/ffi_c/libffi/src/java_raw_api.c +356 -0
  139. data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
  140. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +48 -0
  141. data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
  142. data/ext/ffi_c/libffi/src/m68k/ffi.c +288 -0
  143. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +49 -0
  144. data/ext/ffi_c/libffi/src/m68k/sysv.S +270 -0
  145. data/ext/ffi_c/libffi/src/mips/ffi.c +1036 -0
  146. data/ext/ffi_c/libffi/src/mips/ffitarget.h +242 -0
  147. data/ext/ffi_c/libffi/src/mips/n32.S +591 -0
  148. data/ext/ffi_c/libffi/src/mips/o32.S +381 -0
  149. data/ext/ffi_c/libffi/src/moxie/eabi.S +128 -0
  150. data/ext/ffi_c/libffi/src/moxie/ffi.c +276 -0
  151. data/ext/ffi_c/libffi/src/pa/ffi.c +719 -0
  152. data/ext/ffi_c/libffi/src/pa/ffitarget.h +78 -0
  153. data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
  154. data/ext/ffi_c/libffi/src/pa/linux.S +357 -0
  155. data/ext/ffi_c/libffi/src/powerpc/aix.S +328 -0
  156. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +445 -0
  157. data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
  158. data/ext/ffi_c/libffi/src/powerpc/darwin.S +383 -0
  159. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +575 -0
  160. data/ext/ffi_c/libffi/src/powerpc/ffi.c +1448 -0
  161. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +1359 -0
  162. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +139 -0
  163. data/ext/ffi_c/libffi/src/powerpc/linux64.S +187 -0
  164. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +236 -0
  165. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +327 -0
  166. data/ext/ffi_c/libffi/src/powerpc/sysv.S +219 -0
  167. data/ext/ffi_c/libffi/src/prep_cif.c +177 -0
  168. data/ext/ffi_c/libffi/src/raw_api.c +254 -0
  169. data/ext/ffi_c/libffi/src/s390/ffi.c +780 -0
  170. data/ext/ffi_c/libffi/src/s390/ffitarget.h +62 -0
  171. data/ext/ffi_c/libffi/src/s390/sysv.S +434 -0
  172. data/ext/ffi_c/libffi/src/sh/ffi.c +716 -0
  173. data/ext/ffi_c/libffi/src/sh/ffitarget.h +49 -0
  174. data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
  175. data/ext/ffi_c/libffi/src/sh64/ffi.c +468 -0
  176. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +53 -0
  177. data/ext/ffi_c/libffi/src/sh64/sysv.S +539 -0
  178. data/ext/ffi_c/libffi/src/sparc/ffi.c +669 -0
  179. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +68 -0
  180. data/ext/ffi_c/libffi/src/sparc/v8.S +313 -0
  181. data/ext/ffi_c/libffi/src/sparc/v9.S +307 -0
  182. data/ext/ffi_c/libffi/src/types.c +77 -0
  183. data/ext/ffi_c/libffi/src/x86/darwin.S +444 -0
  184. data/ext/ffi_c/libffi/src/x86/darwin64.S +416 -0
  185. data/ext/ffi_c/libffi/src/x86/ffi.c +644 -0
  186. data/ext/ffi_c/libffi/src/x86/ffi64.c +635 -0
  187. data/ext/ffi_c/libffi/src/x86/ffitarget.h +121 -0
  188. data/ext/ffi_c/libffi/src/x86/freebsd.S +458 -0
  189. data/ext/ffi_c/libffi/src/x86/sysv.S +468 -0
  190. data/ext/ffi_c/libffi/src/x86/unix64.S +426 -0
  191. data/ext/ffi_c/libffi/src/x86/win32.S +1065 -0
  192. data/ext/ffi_c/libffi/src/x86/win64.S +468 -0
  193. data/ext/ffi_c/libffi/testsuite/Makefile.am +80 -0
  194. data/ext/ffi_c/libffi/testsuite/Makefile.in +500 -0
  195. data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
  196. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +300 -0
  197. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +350 -0
  198. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +263 -0
  199. data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +32 -0
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +89 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +81 -0
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +81 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +82 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +89 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +92 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +90 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +64 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +94 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +95 -0
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +96 -0
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +102 -0
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +89 -0
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +91 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +93 -0
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +113 -0
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +90 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +95 -0
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +90 -0
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +90 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +98 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +90 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +109 -0
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +98 -0
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +124 -0
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +113 -0
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +99 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +117 -0
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +97 -0
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +88 -0
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +90 -0
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +91 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +93 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +91 -0
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +92 -0
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +134 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +117 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +95 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +91 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +91 -0
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +92 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +91 -0
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +91 -0
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +93 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +43 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +60 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +42 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +60 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +74 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +74 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +86 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +91 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +74 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +86 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +140 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +44 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +42 -0
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +42 -0
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +42 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +43 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +47 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +43 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +36 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +26 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +153 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +58 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +58 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +72 -0
  274. data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +342 -0
  276. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +69 -0
  277. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +63 -0
  278. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +53 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +152 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +161 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +133 -0
  282. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +110 -0
  283. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +111 -0
  284. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +111 -0
  285. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +112 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +131 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +111 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +131 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +131 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +90 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  293. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +35 -0
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +43 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +125 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +65 -0
  314. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
  315. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +59 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +63 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +65 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +80 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +67 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +96 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +35 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +124 -0
  326. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
  327. data/ext/ffi_c/libffi/texinfo.tex +7210 -0
  328. data/ext/ffi_c/rbffi.h +57 -0
  329. data/ext/ffi_c/rbffi_endian.h +59 -0
  330. data/ext/ffi_c/win32/stdbool.h +8 -0
  331. data/ext/ffi_c/win32/stdint.h +201 -0
  332. data/ffi.gemspec +22 -0
  333. data/gen/Rakefile +30 -0
  334. data/lib/ffi.rb +28 -0
  335. data/lib/ffi/autopointer.rb +194 -0
  336. data/lib/ffi/buffer.rb +4 -0
  337. data/lib/ffi/callback.rb +4 -0
  338. data/lib/ffi/enum.rb +173 -0
  339. data/lib/ffi/errno.rb +43 -0
  340. data/lib/ffi/ffi.rb +44 -0
  341. data/lib/ffi/io.rb +62 -0
  342. data/lib/ffi/library.rb +499 -0
  343. data/lib/ffi/managedstruct.rb +84 -0
  344. data/lib/ffi/memorypointer.rb +1 -0
  345. data/lib/ffi/platform.rb +148 -0
  346. data/lib/ffi/platform/arm-linux/types.conf +104 -0
  347. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  348. data/lib/ffi/platform/i386-darwin/types.conf +100 -0
  349. data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
  350. data/lib/ffi/platform/i386-gnu/types.conf +107 -0
  351. data/lib/ffi/platform/i386-linux/types.conf +103 -0
  352. data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
  353. data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
  354. data/lib/ffi/platform/i386-solaris/types.conf +122 -0
  355. data/lib/ffi/platform/i386-windows/types.conf +105 -0
  356. data/lib/ffi/platform/ia64-linux/types.conf +104 -0
  357. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  358. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  359. data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
  360. data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
  361. data/lib/ffi/platform/powerpc-linux/types.conf +100 -0
  362. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  363. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  364. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  365. data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
  366. data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
  367. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  368. data/lib/ffi/platform/x86_64-darwin/types.conf +100 -0
  369. data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
  370. data/lib/ffi/platform/x86_64-linux/types.conf +102 -0
  371. data/lib/ffi/platform/x86_64-netbsd/types.conf +126 -0
  372. data/lib/ffi/platform/x86_64-openbsd/types.conf +128 -0
  373. data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
  374. data/lib/ffi/platform/x86_64-windows/types.conf +27 -0
  375. data/lib/ffi/pointer.rb +134 -0
  376. data/lib/ffi/struct.rb +367 -0
  377. data/lib/ffi/struct_layout_builder.rb +222 -0
  378. data/lib/ffi/tools/const_generator.rb +229 -0
  379. data/lib/ffi/tools/generator.rb +60 -0
  380. data/lib/ffi/tools/generator_task.rb +36 -0
  381. data/lib/ffi/tools/struct_generator.rb +194 -0
  382. data/lib/ffi/tools/types_generator.rb +135 -0
  383. data/lib/ffi/types.rb +190 -0
  384. data/lib/ffi/union.rb +43 -0
  385. data/lib/ffi/variadic.rb +78 -0
  386. data/lib/ffi/version.rb +4 -0
  387. data/lib/ffi_c.so +0 -0
  388. data/libtest/Benchmark.c +52 -0
  389. data/libtest/BoolTest.c +34 -0
  390. data/libtest/BufferTest.c +31 -0
  391. data/libtest/ClosureTest.c +190 -0
  392. data/libtest/EnumTest.c +34 -0
  393. data/libtest/FunctionTest.c +58 -0
  394. data/libtest/GNUmakefile +149 -0
  395. data/libtest/GlobalVariable.c +62 -0
  396. data/libtest/LastErrorTest.c +21 -0
  397. data/libtest/NumberTest.c +132 -0
  398. data/libtest/PointerTest.c +63 -0
  399. data/libtest/ReferenceTest.c +23 -0
  400. data/libtest/StringTest.c +34 -0
  401. data/libtest/StructTest.c +243 -0
  402. data/libtest/UnionTest.c +43 -0
  403. data/libtest/VariadicTest.c +62 -0
  404. data/spec/ffi/async_callback_spec.rb +35 -0
  405. data/spec/ffi/bool_spec.rb +29 -0
  406. data/spec/ffi/buffer_spec.rb +251 -0
  407. data/spec/ffi/callback_spec.rb +667 -0
  408. data/spec/ffi/custom_param_type.rb +36 -0
  409. data/spec/ffi/custom_type_spec.rb +74 -0
  410. data/spec/ffi/dup_spec.rb +54 -0
  411. data/spec/ffi/enum_spec.rb +220 -0
  412. data/spec/ffi/errno_spec.rb +18 -0
  413. data/spec/ffi/ffi_spec.rb +29 -0
  414. data/spec/ffi/function_spec.rb +76 -0
  415. data/spec/ffi/library_spec.rb +216 -0
  416. data/spec/ffi/long_double.rb +30 -0
  417. data/spec/ffi/managed_struct_spec.rb +57 -0
  418. data/spec/ffi/number_spec.rb +236 -0
  419. data/spec/ffi/pointer_spec.rb +265 -0
  420. data/spec/ffi/rbx/attach_function_spec.rb +28 -0
  421. data/spec/ffi/rbx/memory_pointer_spec.rb +123 -0
  422. data/spec/ffi/rbx/spec_helper.rb +1 -0
  423. data/spec/ffi/rbx/struct_spec.rb +13 -0
  424. data/spec/ffi/spec_helper.rb +33 -0
  425. data/spec/ffi/string_spec.rb +108 -0
  426. data/spec/ffi/strptr_spec.rb +50 -0
  427. data/spec/ffi/struct_by_ref_spec.rb +43 -0
  428. data/spec/ffi/struct_callback_spec.rb +69 -0
  429. data/spec/ffi/struct_initialize_spec.rb +35 -0
  430. data/spec/ffi/struct_packed_spec.rb +51 -0
  431. data/spec/ffi/struct_spec.rb +748 -0
  432. data/spec/ffi/typedef_spec.rb +78 -0
  433. data/spec/ffi/union_spec.rb +65 -0
  434. data/spec/ffi/variadic_spec.rb +92 -0
  435. data/spec/spec.opts +4 -0
  436. metadata +562 -0
@@ -0,0 +1,36 @@
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 "functions with custom parameter types" do
9
+ before :each do
10
+
11
+ Custom_enum = Class.new do
12
+ extend FFI::DataConverter
13
+ ToNativeMap= { :a => 1, :b => 2 }
14
+ FromNativeMap = { 1 => :a, 2 => :b }
15
+
16
+ def self.native_type
17
+ @native_type_called = true
18
+ FFI::Type::INT32
19
+ end
20
+
21
+ def self.to_native(val, ctx)
22
+ @to_native_called = true
23
+ ToNativeMap[val]
24
+ end
25
+
26
+ def self.from_native(val, ctx)
27
+ @from_native_called = true
28
+ FromNativeMap[val]
29
+ end
30
+ def self.native_type_called?; @native_type_called; end
31
+ def self.from_native_called?; @from_native_called; end
32
+ def self.to_native_called?; @to_native_called; end
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,74 @@
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 "functions with custom types" do
9
+ class Custom_enum
10
+ extend FFI::DataConverter
11
+ ToNativeMap= { :a => 1, :b => 2, :c => 3 }
12
+ FromNativeMap = { 1 => :a, 2 => :b, 3 => :c }
13
+
14
+ def self.native_type
15
+ @native_type_called = true
16
+ FFI::Type::INT32
17
+ end
18
+
19
+ def self.to_native(val, ctx)
20
+ @to_native_called = true
21
+ ToNativeMap[val]
22
+ end
23
+
24
+ def self.from_native(val, ctx)
25
+ @from_native_called = true
26
+ FromNativeMap[val]
27
+ end
28
+ def self.native_type_called?; @native_type_called; end
29
+ def self.from_native_called?; @from_native_called; end
30
+ def self.to_native_called?; @to_native_called; end
31
+ end
32
+
33
+ it "can attach with custom return type" do
34
+ lambda do
35
+ Module.new do
36
+ extend FFI::Library
37
+ ffi_lib TestLibrary::PATH
38
+ attach_function :ret_s32, [ :int ], Custom_enum
39
+ end
40
+ end.should_not raise_error
41
+ end
42
+
43
+ it "should return object of correct type" do
44
+
45
+ m = Module.new do
46
+
47
+ extend FFI::Library
48
+ ffi_lib TestLibrary::PATH
49
+ attach_function :ret_s32, [ :int ], Custom_enum
50
+ end
51
+
52
+ m.ret_s32(1).is_a?(Symbol).should be_true
53
+ end
54
+
55
+ it "from_native should be called for result" do
56
+ m = Module.new do
57
+ extend FFI::Library
58
+ ffi_lib TestLibrary::PATH
59
+ attach_function :ret_s32, [ :int ], Custom_enum
60
+ end
61
+ m.ret_s32(1)
62
+ Custom_enum.from_native_called?.should be_true
63
+ end
64
+
65
+ it "to_native should be called for parameter" do
66
+ m = Module.new do
67
+ extend FFI::Library
68
+ ffi_lib TestLibrary::PATH
69
+ attach_function :ret_s32, [ Custom_enum ], :int
70
+ end
71
+ m.ret_s32(:a)
72
+ Custom_enum.to_native_called?.should be_true
73
+ end
74
+ end
@@ -0,0 +1,54 @@
1
+ #
2
+ # This file is part of ruby-ffi.
3
+ # For licensing, see LICENSE.SPECS
4
+ #
5
+
6
+
7
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
8
+
9
+ describe "Pointer#dup" do
10
+ it "clone should be independent" do
11
+ p1 = FFI::MemoryPointer.new(:char, 1024)
12
+ p1.put_string(0, "test123");
13
+ p2 = p1.dup
14
+ p1.put_string(0, "deadbeef")
15
+
16
+ p2.get_string(0).should == "test123"
17
+ end
18
+
19
+ it "sliced pointer can be cloned" do
20
+ p1 = FFI::MemoryPointer.new(:char, 1024)
21
+ p1.put_string(0, "test123");
22
+ p2 = p1[1].dup
23
+
24
+ # first char will be excised
25
+ p2.get_string(0).should == "est123"
26
+ p1.get_string(0).should == "test123"
27
+ end
28
+
29
+ it "sliced pointer when cloned is independent" do
30
+ p1 = FFI::MemoryPointer.new(:char, 1024)
31
+ p1.put_string(0, "test123");
32
+ p2 = p1[1].dup
33
+
34
+ p1.put_string(0, "deadbeef")
35
+ # first char will be excised
36
+ p2.get_string(0).should == "est123"
37
+ end
38
+ end
39
+
40
+
41
+ describe "Struct#dup" do
42
+ it "clone should be independent" do
43
+ s = Class.new(FFI::Struct) do
44
+ layout :i, :int
45
+ end
46
+ s1 = s.new
47
+ s1[:i] = 0x12345
48
+ s2 = s1.dup
49
+ s1[:i] = 0x98765
50
+ s2[:i].should == 0x12345
51
+ s1[:i].should == 0x98765
52
+ end
53
+
54
+ end
@@ -0,0 +1,220 @@
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
+ module TestEnum0
9
+ extend FFI::Library
10
+ end
11
+
12
+ module TestEnum1
13
+ extend FFI::Library
14
+ ffi_lib TestLibrary::PATH
15
+
16
+ enum [:c1, :c2, :c3, :c4]
17
+ enum [:c5, 42, :c6, :c7, :c8]
18
+ enum [:c9, 42, :c10, :c11, 4242, :c12]
19
+ enum [:c13, 42, :c14, 4242, :c15, 424242, :c16, 42424242]
20
+
21
+ attach_function :test_untagged_enum, [:int], :int
22
+ end
23
+
24
+ module TestEnum3
25
+ extend FFI::Library
26
+ ffi_lib TestLibrary::PATH
27
+
28
+ enum :enum_type1, [:c1, :c2, :c3, :c4]
29
+ enum :enum_type2, [:c5, 42, :c6, :c7, :c8]
30
+ enum :enum_type3, [:c9, 42, :c10, :c11, 4242, :c12]
31
+ enum :enum_type4, [:c13, 42, :c14, 4242, :c15, 424242, :c16, 42424242]
32
+
33
+ attach_function :test_tagged_typedef_enum1, [:enum_type1], :enum_type1
34
+ attach_function :test_tagged_typedef_enum2, [:enum_type2], :enum_type2
35
+ attach_function :test_tagged_typedef_enum3, [:enum_type3], :enum_type3
36
+ attach_function :test_tagged_typedef_enum4, [:enum_type4], :enum_type4
37
+ end
38
+
39
+ describe "A library with no enum defined" do
40
+ it "returns nil when asked for an enum" do
41
+ TestEnum0.enum_type(:foo).should == nil
42
+ end
43
+ end
44
+
45
+ describe "An untagged enum" do
46
+ it "constants can be used as function parameters and return value" do
47
+ TestEnum1.test_untagged_enum(:c1).should == 0
48
+ TestEnum1.test_untagged_enum(:c2).should == 1
49
+ TestEnum1.test_untagged_enum(:c3).should == 2
50
+ TestEnum1.test_untagged_enum(:c4).should == 3
51
+ TestEnum1.test_untagged_enum(:c5).should == 42
52
+ TestEnum1.test_untagged_enum(:c6).should == 43
53
+ TestEnum1.test_untagged_enum(:c7).should == 44
54
+ TestEnum1.test_untagged_enum(:c8).should == 45
55
+ TestEnum1.test_untagged_enum(:c9).should == 42
56
+ TestEnum1.test_untagged_enum(:c10).should == 43
57
+ TestEnum1.test_untagged_enum(:c11).should == 4242
58
+ TestEnum1.test_untagged_enum(:c12).should == 4243
59
+ TestEnum1.test_untagged_enum(:c13).should == 42
60
+ TestEnum1.test_untagged_enum(:c14).should == 4242
61
+ TestEnum1.test_untagged_enum(:c15).should == 424242
62
+ TestEnum1.test_untagged_enum(:c16).should == 42424242
63
+ end
64
+ end
65
+
66
+ describe "A tagged typedef enum" do
67
+ it "is accessible through its tag" do
68
+ TestEnum3.enum_type(:enum_type1).should_not == nil
69
+ TestEnum3.enum_type(:enum_type2).should_not == nil
70
+ TestEnum3.enum_type(:enum_type3).should_not == nil
71
+ TestEnum3.enum_type(:enum_type4).should_not == nil
72
+ end
73
+ it "contains enum constants" do
74
+ TestEnum3.enum_type(:enum_type1).symbols.length.should == 4
75
+ TestEnum3.enum_type(:enum_type2).symbols.length.should == 4
76
+ TestEnum3.enum_type(:enum_type3).symbols.length.should == 4
77
+ TestEnum3.enum_type(:enum_type4).symbols.length.should == 4
78
+ end
79
+ it "constants can be used as function parameters and return value" do
80
+ TestEnum3.test_tagged_typedef_enum1(:c1).should == :c1
81
+ TestEnum3.test_tagged_typedef_enum1(:c2).should == :c2
82
+ TestEnum3.test_tagged_typedef_enum1(:c3).should == :c3
83
+ TestEnum3.test_tagged_typedef_enum1(:c4).should == :c4
84
+ TestEnum3.test_tagged_typedef_enum2(:c5).should == :c5
85
+ TestEnum3.test_tagged_typedef_enum2(:c6).should == :c6
86
+ TestEnum3.test_tagged_typedef_enum2(:c7).should == :c7
87
+ TestEnum3.test_tagged_typedef_enum2(:c8).should == :c8
88
+ TestEnum3.test_tagged_typedef_enum3(:c9).should == :c9
89
+ TestEnum3.test_tagged_typedef_enum3(:c10).should == :c10
90
+ TestEnum3.test_tagged_typedef_enum3(:c11).should == :c11
91
+ TestEnum3.test_tagged_typedef_enum3(:c12).should == :c12
92
+ TestEnum3.test_tagged_typedef_enum4(:c13).should == :c13
93
+ TestEnum3.test_tagged_typedef_enum4(:c14).should == :c14
94
+ TestEnum3.test_tagged_typedef_enum4(:c15).should == :c15
95
+ TestEnum3.test_tagged_typedef_enum4(:c16).should == :c16
96
+ end
97
+
98
+ it "integers can be used instead of constants" do
99
+ TestEnum3.test_tagged_typedef_enum1(0).should == :c1
100
+ TestEnum3.test_tagged_typedef_enum1(1).should == :c2
101
+ TestEnum3.test_tagged_typedef_enum1(2).should == :c3
102
+ TestEnum3.test_tagged_typedef_enum1(3).should == :c4
103
+ TestEnum3.test_tagged_typedef_enum2(42).should == :c5
104
+ TestEnum3.test_tagged_typedef_enum2(43).should == :c6
105
+ TestEnum3.test_tagged_typedef_enum2(44).should == :c7
106
+ TestEnum3.test_tagged_typedef_enum2(45).should == :c8
107
+ TestEnum3.test_tagged_typedef_enum3(42).should == :c9
108
+ TestEnum3.test_tagged_typedef_enum3(43).should == :c10
109
+ TestEnum3.test_tagged_typedef_enum3(4242).should == :c11
110
+ TestEnum3.test_tagged_typedef_enum3(4243).should == :c12
111
+ TestEnum3.test_tagged_typedef_enum4(42).should == :c13
112
+ TestEnum3.test_tagged_typedef_enum4(4242).should == :c14
113
+ TestEnum3.test_tagged_typedef_enum4(424242).should == :c15
114
+ TestEnum3.test_tagged_typedef_enum4(42424242).should == :c16
115
+ end
116
+ end
117
+
118
+ describe "All enums" do
119
+ it "have autonumbered constants when defined with names only" do
120
+ TestEnum1.enum_value(:c1).should == 0
121
+ TestEnum1.enum_value(:c2).should == 1
122
+ TestEnum1.enum_value(:c3).should == 2
123
+ TestEnum1.enum_value(:c4).should == 3
124
+
125
+ TestEnum3.enum_value(:c1).should == 0
126
+ TestEnum3.enum_value(:c2).should == 1
127
+ TestEnum3.enum_value(:c3).should == 2
128
+ TestEnum3.enum_value(:c4).should == 3
129
+ end
130
+ it "can have an explicit first constant and autonumbered subsequent constants" do
131
+ TestEnum1.enum_value(:c5).should == 42
132
+ TestEnum1.enum_value(:c6).should == 43
133
+ TestEnum1.enum_value(:c7).should == 44
134
+ TestEnum1.enum_value(:c8).should == 45
135
+
136
+ TestEnum3.enum_value(:c5).should == 42
137
+ TestEnum3.enum_value(:c6).should == 43
138
+ TestEnum3.enum_value(:c7).should == 44
139
+ TestEnum3.enum_value(:c8).should == 45
140
+ end
141
+ it "can have a mix of explicit and autonumbered constants" do
142
+ TestEnum1.enum_value(:c9).should == 42
143
+ TestEnum1.enum_value(:c10).should == 43
144
+ TestEnum1.enum_value(:c11).should == 4242
145
+ TestEnum1.enum_value(:c12).should == 4243
146
+
147
+ TestEnum3.enum_value(:c9).should == 42
148
+ TestEnum3.enum_value(:c10).should == 43
149
+ TestEnum3.enum_value(:c11).should == 4242
150
+ TestEnum3.enum_value(:c12).should == 4243
151
+ end
152
+ it "can have all its constants explicitely valued" do
153
+ TestEnum1.enum_value(:c13).should == 42
154
+ TestEnum1.enum_value(:c14).should == 4242
155
+ TestEnum1.enum_value(:c15).should == 424242
156
+ TestEnum1.enum_value(:c16).should == 42424242
157
+
158
+ TestEnum3.enum_value(:c13).should == 42
159
+ TestEnum3.enum_value(:c14).should == 4242
160
+ TestEnum3.enum_value(:c15).should == 424242
161
+ TestEnum3.enum_value(:c16).should == 42424242
162
+ end
163
+ it "return the constant corresponding to a specific value" do
164
+ enum = TestEnum3.enum_type(:enum_type1)
165
+ enum[0].should == :c1
166
+ enum[1].should == :c2
167
+ enum[2].should == :c3
168
+ enum[3].should == :c4
169
+
170
+ enum = TestEnum3.enum_type(:enum_type2)
171
+ enum[42].should == :c5
172
+ enum[43].should == :c6
173
+ enum[44].should == :c7
174
+ enum[45].should == :c8
175
+
176
+ enum = TestEnum3.enum_type(:enum_type3)
177
+ enum[42].should == :c9
178
+ enum[43].should == :c10
179
+ enum[4242].should == :c11
180
+ enum[4243].should == :c12
181
+
182
+ enum = TestEnum3.enum_type(:enum_type4)
183
+ enum[42].should == :c13
184
+ enum[4242].should == :c14
185
+ enum[424242].should == :c15
186
+ enum[42424242].should == :c16
187
+ end
188
+ it "return nil for values that don't have a symbol" do
189
+ enum = TestEnum3.enum_type(:enum_type1)
190
+ enum[-1].should == nil
191
+ enum[4].should == nil
192
+
193
+ enum = TestEnum3.enum_type(:enum_type2)
194
+ enum[0].should == nil
195
+ enum[41].should == nil
196
+ enum[46].should == nil
197
+
198
+ enum = TestEnum3.enum_type(:enum_type3)
199
+ enum[0].should == nil
200
+ enum[41].should == nil
201
+ enum[44].should == nil
202
+ enum[4241].should == nil
203
+ enum[4244].should == nil
204
+
205
+ enum = TestEnum3.enum_type(:enum_type4)
206
+ enum[0].should == nil
207
+ enum[41].should == nil
208
+ enum[43].should == nil
209
+ enum[4241].should == nil
210
+ enum[4243].should == nil
211
+ enum[424241].should == nil
212
+ enum[424243].should == nil
213
+ enum[42424241].should == nil
214
+ enum[42424243].should == nil
215
+ end
216
+
217
+ it "duplicate enum keys rejected" do
218
+ lambda { enum [ :a, 0xfee1dead, :b, 0xdeadbeef, :a, 0 ] }.should raise_error
219
+ end
220
+ end
@@ -0,0 +1,18 @@
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
+ describe "FFI.errno" do
8
+ module LibTest
9
+ extend FFI::Library
10
+ ffi_lib TestLibrary::PATH
11
+ attach_function :setLastError, [ :int ], :void
12
+ end
13
+ it "FFI.errno contains errno from last function" do
14
+ LibTest.setLastError(0)
15
+ LibTest.setLastError(0x12345678)
16
+ FFI.errno.should == 0x12345678
17
+ end
18
+ end
@@ -0,0 +1,29 @@
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" do
9
+
10
+ describe ".map_library_name" do
11
+
12
+ let(:prefix) { FFI::Platform::LIBPREFIX }
13
+ let(:suffix) { FFI::Platform::LIBSUFFIX }
14
+
15
+ it "should add platform library extension if not present" do
16
+ FFI.map_library_name("#{prefix}dummy").should == "#{prefix}dummy.#{suffix}"
17
+ end
18
+
19
+ it "should add platform library extension even if lib suffix is present in name" do
20
+ FFI.map_library_name("#{prefix}dummy_with_#{suffix}").should == "#{prefix}dummy_with_#{suffix}.#{suffix}"
21
+ end
22
+
23
+ it "should return Platform::LIBC when called with 'c'" do
24
+ FFI.map_library_name('c').should == FFI::Library::LIBC
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,76 @@
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::Function do
9
+ module LibTest
10
+ extend FFI::Library
11
+ ffi_lib TestLibrary::PATH
12
+ attach_function :testFunctionAdd, [:int, :int, :pointer], :int
13
+ end
14
+ before do
15
+ @libtest = FFI::DynamicLibrary.open(TestLibrary::PATH,
16
+ FFI::DynamicLibrary::RTLD_LAZY | FFI::DynamicLibrary::RTLD_GLOBAL)
17
+ end
18
+ it 'is initialized with a signature and a block' do
19
+ FFI::Function.new(:int, []) { }
20
+ end
21
+ it 'raises an error when passing a wrong signature' do
22
+ lambda { FFI::Function.new([], :int).new { } }.should raise_error TypeError
23
+ end
24
+ it 'returns a native pointer' do
25
+ FFI::Function.new(:int, []) { }.kind_of? FFI::Pointer
26
+ end
27
+ it 'can be used as callback from C passing to it a block' do
28
+ function_add = FFI::Function.new(:int, [:int, :int]) { |a, b| a + b }
29
+ LibTest.testFunctionAdd(10, 10, function_add).should == 20
30
+ end
31
+ it 'can be used as callback from C passing to it a Proc object' do
32
+ function_add = FFI::Function.new(:int, [:int, :int], Proc.new { |a, b| a + b })
33
+ LibTest.testFunctionAdd(10, 10, function_add).should == 20
34
+ end
35
+ it 'can be used to wrap an existing function pointer' do
36
+ FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd')).call(10, 10).should == 20
37
+ end
38
+ it 'can be attached to a module' do
39
+ module Foo; end
40
+ fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd'))
41
+ fp.attach(Foo, 'add')
42
+ Foo.add(10, 10).should == 20
43
+ end
44
+ it 'can be used to extend an object' do
45
+ fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd'))
46
+ foo = Object.new
47
+ class << foo
48
+ def singleton_class
49
+ class << self; self; end
50
+ end
51
+ end
52
+ fp.attach(foo.singleton_class, 'add')
53
+ foo.add(10, 10).should == 20
54
+ end
55
+ it 'can wrap a blocking function' do
56
+ fp = FFI::Function.new(:void, [ :int ], @libtest.find_function('testBlocking'), :blocking => true)
57
+ time = Time.now
58
+ threads = []
59
+ threads << Thread.new { fp.call(2) }
60
+ threads << Thread.new(time) { (Time.now - time).should < 1 }
61
+ threads.each { |t| t.join }
62
+ end
63
+ it 'autorelease flag is set to true by default' do
64
+ fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd'))
65
+ fp.autorelease?.should be_true
66
+ end
67
+ it 'can explicity free itself' do
68
+ fp = FFI::Function.new(:int, []) { }
69
+ fp.free
70
+ lambda { fp.free }.should raise_error RuntimeError
71
+ end
72
+ it 'can\'t explicity free itself if not previously allocated' do
73
+ fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd'))
74
+ lambda { fp.free }.should raise_error RuntimeError
75
+ end
76
+ end