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,123 @@
1
+ require 'tempfile'
2
+
3
+ module FFI
4
+ class TypesGenerator
5
+
6
+ ##
7
+ # Maps different C types to the C type representations we use
8
+
9
+ TYPE_MAP = {
10
+ "char" => :char,
11
+ "signed char" => :char,
12
+ "__signed char" => :char,
13
+ "unsigned char" => :uchar,
14
+
15
+ "short" => :short,
16
+ "signed short" => :short,
17
+ "signed short int" => :short,
18
+ "unsigned short" => :ushort,
19
+ "unsigned short int" => :ushort,
20
+
21
+ "int" => :int,
22
+ "signed int" => :int,
23
+ "unsigned int" => :uint,
24
+
25
+ "long" => :long,
26
+ "long int" => :long,
27
+ "signed long" => :long,
28
+ "signed long int" => :long,
29
+ "unsigned long" => :ulong,
30
+ "unsigned long int" => :ulong,
31
+ "long unsigned int" => :ulong,
32
+
33
+ "long long" => :long_long,
34
+ "long long int" => :long_long,
35
+ "signed long long" => :long_long,
36
+ "signed long long int" => :long_long,
37
+ "unsigned long long" => :ulong_long,
38
+ "unsigned long long int" => :ulong_long,
39
+
40
+ "char *" => :string,
41
+ "void *" => :pointer,
42
+ }
43
+
44
+ def self.generate(options = {})
45
+ typedefs = nil
46
+ Tempfile.open 'ffi_types_generator' do |io|
47
+ io.puts <<-C
48
+ #include <sys/types.h>
49
+ #include <sys/socket.h>
50
+ #include <sys/resource.h>
51
+ C
52
+
53
+ io.close
54
+ typedefs = `gcc -E -x c #{options[:cppflags]} -D_DARWIN_USE_64_BIT_INODE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -c #{io.path}`
55
+ end
56
+
57
+ code = ""
58
+
59
+ typedefs.each_line do |type|
60
+ # We only care about single line typedef
61
+ next unless type =~ /typedef/
62
+ # Ignore unions or structs
63
+ next if type =~ /union|struct/
64
+
65
+ # strip off the starting typedef and ending ;
66
+ type.gsub!(/^(.*typedef\s*)/, "")
67
+ type.gsub!(/\s*;\s*$/, "")
68
+
69
+ parts = type.split(/\s+/)
70
+ def_type = parts.join(" ")
71
+
72
+ # GCC does mapping with __attribute__ stuf, also see
73
+ # http://hal.cs.berkeley.edu/cil/cil016.html section 16.2.7. Problem
74
+ # with this is that the __attribute__ stuff can either occur before or
75
+ # after the new type that is defined...
76
+ if type =~ /__attribute__/
77
+ if parts.last =~ /__QI__|__HI__|__SI__|__DI__|__word__/
78
+
79
+ # In this case, the new type is BEFORE __attribute__ we need to
80
+ # find the final_type as the type before the part that starts with
81
+ # __attribute__
82
+ final_type = ""
83
+ parts.each do |p|
84
+ break if p =~ /__attribute__/
85
+ final_type = p
86
+ end
87
+ else
88
+ final_type = parts.pop
89
+ end
90
+
91
+ def_type = case type
92
+ when /__QI__/ then "char"
93
+ when /__HI__/ then "short"
94
+ when /__SI__/ then "int"
95
+ when /__DI__/ then "long long"
96
+ when /__word__/ then "long"
97
+ else "int"
98
+ end
99
+
100
+ def_type = "unsigned #{def_type}" if type =~ /unsigned/
101
+ else
102
+ final_type = parts.pop
103
+ def_type = parts.join(" ")
104
+ end
105
+
106
+ if type = TYPE_MAP[def_type]
107
+ code << "rbx.platform.typedef.#{final_type} = #{type}\n"
108
+ TYPE_MAP[final_type] = TYPE_MAP[def_type]
109
+ else
110
+ # Fallback to an ordinary pointer if we don't know the type
111
+ if def_type =~ /\*/
112
+ code << "rbx.platform.typedef.#{final_type} = pointer\n"
113
+ TYPE_MAP[final_type] = :pointer
114
+ end
115
+ end
116
+ end
117
+
118
+ code
119
+ end
120
+
121
+ end
122
+ end
123
+
@@ -0,0 +1,153 @@
1
+ module FFI
2
+ # TypeDefs = Hash.new
3
+ def self.add_typedef(current, add)
4
+ if current.kind_of?(FFI::Type)
5
+ code = current
6
+ else
7
+ code = TypeDefs[current]
8
+ raise TypeError, "Unable to resolve type '#{current}'" unless code
9
+ end
10
+
11
+ TypeDefs[add] = code
12
+ end
13
+ def self.find_type(name, type_map = nil)
14
+ type_map = TypeDefs if type_map.nil?
15
+ code = type_map[name]
16
+ code = name if !code && name.kind_of?(FFI::Type)
17
+ raise TypeError, "Unable to resolve type '#{name}'" unless code
18
+ return code
19
+ end
20
+
21
+ # Converts a char
22
+ add_typedef(NativeType::INT8, :char)
23
+
24
+ # Converts an unsigned char
25
+ add_typedef(NativeType::UINT8, :uchar)
26
+
27
+ # Converts an 8 bit int
28
+ add_typedef(NativeType::INT8, :int8)
29
+
30
+ # Converts an unsigned char
31
+ add_typedef(NativeType::UINT8, :uint8)
32
+
33
+ # Converts a short
34
+ add_typedef(NativeType::INT16, :short)
35
+
36
+ # Converts an unsigned short
37
+ add_typedef(NativeType::UINT16, :ushort)
38
+
39
+ # Converts a 16bit int
40
+ add_typedef(NativeType::INT16, :int16)
41
+
42
+ # Converts an unsigned 16 bit int
43
+ add_typedef(NativeType::UINT16, :uint16)
44
+
45
+ # Converts an int
46
+ add_typedef(NativeType::INT32, :int)
47
+
48
+ # Converts an unsigned int
49
+ add_typedef(NativeType::UINT32, :uint)
50
+
51
+ # Converts a 32 bit int
52
+ add_typedef(NativeType::INT32, :int32)
53
+
54
+ # Converts an unsigned 16 bit int
55
+ add_typedef(NativeType::UINT32, :uint32)
56
+
57
+ # Converts a long
58
+ add_typedef(NativeType::LONG, :long)
59
+
60
+ # Converts an unsigned long
61
+ add_typedef(NativeType::ULONG, :ulong)
62
+
63
+ # Converts a 64 bit int
64
+ add_typedef(NativeType::INT64, :int64)
65
+
66
+ # Converts an unsigned 64 bit int
67
+ add_typedef(NativeType::UINT64, :uint64)
68
+
69
+ # Converts a long long
70
+ add_typedef(NativeType::INT64, :long_long)
71
+
72
+ # Converts an unsigned long long
73
+ add_typedef(NativeType::UINT64, :ulong_long)
74
+
75
+ # Converts a float
76
+ add_typedef(NativeType::FLOAT32, :float)
77
+
78
+ # Converts a double
79
+ add_typedef(NativeType::FLOAT64, :double)
80
+
81
+ # Converts a pointer to opaque data
82
+ add_typedef(NativeType::POINTER, :pointer)
83
+
84
+ # For when a function has no return value
85
+ add_typedef(NativeType::VOID, :void)
86
+
87
+ # Converts NUL-terminated C strings
88
+ add_typedef(NativeType::STRING, :string)
89
+
90
+ # Converts FFI::Buffer objects
91
+ add_typedef(NativeType::BUFFER_IN, :buffer_in)
92
+ add_typedef(NativeType::BUFFER_OUT, :buffer_out)
93
+ add_typedef(NativeType::BUFFER_INOUT, :buffer_inout)
94
+
95
+ add_typedef(NativeType::VARARGS, :varargs)
96
+
97
+ add_typedef(NativeType::ENUM, :enum)
98
+ add_typedef(NativeType::BOOL, :bool)
99
+
100
+ # Use for a C struct with a char [] embedded inside.
101
+ add_typedef(NativeType::CHAR_ARRAY, :char_array)
102
+
103
+ TypeSizes = {
104
+ 1 => :char,
105
+ 2 => :short,
106
+ 4 => :int,
107
+ 8 => :long_long,
108
+ }
109
+ SizeTypes.merge!({
110
+ NativeType::INT8 => 1,
111
+ NativeType::UINT8 => 1,
112
+ NativeType::INT16 => 2,
113
+ NativeType::UINT16 => 2,
114
+ NativeType::INT32 => 4,
115
+ NativeType::UINT32 => 4,
116
+ NativeType::INT64 => 8,
117
+ NativeType::UINT64 => 8,
118
+ NativeType::FLOAT32 => 4,
119
+ NativeType::FLOAT64 => 8,
120
+ NativeType::LONG => FFI::Platform::LONG_SIZE / 8,
121
+ NativeType::ULONG => FFI::Platform::LONG_SIZE / 8,
122
+ NativeType::POINTER => FFI::Platform::ADDRESS_SIZE / 8,
123
+ })
124
+
125
+ def self.size_to_type(size)
126
+ if sz = TypeSizes[size]
127
+ return sz
128
+ end
129
+
130
+ # Be like C, use int as the default type size.
131
+ return :int
132
+ end
133
+ def self.type_size(type)
134
+ if sz = SizeTypes[find_type(type)]
135
+ return sz
136
+ end
137
+ raise ArgumentError, "Unknown native type"
138
+ end
139
+
140
+ # Load all the platform dependent types
141
+ begin
142
+ File.open(File.join(FFI::Platform::CONF_DIR, 'types.conf'), "r") do |f|
143
+ prefix = "rbx.platform.typedef."
144
+ f.each_line { |line|
145
+ if line.index(prefix) == 0
146
+ new_type, orig_type = line.chomp.slice(prefix.length..-1).split(/\s*=\s*/)
147
+ add_typedef(orig_type.to_sym, new_type.to_sym)
148
+ end
149
+ }
150
+ end
151
+ rescue Errno::ENOENT
152
+ end
153
+ end
@@ -0,0 +1,12 @@
1
+ require 'ffi/struct'
2
+
3
+ module FFI
4
+
5
+ class Union < FFI::Struct
6
+ def self.builder
7
+ b = StructLayoutBuilder.new
8
+ b.union = true
9
+ b
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,25 @@
1
+ module FFI
2
+ class VariadicInvoker
3
+ def init(arg_types, type_map)
4
+ @fixed = Array.new
5
+ @type_map = type_map
6
+ arg_types.each_with_index do |type, i|
7
+ @fixed << type unless type == FFI::NativeType::VARARGS
8
+ end
9
+ end
10
+ def call(*args, &block)
11
+ param_types = Array.new(@fixed)
12
+ param_values = Array.new
13
+ @fixed.each_with_index do |t, i|
14
+ param_values << args[i]
15
+ end
16
+ i = @fixed.length
17
+ while i < args.length
18
+ param_types << FFI.find_type(args[i], @type_map)
19
+ param_values << args[i + 1]
20
+ i += 2
21
+ end
22
+ invoke(param_types, param_values, &block)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+ describe "Function with primitive boolean arguments and return values" do
3
+ module LibTest
4
+ extend FFI::Library
5
+ ffi_lib TestLibrary::PATH
6
+ attach_function :bool_return_true, [ ], :bool
7
+ attach_function :bool_return_false, [ ], :bool
8
+ attach_function :bool_return_val, [ :bool ], :bool
9
+ attach_function :bool_reverse_val, [ :bool ], :bool
10
+ end
11
+ it "bools" do
12
+ LibTest.bool_return_true.should == true
13
+ LibTest.bool_return_false.should == false
14
+
15
+ LibTest.bool_return_val(true).should == true
16
+ LibTest.bool_return_val(false).should == false
17
+
18
+ LibTest.bool_reverse_val(true).should == false
19
+ LibTest.bool_reverse_val(false).should == true
20
+ end
21
+ it "raise error on invalid types" do
22
+ lambda { LibTest.bool_return_val(nil) }.should raise_error(::TypeError)
23
+ end
24
+ end
@@ -0,0 +1,202 @@
1
+ require "rubygems"
2
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
3
+ include FFI
4
+ LongSize = FFI::Platform::LONG_SIZE / 8
5
+
6
+ describe "Buffer#total" do
7
+ [1,2,3].each do |i|
8
+ { :char => 1, :uchar => 1, :short => 2, :ushort => 2, :int => 4,
9
+ :uint => 4, :long => LongSize, :ulong => LongSize,
10
+ :long_long => 8, :ulong_long => 8, :float => 4, :double => 8
11
+ }.each_pair do |t, s|
12
+ it "Buffer.alloc_in(#{t}, #{i}).total == #{i * s}" do
13
+ Buffer.alloc_in(t, i).total.should == i * s
14
+ end
15
+ it "Buffer.alloc_out(#{t}, #{i}).total == #{i * s}" do
16
+ Buffer.alloc_out(t, i).total.should == i * s
17
+ end
18
+ it "Buffer.alloc_inout(#{t}, #{i}).total == #{i * s}" do
19
+ Buffer.alloc_inout(t, i).total.should == i * s
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ describe "Buffer#put_char" do
26
+ bufsize = 4
27
+ (0..127).each do |i|
28
+ (0..bufsize-1).each do |offset|
29
+ it "put_char(#{offset}, #{i}).get_char(#{offset}) == #{i}" do
30
+ Buffer.alloc_in(bufsize).put_char(offset, i).get_char(offset).should == i
31
+ end
32
+ end
33
+ end
34
+ end
35
+ describe "Buffer#put_uchar" do
36
+ bufsize = 4
37
+ (0..255).each do |i|
38
+ (0..bufsize-1).each do |offset|
39
+ it "Buffer.put_uchar(#{offset}, #{i}).get_uchar(#{offset}) == #{i}" do
40
+ Buffer.alloc_in(bufsize).put_uchar(offset, i).get_uchar(offset).should == i
41
+ end
42
+ end
43
+ end
44
+ end
45
+ describe "Buffer#put_short" do
46
+ bufsize = 4
47
+ [0, 1, 128, 32767].each do |i|
48
+ (0..bufsize-2).each do |offset|
49
+ it "put_short(#{offset}, #{i}).get_short(#{offset}) == #{i}" do
50
+ Buffer.alloc_in(bufsize).put_short(offset, i).get_short(offset).should == i
51
+ end
52
+ end
53
+ end
54
+ end
55
+ describe "Buffer#put_ushort" do
56
+ bufsize = 4
57
+ [ 0, 1, 128, 32767, 65535, 0xfee1, 0xdead, 0xbeef, 0xcafe ].each do |i|
58
+ (0..bufsize-2).each do |offset|
59
+ it "put_ushort(#{offset}, #{i}).get_ushort(#{offset}) == #{i}" do
60
+ Buffer.alloc_in(bufsize).put_ushort(offset, i).get_ushort(offset).should == i
61
+ end
62
+ end
63
+ end
64
+ end
65
+ describe "Buffer#put_int" do
66
+ bufsize = 8
67
+ [0, 1, 128, 32767, 0x7ffffff ].each do |i|
68
+ (0..bufsize-4).each do |offset|
69
+ it "put_int(#{offset}, #{i}).get_int(#{offset}) == #{i}" do
70
+ Buffer.alloc_in(bufsize).put_int(offset, i).get_int(offset).should == i
71
+ end
72
+ end
73
+ end
74
+ end
75
+ describe "Buffer#put_uint" do
76
+ bufsize = 8
77
+ [ 0, 1, 128, 32767, 65535, 0xfee1dead, 0xcafebabe, 0xffffffff ].each do |i|
78
+ (0..bufsize-4).each do |offset|
79
+ it "put_uint(#{offset}, #{i}).get_uint(#{offset}) == #{i}" do
80
+ Buffer.alloc_in(bufsize).put_uint(offset, i).get_uint(offset).should == i
81
+ end
82
+ end
83
+ end
84
+ end
85
+ describe "Buffer#put_long" do
86
+ bufsize = 16
87
+ [0, 1, 128, 32767, 0x7ffffff ].each do |i|
88
+ (0..bufsize-LongSize).each do |offset|
89
+ it "put_long(#{offset}, #{i}).get_long(#{offset}) == #{i}" do
90
+ Buffer.alloc_in(bufsize).put_long(offset, i).get_long(offset).should == i
91
+ end
92
+ end
93
+ end
94
+ end
95
+ describe "Buffer#put_ulong" do
96
+ bufsize = 16
97
+ [ 0, 1, 128, 32767, 65535, 0xfee1dead, 0xcafebabe, 0xffffffff ].each do |i|
98
+ (0..bufsize-LongSize).each do |offset|
99
+ it "put_ulong(#{offset}, #{i}).get_ulong(#{offset}) == #{i}" do
100
+ Buffer.alloc_in(bufsize).put_ulong(offset, i).get_ulong(offset).should == i
101
+ end
102
+ end
103
+ end
104
+ end
105
+ describe "Buffer#put_long_long" do
106
+ bufsize = 16
107
+ [0, 1, 128, 32767, 0x7ffffffffffffff ].each do |i|
108
+ (0..bufsize-8).each do |offset|
109
+ it "put_long_long(#{offset}, #{i}).get_long_long(#{offset}) == #{i}" do
110
+ Buffer.alloc_in(bufsize).put_long_long(offset, i).get_long_long(offset).should == i
111
+ end
112
+ end
113
+ end
114
+ end
115
+ describe "Buffer#put_ulong_long" do
116
+ bufsize = 16
117
+ [ 0, 1, 128, 32767, 65535, 0xdeadcafebabe, 0x7fffffffffffffff ].each do |i|
118
+ (0..bufsize-8).each do |offset|
119
+ it "put_ulong_long(#{offset}, #{i}).get_ulong_long(#{offset}) == #{i}" do
120
+ Buffer.alloc_in(bufsize).put_ulong_long(offset, i).get_ulong_long(offset).should == i
121
+ end
122
+ end
123
+ end
124
+ end
125
+ describe "Reading/Writing binary strings" do
126
+ it "Buffer#put_bytes" do
127
+ str = "hello\0world"
128
+ buf = FFI::Buffer.new 1024
129
+ buf.put_bytes(0, str);
130
+ s2 = buf.get_bytes(0, 11);
131
+ s2.should == str
132
+ end
133
+ it "Buffer#put_bytes with index and length" do
134
+ str = "hello\0world"
135
+ buf = FFI::Buffer.new 1024
136
+ buf.put_bytes(0, str, 5, 6);
137
+ s2 = buf.get_bytes(0, 6);
138
+ s2.should == str[5..-1]
139
+ end
140
+ it "Buffer#put_bytes with only index" do
141
+ str = "hello\0world"
142
+ buf = FFI::Buffer.new 1024
143
+ buf.put_bytes(0, str, 5);
144
+ s2 = buf.get_bytes(0, 6);
145
+ s2.should == str[5..-1]
146
+ end
147
+ it "Buffer#put_bytes with index > str.length" do
148
+ str = "hello\0world"
149
+ buf = FFI::Buffer.new 1024
150
+ lambda { buf.put_bytes(0, str, 12); }.should raise_error
151
+ end
152
+ it "Buffer#put_bytes with length > str.length" do
153
+ str = "hello\0world"
154
+ buf = FFI::Buffer.new 1024
155
+ lambda { buf.put_bytes(0, str, 0, 12); }.should raise_error
156
+ end
157
+ it "Buffer#put_bytes with negative index" do
158
+ str = "hello\0world"
159
+ buf = FFI::Buffer.new 1024
160
+ lambda { buf.put_bytes(0, str, -1, 12); }.should raise_error
161
+ end
162
+ end
163
+ describe "Reading/Writing ascii strings" do
164
+ it "Buffer#put_string with string containing zero byte" do
165
+ str = "hello\0world"
166
+ buf = FFI::Buffer.new 1024
167
+ buf.put_string(0, str);
168
+ s2 = buf.get_bytes(0, 11);
169
+ s2.should == str
170
+ end
171
+ it "Buffer#get_string with string containing zero byte" do
172
+ str = "hello\0world"
173
+ buf = FFI::Buffer.new 1024
174
+ buf.put_bytes(0, str);
175
+ s2 = buf.get_string(0, 11);
176
+ s2.should == "hello"
177
+ end
178
+ it "Buffer#put_string without length should NUL terminate" do
179
+ str = "hello"
180
+ buf = FFI::Buffer.new 1024
181
+ buf.put_string(0, str);
182
+ s2 = buf.get_bytes(0, 6);
183
+ s2.should == "hello\0"
184
+ end
185
+ end
186
+ describe "Buffer#put_pointer" do
187
+ it "put_pointer(0, p).get_pointer(0) == p" do
188
+ p = MemoryPointer.new :ulong_long
189
+ p.put_uint(0, 0xdeadbeef)
190
+ buf = Buffer.alloc_inout 8
191
+ p2 = buf.put_pointer(0, p).get_pointer(0)
192
+ p2.should_not be_nil
193
+ p2.should == p
194
+ p2.get_uint(0).should == 0xdeadbeef
195
+ end
196
+ end
197
+ describe "Buffer#size" do
198
+ it "should return size" do
199
+ buf = FFI::Buffer.new 14
200
+ buf.size.should == 14
201
+ end
202
+ end