ffi 0.5.0-x86-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 (328) hide show
  1. data/LICENSE +51 -0
  2. data/README.rdoc +69 -0
  3. data/Rakefile +191 -0
  4. data/ext/ffi_c/AbstractMemory.c +489 -0
  5. data/ext/ffi_c/AbstractMemory.h +160 -0
  6. data/ext/ffi_c/ArrayType.c +129 -0
  7. data/ext/ffi_c/ArrayType.h +58 -0
  8. data/ext/ffi_c/AutoPointer.c +61 -0
  9. data/ext/ffi_c/AutoPointer.h +18 -0
  10. data/ext/ffi_c/Buffer.c +187 -0
  11. data/ext/ffi_c/Call.c +853 -0
  12. data/ext/ffi_c/Call.h +86 -0
  13. data/ext/ffi_c/ClosurePool.c +302 -0
  14. data/ext/ffi_c/ClosurePool.h +29 -0
  15. data/ext/ffi_c/DynamicLibrary.c +216 -0
  16. data/ext/ffi_c/DynamicLibrary.h +22 -0
  17. data/ext/ffi_c/Function.c +478 -0
  18. data/ext/ffi_c/Function.h +80 -0
  19. data/ext/ffi_c/FunctionInfo.c +221 -0
  20. data/ext/ffi_c/LastError.c +159 -0
  21. data/ext/ffi_c/LastError.h +18 -0
  22. data/ext/ffi_c/MemoryPointer.c +178 -0
  23. data/ext/ffi_c/MemoryPointer.h +20 -0
  24. data/ext/ffi_c/MethodHandle.c +346 -0
  25. data/ext/ffi_c/MethodHandle.h +53 -0
  26. data/ext/ffi_c/Platform.c +59 -0
  27. data/ext/ffi_c/Platform.h +16 -0
  28. data/ext/ffi_c/Pointer.c +224 -0
  29. data/ext/ffi_c/Pointer.h +49 -0
  30. data/ext/ffi_c/Struct.c +770 -0
  31. data/ext/ffi_c/Struct.h +80 -0
  32. data/ext/ffi_c/StructByValue.c +140 -0
  33. data/ext/ffi_c/StructByValue.h +53 -0
  34. data/ext/ffi_c/StructLayout.c +450 -0
  35. data/ext/ffi_c/Type.c +329 -0
  36. data/ext/ffi_c/Type.h +57 -0
  37. data/ext/ffi_c/Types.c +103 -0
  38. data/ext/ffi_c/Types.h +85 -0
  39. data/ext/ffi_c/Variadic.c +260 -0
  40. data/ext/ffi_c/compat.h +72 -0
  41. data/ext/ffi_c/endian.h +40 -0
  42. data/ext/ffi_c/extconf.rb +30 -0
  43. data/ext/ffi_c/ffi.c +82 -0
  44. data/ext/ffi_c/libffi.bsd.mk +34 -0
  45. data/ext/ffi_c/libffi.darwin.mk +75 -0
  46. data/ext/ffi_c/libffi.gnu.mk +29 -0
  47. data/ext/ffi_c/libffi.mk +13 -0
  48. data/ext/ffi_c/libffi/ChangeLog +3243 -0
  49. data/ext/ffi_c/libffi/ChangeLog.libffi +347 -0
  50. data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
  51. data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
  52. data/ext/ffi_c/libffi/LICENSE +21 -0
  53. data/ext/ffi_c/libffi/Makefile.am +177 -0
  54. data/ext/ffi_c/libffi/Makefile.in +1640 -0
  55. data/ext/ffi_c/libffi/README +328 -0
  56. data/ext/ffi_c/libffi/TODO +1 -0
  57. data/ext/ffi_c/libffi/acinclude.m4 +92 -0
  58. data/ext/ffi_c/libffi/aclocal.m4 +7516 -0
  59. data/ext/ffi_c/libffi/compile +142 -0
  60. data/ext/ffi_c/libffi/config.guess +1516 -0
  61. data/ext/ffi_c/libffi/config.sub +1626 -0
  62. data/ext/ffi_c/libffi/configure +24414 -0
  63. data/ext/ffi_c/libffi/configure.ac +365 -0
  64. data/ext/ffi_c/libffi/configure.host +11 -0
  65. data/ext/ffi_c/libffi/depcomp +584 -0
  66. data/ext/ffi_c/libffi/doc/libffi.info +533 -0
  67. data/ext/ffi_c/libffi/doc/libffi.texi +541 -0
  68. data/ext/ffi_c/libffi/doc/stamp-vti +4 -0
  69. data/ext/ffi_c/libffi/doc/version.texi +4 -0
  70. data/ext/ffi_c/libffi/fficonfig.h.in +160 -0
  71. data/ext/ffi_c/libffi/include/Makefile.am +9 -0
  72. data/ext/ffi_c/libffi/include/Makefile.in +422 -0
  73. data/ext/ffi_c/libffi/include/ffi.h.in +393 -0
  74. data/ext/ffi_c/libffi/include/ffi_common.h +98 -0
  75. data/ext/ffi_c/libffi/install-sh +323 -0
  76. data/ext/ffi_c/libffi/libffi.pc.in +10 -0
  77. data/ext/ffi_c/libffi/libtool-version +29 -0
  78. data/ext/ffi_c/libffi/ltcf-c.sh +861 -0
  79. data/ext/ffi_c/libffi/ltcf-cxx.sh +1069 -0
  80. data/ext/ffi_c/libffi/ltcf-gcj.sh +700 -0
  81. data/ext/ffi_c/libffi/ltconfig +2862 -0
  82. data/ext/ffi_c/libffi/ltmain.sh +6930 -0
  83. data/ext/ffi_c/libffi/man/Makefile.am +8 -0
  84. data/ext/ffi_c/libffi/man/Makefile.in +395 -0
  85. data/ext/ffi_c/libffi/man/ffi.3 +31 -0
  86. data/ext/ffi_c/libffi/man/ffi_call.3 +103 -0
  87. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +66 -0
  88. data/ext/ffi_c/libffi/mdate-sh +201 -0
  89. data/ext/ffi_c/libffi/missing +353 -0
  90. data/ext/ffi_c/libffi/mkinstalldirs +158 -0
  91. data/ext/ffi_c/libffi/src/alpha/ffi.c +284 -0
  92. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +48 -0
  93. data/ext/ffi_c/libffi/src/alpha/osf.S +366 -0
  94. data/ext/ffi_c/libffi/src/arm/ffi.c +309 -0
  95. data/ext/ffi_c/libffi/src/arm/ffitarget.h +49 -0
  96. data/ext/ffi_c/libffi/src/arm/sysv.S +299 -0
  97. data/ext/ffi_c/libffi/src/closures.c +596 -0
  98. data/ext/ffi_c/libffi/src/cris/ffi.c +383 -0
  99. data/ext/ffi_c/libffi/src/cris/ffitarget.h +51 -0
  100. data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
  101. data/ext/ffi_c/libffi/src/debug.c +59 -0
  102. data/ext/ffi_c/libffi/src/dlmalloc.c +5099 -0
  103. data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
  104. data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
  105. data/ext/ffi_c/libffi/src/frv/ffitarget.h +61 -0
  106. data/ext/ffi_c/libffi/src/ia64/ffi.c +580 -0
  107. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +50 -0
  108. data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
  109. data/ext/ffi_c/libffi/src/ia64/unix.S +560 -0
  110. data/ext/ffi_c/libffi/src/java_raw_api.c +359 -0
  111. data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
  112. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +48 -0
  113. data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
  114. data/ext/ffi_c/libffi/src/m68k/ffi.c +278 -0
  115. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +49 -0
  116. data/ext/ffi_c/libffi/src/m68k/sysv.S +234 -0
  117. data/ext/ffi_c/libffi/src/mips/ffi.c +926 -0
  118. data/ext/ffi_c/libffi/src/mips/ffitarget.h +202 -0
  119. data/ext/ffi_c/libffi/src/mips/n32.S +534 -0
  120. data/ext/ffi_c/libffi/src/mips/o32.S +381 -0
  121. data/ext/ffi_c/libffi/src/pa/ffi.c +709 -0
  122. data/ext/ffi_c/libffi/src/pa/ffitarget.h +77 -0
  123. data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
  124. data/ext/ffi_c/libffi/src/pa/linux.S +357 -0
  125. data/ext/ffi_c/libffi/src/powerpc/aix.S +225 -0
  126. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +247 -0
  127. data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
  128. data/ext/ffi_c/libffi/src/powerpc/darwin.S +245 -0
  129. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +317 -0
  130. data/ext/ffi_c/libffi/src/powerpc/ffi.c +1429 -0
  131. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +800 -0
  132. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +118 -0
  133. data/ext/ffi_c/libffi/src/powerpc/linux64.S +187 -0
  134. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +236 -0
  135. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +327 -0
  136. data/ext/ffi_c/libffi/src/powerpc/sysv.S +230 -0
  137. data/ext/ffi_c/libffi/src/prep_cif.c +174 -0
  138. data/ext/ffi_c/libffi/src/raw_api.c +254 -0
  139. data/ext/ffi_c/libffi/src/s390/ffi.c +780 -0
  140. data/ext/ffi_c/libffi/src/s390/ffitarget.h +60 -0
  141. data/ext/ffi_c/libffi/src/s390/sysv.S +434 -0
  142. data/ext/ffi_c/libffi/src/sh/ffi.c +716 -0
  143. data/ext/ffi_c/libffi/src/sh/ffitarget.h +49 -0
  144. data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
  145. data/ext/ffi_c/libffi/src/sh64/ffi.c +453 -0
  146. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +53 -0
  147. data/ext/ffi_c/libffi/src/sh64/sysv.S +530 -0
  148. data/ext/ffi_c/libffi/src/sparc/ffi.c +610 -0
  149. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +66 -0
  150. data/ext/ffi_c/libffi/src/sparc/v8.S +272 -0
  151. data/ext/ffi_c/libffi/src/sparc/v9.S +307 -0
  152. data/ext/ffi_c/libffi/src/types.c +77 -0
  153. data/ext/ffi_c/libffi/src/x86/darwin.S +443 -0
  154. data/ext/ffi_c/libffi/src/x86/darwin64.S +416 -0
  155. data/ext/ffi_c/libffi/src/x86/ffi.c +475 -0
  156. data/ext/ffi_c/libffi/src/x86/ffi64.c +572 -0
  157. data/ext/ffi_c/libffi/src/x86/ffitarget.h +90 -0
  158. data/ext/ffi_c/libffi/src/x86/freebsd.S +458 -0
  159. data/ext/ffi_c/libffi/src/x86/sysv.S +437 -0
  160. data/ext/ffi_c/libffi/src/x86/unix64.S +418 -0
  161. data/ext/ffi_c/libffi/src/x86/win32.S +391 -0
  162. data/ext/ffi_c/libffi/testsuite/Makefile.am +71 -0
  163. data/ext/ffi_c/libffi/testsuite/Makefile.in +447 -0
  164. data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
  165. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +289 -0
  166. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +263 -0
  167. data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +36 -0
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +97 -0
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +89 -0
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +89 -0
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +90 -0
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +97 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +99 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +98 -0
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +72 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +102 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +103 -0
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +104 -0
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +110 -0
  181. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +97 -0
  182. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +99 -0
  183. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +101 -0
  184. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +121 -0
  185. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +98 -0
  186. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +103 -0
  187. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +98 -0
  188. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +98 -0
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +106 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +98 -0
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +117 -0
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +106 -0
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +132 -0
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +121 -0
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +107 -0
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +125 -0
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +105 -0
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +96 -0
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +98 -0
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +99 -0
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +101 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +99 -0
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +100 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +101 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +99 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +99 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +99 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +99 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +99 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +100 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +51 -0
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +51 -0
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +82 -0
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +82 -0
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +94 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +99 -0
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +82 -0
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +94 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +52 -0
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +50 -0
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +50 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +50 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +51 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +54 -0
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +51 -0
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +86 -0
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +58 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +57 -0
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +72 -0
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +69 -0
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +63 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +53 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +160 -0
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +169 -0
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +141 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +118 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +119 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +119 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +120 -0
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +139 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +119 -0
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +139 -0
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +139 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +98 -0
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +35 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +42 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +65 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +59 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +63 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +65 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +80 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +67 -0
  274. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +86 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +38 -0
  276. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +123 -0
  277. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
  278. data/ext/ffi_c/libffi/texinfo.tex +7482 -0
  279. data/ext/ffi_c/rbffi.h +26 -0
  280. data/gen/Rakefile +12 -0
  281. data/lib/1.8/ffi_c.so +0 -0
  282. data/lib/1.9/ffi_c.so +0 -0
  283. data/lib/ffi.rb +11 -0
  284. data/lib/ffi/autopointer.rb +61 -0
  285. data/lib/ffi/buffer.rb +0 -0
  286. data/lib/ffi/callback.rb +10 -0
  287. data/lib/ffi/enum.rb +78 -0
  288. data/lib/ffi/errno.rb +8 -0
  289. data/lib/ffi/ffi.rb +99 -0
  290. data/lib/ffi/io.rb +21 -0
  291. data/lib/ffi/library.rb +218 -0
  292. data/lib/ffi/managedstruct.rb +55 -0
  293. data/lib/ffi/memorypointer.rb +73 -0
  294. data/lib/ffi/platform.rb +88 -0
  295. data/lib/ffi/pointer.rb +119 -0
  296. data/lib/ffi/struct.rb +183 -0
  297. data/lib/ffi/tools/const_generator.rb +177 -0
  298. data/lib/ffi/tools/generator.rb +58 -0
  299. data/lib/ffi/tools/generator_task.rb +35 -0
  300. data/lib/ffi/tools/struct_generator.rb +194 -0
  301. data/lib/ffi/tools/types_generator.rb +123 -0
  302. data/lib/ffi/types.rb +153 -0
  303. data/lib/ffi/union.rb +12 -0
  304. data/lib/ffi/variadic.rb +25 -0
  305. data/spec/ffi/bool_spec.rb +24 -0
  306. data/spec/ffi/buffer_spec.rb +202 -0
  307. data/spec/ffi/callback_spec.rb +591 -0
  308. data/spec/ffi/enum_spec.rb +164 -0
  309. data/spec/ffi/errno_spec.rb +13 -0
  310. data/spec/ffi/function_spec.rb +73 -0
  311. data/spec/ffi/library_spec.rb +148 -0
  312. data/spec/ffi/managed_struct_spec.rb +56 -0
  313. data/spec/ffi/number_spec.rb +231 -0
  314. data/spec/ffi/pointer_spec.rb +195 -0
  315. data/spec/ffi/rbx/attach_function_spec.rb +27 -0
  316. data/spec/ffi/rbx/memory_pointer_spec.rb +102 -0
  317. data/spec/ffi/rbx/spec_helper.rb +1 -0
  318. data/spec/ffi/rbx/struct_spec.rb +13 -0
  319. data/spec/ffi/spec_helper.rb +17 -0
  320. data/spec/ffi/string_spec.rb +103 -0
  321. data/spec/ffi/struct_callback_spec.rb +64 -0
  322. data/spec/ffi/struct_initialize_spec.rb +30 -0
  323. data/spec/ffi/struct_spec.rb +529 -0
  324. data/spec/ffi/typedef_spec.rb +48 -0
  325. data/spec/ffi/union_spec.rb +60 -0
  326. data/spec/ffi/variadic_spec.rb +84 -0
  327. data/spec/spec.opts +4 -0
  328. metadata +396 -0
