remogatto-ffi 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (324) hide show
  1. data/LICENSE +51 -0
  2. data/README.rdoc +69 -0
  3. data/Rakefile +144 -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 +431 -0
  12. data/ext/ffi_c/Call.h +77 -0
  13. data/ext/ffi_c/DynamicLibrary.c +216 -0
  14. data/ext/ffi_c/DynamicLibrary.h +22 -0
  15. data/ext/ffi_c/Function.c +498 -0
  16. data/ext/ffi_c/Function.h +73 -0
  17. data/ext/ffi_c/FunctionInfo.c +213 -0
  18. data/ext/ffi_c/LastError.c +159 -0
  19. data/ext/ffi_c/LastError.h +18 -0
  20. data/ext/ffi_c/MemoryPointer.c +178 -0
  21. data/ext/ffi_c/MemoryPointer.h +20 -0
  22. data/ext/ffi_c/MethodHandle.c +356 -0
  23. data/ext/ffi_c/MethodHandle.h +53 -0
  24. data/ext/ffi_c/Platform.c +59 -0
  25. data/ext/ffi_c/Platform.h +16 -0
  26. data/ext/ffi_c/Pointer.c +217 -0
  27. data/ext/ffi_c/Pointer.h +49 -0
  28. data/ext/ffi_c/Struct.c +770 -0
  29. data/ext/ffi_c/Struct.h +80 -0
  30. data/ext/ffi_c/StructByValue.c +140 -0
  31. data/ext/ffi_c/StructByValue.h +53 -0
  32. data/ext/ffi_c/StructLayout.c +450 -0
  33. data/ext/ffi_c/Type.c +329 -0
  34. data/ext/ffi_c/Type.h +57 -0
  35. data/ext/ffi_c/Types.c +103 -0
  36. data/ext/ffi_c/Types.h +85 -0
  37. data/ext/ffi_c/Variadic.c +260 -0
  38. data/ext/ffi_c/compat.h +72 -0
  39. data/ext/ffi_c/endian.h +40 -0
  40. data/ext/ffi_c/extconf.rb +34 -0
  41. data/ext/ffi_c/ffi.c +80 -0
  42. data/ext/ffi_c/libffi.bsd.mk +34 -0
  43. data/ext/ffi_c/libffi.darwin.mk +75 -0
  44. data/ext/ffi_c/libffi.gnu.mk +29 -0
  45. data/ext/ffi_c/libffi.mk +13 -0
  46. data/ext/ffi_c/libffi/ChangeLog +3243 -0
  47. data/ext/ffi_c/libffi/ChangeLog.libffi +347 -0
  48. data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
  49. data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
  50. data/ext/ffi_c/libffi/LICENSE +21 -0
  51. data/ext/ffi_c/libffi/Makefile.am +177 -0
  52. data/ext/ffi_c/libffi/Makefile.in +1640 -0
  53. data/ext/ffi_c/libffi/README +328 -0
  54. data/ext/ffi_c/libffi/TODO +1 -0
  55. data/ext/ffi_c/libffi/acinclude.m4 +92 -0
  56. data/ext/ffi_c/libffi/aclocal.m4 +7516 -0
  57. data/ext/ffi_c/libffi/compile +142 -0
  58. data/ext/ffi_c/libffi/config.guess +1516 -0
  59. data/ext/ffi_c/libffi/config.sub +1626 -0
  60. data/ext/ffi_c/libffi/configure +24414 -0
  61. data/ext/ffi_c/libffi/configure.ac +365 -0
  62. data/ext/ffi_c/libffi/configure.host +11 -0
  63. data/ext/ffi_c/libffi/depcomp +584 -0
  64. data/ext/ffi_c/libffi/doc/libffi.info +533 -0
  65. data/ext/ffi_c/libffi/doc/libffi.texi +541 -0
  66. data/ext/ffi_c/libffi/doc/stamp-vti +4 -0
  67. data/ext/ffi_c/libffi/doc/version.texi +4 -0
  68. data/ext/ffi_c/libffi/fficonfig.h.in +160 -0
  69. data/ext/ffi_c/libffi/include/Makefile.am +9 -0
  70. data/ext/ffi_c/libffi/include/Makefile.in +422 -0
  71. data/ext/ffi_c/libffi/include/ffi.h.in +393 -0
  72. data/ext/ffi_c/libffi/include/ffi_common.h +98 -0
  73. data/ext/ffi_c/libffi/install-sh +323 -0
  74. data/ext/ffi_c/libffi/libffi.pc.in +10 -0
  75. data/ext/ffi_c/libffi/libtool-version +29 -0
  76. data/ext/ffi_c/libffi/ltcf-c.sh +861 -0
  77. data/ext/ffi_c/libffi/ltcf-cxx.sh +1069 -0
  78. data/ext/ffi_c/libffi/ltcf-gcj.sh +700 -0
  79. data/ext/ffi_c/libffi/ltconfig +2862 -0
  80. data/ext/ffi_c/libffi/ltmain.sh +6930 -0
  81. data/ext/ffi_c/libffi/man/Makefile.am +8 -0
  82. data/ext/ffi_c/libffi/man/Makefile.in +395 -0
  83. data/ext/ffi_c/libffi/man/ffi.3 +31 -0
  84. data/ext/ffi_c/libffi/man/ffi_call.3 +103 -0
  85. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +66 -0
  86. data/ext/ffi_c/libffi/mdate-sh +201 -0
  87. data/ext/ffi_c/libffi/missing +353 -0
  88. data/ext/ffi_c/libffi/mkinstalldirs +158 -0
  89. data/ext/ffi_c/libffi/src/alpha/ffi.c +284 -0
  90. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +48 -0
  91. data/ext/ffi_c/libffi/src/alpha/osf.S +366 -0
  92. data/ext/ffi_c/libffi/src/arm/ffi.c +309 -0
  93. data/ext/ffi_c/libffi/src/arm/ffitarget.h +49 -0
  94. data/ext/ffi_c/libffi/src/arm/sysv.S +299 -0
  95. data/ext/ffi_c/libffi/src/closures.c +596 -0
  96. data/ext/ffi_c/libffi/src/cris/ffi.c +383 -0
  97. data/ext/ffi_c/libffi/src/cris/ffitarget.h +51 -0
  98. data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
  99. data/ext/ffi_c/libffi/src/debug.c +59 -0
  100. data/ext/ffi_c/libffi/src/dlmalloc.c +5099 -0
  101. data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
  102. data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
  103. data/ext/ffi_c/libffi/src/frv/ffitarget.h +61 -0
  104. data/ext/ffi_c/libffi/src/ia64/ffi.c +580 -0
  105. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +50 -0
  106. data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
  107. data/ext/ffi_c/libffi/src/ia64/unix.S +560 -0
  108. data/ext/ffi_c/libffi/src/java_raw_api.c +359 -0
  109. data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
  110. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +48 -0
  111. data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
  112. data/ext/ffi_c/libffi/src/m68k/ffi.c +278 -0
  113. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +49 -0
  114. data/ext/ffi_c/libffi/src/m68k/sysv.S +234 -0
  115. data/ext/ffi_c/libffi/src/mips/ffi.c +926 -0
  116. data/ext/ffi_c/libffi/src/mips/ffitarget.h +202 -0
  117. data/ext/ffi_c/libffi/src/mips/n32.S +534 -0
  118. data/ext/ffi_c/libffi/src/mips/o32.S +381 -0
  119. data/ext/ffi_c/libffi/src/pa/ffi.c +709 -0
  120. data/ext/ffi_c/libffi/src/pa/ffitarget.h +77 -0
  121. data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
  122. data/ext/ffi_c/libffi/src/pa/linux.S +357 -0
  123. data/ext/ffi_c/libffi/src/powerpc/aix.S +225 -0
  124. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +247 -0
  125. data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
  126. data/ext/ffi_c/libffi/src/powerpc/darwin.S +245 -0
  127. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +317 -0
  128. data/ext/ffi_c/libffi/src/powerpc/ffi.c +1429 -0
  129. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +800 -0
  130. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +118 -0
  131. data/ext/ffi_c/libffi/src/powerpc/linux64.S +187 -0
  132. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +236 -0
  133. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +327 -0
  134. data/ext/ffi_c/libffi/src/powerpc/sysv.S +230 -0
  135. data/ext/ffi_c/libffi/src/prep_cif.c +174 -0
  136. data/ext/ffi_c/libffi/src/raw_api.c +254 -0
  137. data/ext/ffi_c/libffi/src/s390/ffi.c +780 -0
  138. data/ext/ffi_c/libffi/src/s390/ffitarget.h +60 -0
  139. data/ext/ffi_c/libffi/src/s390/sysv.S +434 -0
  140. data/ext/ffi_c/libffi/src/sh/ffi.c +716 -0
  141. data/ext/ffi_c/libffi/src/sh/ffitarget.h +49 -0
  142. data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
  143. data/ext/ffi_c/libffi/src/sh64/ffi.c +453 -0
  144. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +53 -0
  145. data/ext/ffi_c/libffi/src/sh64/sysv.S +530 -0
  146. data/ext/ffi_c/libffi/src/sparc/ffi.c +610 -0
  147. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +66 -0
  148. data/ext/ffi_c/libffi/src/sparc/v8.S +272 -0
  149. data/ext/ffi_c/libffi/src/sparc/v9.S +307 -0
  150. data/ext/ffi_c/libffi/src/types.c +77 -0
  151. data/ext/ffi_c/libffi/src/x86/darwin.S +443 -0
  152. data/ext/ffi_c/libffi/src/x86/darwin64.S +416 -0
  153. data/ext/ffi_c/libffi/src/x86/ffi.c +475 -0
  154. data/ext/ffi_c/libffi/src/x86/ffi64.c +572 -0
  155. data/ext/ffi_c/libffi/src/x86/ffitarget.h +90 -0
  156. data/ext/ffi_c/libffi/src/x86/freebsd.S +458 -0
  157. data/ext/ffi_c/libffi/src/x86/sysv.S +437 -0
  158. data/ext/ffi_c/libffi/src/x86/unix64.S +418 -0
  159. data/ext/ffi_c/libffi/src/x86/win32.S +391 -0
  160. data/ext/ffi_c/libffi/testsuite/Makefile.am +71 -0
  161. data/ext/ffi_c/libffi/testsuite/Makefile.in +447 -0
  162. data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
  163. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +289 -0
  164. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +263 -0
  165. data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +36 -0
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +97 -0
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +89 -0
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +89 -0
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +90 -0
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +97 -0
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +99 -0
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +98 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +72 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +102 -0
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +103 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +104 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +110 -0
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +97 -0
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +99 -0
  181. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +101 -0
  182. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +121 -0
  183. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +98 -0
  184. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +103 -0
  185. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +98 -0
  186. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +98 -0
  187. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +106 -0
  188. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +98 -0
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +117 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +106 -0
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +132 -0
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +121 -0
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +107 -0
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +125 -0
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +105 -0
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +96 -0
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +98 -0
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +99 -0
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +101 -0
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +99 -0
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +100 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +101 -0
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +99 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +99 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +99 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +99 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +99 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +100 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +51 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +51 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +82 -0
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +82 -0
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +94 -0
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +99 -0
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +82 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +94 -0
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +52 -0
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +50 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +50 -0
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +50 -0
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +51 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +54 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +51 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +86 -0
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +58 -0
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +57 -0
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +72 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +69 -0
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +63 -0
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +53 -0
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +160 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +169 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +141 -0
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +118 -0
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +119 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +119 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +120 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +139 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +119 -0
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +139 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +139 -0
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +98 -0
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +35 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +42 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +65 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +59 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +63 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +65 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +80 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +67 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +86 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +38 -0
  274. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +123 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
  276. data/ext/ffi_c/libffi/texinfo.tex +7482 -0
  277. data/ext/ffi_c/rbffi.h +26 -0
  278. data/gen/Rakefile +12 -0
  279. data/lib/ffi.rb +11 -0
  280. data/lib/ffi/autopointer.rb +61 -0
  281. data/lib/ffi/buffer.rb +0 -0
  282. data/lib/ffi/callback.rb +10 -0
  283. data/lib/ffi/enum.rb +78 -0
  284. data/lib/ffi/errno.rb +8 -0
  285. data/lib/ffi/ffi.rb +99 -0
  286. data/lib/ffi/io.rb +21 -0
  287. data/lib/ffi/library.rb +218 -0
  288. data/lib/ffi/managedstruct.rb +55 -0
  289. data/lib/ffi/memorypointer.rb +73 -0
  290. data/lib/ffi/platform.rb +78 -0
  291. data/lib/ffi/pointer.rb +119 -0
  292. data/lib/ffi/struct.rb +164 -0
  293. data/lib/ffi/tools/const_generator.rb +177 -0
  294. data/lib/ffi/tools/generator.rb +58 -0
  295. data/lib/ffi/tools/generator_task.rb +35 -0
  296. data/lib/ffi/tools/struct_generator.rb +194 -0
  297. data/lib/ffi/tools/types_generator.rb +123 -0
  298. data/lib/ffi/types.rb +153 -0
  299. data/lib/ffi/union.rb +12 -0
  300. data/lib/ffi/variadic.rb +25 -0
  301. data/spec/ffi/bool_spec.rb +24 -0
  302. data/spec/ffi/buffer_spec.rb +202 -0
  303. data/spec/ffi/callback_spec.rb +591 -0
  304. data/spec/ffi/enum_spec.rb +164 -0
  305. data/spec/ffi/errno_spec.rb +13 -0
  306. data/spec/ffi/function_spec.rb +47 -0
  307. data/spec/ffi/library_spec.rb +144 -0
  308. data/spec/ffi/managed_struct_spec.rb +56 -0
  309. data/spec/ffi/number_spec.rb +231 -0
  310. data/spec/ffi/pointer_spec.rb +195 -0
  311. data/spec/ffi/rbx/attach_function_spec.rb +27 -0
  312. data/spec/ffi/rbx/memory_pointer_spec.rb +102 -0
  313. data/spec/ffi/rbx/spec_helper.rb +1 -0
  314. data/spec/ffi/rbx/struct_spec.rb +13 -0
  315. data/spec/ffi/spec_helper.rb +17 -0
  316. data/spec/ffi/string_spec.rb +103 -0
  317. data/spec/ffi/struct_callback_spec.rb +62 -0
  318. data/spec/ffi/struct_initialize_spec.rb +30 -0
  319. data/spec/ffi/struct_spec.rb +529 -0
  320. data/spec/ffi/typedef_spec.rb +48 -0
  321. data/spec/ffi/union_spec.rb +60 -0
  322. data/spec/ffi/variadic_spec.rb +84 -0
  323. data/spec/spec.opts +4 -0
  324. metadata +432 -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