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,164 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+
3
+ module TestEnum0
4
+ extend FFI::Library
5
+ end
6
+
7
+ module TestEnum1
8
+ extend FFI::Library
9
+ ffi_lib TestLibrary::PATH
10
+
11
+ enum [:c1, :c2, :c3, :c4]
12
+ enum [:c5, 42, :c6, :c7, :c8]
13
+ enum [:c9, 42, :c10, :c11, 4242, :c12]
14
+ enum [:c13, 42, :c14, 4242, :c15, 424242, :c16, 42424242]
15
+
16
+ attach_function :test_untagged_enum, [:int], :int
17
+ end
18
+
19
+ module TestEnum3
20
+ extend FFI::Library
21
+ ffi_lib TestLibrary::PATH
22
+
23
+ enum :enum_type1, [:c1, :c2, :c3, :c4]
24
+ enum :enum_type2, [:c5, 42, :c6, :c7, :c8]
25
+ enum :enum_type3, [:c9, 42, :c10, :c11, 4242, :c12]
26
+ enum :enum_type4, [:c13, 42, :c14, 4242, :c15, 424242, :c16, 42424242]
27
+
28
+ attach_function :test_tagged_typedef_enum1, [:enum_type1], :enum_type1
29
+ attach_function :test_tagged_typedef_enum2, [:enum_type2], :enum_type2
30
+ attach_function :test_tagged_typedef_enum3, [:enum_type3], :enum_type3
31
+ attach_function :test_tagged_typedef_enum4, [:enum_type4], :enum_type4
32
+ end
33
+
34
+ describe "A library with no enum defined" do
35
+ it "returns nil when asked for an enum" do
36
+ TestEnum0.enum_type(:foo).should == nil
37
+ end
38
+ end
39
+
40
+ describe "An untagged enum" do
41
+ it "constants can be used as function parameters and return value" do
42
+ TestEnum1.test_untagged_enum(:c1).should == 0
43
+ TestEnum1.test_untagged_enum(:c2).should == 1
44
+ TestEnum1.test_untagged_enum(:c3).should == 2
45
+ TestEnum1.test_untagged_enum(:c4).should == 3
46
+ TestEnum1.test_untagged_enum(:c5).should == 42
47
+ TestEnum1.test_untagged_enum(:c6).should == 43
48
+ TestEnum1.test_untagged_enum(:c7).should == 44
49
+ TestEnum1.test_untagged_enum(:c8).should == 45
50
+ TestEnum1.test_untagged_enum(:c9).should == 42
51
+ TestEnum1.test_untagged_enum(:c10).should == 43
52
+ TestEnum1.test_untagged_enum(:c11).should == 4242
53
+ TestEnum1.test_untagged_enum(:c12).should == 4243
54
+ TestEnum1.test_untagged_enum(:c13).should == 42
55
+ TestEnum1.test_untagged_enum(:c14).should == 4242
56
+ TestEnum1.test_untagged_enum(:c15).should == 424242
57
+ TestEnum1.test_untagged_enum(:c16).should == 42424242
58
+ end
59
+ end
60
+
61
+ describe "A tagged typedef enum" do
62
+ it "is accessible through its tag" do
63
+ TestEnum3.enum_type(:enum_type1).should_not == nil
64
+ TestEnum3.enum_type(:enum_type2).should_not == nil
65
+ TestEnum3.enum_type(:enum_type3).should_not == nil
66
+ TestEnum3.enum_type(:enum_type4).should_not == nil
67
+ end
68
+ it "contains enum constants" do
69
+ TestEnum3.enum_type(:enum_type1).symbols.length.should == 4
70
+ TestEnum3.enum_type(:enum_type2).symbols.length.should == 4
71
+ TestEnum3.enum_type(:enum_type3).symbols.length.should == 4
72
+ TestEnum3.enum_type(:enum_type4).symbols.length.should == 4
73
+ end
74
+ it "constants can be used as function parameters and return value" do
75
+ TestEnum3.test_tagged_typedef_enum1(:c1).should == :c1
76
+ TestEnum3.test_tagged_typedef_enum1(:c2).should == :c2
77
+ TestEnum3.test_tagged_typedef_enum1(:c3).should == :c3
78
+ TestEnum3.test_tagged_typedef_enum1(:c4).should == :c4
79
+ TestEnum3.test_tagged_typedef_enum2(:c5).should == :c5
80
+ TestEnum3.test_tagged_typedef_enum2(:c6).should == :c6
81
+ TestEnum3.test_tagged_typedef_enum2(:c7).should == :c7
82
+ TestEnum3.test_tagged_typedef_enum2(:c8).should == :c8
83
+ TestEnum3.test_tagged_typedef_enum3(:c9).should == :c9
84
+ TestEnum3.test_tagged_typedef_enum3(:c10).should == :c10
85
+ TestEnum3.test_tagged_typedef_enum3(:c11).should == :c11
86
+ TestEnum3.test_tagged_typedef_enum3(:c12).should == :c12
87
+ TestEnum3.test_tagged_typedef_enum4(:c13).should == :c13
88
+ TestEnum3.test_tagged_typedef_enum4(:c14).should == :c14
89
+ TestEnum3.test_tagged_typedef_enum4(:c15).should == :c15
90
+ TestEnum3.test_tagged_typedef_enum4(:c16).should == :c16
91
+ end
92
+ end
93
+
94
+ describe "All enums" do
95
+ it "have autonumbered constants when defined with names only" do
96
+ TestEnum1.enum_value(:c1).should == 0
97
+ TestEnum1.enum_value(:c2).should == 1
98
+ TestEnum1.enum_value(:c3).should == 2
99
+ TestEnum1.enum_value(:c4).should == 3
100
+
101
+ TestEnum3.enum_value(:c1).should == 0
102
+ TestEnum3.enum_value(:c2).should == 1
103
+ TestEnum3.enum_value(:c3).should == 2
104
+ TestEnum3.enum_value(:c4).should == 3
105
+ end
106
+ it "can have an explicit first constant and autonumbered subsequent constants" do
107
+ TestEnum1.enum_value(:c5).should == 42
108
+ TestEnum1.enum_value(:c6).should == 43
109
+ TestEnum1.enum_value(:c7).should == 44
110
+ TestEnum1.enum_value(:c8).should == 45
111
+
112
+ TestEnum3.enum_value(:c5).should == 42
113
+ TestEnum3.enum_value(:c6).should == 43
114
+ TestEnum3.enum_value(:c7).should == 44
115
+ TestEnum3.enum_value(:c8).should == 45
116
+ end
117
+ it "can have a mix of explicit and autonumbered constants" do
118
+ TestEnum1.enum_value(:c9).should == 42
119
+ TestEnum1.enum_value(:c10).should == 43
120
+ TestEnum1.enum_value(:c11).should == 4242
121
+ TestEnum1.enum_value(:c12).should == 4243
122
+
123
+ TestEnum3.enum_value(:c9).should == 42
124
+ TestEnum3.enum_value(:c10).should == 43
125
+ TestEnum3.enum_value(:c11).should == 4242
126
+ TestEnum3.enum_value(:c12).should == 4243
127
+ end
128
+ it "can have all its constants explicitely valued" do
129
+ TestEnum1.enum_value(:c13).should == 42
130
+ TestEnum1.enum_value(:c14).should == 4242
131
+ TestEnum1.enum_value(:c15).should == 424242
132
+ TestEnum1.enum_value(:c16).should == 42424242
133
+
134
+ TestEnum3.enum_value(:c13).should == 42
135
+ TestEnum3.enum_value(:c14).should == 4242
136
+ TestEnum3.enum_value(:c15).should == 424242
137
+ TestEnum3.enum_value(:c16).should == 42424242
138
+ end
139
+ it "return the constant corresponding to a specific value" do
140
+ enum = TestEnum3.enum_type(:enum_type1)
141
+ enum[0].should == :c1
142
+ enum[1].should == :c2
143
+ enum[2].should == :c3
144
+ enum[3].should == :c4
145
+
146
+ enum = TestEnum3.enum_type(:enum_type2)
147
+ enum[42].should == :c5
148
+ enum[43].should == :c6
149
+ enum[44].should == :c7
150
+ enum[45].should == :c8
151
+
152
+ enum = TestEnum3.enum_type(:enum_type3)
153
+ enum[42].should == :c9
154
+ enum[43].should == :c10
155
+ enum[4242].should == :c11
156
+ enum[4243].should == :c12
157
+
158
+ enum = TestEnum3.enum_type(:enum_type4)
159
+ enum[42].should == :c13
160
+ enum[4242].should == :c14
161
+ enum[424242].should == :c15
162
+ enum[42424242].should == :c16
163
+ end
164
+ end
@@ -0,0 +1,13 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+ describe "FFI.errno" do
3
+ module LibTest
4
+ extend FFI::Library
5
+ ffi_lib TestLibrary::PATH
6
+ attach_function :setLastError, [ :int ], :void
7
+ end
8
+ it "FFI.errno contains errno from last function" do
9
+ LibTest.setLastError(0)
10
+ LibTest.setLastError(0x12345678)
11
+ FFI.errno.should == 0x12345678
12
+ end
13
+ end
@@ -0,0 +1,144 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+ describe "Library" do
3
+ it "attach_function with no library specified" do
4
+ lambda {
5
+ Module.new do |m|
6
+ m.extend FFI::Library
7
+ attach_function :getpid, [ ], :uint
8
+ end
9
+ }.should_not raise_error
10
+ end
11
+ it "attach_function :getpid from this process" do
12
+ lambda {
13
+ Module.new do |m|
14
+ m.extend FFI::Library
15
+ attach_function :getpid, [ ], :uint
16
+ end.getpid.should == Process.pid
17
+ }.should_not raise_error
18
+ end
19
+ it "attach_function :getpid from [ 'c', 'libc.so.6'] " do
20
+ lambda {
21
+ Module.new do |m|
22
+ m.extend FFI::Library
23
+ ffi_lib 'c', 'libc.so.6'
24
+ attach_function :getpid, [ ], :uint
25
+ end.getpid.should == Process.pid
26
+ }.should_not raise_error
27
+ end
28
+ it "attach_function :getpid from [ 'libc.so.6', 'c' ] " do
29
+ lambda {
30
+ Module.new do |m|
31
+ m.extend FFI::Library
32
+ ffi_lib 'libc.so.6', 'c'
33
+ attach_function :getpid, [ ], :uint
34
+ end.getpid.should == Process.pid
35
+ }.should_not raise_error
36
+ end
37
+ it "attach_function :getpid from [ 'libfubar.so.0xdeadbeef', nil, 'c' ] " do
38
+ lambda {
39
+ Module.new do |m|
40
+ m.extend FFI::Library
41
+ ffi_lib 'libfubar.so.0xdeadbeef', nil, 'c'
42
+ attach_function :getpid, [ ], :uint
43
+ end.getpid.should == Process.pid
44
+ }.should_not raise_error
45
+ end
46
+ it "attach_function :getpid from [ 'libfubar.so.0xdeadbeef' ] " do
47
+ lambda {
48
+ Module.new do |m|
49
+ m.extend FFI::Library
50
+ ffi_lib 'libfubar.so.0xdeadbeef'
51
+ attach_function :getpid, [ ], :uint
52
+ end.getpid.should == Process.pid
53
+ }.should raise_error(LoadError)
54
+ end
55
+ def gvar_lib(name, type)
56
+ Module.new do |m|
57
+ m.extend FFI::Library
58
+ ffi_lib TestLibrary::PATH
59
+ attach_variable :gvar, "gvar_#{name}", type
60
+ attach_function :get, "gvar_#{name}_get", [], type
61
+ attach_function :set, "gvar_#{name}_set", [ type ], :void
62
+ end
63
+ end
64
+ def gvar_test(name, type, val)
65
+ lib = gvar_lib(name, type)
66
+ lib.set(val)
67
+ lib.gvar.should == val
68
+ lib.set(0)
69
+ lib.gvar = val
70
+ lib.get.should == val
71
+ end
72
+ [ 0, 127, -128, -1 ].each do |i|
73
+ it ":char variable" do
74
+ gvar_test("s8", :char, i)
75
+ end
76
+ end
77
+ [ 0, 0x7f, 0x80, 0xff ].each do |i|
78
+ it ":uchar variable" do
79
+ gvar_test("u8", :uchar, i)
80
+ end
81
+ end
82
+ [ 0, 0x7fff, -0x8000, -1 ].each do |i|
83
+ it ":short variable" do
84
+ gvar_test("s16", :short, i)
85
+ end
86
+ end
87
+ [ 0, 0x7fff, 0x8000, 0xffff ].each do |i|
88
+ it ":ushort variable" do
89
+ gvar_test("u16", :ushort, i)
90
+ end
91
+ end
92
+ [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
93
+ it ":int variable" do
94
+ gvar_test("s32", :int, i)
95
+ end
96
+ end
97
+ [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
98
+ it ":uint variable" do
99
+ gvar_test("u32", :uint, i)
100
+ end
101
+ end
102
+ [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
103
+ it ":long_long variable" do
104
+ gvar_test("s64", :long_long, i)
105
+ end
106
+ end
107
+ [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
108
+ it ":ulong_long variable" do
109
+ gvar_test("u64", :ulong_long, i)
110
+ end
111
+ end
112
+ if FFI::Platform::LONG_SIZE == 32
113
+ [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
114
+ it ":long variable" do
115
+ gvar_test("long", :long, i)
116
+ end
117
+ end
118
+ [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
119
+ it ":ulong variable" do
120
+ gvar_test("ulong", :ulong, i)
121
+ end
122
+ end
123
+ else
124
+ [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
125
+ it ":long variable" do
126
+ gvar_test("long", :long, i)
127
+ end
128
+ end
129
+ [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
130
+ it ":ulong variable" do
131
+ gvar_test("ulong", :ulong, i)
132
+ end
133
+ end
134
+ end
135
+ it "Pointer variable" do
136
+ lib = gvar_lib("pointer", :pointer)
137
+ val = FFI::MemoryPointer.new :long
138
+ lib.set(val)
139
+ lib.gvar.should == val
140
+ lib.set(nil)
141
+ lib.gvar = val
142
+ lib.get.should == val
143
+ end
144
+ end
@@ -0,0 +1,56 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+ require 'java' if RUBY_PLATFORM =~ /java/
3
+
4
+ describe "Managed Struct" do
5
+ include FFI
6
+ module LibTest
7
+ extend FFI::Library
8
+ ffi_lib TestLibrary::PATH
9
+ attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer
10
+ end
11
+ it "should raise an error if release() is not defined" do
12
+ class NoRelease < FFI::ManagedStruct ; layout :i, :int; end
13
+ lambda { NoRelease.new(LibTest.ptr_from_address(0x12345678)) }.should raise_error(NoMethodError)
14
+ end
15
+
16
+ it "should be the right class" do
17
+ class WhatClassAmI < FFI::ManagedStruct
18
+ layout :i, :int
19
+ def self.release
20
+ end
21
+ end
22
+
23
+ WhatClassAmI.new(LibTest.ptr_from_address(0x12345678)).class.should == WhatClassAmI
24
+ end
25
+
26
+ it "should release memory properly" do
27
+ class PleaseReleaseMe < FFI::ManagedStruct
28
+ layout :i, :int
29
+ @@count = 0
30
+ def self.release
31
+ @@count += 1
32
+ end
33
+ def self.wait_gc(count)
34
+ loop = 5
35
+ while loop > 0 && @@count < count
36
+ loop -= 1
37
+ if RUBY_PLATFORM =~ /java/
38
+ java.lang.System.gc
39
+ else
40
+ GC.start
41
+ end
42
+ sleep 0.05 if @@count < count
43
+ end
44
+ end
45
+ end
46
+
47
+ loop_count = 30
48
+ wiggle_room = 2
49
+
50
+ PleaseReleaseMe.should_receive(:release).at_least(loop_count-wiggle_room).times
51
+ loop_count.times do
52
+ s = PleaseReleaseMe.new(LibTest.ptr_from_address(0x12345678))
53
+ end
54
+ PleaseReleaseMe.wait_gc loop_count
55
+ end
56
+ end
@@ -0,0 +1,231 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+ describe "Function with primitive integer arguments" do
3
+ module LibTest
4
+ extend FFI::Library
5
+ ffi_lib TestLibrary::PATH
6
+ attach_function :ret_s8, [ :char ], :char
7
+ attach_function :ret_u8, [ :uchar ], :uchar
8
+ attach_function :ret_s16, [ :short ], :short
9
+ attach_function :ret_u16, [ :ushort ], :ushort
10
+ attach_function :ret_s32, [ :int ], :int
11
+ attach_function :ret_u32, [ :uint ], :uint
12
+ attach_function :ret_s64, [ :long_long ], :long_long
13
+ attach_function :ret_u64, [ :ulong_long ], :ulong_long
14
+ attach_function :ret_long, [ :long ], :long
15
+ attach_function :ret_ulong, [ :ulong ], :ulong
16
+ attach_function :set_s8, [ :char ], :void
17
+ attach_function :get_s8, [ ], :char
18
+ attach_function :set_float, [ :float ], :void
19
+ attach_function :get_float, [ ], :float
20
+ attach_function :set_double, [ :double ], :void
21
+ attach_function :get_double, [ ], :double
22
+ end
23
+ it "int8.size" do
24
+ FFI::TYPE_INT8.size.should == 1
25
+ end
26
+ it "uint8.size" do
27
+ FFI::TYPE_UINT8.size.should == 1
28
+ end
29
+ it "int16.size" do
30
+ FFI::TYPE_INT16.size.should == 2
31
+ end
32
+ it "uint16.size" do
33
+ FFI::TYPE_UINT16.size.should == 2
34
+ end
35
+ it "int32.size" do
36
+ FFI::TYPE_INT32.size.should == 4
37
+ end
38
+ it "uint32.size" do
39
+ FFI::TYPE_UINT32.size.should == 4
40
+ end
41
+ it "int64.size" do
42
+ FFI::TYPE_INT64.size.should == 8
43
+ end
44
+ it "uint64.size" do
45
+ FFI::TYPE_UINT64.size.should == 8
46
+ end
47
+ it "float.size" do
48
+ FFI::TYPE_FLOAT32.size.should == 4
49
+ end
50
+ it "double.size" do
51
+ FFI::TYPE_FLOAT64.size.should == 8
52
+ end
53
+ [ 0, 127, -128, -1 ].each do |i|
54
+ it ":char call(:char (#{i}))" do
55
+ LibTest.ret_s8(i).should == i
56
+ end
57
+ end
58
+ [ 0, 0x7f, 0x80, 0xff ].each do |i|
59
+ it ":uchar call(:uchar (#{i}))" do
60
+ LibTest.ret_u8(i).should == i
61
+ end
62
+ end
63
+ [ 0, 0x7fff, -0x8000, -1 ].each do |i|
64
+ it ":short call(:short (#{i}))" do
65
+ LibTest.ret_s16(i).should == i
66
+ end
67
+ end
68
+ [ 0, 0x7fff, 0x8000, 0xffff ].each do |i|
69
+ it ":ushort call(:ushort (#{i}))" do
70
+ LibTest.ret_u16(i).should == i
71
+ end
72
+ end
73
+ [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
74
+ it ":int call(:int (#{i}))" do
75
+ LibTest.ret_s32(i).should == i
76
+ end
77
+ end
78
+ [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
79
+ it ":uint call(:uint (#{i}))" do
80
+ LibTest.ret_u32(i).should == i
81
+ end
82
+ end
83
+ [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
84
+ it ":long_long call(:long_long (#{i}))" do
85
+ LibTest.ret_s64(i).should == i
86
+ end
87
+ end
88
+ [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
89
+ it ":ulong_long call(:ulong_long (#{i}))" do
90
+ LibTest.ret_u64(i).should == i
91
+ end
92
+ end
93
+ if FFI::Platform::LONG_SIZE == 32
94
+ [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
95
+ it ":long call(:long (#{i}))" do
96
+ LibTest.ret_long(i).should == i
97
+ end
98
+ end
99
+ [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
100
+ it ":ulong call(:ulong (#{i}))" do
101
+ LibTest.ret_ulong(i).should == i
102
+ end
103
+ end
104
+ else
105
+ [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
106
+ it ":long call(:long (#{i}))" do
107
+ LibTest.ret_long(i).should == i
108
+ end
109
+ end
110
+ [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
111
+ it ":ulong call(:ulong (#{i}))" do
112
+ LibTest.ret_ulong(i).should == i
113
+ end
114
+ end
115
+ [ 0.0, 0.1, 1.1, 1.23 ].each do |f|
116
+ it ":float call(:double (#{f}))" do
117
+ LibTest.set_float(f)
118
+ (LibTest.get_float - f).abs.should < 0.001
119
+ end
120
+ end
121
+ [ 0.0, 0.1, 1.1, 1.23 ].each do |f|
122
+ it ":double call(:double (#{f}))" do
123
+ LibTest.set_double(f)
124
+ (LibTest.get_double - f).abs.should < 0.001
125
+ end
126
+ end
127
+ end
128
+ end
129
+ describe "Integer parameter range checking" do
130
+ [ 128, -129 ].each do |i|
131
+ it ":char call(:char (#{i}))" do
132
+ lambda { LibTest.ret_int8_t(i).should == i }.should raise_error
133
+ end
134
+ end
135
+ [ -1, 256 ].each do |i|
136
+ it ":uchar call(:uchar (#{i}))" do
137
+ lambda { LibTest.ret_u_int8_t(i).should == i }.should raise_error
138
+ end
139
+ end
140
+ [ 0x8000, -0x8001 ].each do |i|
141
+ it ":short call(:short (#{i}))" do
142
+ lambda { LibTest.ret_int16_t(i).should == i }.should raise_error
143
+ end
144
+ end
145
+ [ -1, 0x10000 ].each do |i|
146
+ it ":ushort call(:ushort (#{i}))" do
147
+ lambda { LibTest.ret_u_int16_t(i).should == i }.should raise_error
148
+ end
149
+ end
150
+ [ 0x80000000, -0x80000001 ].each do |i|
151
+ it ":int call(:int (#{i}))" do
152
+ lambda { LibTest.ret_int32_t(i).should == i }.should raise_error
153
+ end
154
+ end
155
+ [ -1, 0x100000000 ].each do |i|
156
+ it ":ushort call(:ushort (#{i}))" do
157
+ lambda { LibTest.ret_u_int32_t(i).should == i }.should raise_error
158
+ end
159
+ end
160
+ end
161
+ describe "Three different size Integer arguments" do
162
+ TYPE_MAP = {
163
+ 's8' => :char, 'u8' => :uchar, 's16' => :short, 'u16' => :ushort,
164
+ 's32' => :int, 'u32' => :uint, 's64' => :long_long, 'u64' => :ulong_long,
165
+ 'sL' => :long, 'uL' => :ulong, 'f32' => :float, 'f64' => :double
166
+ }
167
+ TYPES = TYPE_MAP.keys
168
+ module LibTest
169
+ extend FFI::Library
170
+ ffi_lib TestLibrary::PATH
171
+
172
+
173
+ [ 's32', 'u32', 's64', 'u64' ].each do |rt|
174
+ TYPES.each do |t1|
175
+ TYPES.each do |t2|
176
+ TYPES.each do |t3|
177
+ begin
178
+ attach_function "pack_#{t1}#{t2}#{t3}_#{rt}",
179
+ [ TYPE_MAP[t1], TYPE_MAP[t2], TYPE_MAP[t3], :buffer_out ], :void
180
+ rescue FFI::NotFoundError
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
187
+
188
+ PACK_VALUES = {
189
+ 's8' => [ 0x12 ],
190
+ 'u8' => [ 0x34 ],
191
+ 's16' => [ 0x5678 ],
192
+ 'u16' => [ 0x9abc ],
193
+ 's32' => [ 0x7654321f ],
194
+ 'u32' => [ 0xfee1babe ],
195
+ 'sL' => [ 0x1f2e3d4c ],
196
+ 'uL' => [ 0xf7e8d9ca ],
197
+ 's64' => [ 0x1eafdeadbeefa1b2 ],
198
+ # 'f32' => [ 1.234567 ],
199
+ 'f64' => [ 9.87654321 ]
200
+ }
201
+ module Number
202
+ def self.verify(p, off, t, v)
203
+ if t == 'f32'
204
+ p.get_float32(off).should == v
205
+ elsif t == 'f64'
206
+ p.get_float64(off).should == v
207
+ else
208
+ p.get_int64(off).should == v
209
+ end
210
+ end
211
+ end
212
+ PACK_VALUES.keys.each do |t1|
213
+ PACK_VALUES.keys.each do |t2|
214
+ PACK_VALUES.keys.each do |t3|
215
+ PACK_VALUES[t1].each do |v1|
216
+ PACK_VALUES[t2].each do |v2|
217
+ PACK_VALUES[t3].each do |v3|
218
+ it "call(#{TYPE_MAP[t1]} (#{v1}), #{TYPE_MAP[t2]} (#{v2}), #{TYPE_MAP[t3]} (#{v3}))" do
219
+ p = FFI::Buffer.new :long_long, 3
220
+ LibTest.send("pack_#{t1}#{t2}#{t3}_s64", v1, v2, v3, p)
221
+ Number.verify(p, 0, t1, v1)
222
+ Number.verify(p, 8, t2, v2)
223
+ Number.verify(p, 16, t3, v3)
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end
229
+ end
230
+ end
231
+ end