ffi 1.9.3-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ffi might be problematic. Click here for more details.

Files changed (436) hide show
  1. data/COPYING +49 -0
  2. data/LICENSE +24 -0
  3. data/README.md +109 -0
  4. data/Rakefile +220 -0
  5. data/ext/ffi_c/AbstractMemory.c +1032 -0
  6. data/ext/ffi_c/AbstractMemory.h +175 -0
  7. data/ext/ffi_c/ArrayType.c +162 -0
  8. data/ext/ffi_c/ArrayType.h +59 -0
  9. data/ext/ffi_c/Buffer.c +365 -0
  10. data/ext/ffi_c/Call.c +465 -0
  11. data/ext/ffi_c/Call.h +93 -0
  12. data/ext/ffi_c/ClosurePool.c +283 -0
  13. data/ext/ffi_c/ClosurePool.h +57 -0
  14. data/ext/ffi_c/DataConverter.c +91 -0
  15. data/ext/ffi_c/DynamicLibrary.c +333 -0
  16. data/ext/ffi_c/DynamicLibrary.h +49 -0
  17. data/ext/ffi_c/Function.c +999 -0
  18. data/ext/ffi_c/Function.h +87 -0
  19. data/ext/ffi_c/FunctionInfo.c +271 -0
  20. data/ext/ffi_c/LastError.c +184 -0
  21. data/ext/ffi_c/LastError.h +47 -0
  22. data/ext/ffi_c/LongDouble.c +63 -0
  23. data/ext/ffi_c/LongDouble.h +51 -0
  24. data/ext/ffi_c/MappedType.c +168 -0
  25. data/ext/ffi_c/MappedType.h +59 -0
  26. data/ext/ffi_c/MemoryPointer.c +197 -0
  27. data/ext/ffi_c/MemoryPointer.h +53 -0
  28. data/ext/ffi_c/MethodHandle.c +360 -0
  29. data/ext/ffi_c/MethodHandle.h +55 -0
  30. data/ext/ffi_c/Platform.c +121 -0
  31. data/ext/ffi_c/Platform.h +45 -0
  32. data/ext/ffi_c/Pointer.c +508 -0
  33. data/ext/ffi_c/Pointer.h +63 -0
  34. data/ext/ffi_c/Struct.c +828 -0
  35. data/ext/ffi_c/Struct.h +106 -0
  36. data/ext/ffi_c/StructByReference.c +190 -0
  37. data/ext/ffi_c/StructByReference.h +50 -0
  38. data/ext/ffi_c/StructByValue.c +150 -0
  39. data/ext/ffi_c/StructByValue.h +55 -0
  40. data/ext/ffi_c/StructLayout.c +698 -0
  41. data/ext/ffi_c/Thread.c +352 -0
  42. data/ext/ffi_c/Thread.h +95 -0
  43. data/ext/ffi_c/Type.c +397 -0
  44. data/ext/ffi_c/Type.h +62 -0
  45. data/ext/ffi_c/Types.c +139 -0
  46. data/ext/ffi_c/Types.h +89 -0
  47. data/ext/ffi_c/Variadic.c +276 -0
  48. data/ext/ffi_c/compat.h +83 -0
  49. data/ext/ffi_c/extconf.rb +64 -0
  50. data/ext/ffi_c/ffi.c +98 -0
  51. data/ext/ffi_c/libffi.bsd.mk +34 -0
  52. data/ext/ffi_c/libffi.darwin.mk +95 -0
  53. data/ext/ffi_c/libffi.gnu.mk +31 -0
  54. data/ext/ffi_c/libffi.mk +13 -0
  55. data/ext/ffi_c/libffi.vc.mk +26 -0
  56. data/ext/ffi_c/libffi.vc64.mk +26 -0
  57. data/ext/ffi_c/libffi/ChangeLog +4600 -0
  58. data/ext/ffi_c/libffi/ChangeLog.libffi +584 -0
  59. data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
  60. data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
  61. data/ext/ffi_c/libffi/LICENSE +21 -0
  62. data/ext/ffi_c/libffi/Makefile.am +196 -0
  63. data/ext/ffi_c/libffi/Makefile.in +1820 -0
  64. data/ext/ffi_c/libffi/Makefile.vc +141 -0
  65. data/ext/ffi_c/libffi/Makefile.vc64 +141 -0
  66. data/ext/ffi_c/libffi/README +342 -0
  67. data/ext/ffi_c/libffi/acinclude.m4 +92 -0
  68. data/ext/ffi_c/libffi/aclocal.m4 +1873 -0
  69. data/ext/ffi_c/libffi/build-ios.sh +67 -0
  70. data/ext/ffi_c/libffi/compile +143 -0
  71. data/ext/ffi_c/libffi/config.guess +1501 -0
  72. data/ext/ffi_c/libffi/config.sub +1705 -0
  73. data/ext/ffi_c/libffi/configure +17191 -0
  74. data/ext/ffi_c/libffi/configure.ac +496 -0
  75. data/ext/ffi_c/libffi/configure.host +11 -0
  76. data/ext/ffi_c/libffi/depcomp +630 -0
  77. data/ext/ffi_c/libffi/doc/libffi.info +593 -0
  78. data/ext/ffi_c/libffi/doc/libffi.texi +600 -0
  79. data/ext/ffi_c/libffi/doc/stamp-vti +4 -0
  80. data/ext/ffi_c/libffi/doc/version.texi +4 -0
  81. data/ext/ffi_c/libffi/fficonfig.h.in +199 -0
  82. data/ext/ffi_c/libffi/fficonfig.hw +57 -0
  83. data/ext/ffi_c/libffi/include/Makefile.am +9 -0
  84. data/ext/ffi_c/libffi/include/Makefile.in +487 -0
  85. data/ext/ffi_c/libffi/include/ffi.h.in +427 -0
  86. data/ext/ffi_c/libffi/include/ffi.h.vc +427 -0
  87. data/ext/ffi_c/libffi/include/ffi.h.vc64 +427 -0
  88. data/ext/ffi_c/libffi/include/ffi_common.h +126 -0
  89. data/ext/ffi_c/libffi/install-sh +520 -0
  90. data/ext/ffi_c/libffi/libffi.pc.in +10 -0
  91. data/ext/ffi_c/libffi/libtool-version +29 -0
  92. data/ext/ffi_c/libffi/ltmain.sh +9636 -0
  93. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +176 -0
  94. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +195 -0
  95. data/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 +76 -0
  96. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +63 -0
  97. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +70 -0
  98. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +300 -0
  99. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +215 -0
  100. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +79 -0
  101. data/ext/ffi_c/libffi/m4/libtool.m4 +7831 -0
  102. data/ext/ffi_c/libffi/m4/ltoptions.m4 +369 -0
  103. data/ext/ffi_c/libffi/m4/ltsugar.m4 +123 -0
  104. data/ext/ffi_c/libffi/m4/ltversion.m4 +23 -0
  105. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +98 -0
  106. data/ext/ffi_c/libffi/man/Makefile.am +8 -0
  107. data/ext/ffi_c/libffi/man/Makefile.in +466 -0
  108. data/ext/ffi_c/libffi/man/ffi.3 +31 -0
  109. data/ext/ffi_c/libffi/man/ffi_call.3 +103 -0
  110. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +66 -0
  111. data/ext/ffi_c/libffi/mdate-sh +201 -0
  112. data/ext/ffi_c/libffi/missing +376 -0
  113. data/ext/ffi_c/libffi/msvcc.sh +197 -0
  114. data/ext/ffi_c/libffi/src/alpha/ffi.c +284 -0
  115. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +48 -0
  116. data/ext/ffi_c/libffi/src/alpha/osf.S +387 -0
  117. data/ext/ffi_c/libffi/src/arm/ffi.c +728 -0
  118. data/ext/ffi_c/libffi/src/arm/ffitarget.h +65 -0
  119. data/ext/ffi_c/libffi/src/arm/gentramp.sh +118 -0
  120. data/ext/ffi_c/libffi/src/arm/sysv.S +497 -0
  121. data/ext/ffi_c/libffi/src/arm/trampoline.S +4450 -0
  122. data/ext/ffi_c/libffi/src/avr32/ffi.c +423 -0
  123. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +50 -0
  124. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  125. data/ext/ffi_c/libffi/src/closures.c +615 -0
  126. data/ext/ffi_c/libffi/src/cris/ffi.c +383 -0
  127. data/ext/ffi_c/libffi/src/cris/ffitarget.h +51 -0
  128. data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
  129. data/ext/ffi_c/libffi/src/debug.c +59 -0
  130. data/ext/ffi_c/libffi/src/dlmalloc.c +5161 -0
  131. data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
  132. data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
  133. data/ext/ffi_c/libffi/src/frv/ffitarget.h +57 -0
  134. data/ext/ffi_c/libffi/src/ia64/ffi.c +582 -0
  135. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +50 -0
  136. data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
  137. data/ext/ffi_c/libffi/src/ia64/unix.S +560 -0
  138. data/ext/ffi_c/libffi/src/java_raw_api.c +356 -0
  139. data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
  140. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +48 -0
  141. data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
  142. data/ext/ffi_c/libffi/src/m68k/ffi.c +288 -0
  143. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +49 -0
  144. data/ext/ffi_c/libffi/src/m68k/sysv.S +270 -0
  145. data/ext/ffi_c/libffi/src/mips/ffi.c +1036 -0
  146. data/ext/ffi_c/libffi/src/mips/ffitarget.h +242 -0
  147. data/ext/ffi_c/libffi/src/mips/n32.S +591 -0
  148. data/ext/ffi_c/libffi/src/mips/o32.S +381 -0
  149. data/ext/ffi_c/libffi/src/moxie/eabi.S +128 -0
  150. data/ext/ffi_c/libffi/src/moxie/ffi.c +276 -0
  151. data/ext/ffi_c/libffi/src/pa/ffi.c +719 -0
  152. data/ext/ffi_c/libffi/src/pa/ffitarget.h +78 -0
  153. data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
  154. data/ext/ffi_c/libffi/src/pa/linux.S +357 -0
  155. data/ext/ffi_c/libffi/src/powerpc/aix.S +328 -0
  156. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +445 -0
  157. data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
  158. data/ext/ffi_c/libffi/src/powerpc/darwin.S +383 -0
  159. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +575 -0
  160. data/ext/ffi_c/libffi/src/powerpc/ffi.c +1448 -0
  161. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +1359 -0
  162. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +139 -0
  163. data/ext/ffi_c/libffi/src/powerpc/linux64.S +187 -0
  164. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +236 -0
  165. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +327 -0
  166. data/ext/ffi_c/libffi/src/powerpc/sysv.S +219 -0
  167. data/ext/ffi_c/libffi/src/prep_cif.c +177 -0
  168. data/ext/ffi_c/libffi/src/raw_api.c +254 -0
  169. data/ext/ffi_c/libffi/src/s390/ffi.c +780 -0
  170. data/ext/ffi_c/libffi/src/s390/ffitarget.h +62 -0
  171. data/ext/ffi_c/libffi/src/s390/sysv.S +434 -0
  172. data/ext/ffi_c/libffi/src/sh/ffi.c +716 -0
  173. data/ext/ffi_c/libffi/src/sh/ffitarget.h +49 -0
  174. data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
  175. data/ext/ffi_c/libffi/src/sh64/ffi.c +468 -0
  176. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +53 -0
  177. data/ext/ffi_c/libffi/src/sh64/sysv.S +539 -0
  178. data/ext/ffi_c/libffi/src/sparc/ffi.c +669 -0
  179. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +68 -0
  180. data/ext/ffi_c/libffi/src/sparc/v8.S +313 -0
  181. data/ext/ffi_c/libffi/src/sparc/v9.S +307 -0
  182. data/ext/ffi_c/libffi/src/types.c +77 -0
  183. data/ext/ffi_c/libffi/src/x86/darwin.S +444 -0
  184. data/ext/ffi_c/libffi/src/x86/darwin64.S +416 -0
  185. data/ext/ffi_c/libffi/src/x86/ffi.c +644 -0
  186. data/ext/ffi_c/libffi/src/x86/ffi64.c +635 -0
  187. data/ext/ffi_c/libffi/src/x86/ffitarget.h +121 -0
  188. data/ext/ffi_c/libffi/src/x86/freebsd.S +458 -0
  189. data/ext/ffi_c/libffi/src/x86/sysv.S +468 -0
  190. data/ext/ffi_c/libffi/src/x86/unix64.S +426 -0
  191. data/ext/ffi_c/libffi/src/x86/win32.S +1065 -0
  192. data/ext/ffi_c/libffi/src/x86/win64.S +468 -0
  193. data/ext/ffi_c/libffi/testsuite/Makefile.am +80 -0
  194. data/ext/ffi_c/libffi/testsuite/Makefile.in +500 -0
  195. data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
  196. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +300 -0
  197. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +350 -0
  198. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +263 -0
  199. data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +32 -0
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +89 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +81 -0
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +81 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +82 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +89 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +92 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +90 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +64 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +94 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +95 -0
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +96 -0
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +102 -0
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +89 -0
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +91 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +93 -0
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +113 -0
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +90 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +95 -0
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +90 -0
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +90 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +98 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +90 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +109 -0
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +98 -0
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +124 -0
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +113 -0
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +99 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +117 -0
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +97 -0
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +88 -0
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +90 -0
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +91 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +93 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +91 -0
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +92 -0
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +134 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +117 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +95 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +91 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +91 -0
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +92 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +91 -0
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +91 -0
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +93 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +43 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +60 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +42 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +60 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +74 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +74 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +86 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +91 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +74 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +86 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +140 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +44 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +42 -0
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +42 -0
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +42 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +43 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +47 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +43 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +36 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +26 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +153 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +58 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +58 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +72 -0
  274. data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +342 -0
  276. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +69 -0
  277. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +63 -0
  278. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +53 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +152 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +161 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +133 -0
  282. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +110 -0
  283. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +111 -0
  284. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +111 -0
  285. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +112 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +131 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +111 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +131 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +131 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +90 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  293. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +35 -0
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +43 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +125 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +65 -0
  314. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
  315. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +59 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +63 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +65 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +80 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +67 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +96 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +35 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +124 -0
  326. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
  327. data/ext/ffi_c/libffi/texinfo.tex +7210 -0
  328. data/ext/ffi_c/rbffi.h +57 -0
  329. data/ext/ffi_c/rbffi_endian.h +59 -0
  330. data/ext/ffi_c/win32/stdbool.h +8 -0
  331. data/ext/ffi_c/win32/stdint.h +201 -0
  332. data/ffi.gemspec +22 -0
  333. data/gen/Rakefile +30 -0
  334. data/lib/ffi.rb +28 -0
  335. data/lib/ffi/autopointer.rb +194 -0
  336. data/lib/ffi/buffer.rb +4 -0
  337. data/lib/ffi/callback.rb +4 -0
  338. data/lib/ffi/enum.rb +173 -0
  339. data/lib/ffi/errno.rb +43 -0
  340. data/lib/ffi/ffi.rb +44 -0
  341. data/lib/ffi/io.rb +62 -0
  342. data/lib/ffi/library.rb +499 -0
  343. data/lib/ffi/managedstruct.rb +84 -0
  344. data/lib/ffi/memorypointer.rb +1 -0
  345. data/lib/ffi/platform.rb +148 -0
  346. data/lib/ffi/platform/arm-linux/types.conf +104 -0
  347. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  348. data/lib/ffi/platform/i386-darwin/types.conf +100 -0
  349. data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
  350. data/lib/ffi/platform/i386-gnu/types.conf +107 -0
  351. data/lib/ffi/platform/i386-linux/types.conf +103 -0
  352. data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
  353. data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
  354. data/lib/ffi/platform/i386-solaris/types.conf +122 -0
  355. data/lib/ffi/platform/i386-windows/types.conf +105 -0
  356. data/lib/ffi/platform/ia64-linux/types.conf +104 -0
  357. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  358. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  359. data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
  360. data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
  361. data/lib/ffi/platform/powerpc-linux/types.conf +100 -0
  362. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  363. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  364. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  365. data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
  366. data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
  367. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  368. data/lib/ffi/platform/x86_64-darwin/types.conf +100 -0
  369. data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
  370. data/lib/ffi/platform/x86_64-linux/types.conf +102 -0
  371. data/lib/ffi/platform/x86_64-netbsd/types.conf +126 -0
  372. data/lib/ffi/platform/x86_64-openbsd/types.conf +128 -0
  373. data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
  374. data/lib/ffi/platform/x86_64-windows/types.conf +27 -0
  375. data/lib/ffi/pointer.rb +134 -0
  376. data/lib/ffi/struct.rb +367 -0
  377. data/lib/ffi/struct_layout_builder.rb +222 -0
  378. data/lib/ffi/tools/const_generator.rb +229 -0
  379. data/lib/ffi/tools/generator.rb +60 -0
  380. data/lib/ffi/tools/generator_task.rb +36 -0
  381. data/lib/ffi/tools/struct_generator.rb +194 -0
  382. data/lib/ffi/tools/types_generator.rb +135 -0
  383. data/lib/ffi/types.rb +190 -0
  384. data/lib/ffi/union.rb +43 -0
  385. data/lib/ffi/variadic.rb +78 -0
  386. data/lib/ffi/version.rb +4 -0
  387. data/lib/ffi_c.so +0 -0
  388. data/libtest/Benchmark.c +52 -0
  389. data/libtest/BoolTest.c +34 -0
  390. data/libtest/BufferTest.c +31 -0
  391. data/libtest/ClosureTest.c +190 -0
  392. data/libtest/EnumTest.c +34 -0
  393. data/libtest/FunctionTest.c +58 -0
  394. data/libtest/GNUmakefile +149 -0
  395. data/libtest/GlobalVariable.c +62 -0
  396. data/libtest/LastErrorTest.c +21 -0
  397. data/libtest/NumberTest.c +132 -0
  398. data/libtest/PointerTest.c +63 -0
  399. data/libtest/ReferenceTest.c +23 -0
  400. data/libtest/StringTest.c +34 -0
  401. data/libtest/StructTest.c +243 -0
  402. data/libtest/UnionTest.c +43 -0
  403. data/libtest/VariadicTest.c +62 -0
  404. data/spec/ffi/async_callback_spec.rb +35 -0
  405. data/spec/ffi/bool_spec.rb +29 -0
  406. data/spec/ffi/buffer_spec.rb +251 -0
  407. data/spec/ffi/callback_spec.rb +667 -0
  408. data/spec/ffi/custom_param_type.rb +36 -0
  409. data/spec/ffi/custom_type_spec.rb +74 -0
  410. data/spec/ffi/dup_spec.rb +54 -0
  411. data/spec/ffi/enum_spec.rb +220 -0
  412. data/spec/ffi/errno_spec.rb +18 -0
  413. data/spec/ffi/ffi_spec.rb +29 -0
  414. data/spec/ffi/function_spec.rb +76 -0
  415. data/spec/ffi/library_spec.rb +216 -0
  416. data/spec/ffi/long_double.rb +30 -0
  417. data/spec/ffi/managed_struct_spec.rb +57 -0
  418. data/spec/ffi/number_spec.rb +236 -0
  419. data/spec/ffi/pointer_spec.rb +265 -0
  420. data/spec/ffi/rbx/attach_function_spec.rb +28 -0
  421. data/spec/ffi/rbx/memory_pointer_spec.rb +123 -0
  422. data/spec/ffi/rbx/spec_helper.rb +1 -0
  423. data/spec/ffi/rbx/struct_spec.rb +13 -0
  424. data/spec/ffi/spec_helper.rb +33 -0
  425. data/spec/ffi/string_spec.rb +108 -0
  426. data/spec/ffi/strptr_spec.rb +50 -0
  427. data/spec/ffi/struct_by_ref_spec.rb +43 -0
  428. data/spec/ffi/struct_callback_spec.rb +69 -0
  429. data/spec/ffi/struct_initialize_spec.rb +35 -0
  430. data/spec/ffi/struct_packed_spec.rb +51 -0
  431. data/spec/ffi/struct_spec.rb +748 -0
  432. data/spec/ffi/typedef_spec.rb +78 -0
  433. data/spec/ffi/union_spec.rb +65 -0
  434. data/spec/ffi/variadic_spec.rb +92 -0
  435. data/spec/spec.opts +4 -0
  436. metadata +562 -0
