ffi 0.4.0-x86-mswin32

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 (316) hide show
  1. data/LICENSE +51 -0
  2. data/README.rdoc +69 -0
  3. data/Rakefile +142 -0
  4. data/ext/ffi_c/AbstractMemory.c +412 -0
  5. data/ext/ffi_c/AbstractMemory.h +68 -0
  6. data/ext/ffi_c/AutoPointer.c +60 -0
  7. data/ext/ffi_c/AutoPointer.h +18 -0
  8. data/ext/ffi_c/Buffer.c +171 -0
  9. data/ext/ffi_c/Callback.c +374 -0
  10. data/ext/ffi_c/Callback.h +47 -0
  11. data/ext/ffi_c/DynamicLibrary.c +213 -0
  12. data/ext/ffi_c/DynamicLibrary.h +22 -0
  13. data/ext/ffi_c/Invoker.c +962 -0
  14. data/ext/ffi_c/LastError.c +135 -0
  15. data/ext/ffi_c/LastError.h +18 -0
  16. data/ext/ffi_c/MemoryPointer.c +156 -0
  17. data/ext/ffi_c/MemoryPointer.h +20 -0
  18. data/ext/ffi_c/NullPointer.c +143 -0
  19. data/ext/ffi_c/Platform.c +59 -0
  20. data/ext/ffi_c/Platform.h +16 -0
  21. data/ext/ffi_c/Pointer.c +164 -0
  22. data/ext/ffi_c/Pointer.h +25 -0
  23. data/ext/ffi_c/Struct.c +477 -0
  24. data/ext/ffi_c/Struct.h +26 -0
  25. data/ext/ffi_c/Type.c +230 -0
  26. data/ext/ffi_c/Type.h +28 -0
  27. data/ext/ffi_c/Types.c +118 -0
  28. data/ext/ffi_c/Types.h +54 -0
  29. data/ext/ffi_c/compat.h +22 -0
  30. data/ext/ffi_c/endian.h +40 -0
  31. data/ext/ffi_c/extconf.rb +31 -0
  32. data/ext/ffi_c/ffi.c +76 -0
  33. data/ext/ffi_c/libffi.bsd.mk +34 -0
  34. data/ext/ffi_c/libffi.darwin.mk +75 -0
  35. data/ext/ffi_c/libffi.gnu.mk +29 -0
  36. data/ext/ffi_c/libffi.mk +13 -0
  37. data/ext/ffi_c/libffi/ChangeLog +3243 -0
  38. data/ext/ffi_c/libffi/ChangeLog.libffi +347 -0
  39. data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
  40. data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
  41. data/ext/ffi_c/libffi/LICENSE +21 -0
  42. data/ext/ffi_c/libffi/Makefile.am +177 -0
  43. data/ext/ffi_c/libffi/Makefile.in +1640 -0
  44. data/ext/ffi_c/libffi/README +328 -0
  45. data/ext/ffi_c/libffi/TODO +1 -0
  46. data/ext/ffi_c/libffi/acinclude.m4 +92 -0
  47. data/ext/ffi_c/libffi/aclocal.m4 +7516 -0
  48. data/ext/ffi_c/libffi/compile +142 -0
  49. data/ext/ffi_c/libffi/config.guess +1516 -0
  50. data/ext/ffi_c/libffi/config.sub +1626 -0
  51. data/ext/ffi_c/libffi/configure +24414 -0
  52. data/ext/ffi_c/libffi/configure.ac +365 -0
  53. data/ext/ffi_c/libffi/configure.host +11 -0
  54. data/ext/ffi_c/libffi/depcomp +584 -0
  55. data/ext/ffi_c/libffi/doc/libffi.info +533 -0
  56. data/ext/ffi_c/libffi/doc/libffi.texi +541 -0
  57. data/ext/ffi_c/libffi/doc/stamp-vti +4 -0
  58. data/ext/ffi_c/libffi/doc/version.texi +4 -0
  59. data/ext/ffi_c/libffi/fficonfig.h.in +160 -0
  60. data/ext/ffi_c/libffi/include/Makefile.am +9 -0
  61. data/ext/ffi_c/libffi/include/Makefile.in +422 -0
  62. data/ext/ffi_c/libffi/include/ffi.h.in +393 -0
  63. data/ext/ffi_c/libffi/include/ffi_common.h +98 -0
  64. data/ext/ffi_c/libffi/install-sh +323 -0
  65. data/ext/ffi_c/libffi/libffi.pc.in +10 -0
  66. data/ext/ffi_c/libffi/libtool-version +29 -0
  67. data/ext/ffi_c/libffi/ltcf-c.sh +861 -0
  68. data/ext/ffi_c/libffi/ltcf-cxx.sh +1069 -0
  69. data/ext/ffi_c/libffi/ltcf-gcj.sh +700 -0
  70. data/ext/ffi_c/libffi/ltconfig +2862 -0
  71. data/ext/ffi_c/libffi/ltmain.sh +6930 -0
  72. data/ext/ffi_c/libffi/man/Makefile.am +8 -0
  73. data/ext/ffi_c/libffi/man/Makefile.in +395 -0
  74. data/ext/ffi_c/libffi/man/ffi.3 +31 -0
  75. data/ext/ffi_c/libffi/man/ffi_call.3 +103 -0
  76. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +66 -0
  77. data/ext/ffi_c/libffi/mdate-sh +201 -0
  78. data/ext/ffi_c/libffi/missing +353 -0
  79. data/ext/ffi_c/libffi/mkinstalldirs +158 -0
  80. data/ext/ffi_c/libffi/src/alpha/ffi.c +284 -0
  81. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +48 -0
  82. data/ext/ffi_c/libffi/src/alpha/osf.S +366 -0
  83. data/ext/ffi_c/libffi/src/arm/ffi.c +309 -0
  84. data/ext/ffi_c/libffi/src/arm/ffitarget.h +49 -0
  85. data/ext/ffi_c/libffi/src/arm/sysv.S +299 -0
  86. data/ext/ffi_c/libffi/src/closures.c +596 -0
  87. data/ext/ffi_c/libffi/src/cris/ffi.c +383 -0
  88. data/ext/ffi_c/libffi/src/cris/ffitarget.h +51 -0
  89. data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
  90. data/ext/ffi_c/libffi/src/debug.c +59 -0
  91. data/ext/ffi_c/libffi/src/dlmalloc.c +5099 -0
  92. data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
  93. data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
  94. data/ext/ffi_c/libffi/src/frv/ffitarget.h +61 -0
  95. data/ext/ffi_c/libffi/src/ia64/ffi.c +580 -0
  96. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +50 -0
  97. data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
  98. data/ext/ffi_c/libffi/src/ia64/unix.S +560 -0
  99. data/ext/ffi_c/libffi/src/java_raw_api.c +359 -0
  100. data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
  101. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +48 -0
  102. data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
  103. data/ext/ffi_c/libffi/src/m68k/ffi.c +278 -0
  104. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +49 -0
  105. data/ext/ffi_c/libffi/src/m68k/sysv.S +234 -0
  106. data/ext/ffi_c/libffi/src/mips/ffi.c +926 -0
  107. data/ext/ffi_c/libffi/src/mips/ffitarget.h +202 -0
  108. data/ext/ffi_c/libffi/src/mips/n32.S +534 -0
  109. data/ext/ffi_c/libffi/src/mips/o32.S +381 -0
  110. data/ext/ffi_c/libffi/src/pa/ffi.c +709 -0
  111. data/ext/ffi_c/libffi/src/pa/ffitarget.h +77 -0
  112. data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
  113. data/ext/ffi_c/libffi/src/pa/linux.S +357 -0
  114. data/ext/ffi_c/libffi/src/powerpc/aix.S +225 -0
  115. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +247 -0
  116. data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
  117. data/ext/ffi_c/libffi/src/powerpc/darwin.S +245 -0
  118. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +317 -0
  119. data/ext/ffi_c/libffi/src/powerpc/ffi.c +1429 -0
  120. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +800 -0
  121. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +118 -0
  122. data/ext/ffi_c/libffi/src/powerpc/linux64.S +187 -0
  123. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +236 -0
  124. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +327 -0
  125. data/ext/ffi_c/libffi/src/powerpc/sysv.S +230 -0
  126. data/ext/ffi_c/libffi/src/prep_cif.c +174 -0
  127. data/ext/ffi_c/libffi/src/raw_api.c +254 -0
  128. data/ext/ffi_c/libffi/src/s390/ffi.c +780 -0
  129. data/ext/ffi_c/libffi/src/s390/ffitarget.h +60 -0
  130. data/ext/ffi_c/libffi/src/s390/sysv.S +434 -0
  131. data/ext/ffi_c/libffi/src/sh/ffi.c +716 -0
  132. data/ext/ffi_c/libffi/src/sh/ffitarget.h +49 -0
  133. data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
  134. data/ext/ffi_c/libffi/src/sh64/ffi.c +453 -0
  135. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +53 -0
  136. data/ext/ffi_c/libffi/src/sh64/sysv.S +530 -0
  137. data/ext/ffi_c/libffi/src/sparc/ffi.c +610 -0
  138. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +66 -0
  139. data/ext/ffi_c/libffi/src/sparc/v8.S +272 -0
  140. data/ext/ffi_c/libffi/src/sparc/v9.S +307 -0
  141. data/ext/ffi_c/libffi/src/types.c +77 -0
  142. data/ext/ffi_c/libffi/src/x86/darwin.S +443 -0
  143. data/ext/ffi_c/libffi/src/x86/darwin64.S +416 -0
  144. data/ext/ffi_c/libffi/src/x86/ffi.c +475 -0
  145. data/ext/ffi_c/libffi/src/x86/ffi64.c +572 -0
  146. data/ext/ffi_c/libffi/src/x86/ffitarget.h +90 -0
  147. data/ext/ffi_c/libffi/src/x86/freebsd.S +458 -0
  148. data/ext/ffi_c/libffi/src/x86/sysv.S +437 -0
  149. data/ext/ffi_c/libffi/src/x86/unix64.S +418 -0
  150. data/ext/ffi_c/libffi/src/x86/win32.S +391 -0
  151. data/ext/ffi_c/libffi/testsuite/Makefile.am +71 -0
  152. data/ext/ffi_c/libffi/testsuite/Makefile.in +447 -0
  153. data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
  154. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +289 -0
  155. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +263 -0
  156. data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +36 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +97 -0
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +89 -0
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +89 -0
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +90 -0
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +97 -0
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +99 -0
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +98 -0
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +72 -0
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +102 -0
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +103 -0
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +104 -0
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +110 -0
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +97 -0
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +99 -0
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +101 -0
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +121 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +98 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +103 -0
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +98 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +98 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +106 -0
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +98 -0
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +117 -0
  181. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +106 -0
  182. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +132 -0
  183. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +121 -0
  184. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +107 -0
  185. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +125 -0
  186. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +105 -0
  187. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +96 -0
  188. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +98 -0
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +99 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +101 -0
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +99 -0
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +100 -0
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +101 -0
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +99 -0
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +99 -0
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +99 -0
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +99 -0
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +99 -0
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +100 -0
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +51 -0
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +51 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +82 -0
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +82 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +94 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +99 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +82 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +94 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +52 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +50 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +50 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +50 -0
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +51 -0
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +54 -0
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +51 -0
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +86 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +58 -0
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +57 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +72 -0
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +69 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +63 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +53 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +160 -0
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +169 -0
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +141 -0
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +118 -0
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +119 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +119 -0
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +120 -0
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +139 -0
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +119 -0
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +139 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +139 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +98 -0
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +35 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +42 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +65 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +59 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +63 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +65 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +80 -0
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +67 -0
  263. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +86 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +38 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +123 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
  267. data/ext/ffi_c/libffi/texinfo.tex +7482 -0
  268. data/ext/ffi_c/rbffi.h +23 -0
  269. data/gen/Rakefile +12 -0
  270. data/lib/1.8/ffi_c.so +0 -0
  271. data/lib/1.9/ffi_c.so +0 -0
  272. data/lib/ffi.rb +11 -0
  273. data/lib/ffi/autopointer.rb +61 -0
  274. data/lib/ffi/buffer.rb +0 -0
  275. data/lib/ffi/callback.rb +10 -0
  276. data/lib/ffi/enum.rb +78 -0
  277. data/lib/ffi/errno.rb +8 -0
  278. data/lib/ffi/ffi.rb +96 -0
  279. data/lib/ffi/io.rb +21 -0
  280. data/lib/ffi/library.rb +243 -0
  281. data/lib/ffi/managedstruct.rb +55 -0
  282. data/lib/ffi/memorypointer.rb +73 -0
  283. data/lib/ffi/platform.rb +78 -0
  284. data/lib/ffi/pointer.rb +119 -0
  285. data/lib/ffi/struct.rb +354 -0
  286. data/lib/ffi/tools/const_generator.rb +177 -0
  287. data/lib/ffi/tools/generator.rb +58 -0
  288. data/lib/ffi/tools/generator_task.rb +35 -0
  289. data/lib/ffi/tools/struct_generator.rb +194 -0
  290. data/lib/ffi/tools/types_generator.rb +123 -0
  291. data/lib/ffi/types.rb +153 -0
  292. data/lib/ffi/union.rb +17 -0
  293. data/lib/ffi/variadic.rb +30 -0
  294. data/spec/ffi/bool_spec.rb +24 -0
  295. data/spec/ffi/buffer_spec.rb +196 -0
  296. data/spec/ffi/callback_spec.rb +560 -0
  297. data/spec/ffi/enum_spec.rb +164 -0
  298. data/spec/ffi/errno_spec.rb +13 -0
  299. data/spec/ffi/library_spec.rb +144 -0
  300. data/spec/ffi/managed_struct_spec.rb +56 -0
  301. data/spec/ffi/number_spec.rb +231 -0
  302. data/spec/ffi/pointer_spec.rb +195 -0
  303. data/spec/ffi/rbx/attach_function_spec.rb +27 -0
  304. data/spec/ffi/rbx/memory_pointer_spec.rb +102 -0
  305. data/spec/ffi/rbx/spec_helper.rb +1 -0
  306. data/spec/ffi/rbx/struct_spec.rb +13 -0
  307. data/spec/ffi/spec_helper.rb +17 -0
  308. data/spec/ffi/string_spec.rb +103 -0
  309. data/spec/ffi/struct_callback_spec.rb +41 -0
  310. data/spec/ffi/struct_initialize_spec.rb +30 -0
  311. data/spec/ffi/struct_spec.rb +476 -0
  312. data/spec/ffi/typedef_spec.rb +48 -0
  313. data/spec/ffi/union_spec.rb +60 -0
  314. data/spec/ffi/variadic_spec.rb +84 -0
  315. data/spec/spec.opts +4 -0
  316. metadata +375 -0