@@ -0,0 +1,231 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+ describe "Function with primitive integer arguments" do
3
+ module LibTest
4
+ extend FFI::Library
5
+ ffi_lib TestLibrary::PATH
6
+ attach_function :ret_s8, [ :char ], :char
7
+ attach_function :ret_u8, [ :uchar ], :uchar
8
+ attach_function :ret_s16, [ :short ], :short
9
+ attach_function :ret_u16, [ :ushort ], :ushort
10
+ attach_function :ret_s32, [ :int ], :int
11
+ attach_function :ret_u32, [ :uint ], :uint
12
+ attach_function :ret_s64, [ :long_long ], :long_long
13
+ attach_function :ret_u64, [ :ulong_long ], :ulong_long
14
+ attach_function :ret_long, [ :long ], :long
15
+ attach_function :ret_ulong, [ :ulong ], :ulong
16
+ attach_function :set_s8, [ :char ], :void
17
+ attach_function :get_s8, [ ], :char
18
+ attach_function :set_float, [ :float ], :void
19
+ attach_function :get_float, [ ], :float
20
+ attach_function :set_double, [ :double ], :void
21
+ attach_function :get_double, [ ], :double
22
+ end
23
+ it "int8.size" do
24
+ FFI::TYPE_INT8.size.should == 1
25
+ end
26
+ it "uint8.size" do
27
+ FFI::TYPE_UINT8.size.should == 1
28
+ end
29
+ it "int16.size" do
30
+ FFI::TYPE_INT16.size.should == 2
31
+ end
32
+ it "uint16.size" do
33
+ FFI::TYPE_UINT16.size.should == 2
34
+ end
35
+ it "int32.size" do
36
+ FFI::TYPE_INT32.size.should == 4
37
+ end
38
+ it "uint32.size" do
39
+ FFI::TYPE_UINT32.size.should == 4
40
+ end
41
+ it "int64.size" do
42
+ FFI::TYPE_INT64.size.should == 8
43
+ end
44
+ it "uint64.size" do
45
+ FFI::TYPE_UINT64.size.should == 8
46
+ end
47
+ it "float.size" do
48
+ FFI::TYPE_FLOAT32.size.should == 4
49
+ end
50
+ it "double.size" do
51
+ FFI::TYPE_FLOAT64.size.should == 8
52
+ end
53
+ [ 0, 127, -128, -1 ].each do |i|
54
+ it ":char call(:char (#{i}))" do
55
+ LibTest.ret_s8(i).should == i
56
+ end
57
+ end
58
+ [ 0, 0x7f, 0x80, 0xff ].each do |i|
59
+ it ":uchar call(:uchar (#{i}))" do
60
+ LibTest.ret_u8(i).should == i
61
+ end
62
+ end
63
+ [ 0, 0x7fff, -0x8000, -1 ].each do |i|
64
+ it ":short call(:short (#{i}))" do
65
+ LibTest.ret_s16(i).should == i
66
+ end
67
+ end
68
+ [ 0, 0x7fff, 0x8000, 0xffff ].each do |i|
69
+ it ":ushort call(:ushort (#{i}))" do
70
+ LibTest.ret_u16(i).should == i
71
+ end
72
+ end
73
+ [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
74
+ it ":int call(:int (#{i}))" do
75
+ LibTest.ret_s32(i).should == i
76
+ end
77
+ end
78
+ [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
79
+ it ":uint call(:uint (#{i}))" do
80
+ LibTest.ret_u32(i).should == i
81
+ end
82
+ end
83
+ [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
84
+ it ":long_long call(:long_long (#{i}))" do
85
+ LibTest.ret_s64(i).should == i
86
+ end
87
+ end
88
+ [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
89
+ it ":ulong_long call(:ulong_long (#{i}))" do
90
+ LibTest.ret_u64(i).should == i
91
+ end
92
+ end
93
+ if FFI::Platform::LONG_SIZE == 32
94
+ [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
95
+ it ":long call(:long (#{i}))" do
96
+ LibTest.ret_long(i).should == i
97
+ end
98
+ end
99
+ [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
100
+ it ":ulong call(:ulong (#{i}))" do
101
+ LibTest.ret_ulong(i).should == i
102
+ end
103
+ end
104
+ else
105
+ [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
106
+ it ":long call(:long (#{i}))" do
107
+ LibTest.ret_long(i).should == i
108
+ end
109
+ end
110
+ [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
111
+ it ":ulong call(:ulong (#{i}))" do
112
+ LibTest.ret_ulong(i).should == i
113
+ end
114
+ end
115
+ [ 0.0, 0.1, 1.1, 1.23 ].each do |f|
116
+ it ":float call(:double (#{f}))" do
117
+ LibTest.set_float(f)
118
+ (LibTest.get_float - f).abs.should < 0.001
119
+ end
120
+ end
121
+ [ 0.0, 0.1, 1.1, 1.23 ].each do |f|
122
+ it ":double call(:double (#{f}))" do
123
+ LibTest.set_double(f)
124
+ (LibTest.get_double - f).abs.should < 0.001
125
+ end
126
+ end
127
+ end
128
+ end
129
+ describe "Integer parameter range checking" do
130
+ [ 128, -129 ].each do |i|
131
+ it ":char call(:char (#{i}))" do
132
+ lambda { LibTest.ret_int8_t(i).should == i }.should raise_error
133
+ end
134
+ end
135
+ [ -1, 256 ].each do |i|
136
+ it ":uchar call(:uchar (#{i}))" do
137
+ lambda { LibTest.ret_u_int8_t(i).should == i }.should raise_error
138
+ end
139
+ end
140
+ [ 0x8000, -0x8001 ].each do |i|
141
+ it ":short call(:short (#{i}))" do
142
+ lambda { LibTest.ret_int16_t(i).should == i }.should raise_error
143
+ end
144
+ end
145
+ [ -1, 0x10000 ].each do |i|
146
+ it ":ushort call(:ushort (#{i}))" do
147
+ lambda { LibTest.ret_u_int16_t(i).should == i }.should raise_error
148
+ end
149
+ end
150
+ [ 0x80000000, -0x80000001 ].each do |i|
151
+ it ":int call(:int (#{i}))" do
152
+ lambda { LibTest.ret_int32_t(i).should == i }.should raise_error
153
+ end
154
+ end
155
+ [ -1, 0x100000000 ].each do |i|
156
+ it ":ushort call(:ushort (#{i}))" do
157
+ lambda { LibTest.ret_u_int32_t(i).should == i }.should raise_error
158
+ end
159
+ end
160
+ end
161
+ describe "Three different size Integer arguments" do
162
+ TYPE_MAP = {
163
+ 's8' => :char, 'u8' => :uchar, 's16' => :short, 'u16' => :ushort,
164
+ 's32' => :int, 'u32' => :uint, 's64' => :long_long, 'u64' => :ulong_long,
165
+ 'sL' => :long, 'uL' => :ulong, 'f32' => :float, 'f64' => :double
166
+ }
167
+ TYPES = TYPE_MAP.keys
168
+ module LibTest
169
+ extend FFI::Library
170
+ ffi_lib TestLibrary::PATH
171
+
172
+
173
+ [ 's32', 'u32', 's64', 'u64' ].each do |rt|
174
+ TYPES.each do |t1|
175
+ TYPES.each do |t2|
176
+ TYPES.each do |t3|
177
+ begin
178
+ attach_function "pack_#{t1}#{t2}#{t3}_#{rt}",
179
+ [ TYPE_MAP[t1], TYPE_MAP[t2], TYPE_MAP[t3], :buffer_out ], :void
180
+ rescue FFI::NotFoundError
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
187
+
188
+ PACK_VALUES = {
189
+ 's8' => [ 0x12 ],
190
+ 'u8' => [ 0x34 ],
191
+ 's16' => [ 0x5678 ],
192
+ 'u16' => [ 0x9abc ],
193
+ 's32' => [ 0x7654321f ],
194
+ 'u32' => [ 0xfee1babe ],
195
+ 'sL' => [ 0x1f2e3d4c ],
196
+ 'uL' => [ 0xf7e8d9ca ],
197
+ 's64' => [ 0x1eafdeadbeefa1b2 ],
198
+ # 'f32' => [ 1.234567 ],
199
+ 'f64' => [ 9.87654321 ]
200
+ }
201
+ module Number
202
+ def self.verify(p, off, t, v)
203
+ if t == 'f32'
204
+ p.get_float32(off).should == v
205
+ elsif t == 'f64'
206
+ p.get_float64(off).should == v
207
+ else
208
+ p.get_int64(off).should == v
209
+ end
210
+ end
211
+ end
212
+ PACK_VALUES.keys.each do |t1|
213
+ PACK_VALUES.keys.each do |t2|
214
+ PACK_VALUES.keys.each do |t3|
215
+ PACK_VALUES[t1].each do |v1|
216
+ PACK_VALUES[t2].each do |v2|
217
+ PACK_VALUES[t3].each do |v3|
218
+ it "call(#{TYPE_MAP[t1]} (#{v1}), #{TYPE_MAP[t2]} (#{v2}), #{TYPE_MAP[t3]} (#{v3}))" do
219
+ p = FFI::Buffer.new :long_long, 3
220
+ LibTest.send("pack_#{t1}#{t2}#{t3}_s64", v1, v2, v3, p)
221
+ Number.verify(p, 0, t1, v1)
222
+ Number.verify(p, 8, t2, v2)
223
+ Number.verify(p, 16, t3, v3)
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end
229
+ end
230
+ end
231
+ end
@@ -0,0 +1,195 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+ require 'delegate'
3
+ require 'java' if RUBY_PLATFORM =~ /java/
4
+
5
+ module LibTest
6
+ attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int
7
+ attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer
8
+ attach_function :ptr_set_pointer, [ :pointer, :int, :pointer ], :void
9
+ attach_function :ptr_ret_pointer, [ :pointer, :int ], :pointer
10
+ end
11
+ describe "Pointer" do
12
+ include FFI
13
+ class ToPtrTest
14
+ def initialize(ptr)
15
+ @ptr = ptr
16
+ end
17
+ def to_ptr
18
+ @ptr
19
+ end
20
+ end
21
+ it "Any object implementing #to_ptr can be passed as a :pointer parameter" do
22
+ memory = FFI::MemoryPointer.new :long_long
23
+ magic = 0x12345678
24
+ memory.put_int32(0, magic)
25
+ tp = ToPtrTest.new(memory)
26
+ LibTest.ptr_ret_int32_t(tp, 0).should == magic
27
+ end
28
+ class PointerDelegate < DelegateClass(FFI::Pointer)
29
+ def initialize(ptr)
30
+ @ptr = ptr
31
+ end
32
+ def to_ptr
33
+ @ptr
34
+ end
35
+ end
36
+ it "A DelegateClass(Pointer) can be passed as a :pointer parameter" do
37
+ memory = FFI::MemoryPointer.new :long_long
38
+ magic = 0x12345678
39
+ memory.put_int32(0, magic)
40
+ ptr = PointerDelegate.new(memory)
41
+ LibTest.ptr_ret_int32_t(ptr, 0).should == magic
42
+ end
43
+ it "Fixnum cannot be used as a Pointer argument" do
44
+ lambda { LibTest.ptr_ret_int32(0, 0) }.should raise_error
45
+ end
46
+ it "Bignum cannot be used as a Pointer argument" do
47
+ lambda { LibTest.ptr_ret_int32(0xfee1deadbeefcafebabe, 0) }.should raise_error
48
+ end
49
+
50
+ describe "pointer type methods" do
51
+
52
+ describe "#read_pointer" do
53
+ memory = FFI::MemoryPointer.new :pointer
54
+ LibTest.ptr_set_pointer(memory, 0, LibTest.ptr_from_address(0xdeadbeef))
55
+ memory.read_pointer.address.should == 0xdeadbeef
56
+ end
57
+
58
+ describe "#write_pointer" do
59
+ memory = FFI::MemoryPointer.new :pointer
60
+ memory.write_pointer(LibTest.ptr_from_address(0xdeadbeef))
61
+ LibTest.ptr_ret_pointer(memory, 0).address.should == 0xdeadbeef
62
+ end
63
+
64
+ describe "#read_array_of_pointer" do
65
+ values = [0x12345678, 0xfeedf00d, 0xdeadbeef]
66
+ memory = FFI::MemoryPointer.new :pointer, values.size
67
+ values.each_with_index do |address, j|
68
+ LibTest.ptr_set_pointer(memory, j * FFI.type_size(:pointer), LibTest.ptr_from_address(address))
69
+ end
70
+ array = memory.read_array_of_pointer(values.size)
71
+ values.each_with_index do |address, j|
72
+ array[j].address.should == address
73
+ end
74
+ end
75
+
76
+ describe "#write_array_of_pointer" do
77
+ values = [0x12345678, 0xfeedf00d, 0xdeadbeef]
78
+ memory = FFI::MemoryPointer.new :pointer, values.size
79
+ memory.write_array_of_pointer(values.map { |address| LibTest.ptr_from_address(address) })
80
+ array = []
81
+ values.each_with_index do |address, j|
82
+ array << LibTest.ptr_ret_pointer(memory, j * FFI.type_size(:pointer))
83
+ end
84
+ values.each_with_index do |address, j|
85
+ array[j].address.should == address
86
+ end
87
+ end
88
+
89
+ end
90
+
91
+ describe 'NULL' do
92
+ it 'should be obtained using Pointer::NULL constant' do
93
+ null_ptr = FFI::Pointer::NULL
94
+ null_ptr.null?.should be_true
95
+ end
96
+ it 'should be obtained passing address 0 to constructor' do
97
+ FFI::Pointer.new(0).null?.should be_true
98
+ end
99
+ it 'should raise an error when attempting read/write operations on it' do
100
+ null_ptr = FFI::Pointer::NULL
101
+ lambda { null_ptr.read_int }.should raise_error(FFI::NullPointerError)
102
+ lambda { null_ptr.write_int(0xff1) }.should raise_error(FFI::NullPointerError)
103
+ end
104
+ end
105
+
106
+ end
107
+
108
+ describe "AutoPointer" do
109
+ loop_count = 30
110
+ wiggle_room = 2 # GC rarely cleans up all objects. we can get most of them, and that's enough to determine if the basic functionality is working.
111
+ magic = 0x12345678
112
+
113
+ class AutoPointerTestHelper
114
+ @@count = 0
115
+ def self.release
116
+ @@count += 1 if @@count > 0
117
+ end
118
+ def self.reset
119
+ @@count = 0
120
+ end
121
+ def self.gc_everything(count)
122
+ loop = 5
123
+ while @@count < count && loop > 0
124
+ loop -= 1
125
+ if RUBY_PLATFORM =~ /java/
126
+ java.lang.System.gc
127
+ else
128
+ GC.start
129
+ end
130
+ sleep 0.05 unless @@count == count
131
+ end
132
+ @@count = 0
133
+ end
134
+ def self.finalizer
135
+ self.method(:release).to_proc
136
+ end
137
+ end
138
+ class AutoPointerSubclass < FFI::AutoPointer
139
+ def self.release(ptr); end
140
+ end
141
+ it "cleanup via default release method" do
142
+ AutoPointerSubclass.should_receive(:release).at_least(loop_count-wiggle_room).times
143
+ AutoPointerTestHelper.reset
144
+ loop_count.times do
145
+ # note that if we called
146
+ # AutoPointerTestHelper.method(:release).to_proc inline, we'd
147
+ # have a reference to the pointer and it would never get GC'd.
148
+ ap = AutoPointerSubclass.new(LibTest.ptr_from_address(magic))
149
+ end
150
+ AutoPointerTestHelper.gc_everything loop_count
151
+ end
152
+
153
+ it "cleanup when passed a proc" do
154
+ # NOTE: passing a proc is touchy, because it's so easy to create a memory leak.
155
+ #
156
+ # specifically, if we made an inline call to
157
+ #
158
+ # AutoPointerTestHelper.method(:release).to_proc
159
+ #
160
+ # we'd have a reference to the pointer and it would
161
+ # never get GC'd.
162
+ AutoPointerTestHelper.should_receive(:release).at_least(loop_count-wiggle_room).times
163
+ AutoPointerTestHelper.reset
164
+ loop_count.times do
165
+ ap = FFI::AutoPointer.new(LibTest.ptr_from_address(magic),
166
+ AutoPointerTestHelper.finalizer)
167
+ end
168
+ AutoPointerTestHelper.gc_everything loop_count
169
+ end
170
+
171
+ it "cleanup when passed a method" do
172
+ AutoPointerTestHelper.should_receive(:release).at_least(loop_count-wiggle_room).times
173
+ AutoPointerTestHelper.reset
174
+ loop_count.times do
175
+ ap = FFI::AutoPointer.new(LibTest.ptr_from_address(magic),
176
+ AutoPointerTestHelper.method(:release))
177
+ end
178
+ AutoPointerTestHelper.gc_everything loop_count
179
+ end
180
+ end
181
+ describe "AutoPointer#new" do
182
+ class AutoPointerSubclass < FFI::AutoPointer
183
+ def self.release(ptr); end
184
+ end
185
+ it "MemoryPointer argument raises TypeError" do
186
+ lambda { FFI::AutoPointer.new(FFI::MemoryPointer.new(:int))}.should raise_error(::TypeError)
187
+ end
188
+ it "AutoPointer argument raises TypeError" do
189
+ lambda { AutoPointerSubclass.new(AutoPointerSubclass.new(LibTest.ptr_from_address(0))) }.should raise_error(::TypeError)
190
+ end
191
+ it "Buffer argument raises TypeError" do
192
+ lambda { FFI::AutoPointer.new(FFI::Buffer.new(:int))}.should raise_error(::TypeError)
193
+ end
194
+
195
+ end
@@ -0,0 +1,27 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+
3
+ class Timeval < FFI::Struct
4
+ layout :tv_sec, :ulong, 0, :tv_usec, :ulong, 4
5
+ end
6
+
7
+ module LibC
8
+ extend FFI::Library
9
+
10
+ attach_function :gettimeofday, [:pointer, :pointer], :int
11
+ end
12
+
13
+ describe FFI::Library, "#attach_function" do
14
+ it "correctly returns a value for gettimeofday" do
15
+ t = Timeval.new
16
+ time = LibC.gettimeofday(t.pointer, nil)
17
+ time.should be_kind_of(Integer)
18
+ end
19
+
20
+ it "correctly populates a struct for gettimeofday" do
21
+ t = Timeval.new
22
+ time = LibC.gettimeofday(t.pointer, nil)
23
+ t[:tv_sec].should be_kind_of(Numeric)
24
+ t[:tv_usec].should be_kind_of(Numeric)
25
+ end
26
+ end
27
+