@@ -0,0 +1,216 @@
1
+ #
2
+ # This file is part of ruby-ffi.
3
+ # For licensing, see LICENSE.SPECS
4
+ #
5
+
6
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
7
+ describe "Library" do
8
+ describe "#ffi_convention" do
9
+ it "defaults to :default" do
10
+ m = Module.new do
11
+ extend FFI::Library
12
+ end
13
+ m.ffi_convention.should == :default
14
+ end
15
+
16
+ it "should be settable" do
17
+ m = Module.new do
18
+ extend FFI::Library
19
+ end
20
+
21
+ m.ffi_convention.should == :default
22
+ m.ffi_convention :stdcall
23
+ m.ffi_convention.should == :stdcall
24
+ end
25
+ end
26
+
27
+ describe "ffi_lib" do
28
+ it "empty name list should raise error" do
29
+ lambda {
30
+ Module.new do |m|
31
+ m.extend FFI::Library
32
+ ffi_lib
33
+ end
34
+ }.should raise_error(LoadError)
35
+ end
36
+
37
+ end
38
+ unless RbConfig::CONFIG['target_os'] =~ /mswin|mingw/
39
+ it "attach_function with no library specified" do
40
+ lambda {
41
+ Module.new do |m|
42
+ m.extend FFI::Library
43
+ attach_function :getpid, [ ], :uint
44
+ end
45
+ }.should raise_error
46
+ end
47
+ it "attach_function :getpid from this process" do
48
+ lambda {
49
+ Module.new do |m|
50
+ m.extend FFI::Library
51
+ ffi_lib FFI::Library::CURRENT_PROCESS
52
+ attach_function :getpid, [ ], :uint
53
+ end.getpid.should == Process.pid
54
+ }.should_not raise_error
55
+ end
56
+ it "attach_function :getpid from [ 'c', 'libc.so.6'] " do
57
+ lambda {
58
+ Module.new do |m|
59
+ m.extend FFI::Library
60
+ ffi_lib [ 'c', 'libc.so.6' ]
61
+ attach_function :getpid, [ ], :uint
62
+ end.getpid.should == Process.pid
63
+ }.should_not raise_error
64
+ end
65
+ it "attach_function :getpid from [ 'libc.so.6', 'c' ] " do
66
+ lambda {
67
+ Module.new do |m|
68
+ m.extend FFI::Library
69
+ ffi_lib [ 'libc.so.6', 'c' ]
70
+ attach_function :getpid, [ ], :uint
71
+ end.getpid.should == Process.pid
72
+ }.should_not raise_error
73
+ end
74
+ it "attach_function :getpid from [ 'libfubar.so.0xdeadbeef', nil, 'c' ] " do
75
+ lambda {
76
+ Module.new do |m|
77
+ m.extend FFI::Library
78
+ ffi_lib [ 'libfubar.so.0xdeadbeef', nil, 'c' ]
79
+ attach_function :getpid, [ ], :uint
80
+ end.getpid.should == Process.pid
81
+ }.should_not raise_error
82
+ end
83
+ it "attach_function :getpid from [ 'libfubar.so.0xdeadbeef' ] " do
84
+ lambda {
85
+ Module.new do |m|
86
+ m.extend FFI::Library
87
+ ffi_lib 'libfubar.so.0xdeadbeef'
88
+ attach_function :getpid, [ ], :uint
89
+ end.getpid.should == Process.pid
90
+ }.should raise_error(LoadError)
91
+ end
92
+ it "attach_function :bool_return_true from [ File.expand_path(#{TestLibrary::PATH.inspect}) ]" do
93
+ Module.new do |m|
94
+ m.extend FFI::Library
95
+ ffi_lib File.expand_path(TestLibrary::PATH)
96
+ attach_function :bool_return_true, [ ], :bool
97
+ m.bool_return_true.should == true
98
+ end
99
+ end
100
+ end
101
+
102
+ def gvar_lib(name, type)
103
+ Module.new do |m|
104
+ m.extend FFI::Library
105
+ ffi_lib TestLibrary::PATH
106
+ attach_variable :gvar, "gvar_#{name}", type
107
+ attach_function :get, "gvar_#{name}_get", [], type
108
+ attach_function :set, "gvar_#{name}_set", [ type ], :void
109
+ end
110
+ end
111
+ def gvar_test(name, type, val)
112
+ lib = gvar_lib(name, type)
113
+ lib.set(val)
114
+ lib.gvar.should == val
115
+ lib.set(0)
116
+ lib.gvar = val
117
+ lib.get.should == val
118
+ end
119
+ [ 0, 127, -128, -1 ].each do |i|
120
+ it ":char variable" do
121
+ gvar_test("s8", :char, i)
122
+ end
123
+ end
124
+ [ 0, 0x7f, 0x80, 0xff ].each do |i|
125
+ it ":uchar variable" do
126
+ gvar_test("u8", :uchar, i)
127
+ end
128
+ end
129
+ [ 0, 0x7fff, -0x8000, -1 ].each do |i|
130
+ it ":short variable" do
131
+ gvar_test("s16", :short, i)
132
+ end
133
+ end
134
+ [ 0, 0x7fff, 0x8000, 0xffff ].each do |i|
135
+ it ":ushort variable" do
136
+ gvar_test("u16", :ushort, i)
137
+ end
138
+ end
139
+ [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
140
+ it ":int variable" do
141
+ gvar_test("s32", :int, i)
142
+ end
143
+ end
144
+ [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
145
+ it ":uint variable" do
146
+ gvar_test("u32", :uint, i)
147
+ end
148
+ end
149
+ [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
150
+ it ":long_long variable" do
151
+ gvar_test("s64", :long_long, i)
152
+ end
153
+ end
154
+ [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
155
+ it ":ulong_long variable" do
156
+ gvar_test("u64", :ulong_long, i)
157
+ end
158
+ end
159
+ if FFI::Platform::LONG_SIZE == 32
160
+ [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
161
+ it ":long variable" do
162
+ gvar_test("long", :long, i)
163
+ end
164
+ end
165
+ [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
166
+ it ":ulong variable" do
167
+ gvar_test("ulong", :ulong, i)
168
+ end
169
+ end
170
+ else
171
+ [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
172
+ it ":long variable" do
173
+ gvar_test("long", :long, i)
174
+ end
175
+ end
176
+ [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
177
+ it ":ulong variable" do
178
+ gvar_test("ulong", :ulong, i)
179
+ end
180
+ end
181
+ end
182
+ it "Pointer variable" do
183
+ lib = gvar_lib("pointer", :pointer)
184
+ val = FFI::MemoryPointer.new :long
185
+ lib.set(val)
186
+ lib.gvar.should == val
187
+ lib.set(nil)
188
+ lib.gvar = val
189
+ lib.get.should == val
190
+ end
191
+
192
+ [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
193
+ it "structure" do
194
+ class GlobalStruct < FFI::Struct
195
+ layout :data, :long
196
+ end
197
+
198
+ lib = Module.new do |m|
199
+ m.extend FFI::Library
200
+ ffi_lib TestLibrary::PATH
201
+ attach_variable :gvar, "gvar_gstruct", GlobalStruct
202
+ attach_function :get, "gvar_gstruct_get", [], GlobalStruct
203
+ attach_function :set, "gvar_gstruct_set", [ GlobalStruct ], :void
204
+ end
205
+
206
+ val = GlobalStruct.new
207
+ val[:data] = i
208
+ lib.set(val)
209
+ lib.gvar[:data].should == i
210
+ val[:data] = 0
211
+ lib.gvar[:data] = i
212
+ val = GlobalStruct.new(lib.get)
213
+ val[:data].should == i
214
+ end
215
+ end
216
+ end
@@ -0,0 +1,30 @@
1
+ #
2
+ # This file is part of ruby-ffi.
3
+ # For licensing, see LICENSE.SPECS
4
+ #
5
+
6
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
7
+ require 'bigdecimal'
8
+
9
+ describe ":long_double arguments and return values" do
10
+ module LibTest
11
+ extend FFI::Library
12
+ ffi_lib TestLibrary::PATH
13
+ attach_function :add_f128, [ :long_double, :long_double ], :long_double
14
+ attach_function :ret_f128, [ :long_double ], :long_double
15
+ end
16
+
17
+ it "returns first parameter" do
18
+ LibTest.ret_f128(0.1).should be_within(0.01).of(0.1)
19
+ end
20
+
21
+ it "returns first parameter with high precision" do
22
+ ld = BigDecimal.new("1.234567890123456789")
23
+ tolerance = BigDecimal.new("0.0000000000000000001")
24
+ LibTest.ret_f128(ld).should be_within(tolerance).of(ld)
25
+ end
26
+
27
+ it "add two long double numbers" do
28
+ LibTest.add_f128(0.1, 0.2).should be_within(0.01).of(0.3)
29
+ end
30
+ end
@@ -0,0 +1,57 @@
1
+ #
2
+ # This file is part of ruby-ffi.
3
+ # For licensing, see LICENSE.SPECS
4
+ #
5
+
6
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
7
+ require 'java' if RUBY_PLATFORM =~ /java/
8
+
9
+ describe "Managed Struct" do
10
+ include FFI
11
+ module ManagedStructTestLib
12
+ extend FFI::Library
13
+ ffi_lib TestLibrary::PATH
14
+ attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer
15
+ end
16
+ it "should raise an error if release() is not defined" do
17
+ class NoRelease < FFI::ManagedStruct ; layout :i, :int; end
18
+ lambda { NoRelease.new(ManagedStructTestLib.ptr_from_address(0x12345678)) }.should raise_error(NoMethodError)
19
+ end
20
+
21
+ it "should be the right class" do
22
+ class WhatClassAmI < FFI::ManagedStruct
23
+ layout :i, :int
24
+ def self.release
25
+ end
26
+ end
27
+
28
+ WhatClassAmI.new(ManagedStructTestLib.ptr_from_address(0x12345678)).class.should == WhatClassAmI
29
+ end
30
+
31
+ it "should release memory properly" do
32
+ class PleaseReleaseMe < FFI::ManagedStruct
33
+ layout :i, :int
34
+ @@count = 0
35
+ def self.release
36
+ @@count += 1
37
+ end
38
+ def self.wait_gc(count)
39
+ loop = 5
40
+ while loop > 0 && @@count < count
41
+ loop -= 1
42
+ TestLibrary.force_gc
43
+ sleep 0.05 if @@count < count
44
+ end
45
+ end
46
+ end
47
+
48
+ loop_count = 30
49
+ wiggle_room = 5
50
+
51
+ PleaseReleaseMe.should_receive(:release).at_least(loop_count-wiggle_room).times
52
+ loop_count.times do
53
+ PleaseReleaseMe.new(ManagedStructTestLib.ptr_from_address(0x12345678))
54
+ end
55
+ PleaseReleaseMe.wait_gc loop_count
56
+ end
57
+ end
@@ -0,0 +1,236 @@
1
+ #
2
+ # This file is part of ruby-ffi.
3
+ # For licensing, see LICENSE.SPECS
4
+ #
5
+
6
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
7
+ describe "Function with primitive integer arguments" do
8
+ module LibTest
9
+ extend FFI::Library
10
+ ffi_lib TestLibrary::PATH
11
+ attach_function :ret_s8, [ :char ], :char
12
+ attach_function :ret_u8, [ :uchar ], :uchar
13
+ attach_function :ret_s16, [ :short ], :short
14
+ attach_function :ret_u16, [ :ushort ], :ushort
15
+ attach_function :ret_s32, [ :int ], :int
16
+ attach_function :ret_u32, [ :uint ], :uint
17
+ attach_function :ret_s64, [ :long_long ], :long_long
18
+ attach_function :ret_u64, [ :ulong_long ], :ulong_long
19
+ attach_function :ret_long, [ :long ], :long
20
+ attach_function :ret_ulong, [ :ulong ], :ulong
21
+ attach_function :set_s8, [ :char ], :void
22
+ attach_function :get_s8, [ ], :char
23
+ attach_function :set_float, [ :float ], :void
24
+ attach_function :get_float, [ ], :float
25
+ attach_function :set_double, [ :double ], :void
26
+ attach_function :get_double, [ ], :double
27
+ end
28
+ it "int8.size" do
29
+ FFI::TYPE_INT8.size.should == 1
30
+ end
31
+ it "uint8.size" do
32
+ FFI::TYPE_UINT8.size.should == 1
33
+ end
34
+ it "int16.size" do
35
+ FFI::TYPE_INT16.size.should == 2
36
+ end
37
+ it "uint16.size" do
38
+ FFI::TYPE_UINT16.size.should == 2
39
+ end
40
+ it "int32.size" do
41
+ FFI::TYPE_INT32.size.should == 4
42
+ end
43
+ it "uint32.size" do
44
+ FFI::TYPE_UINT32.size.should == 4
45
+ end
46
+ it "int64.size" do
47
+ FFI::TYPE_INT64.size.should == 8
48
+ end
49
+ it "uint64.size" do
50
+ FFI::TYPE_UINT64.size.should == 8
51
+ end
52
+ it "float.size" do
53
+ FFI::TYPE_FLOAT32.size.should == 4
54
+ end
55
+ it "double.size" do
56
+ FFI::TYPE_FLOAT64.size.should == 8
57
+ end
58
+ [ 0, 127, -128, -1 ].each do |i|
59
+ it ":char call(:char (#{i}))" do
60
+ LibTest.ret_s8(i).should == i
61
+ end
62
+ end
63
+ [ 0, 0x7f, 0x80, 0xff ].each do |i|
64
+ it ":uchar call(:uchar (#{i}))" do
65
+ LibTest.ret_u8(i).should == i
66
+ end
67
+ end
68
+ [ 0, 0x7fff, -0x8000, -1 ].each do |i|
69
+ it ":short call(:short (#{i}))" do
70
+ LibTest.ret_s16(i).should == i
71
+ end
72
+ end
73
+ [ 0, 0x7fff, 0x8000, 0xffff ].each do |i|
74
+ it ":ushort call(:ushort (#{i}))" do
75
+ LibTest.ret_u16(i).should == i
76
+ end
77
+ end
78
+ [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
79
+ it ":int call(:int (#{i}))" do
80
+ LibTest.ret_s32(i).should == i
81
+ end
82
+ end
83
+ [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
84
+ it ":uint call(:uint (#{i}))" do
85
+ LibTest.ret_u32(i).should == i
86
+ end
87
+ end
88
+ [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
89
+ it ":long_long call(:long_long (#{i}))" do
90
+ LibTest.ret_s64(i).should == i
91
+ end
92
+ end
93
+ [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
94
+ it ":ulong_long call(:ulong_long (#{i}))" do
95
+ LibTest.ret_u64(i).should == i
96
+ end
97
+ end
98
+ if FFI::Platform::LONG_SIZE == 32
99
+ [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
100
+ it ":long call(:long (#{i}))" do
101
+ LibTest.ret_long(i).should == i
102
+ end
103
+ end
104
+ [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
105
+ it ":ulong call(:ulong (#{i}))" do
106
+ LibTest.ret_ulong(i).should == i
107
+ end
108
+ end
109
+ else
110
+ [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
111
+ it ":long call(:long (#{i}))" do
112
+ LibTest.ret_long(i).should == i
113
+ end
114
+ end
115
+ [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
116
+ it ":ulong call(:ulong (#{i}))" do
117
+ LibTest.ret_ulong(i).should == i
118
+ end
119
+ end
120
+ [ 0.0, 0.1, 1.1, 1.23 ].each do |f|
121
+ it ":float call(:double (#{f}))" do
122
+ LibTest.set_float(f)
123
+ (LibTest.get_float - f).abs.should < 0.001
124
+ end
125
+ end
126
+ [ 0.0, 0.1, 1.1, 1.23 ].each do |f|
127
+ it ":double call(:double (#{f}))" do
128
+ LibTest.set_double(f)
129
+ (LibTest.get_double - f).abs.should < 0.001
130
+ end
131
+ end
132
+ end
133
+ end
134
+ describe "Integer parameter range checking" do
135
+ [ 128, -129 ].each do |i|
136
+ it ":char call(:char (#{i}))" do
137
+ lambda { LibTest.ret_int8_t(i).should == i }.should raise_error
138
+ end
139
+ end
140
+ [ -1, 256 ].each do |i|
141
+ it ":uchar call(:uchar (#{i}))" do
142
+ lambda { LibTest.ret_u_int8_t(i).should == i }.should raise_error
143
+ end
144
+ end
145
+ [ 0x8000, -0x8001 ].each do |i|
146
+ it ":short call(:short (#{i}))" do
147
+ lambda { LibTest.ret_int16_t(i).should == i }.should raise_error
148
+ end
149
+ end
150
+ [ -1, 0x10000 ].each do |i|
151
+ it ":ushort call(:ushort (#{i}))" do
152
+ lambda { LibTest.ret_u_int16_t(i).should == i }.should raise_error
153
+ end
154
+ end
155
+ [ 0x80000000, -0x80000001 ].each do |i|
156
+ it ":int call(:int (#{i}))" do
157
+ lambda { LibTest.ret_int32_t(i).should == i }.should raise_error
158
+ end
159
+ end
160
+ [ -1, 0x100000000 ].each do |i|
161
+ it ":ushort call(:ushort (#{i}))" do
162
+ lambda { LibTest.ret_u_int32_t(i).should == i }.should raise_error
163
+ end
164
+ end
165
+ end
166
+ describe "Three different size Integer arguments" do
167
+ TYPE_MAP = {
168
+ 's8' => :char, 'u8' => :uchar, 's16' => :short, 'u16' => :ushort,
169
+ 's32' => :int, 'u32' => :uint, 's64' => :long_long, 'u64' => :ulong_long,
170
+ 'sL' => :long, 'uL' => :ulong, 'f32' => :float, 'f64' => :double
171
+ }
172
+ TYPES = TYPE_MAP.keys
173
+ module LibTest
174
+ extend FFI::Library
175
+ ffi_lib TestLibrary::PATH
176
+
177
+
178
+ [ 's32', 'u32', 's64', 'u64' ].each do |rt|
179
+ TYPES.each do |t1|
180
+ TYPES.each do |t2|
181
+ TYPES.each do |t3|
182
+ begin
183
+ attach_function "pack_#{t1}#{t2}#{t3}_#{rt}",
184
+ [ TYPE_MAP[t1], TYPE_MAP[t2], TYPE_MAP[t3], :buffer_out ], :void
185
+ rescue FFI::NotFoundError
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end
192
+
193
+ PACK_VALUES = {
194
+ 's8' => [ 0x12 ],
195
+ 'u8' => [ 0x34 ],
196
+ 's16' => [ 0x5678 ],
197
+ 'u16' => [ 0x9abc ],
198
+ 's32' => [ 0x7654321f ],
199
+ 'u32' => [ 0xfee1babe ],
200
+ 'sL' => [ 0x1f2e3d4c ],
201
+ 'uL' => [ 0xf7e8d9ca ],
202
+ 's64' => [ 0x1eafdeadbeefa1b2 ],
203
+ # 'f32' => [ 1.234567 ],
204
+ 'f64' => [ 9.87654321 ]
205
+ }
206
+
207
+ def verify(p, off, t, v)
208
+ if t == 'f32'
209
+ p.get_float32(off).should == v
210
+ elsif t == 'f64'
211
+ p.get_float64(off).should == v
212
+ else
213
+ p.get_int64(off).should == v
214
+ end
215
+ end
216
+
217
+ PACK_VALUES.keys.each do |t1|
218
+ PACK_VALUES.keys.each do |t2|
219
+ PACK_VALUES.keys.each do |t3|
220
+ PACK_VALUES[t1].each do |v1|
221
+ PACK_VALUES[t2].each do |v2|
222
+ PACK_VALUES[t3].each do |v3|
223
+ it "call(#{TYPE_MAP[t1]} (#{v1}), #{TYPE_MAP[t2]} (#{v2}), #{TYPE_MAP[t3]} (#{v3}))" do
224
+ p = FFI::Buffer.new :long_long, 3
225
+ LibTest.send("pack_#{t1}#{t2}#{t3}_s64", v1, v2, v3, p)
226
+ verify(p, 0, t1, v1)
227
+ verify(p, 8, t2, v2)
228
+ verify(p, 16, t3, v3)
229
+ end
230
+ end
231
+ end
232
+ end
233
+ end
234
+ end
235
+ end
236
+ end