@@ -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 ArgumentError" do
186
+ lambda { FFI::AutoPointer.new(FFI::MemoryPointer.new(:int))}.should raise_error(::TypeError)
187
+ end
188
+ it "AutoPointer argument raises ArgumentError" do
189
+ lambda { AutoPointerSubclass.new(AutoPointerSubclass.new(LibTest.ptr_from_address(0))) }.should raise_error(::TypeError)
190
+ end
191
+ it "Buffer argument raises ArgumentError" 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
+
@@ -0,0 +1,102 @@
1
+ require "rubygems"
2
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
3
+
4
+ module CTest
5
+ extend FFI::Library
6
+
7
+ attach_function :strcat, [:pointer, :pointer], :pointer
8
+ end
9
+
10
+ describe "MemoryPointer" do
11
+ it "makes a pointer from a string" do
12
+ m = FFI::MemoryPointer.from_string("FFI is Awesome")
13
+ m.type_size.should == 15
14
+ end
15
+
16
+ it "reads back a string" do
17
+ m = FFI::MemoryPointer.from_string("FFI is Awesome")
18
+ m.read_string.should == "FFI is Awesome"
19
+ end
20
+
21
+ it "makes a pointer for a certain number of bytes" do
22
+ m = FFI::MemoryPointer.new(8)
23
+ m.write_array_of_int([1,2])
24
+ m.read_array_of_int(2).should == [1,2]
25
+ end
26
+
27
+ it "allows access to an element of the pointer (as an array)" do
28
+ m = FFI::MemoryPointer.new(:int, 2)
29
+ m.write_array_of_int([1,2])
30
+ m[0].read_int.should == 1
31
+ m[1].read_int.should == 2
32
+ end
33
+
34
+ it "allows writing as an int" do
35
+ m = FFI::MemoryPointer.new(:int)
36
+ m.write_int(1)
37
+ m.read_int.should == 1
38
+ end
39
+
40
+ it "allows writing as a long" do
41
+ m = FFI::MemoryPointer.new(:long)
42
+ m.write_long(10)
43
+ m.read_long.should == 10
44
+ end
45
+
46
+ it "raises an error if you try putting a long into a pointer of size 1" do
47
+ m = FFI::MemoryPointer.new(1)
48
+ lambda { m.write_long(10) }.should raise_error
49
+ end
50
+
51
+ it "raises an error if you try putting an int into a pointer of size 1" do
52
+ m = FFI::MemoryPointer.new(1)
53
+ lambda { m.write_int(10) }.should raise_error
54
+ end
55
+ # it "does not raise IndexError for opaque pointers" do
56
+ # m = FFI::MemoryPointer.new(8)
57
+ # p2 = FFI::MemoryPointer.new(1024)
58
+ # m.write_long(p2.address)
59
+ # p = m.read_pointer
60
+ # lambda { p.write_int(10) }.should_not raise_error
61
+ # end
62
+
63
+ it "makes a pointer for a certain type" do
64
+ m = FFI::MemoryPointer.new(:int)
65
+ m.write_int(10)
66
+ m.read_int.should == 10
67
+ end
68
+
69
+ it "makes a memory pointer for a number of a certain type" do
70
+ m = FFI::MemoryPointer.new(:int, 2)
71
+ m.write_array_of_int([1,2])
72
+ m.read_array_of_int(2).should == [1,2]
73
+ end
74
+
75
+ it "makes a pointer for an object responding to #size" do
76
+ m = FFI::MemoryPointer.new(Struct.new(:size).new(8))
77
+ m.write_array_of_int([1,2])
78
+ m.read_array_of_int(2).should == [1,2]
79
+ end
80
+
81
+ it "makes a pointer for a number of an object responding to #size" do
82
+ m = FFI::MemoryPointer.new(Struct.new(:size).new(4), 2)
83
+ m.write_array_of_int([1,2])
84
+ m.read_array_of_int(2).should == [1,2]
85
+ end
86
+ it "MemoryPointer#address returns correct value" do
87
+ m = FFI::MemoryPointer.new(:long_long)
88
+ magic = 0x12345678
89
+ m.write_long(magic)
90
+ m.read_pointer.address.should == magic
91
+ end
92
+ it "MemoryPointer#null? returns true for zero value" do
93
+ m = FFI::MemoryPointer.new(:long_long)
94
+ m.write_long(0)
95
+ m.read_pointer.null?.should == true
96
+ end
97
+ it "MemoryPointer#null? returns false for non-zero value" do
98
+ m = FFI::MemoryPointer.new(:long_long)
99
+ m.write_long(0x12345678)
100
+ m.read_pointer.null?.should == false
101
+ end
102
+ end
@@ -0,0 +1 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
@@ -0,0 +1,13 @@
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
+ describe FFI::Struct do
8
+ it "allows setting fields" do
9
+ t = Timeval.new
10
+ t[:tv_sec] = 12
11
+ t[:tv_sec].should == 12
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ require 'rubygems'
2
+ require 'rbconfig'
3
+ require 'spec'
4
+
5
+ if ENV["MRI_FFI"]
6
+ $:.unshift File.join(File.dirname(__FILE__), "..", "..", "lib"),
7
+ File.join(File.dirname(__FILE__), "..", "..", "build", "#{Config::CONFIG['host_cpu''arch']}", "ffi_c", RUBY_VERSION)
8
+ end
9
+ require "ffi"
10
+
11
+ module TestLibrary
12
+ PATH = "build/libtest.#{FFI::Platform::LIBSUFFIX}"
13
+ end
14
+ module LibTest
15
+ extend FFI::Library
16
+ ffi_lib TestLibrary::PATH
17
+ end
@@ -0,0 +1,103 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+ describe "String tests" do
3
+ include FFI
4
+ module StrLibTest
5
+ extend FFI::Library
6
+ ffi_lib TestLibrary::PATH
7
+ attach_function :ptr_ret_pointer, [ :pointer, :int], :string
8
+ attach_function :string_equals, [ :string, :string ], :int
9
+ attach_function :string_dummy, [ :string ], :void
10
+ attach_function :string_null, [ ], :string
11
+ end
12
+ it "MemoryPointer#get_string returns a tainted string" do
13
+ mp = MemoryPointer.new 1024
14
+ mp.put_string(0, "test\0")
15
+ str = mp.get_string(0)
16
+ str.tainted?.should == true
17
+ end
18
+ it "String returned by a method is tainted" do
19
+ mp = MemoryPointer.new :pointer
20
+ sp = MemoryPointer.new 1024
21
+ sp.put_string(0, "test")
22
+ mp.put_pointer(0, sp)
23
+ str = StrLibTest.ptr_ret_pointer(mp, 0)
24
+ str.should == "test"
25
+ str.tainted?.should == true
26
+ end
27
+ it "Poison null byte raises error" do
28
+ s = "123\0abc"
29
+ lambda { StrLibTest.string_equals(s, s) }.should raise_error
30
+ end
31
+ it "Tainted String parameter should throw a SecurityError" do
32
+ $SAFE = 1
33
+ str = "test"
34
+ str.taint
35
+ begin
36
+ LibTest.string_equals(str, str).should == false
37
+ rescue SecurityError => e
38
+ end
39
+ end if false
40
+ it "casts nil as NULL pointer" do
41
+ StrLibTest.string_dummy(nil)
42
+ end
43
+ it "return nil for NULL char*" do
44
+ StrLibTest.string_null.should == nil
45
+ end
46
+ it "reads an array of strings until encountering a NULL pointer" do
47
+ strings = ["foo", "bar", "baz", "testing", "ffi"]
48
+ ptrary = MemoryPointer.new(:pointer, 6)
49
+ ary = strings.inject([]) do |a, str|
50
+ f = MemoryPointer.new(1024)
51
+ f.put_string(0, str)
52
+ a << f
53
+ end
54
+ ary.insert(3, nil)
55
+ ptrary.write_array_of_pointer(ary)
56
+ ptrary.get_array_of_string(0).should == ["foo", "bar", "baz"]
57
+ end
58
+ it "reads an array of strings of the size specified, substituting nil when a pointer is NULL" do
59
+ strings = ["foo", "bar", "baz", "testing", "ffi"]
60
+ ptrary = MemoryPointer.new(:pointer, 6)
61
+ ary = strings.inject([]) do |a, str|
62
+ f = MemoryPointer.new(1024)
63
+ f.put_string(0, str)
64
+ a << f
65
+ end
66
+ ary.insert(2, nil)
67
+ ptrary.write_array_of_pointer(ary)
68
+ ptrary.get_array_of_string(0, 4).should == ["foo", "bar", nil, "baz"]
69
+ end
70
+ it "reads an array of strings, taking a memory offset parameter" do
71
+ strings = ["foo", "bar", "baz", "testing", "ffi"]
72
+ ptrary = MemoryPointer.new(:pointer, 5)
73
+ ary = strings.inject([]) do |a, str|
74
+ f = MemoryPointer.new(1024)
75
+ f.put_string(0, str)
76
+ a << f
77
+ end
78
+ ptrary.write_array_of_pointer(ary)
79
+ ptrary.get_array_of_string(2 * FFI.type_size(:pointer), 3).should == ["baz", "testing", "ffi"]
80
+ end
81
+ it "raises an IndexError when trying to read an array of strings out of bounds" do
82
+ strings = ["foo", "bar", "baz", "testing", "ffi"]
83
+ ptrary = MemoryPointer.new(:pointer, 5)
84
+ ary = strings.inject([]) do |a, str|
85
+ f = MemoryPointer.new(1024)
86
+ f.put_string(0, str)
87
+ a << f
88
+ end
89
+ ptrary.write_array_of_pointer(ary)
90
+ lambda { ptrary.get_array_of_string(0, 6) }.should raise_error
91
+ end
92
+ it "raises an IndexError when trying to read an array of strings using a negative offset" do
93
+ strings = ["foo", "bar", "baz", "testing", "ffi"]
94
+ ptrary = MemoryPointer.new(:pointer, 5)
95
+ ary = strings.inject([]) do |a, str|
96
+ f = MemoryPointer.new(1024)
97
+ f.put_string(0, str)
98
+ a << f
99
+ end
100
+ ptrary.write_array_of_pointer(ary)
101
+ lambda { ptrary.get_array_of_string(-1) }.should raise_error
102
+ end
103
+ end