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,265 @@
1
+ #
2
+ # This file is part of ruby-ffi.
3
+ # For licensing, see LICENSE.SPECS
4
+ #
5
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
6
+ require 'delegate'
7
+ require 'java' if RUBY_PLATFORM =~ /java/
8
+
9
+ module PointerTestLib
10
+ extend FFI::Library
11
+ ffi_lib TestLibrary::PATH
12
+ attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int
13
+ attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer
14
+ attach_function :ptr_set_pointer, [ :pointer, :int, :pointer ], :void
15
+ attach_function :ptr_ret_pointer, [ :pointer, :int ], :pointer
16
+ end
17
+ describe "Pointer" do
18
+ include FFI
19
+ class ToPtrTest
20
+ def initialize(ptr)
21
+ @ptr = ptr
22
+ end
23
+ def to_ptr
24
+ @ptr
25
+ end
26
+ end
27
+ it "Any object implementing #to_ptr can be passed as a :pointer parameter" do
28
+ memory = FFI::MemoryPointer.new :long_long
29
+ magic = 0x12345678
30
+ memory.put_int32(0, magic)
31
+ tp = ToPtrTest.new(memory)
32
+ PointerTestLib.ptr_ret_int32_t(tp, 0).should == magic
33
+ end
34
+ class PointerDelegate < DelegateClass(FFI::Pointer)
35
+ def initialize(ptr)
36
+ @ptr = ptr
37
+ end
38
+ def to_ptr
39
+ @ptr
40
+ end
41
+ end
42
+ it "A DelegateClass(Pointer) can be passed as a :pointer parameter" do
43
+ memory = FFI::MemoryPointer.new :long_long
44
+ magic = 0x12345678
45
+ memory.put_int32(0, magic)
46
+ ptr = PointerDelegate.new(memory)
47
+ PointerTestLib.ptr_ret_int32_t(ptr, 0).should == magic
48
+ end
49
+ it "Fixnum cannot be used as a Pointer argument" do
50
+ lambda { PointerTestLib.ptr_ret_int32(0, 0) }.should raise_error
51
+ end
52
+ it "Bignum cannot be used as a Pointer argument" do
53
+ lambda { PointerTestLib.ptr_ret_int32(0xfee1deadbeefcafebabe, 0) }.should raise_error
54
+ end
55
+
56
+ describe "pointer type methods" do
57
+
58
+ it "#read_pointer" do
59
+ memory = FFI::MemoryPointer.new :pointer
60
+ PointerTestLib.ptr_set_pointer(memory, 0, PointerTestLib.ptr_from_address(0xdeadbeef))
61
+ memory.read_pointer.address.should == 0xdeadbeef
62
+ end
63
+
64
+ it "#write_pointer" do
65
+ memory = FFI::MemoryPointer.new :pointer
66
+ memory.write_pointer(PointerTestLib.ptr_from_address(0xdeadbeef))
67
+ PointerTestLib.ptr_ret_pointer(memory, 0).address.should == 0xdeadbeef
68
+ end
69
+
70
+ it "#read_array_of_pointer" do
71
+ values = [0x12345678, 0xfeedf00d, 0xdeadbeef]
72
+ memory = FFI::MemoryPointer.new :pointer, values.size
73
+ values.each_with_index do |address, j|
74
+ PointerTestLib.ptr_set_pointer(memory, j * FFI.type_size(:pointer), PointerTestLib.ptr_from_address(address))
75
+ end
76
+ array = memory.read_array_of_pointer(values.size)
77
+ values.each_with_index do |address, j|
78
+ array[j].address.should == address
79
+ end
80
+ end
81
+
82
+ end
83
+
84
+ describe 'NULL' do
85
+ it 'should be obtained using Pointer::NULL constant' do
86
+ null_ptr = FFI::Pointer::NULL
87
+ null_ptr.null?.should be_true
88
+ end
89
+ it 'should be obtained passing address 0 to constructor' do
90
+ FFI::Pointer.new(0).null?.should be_true
91
+ end
92
+ it 'should raise an error when attempting read/write operations on it' do
93
+ null_ptr = FFI::Pointer::NULL
94
+ lambda { null_ptr.read_int }.should raise_error(FFI::NullPointerError)
95
+ lambda { null_ptr.write_int(0xff1) }.should raise_error(FFI::NullPointerError)
96
+ end
97
+ it 'returns true when compared with nil' do
98
+ (FFI::Pointer::NULL == nil).should be_true
99
+ end
100
+ end
101
+
102
+ it "Pointer.size returns sizeof pointer on platform" do
103
+ FFI::Pointer.size.should == (FFI::Platform::ADDRESS_SIZE / 8)
104
+ end
105
+
106
+ describe "#slice" do
107
+ before(:each) do
108
+ @mptr = FFI::MemoryPointer.new(:char, 12)
109
+ @mptr.put_uint(0, 0x12345678)
110
+ @mptr.put_uint(4, 0xdeadbeef)
111
+ end
112
+
113
+ it "contents of sliced pointer matches original pointer at offset" do
114
+ @mptr.slice(4, 4).get_uint(0).should == 0xdeadbeef
115
+ end
116
+
117
+ it "modifying sliced pointer is reflected in original pointer" do
118
+ @mptr.slice(4, 4).put_uint(0, 0xfee1dead)
119
+ @mptr.get_uint(4).should == 0xfee1dead
120
+ end
121
+
122
+ it "access beyond bounds should raise IndexError" do
123
+ lambda { @mptr.slice(4, 4).get_int(4) }.should raise_error(IndexError)
124
+ end
125
+ end
126
+
127
+ describe "#type_size" do
128
+ it "should be same as FFI.type_size(type)" do
129
+ FFI::MemoryPointer.new(:int, 1).type_size.should == FFI.type_size(:int)
130
+ end
131
+ end
132
+ end
133
+
134
+ describe "AutoPointer" do
135
+ loop_count = 30
136
+ wiggle_room = 5 # GC rarely cleans up all objects. we can get most of them, and that's enough to determine if the basic functionality is working.
137
+ magic = 0x12345678
138
+
139
+ class AutoPointerTestHelper
140
+ @@count = 0
141
+ def self.release
142
+ @@count += 1 if @@count > 0
143
+ end
144
+ def self.reset
145
+ @@count = 0
146
+ end
147
+ def self.gc_everything(count)
148
+ loop = 5
149
+ while @@count < count && loop > 0
150
+ loop -= 1
151
+ TestLibrary.force_gc
152
+ sleep 0.05 unless @@count == count
153
+ end
154
+ @@count = 0
155
+ end
156
+ def self.finalizer
157
+ self.method(:release).to_proc
158
+ end
159
+ end
160
+ class AutoPointerSubclass < FFI::AutoPointer
161
+ def self.release(ptr); end
162
+ end
163
+ it "cleanup via default release method" do
164
+ AutoPointerSubclass.should_receive(:release).at_least(loop_count-wiggle_room).times
165
+ AutoPointerTestHelper.reset
166
+ loop_count.times do
167
+ # note that if we called
168
+ # AutoPointerTestHelper.method(:release).to_proc inline, we'd
169
+ # have a reference to the pointer and it would never get GC'd.
170
+ AutoPointerSubclass.new(PointerTestLib.ptr_from_address(magic))
171
+ end
172
+ AutoPointerTestHelper.gc_everything loop_count
173
+ end
174
+
175
+ it "cleanup when passed a proc" do
176
+ # NOTE: passing a proc is touchy, because it's so easy to create a memory leak.
177
+ #
178
+ # specifically, if we made an inline call to
179
+ #
180
+ # AutoPointerTestHelper.method(:release).to_proc
181
+ #
182
+ # we'd have a reference to the pointer and it would
183
+ # never get GC'd.
184
+ AutoPointerTestHelper.should_receive(:release).at_least(loop_count-wiggle_room).times
185
+ AutoPointerTestHelper.reset
186
+ loop_count.times do
187
+ FFI::AutoPointer.new(PointerTestLib.ptr_from_address(magic),
188
+ AutoPointerTestHelper.finalizer)
189
+ end
190
+ AutoPointerTestHelper.gc_everything loop_count
191
+ end
192
+
193
+ it "cleanup when passed a method" do
194
+ AutoPointerTestHelper.should_receive(:release).at_least(loop_count-wiggle_room).times
195
+ AutoPointerTestHelper.reset
196
+ loop_count.times do
197
+ FFI::AutoPointer.new(PointerTestLib.ptr_from_address(magic),
198
+ AutoPointerTestHelper.method(:release))
199
+ end
200
+ AutoPointerTestHelper.gc_everything loop_count
201
+ end
202
+
203
+ it "can be used as the return type of a function" do
204
+ lambda do
205
+ Module.new do
206
+ extend FFI::Library
207
+ ffi_lib TestLibrary::PATH
208
+ class CustomAutoPointer < FFI::AutoPointer
209
+ def self.release(ptr); end
210
+ end
211
+ attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], CustomAutoPointer
212
+ end
213
+ end.should_not raise_error
214
+ end
215
+
216
+ describe "#new" do
217
+ it "MemoryPointer argument raises TypeError" do
218
+ lambda { FFI::AutoPointer.new(FFI::MemoryPointer.new(:int))}.should raise_error(::TypeError)
219
+ end
220
+ it "AutoPointer argument raises TypeError" do
221
+ lambda { AutoPointerSubclass.new(AutoPointerSubclass.new(PointerTestLib.ptr_from_address(0))) }.should raise_error(::TypeError)
222
+ end
223
+ it "Buffer argument raises TypeError" do
224
+ lambda { FFI::AutoPointer.new(FFI::Buffer.new(:int))}.should raise_error(::TypeError)
225
+ end
226
+
227
+ end
228
+
229
+ describe "#autorelease?" do
230
+ ptr_class = Class.new(FFI::AutoPointer) do
231
+ def self.release(ptr); end
232
+ end
233
+
234
+ it "should be true by default" do
235
+ ptr_class.new(FFI::Pointer.new(0xdeadbeef)).autorelease?.should be_true
236
+ end
237
+
238
+ it "should return false when autorelease=(false)" do
239
+ ptr = ptr_class.new(FFI::Pointer.new(0xdeadbeef))
240
+ ptr.autorelease = false
241
+ ptr.autorelease?.should be_false
242
+ end
243
+ end
244
+
245
+ describe "#type_size" do
246
+ ptr_class = Class.new(FFI::AutoPointer) do
247
+ def self.release(ptr); end
248
+ end
249
+
250
+ it "type_size of AutoPointer should match wrapped Pointer" do
251
+ aptr = ptr_class.new(FFI::Pointer.new(:int, 0xdeadbeef))
252
+ aptr.type_size.should == FFI.type_size(:int)
253
+ end
254
+
255
+ it "[] offset should match wrapped Pointer" do
256
+ mptr = FFI::MemoryPointer.new(:int, 1024)
257
+ aptr = ptr_class.new(FFI::Pointer.new(:int, mptr))
258
+ aptr[0].write_uint(0xfee1dead)
259
+ aptr[1].write_uint(0xcafebabe)
260
+ mptr[0].read_uint.should == 0xfee1dead
261
+ mptr[1].read_uint.should == 0xcafebabe
262
+ end
263
+ end
264
+ end
265
+
@@ -0,0 +1,28 @@
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
+ ffi_lib FFI::Library::LIBC
10
+
11
+ attach_function :gettimeofday, [:pointer, :pointer], :int
12
+ end
13
+
14
+ describe FFI::Library, "#attach_function" do
15
+ it "correctly returns a value for gettimeofday" do
16
+ t = Timeval.new
17
+ time = LibC.gettimeofday(t.pointer, nil)
18
+ time.should be_kind_of(Integer)
19
+ end
20
+
21
+ it "correctly populates a struct for gettimeofday" do
22
+ t = Timeval.new
23
+ time = LibC.gettimeofday(t.pointer, nil)
24
+ t[:tv_sec].should be_kind_of(Numeric)
25
+ t[:tv_usec].should be_kind_of(Numeric)
26
+ end
27
+ end
28
+
@@ -0,0 +1,123 @@
1
+ # coding: utf-8
2
+ require "rubygems"
3
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
4
+
5
+ module CTest
6
+ extend FFI::Library
7
+ ffi_lib FFI::Library::LIBC
8
+
9
+ attach_function :strcat, [:pointer, :pointer], :pointer
10
+ end
11
+
12
+ describe "MemoryPointer" do
13
+ it "makes a pointer from a string" do
14
+ m = FFI::MemoryPointer.from_string("FFI is Awesome")
15
+ m.total.should == 15
16
+ m.type_size.should == 1
17
+ end
18
+
19
+ it "does not make a pointer from non-strings" do
20
+ expect { FFI::MemoryPointer.from_string(nil) }.to raise_error(TypeError)
21
+ end
22
+
23
+ it "makes a pointer from a string with multibyte characters" do
24
+ m = FFI::MemoryPointer.from_string("ぱんだ")
25
+ m.total.should == 10
26
+ m.type_size.should == 1
27
+ end
28
+
29
+ it "reads back a string" do
30
+ m = FFI::MemoryPointer.from_string("FFI is Awesome")
31
+ m.read_string.should == "FFI is Awesome"
32
+ end
33
+
34
+ it "makes a pointer for a certain number of bytes" do
35
+ m = FFI::MemoryPointer.new(8)
36
+ m.write_array_of_int([1,2])
37
+ m.read_array_of_int(2).should == [1,2]
38
+ end
39
+
40
+ it "allows access to an element of the pointer (as an array)" do
41
+ m = FFI::MemoryPointer.new(:int, 2)
42
+ m.write_array_of_int([1,2])
43
+ m[0].read_int.should == 1
44
+ m[1].read_int.should == 2
45
+ end
46
+
47
+ it "allows writing as an int" do
48
+ m = FFI::MemoryPointer.new(:int)
49
+ m.write_int(1)
50
+ m.read_int.should == 1
51
+ end
52
+
53
+ it "allows writing as a long" do
54
+ m = FFI::MemoryPointer.new(:long)
55
+ m.write_long(10)
56
+ m.read_long.should == 10
57
+ end
58
+
59
+ it "raises an error if you try putting a long into a pointer of size 1" do
60
+ m = FFI::MemoryPointer.new(1)
61
+ lambda { m.write_long(10) }.should raise_error
62
+ end
63
+
64
+ it "raises an error if you try putting an int into a pointer of size 1" do
65
+ m = FFI::MemoryPointer.new(1)
66
+ lambda { m.write_int(10) }.should raise_error
67
+ end
68
+ # it "does not raise IndexError for opaque pointers" do
69
+ # m = FFI::MemoryPointer.new(8)
70
+ # p2 = FFI::MemoryPointer.new(1024)
71
+ # m.write_long(p2.address)
72
+ # p = m.read_pointer
73
+ # lambda { p.write_int(10) }.should_not raise_error
74
+ # end
75
+
76
+ it "makes a pointer for a certain type" do
77
+ m = FFI::MemoryPointer.new(:int)
78
+ m.write_int(10)
79
+ m.read_int.should == 10
80
+ end
81
+
82
+ it "makes a memory pointer for a number of a certain type" do
83
+ m = FFI::MemoryPointer.new(:int, 2)
84
+ m.write_array_of_int([1,2])
85
+ m.read_array_of_int(2).should == [1,2]
86
+ end
87
+
88
+ it "makes a pointer for an object responding to #size" do
89
+ m = FFI::MemoryPointer.new(Struct.new(:size).new(8))
90
+ m.write_array_of_int([1,2])
91
+ m.read_array_of_int(2).should == [1,2]
92
+ end
93
+
94
+ it "makes a pointer for a number of an object responding to #size" do
95
+ m = FFI::MemoryPointer.new(Struct.new(:size).new(4), 2)
96
+ m.write_array_of_int([1,2])
97
+ m.read_array_of_int(2).should == [1,2]
98
+ end
99
+ it "MemoryPointer#address returns correct value" do
100
+ m = FFI::MemoryPointer.new(:long_long)
101
+ magic = 0x12345678
102
+ m.write_long(magic)
103
+ m.read_pointer.address.should == magic
104
+ end
105
+ it "MemoryPointer#null? returns true for zero value" do
106
+ m = FFI::MemoryPointer.new(:long_long)
107
+ m.write_long(0)
108
+ m.read_pointer.null?.should == true
109
+ end
110
+ it "MemoryPointer#null? returns false for non-zero value" do
111
+ m = FFI::MemoryPointer.new(:long_long)
112
+ m.write_long(0x12345678)
113
+ m.read_pointer.null?.should == false
114
+ end
115
+
116
+ it "initialize with block should execute block" do
117
+ block_executed = false
118
+ FFI::MemoryPointer.new(:pointer) do |ptr|
119
+ block_executed = true
120
+ end
121
+ block_executed.should be_true
122
+ end
123
+ 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,33 @@
1
+ #
2
+ # This file is part of ruby-ffi.
3
+ # For licensing, see LICENSE.SPECS
4
+ #
5
+ require 'rubygems'
6
+ require 'rbconfig'
7
+
8
+ if RUBY_PLATFORM =~/java/
9
+ libdir = File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "lib"))
10
+ $:.reject! { |p| p == libdir }
11
+ else
12
+ $:.unshift File.join(File.dirname(__FILE__), "..", "..", "lib"),
13
+ File.join(File.dirname(__FILE__), "..", "..", "build", "#{RbConfig::CONFIG['host_cpu''arch']}", "ffi_c", RUBY_VERSION)
14
+ end
15
+ # puts "loadpath=#{$:.join(':')}"
16
+ require "ffi"
17
+
18
+ module TestLibrary
19
+ PATH = "build/libtest.#{FFI::Platform::LIBSUFFIX}"
20
+ def self.force_gc
21
+ if RUBY_PLATFORM =~ /java/
22
+ java.lang.System.gc
23
+ elsif defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
24
+ GC.run(true)
25
+ else
26
+ GC.start
27
+ end
28
+ end
29
+ end
30
+ module LibTest
31
+ extend FFI::Library
32
+ ffi_lib TestLibrary::PATH
33
+ end