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,26 @@
1
+ #ifndef _STRUCT_H
2
+ #define _STRUCT_H
3
+
4
+ #include "AbstractMemory.h"
5
+
6
+ #ifdef __cplusplus
7
+ extern "C" {
8
+ #endif
9
+
10
+ extern void rbffi_Struct_Init(VALUE ffiModule);
11
+
12
+ struct StructLayout;
13
+ typedef struct Struct {
14
+ struct StructLayout* layout;
15
+ AbstractMemory* pointer;
16
+ VALUE rbLayout;
17
+ VALUE rbPointer;
18
+ } Struct;
19
+
20
+ extern VALUE rbffi_StructClass;
21
+ #ifdef __cplusplus
22
+ }
23
+ #endif
24
+
25
+ #endif /* _STRUCT_H */
26
+
data/ext/ffi_c/Type.c ADDED
@@ -0,0 +1,230 @@
1
+ #include <sys/param.h>
2
+ #include <sys/types.h>
3
+ #include <ruby.h>
4
+ #include <ffi.h>
5
+ #include "rbffi.h"
6
+ #include "compat.h"
7
+ #include "Types.h"
8
+ #include "Type.h"
9
+
10
+
11
+ typedef struct BuiltinType_ {
12
+ Type type;
13
+ char* name;
14
+ } BuiltinType;
15
+
16
+ static void builtin_type_free(BuiltinType *);
17
+
18
+ VALUE rbffi_TypeClass = Qnil;
19
+
20
+ static VALUE classBuiltinType = Qnil;
21
+
22
+ static VALUE
23
+ type_allocate(VALUE klass)
24
+ {
25
+ Type* type;
26
+ VALUE obj = Data_Make_Struct(klass, Type, NULL, -1, type);
27
+
28
+ type->nativeType = -1;
29
+ type->size = 0;
30
+ type->alignment = 1;
31
+
32
+ return obj;
33
+ }
34
+
35
+ static VALUE
36
+ type_initialize(VALUE self, VALUE value)
37
+ {
38
+ Type* type;
39
+ Type* other;
40
+
41
+ Data_Get_Struct(self, Type, type);
42
+
43
+ if (FIXNUM_P(value)) {
44
+ type->nativeType = FIX2INT(value);
45
+ } else if (rb_obj_is_kind_of(value, rbffi_TypeClass)) {
46
+ Data_Get_Struct(value, Type, other);
47
+ type->nativeType = other->nativeType;
48
+ type->size = other->size;
49
+ type->alignment = other->alignment;
50
+ } else {
51
+ rb_raise(rb_eArgError, "wrong type");
52
+ }
53
+
54
+ return self;
55
+ }
56
+
57
+ static VALUE
58
+ type_size(VALUE self)
59
+ {
60
+ Type *type;
61
+
62
+ Data_Get_Struct(self, Type, type);
63
+
64
+ return INT2FIX(type->size);
65
+ }
66
+
67
+ static VALUE
68
+ type_alignment(VALUE self)
69
+ {
70
+ Type *type;
71
+
72
+ Data_Get_Struct(self, Type, type);
73
+
74
+ return INT2FIX(type->alignment);
75
+ }
76
+
77
+ static VALUE
78
+ type_inspect(VALUE self)
79
+ {
80
+ char buf[256];
81
+ Type *type;
82
+
83
+ Data_Get_Struct(self, Type, type);
84
+ snprintf(buf, sizeof(buf), "#<FFI::Type:%p size=%d alignment=%d>",
85
+ type, type->size, type->alignment);
86
+
87
+ return rb_str_new2(buf);
88
+ }
89
+
90
+ static VALUE
91
+ enum_allocate(VALUE klass)
92
+ {
93
+ Type* type;
94
+ VALUE obj;
95
+
96
+ obj = Data_Make_Struct(klass, Type, NULL, -1, type);
97
+ type->nativeType = NATIVE_ENUM;
98
+ type->ffiType = &ffi_type_sint;
99
+ type->size = ffi_type_sint.size;
100
+ type->alignment = ffi_type_sint.alignment;
101
+
102
+ return obj;
103
+ }
104
+
105
+ int
106
+ rbffi_Type_GetIntValue(VALUE type)
107
+ {
108
+ if (rb_obj_is_kind_of(type, rbffi_TypeClass)) {
109
+ Type* t;
110
+ Data_Get_Struct(type, Type, t);
111
+ return t->nativeType;
112
+ } else {
113
+ rb_raise(rb_eArgError, "Invalid type argument");
114
+ }
115
+ }
116
+
117
+ static VALUE
118
+ builtin_type_new(VALUE klass, int nativeType, ffi_type* ffiType, const char* name)
119
+ {
120
+ BuiltinType* type;
121
+ VALUE obj = Data_Make_Struct(klass, BuiltinType, NULL, builtin_type_free, type);
122
+
123
+ type->name = strdup(name);
124
+ type->type.nativeType = nativeType;
125
+ type->type.ffiType = ffiType;
126
+ type->type.size = ffiType->size;
127
+ type->type.alignment = ffiType->alignment;
128
+
129
+ return obj;
130
+ }
131
+
132
+ static void
133
+ builtin_type_free(BuiltinType *type)
134
+ {
135
+ free(type->name);
136
+ xfree(type);
137
+ }
138
+
139
+ static VALUE
140
+ builtin_type_inspect(VALUE self)
141
+ {
142
+ char buf[256];
143
+ BuiltinType *type;
144
+
145
+ Data_Get_Struct(self, BuiltinType, type);
146
+ snprintf(buf, sizeof(buf), "#<FFI::Type::Builtin:%ssize=%d alignment=%d>",
147
+ type->name, type->type.size, type->type.alignment);
148
+
149
+ return rb_str_new2(buf);
150
+ }
151
+
152
+ void
153
+ rbffi_Type_Init(VALUE moduleFFI)
154
+ {
155
+ VALUE moduleNativeType;
156
+ VALUE classType = rbffi_TypeClass = rb_define_class_under(moduleFFI, "Type", rb_cObject);
157
+ VALUE classEnum = rb_define_class_under(moduleFFI, "Enum", classType);
158
+ classBuiltinType = rb_define_class_under(rbffi_TypeClass, "Builtin", rbffi_TypeClass);
159
+ moduleNativeType = rb_define_module_under(moduleFFI, "NativeType");
160
+
161
+ rb_global_variable(&rbffi_TypeClass);
162
+ rb_global_variable(&classBuiltinType);
163
+ rb_global_variable(&moduleNativeType);
164
+
165
+ rb_define_alloc_func(classType, type_allocate);
166
+ rb_define_method(classType, "initialize", type_initialize, 1);
167
+ rb_define_method(classType, "size", type_size, 0);
168
+ rb_define_method(classType, "alignment", type_alignment, 0);
169
+ rb_define_method(classBuiltinType, "inspect", type_inspect, 0);
170
+
171
+ // Make Type::Builtin non-allocatable
172
+ rb_undef_method(CLASS_OF(classBuiltinType), "new");
173
+ rb_define_method(classBuiltinType, "inspect", builtin_type_inspect, 0);
174
+
175
+ rb_define_alloc_func(classEnum, enum_allocate);
176
+
177
+ rb_global_variable(&rbffi_TypeClass);
178
+ rb_global_variable(&classBuiltinType);
179
+
180
+ // Define all the builtin types
181
+ #define T(x, ffiType) do { \
182
+ VALUE t = Qnil; \
183
+ rb_define_const(classType, #x, t = builtin_type_new(classBuiltinType, NATIVE_##x, ffiType, #x)); \
184
+ rb_define_const(moduleNativeType, #x, t); \
185
+ rb_define_const(moduleFFI, "TYPE_" #x, t); \
186
+ } while(0)
187
+
188
+ T(VOID, &ffi_type_void);
189
+ T(INT8, &ffi_type_sint8);
190
+ T(UINT8, &ffi_type_uint8);
191
+ T(INT16, &ffi_type_sint16);
192
+ T(UINT16, &ffi_type_uint16);
193
+ T(INT32, &ffi_type_sint32);
194
+ T(UINT32, &ffi_type_uint32);
195
+ T(INT64, &ffi_type_sint64);
196
+ T(UINT64, &ffi_type_uint64);
197
+ T(FLOAT32, &ffi_type_float);
198
+ T(FLOAT64, &ffi_type_double);
199
+ T(POINTER, &ffi_type_pointer);
200
+ T(STRING, &ffi_type_pointer);
201
+ T(RBXSTRING, &ffi_type_pointer);
202
+ T(BUFFER_IN, &ffi_type_pointer);
203
+ T(BUFFER_OUT, &ffi_type_pointer);
204
+ T(BUFFER_INOUT, &ffi_type_pointer);
205
+ T(ENUM, &ffi_type_sint);
206
+ T(BOOL, &ffi_type_sint);
207
+
208
+
209
+ T(CHAR_ARRAY, &ffi_type_void);
210
+ T(VARARGS, &ffi_type_void);
211
+
212
+
213
+ if (sizeof(long) == 4) {
214
+ VALUE t = Qnil;
215
+ rb_define_const(classType, "LONG", t = builtin_type_new(classBuiltinType, NATIVE_INT32, &ffi_type_slong, "LONG"));
216
+ rb_define_const(moduleNativeType, "LONG", t);
217
+ rb_define_const(moduleFFI, "TYPE_LONG", t);
218
+ rb_define_const(classType, "ULONG", t = builtin_type_new(classBuiltinType, NATIVE_UINT32, &ffi_type_slong, "ULONG"));
219
+ rb_define_const(moduleNativeType, "ULONG", t);
220
+ rb_define_const(moduleFFI, "TYPE_ULONG", t);
221
+ } else {
222
+ VALUE t = Qnil;
223
+ rb_define_const(classType, "LONG", t = builtin_type_new(classBuiltinType, NATIVE_INT64, &ffi_type_slong, "LONG"));
224
+ rb_define_const(moduleNativeType, "LONG", t);
225
+ rb_define_const(moduleFFI, "TYPE_LONG", t);
226
+ rb_define_const(classType, "ULONG", t = builtin_type_new(classBuiltinType, NATIVE_UINT64, &ffi_type_slong, "ULONG"));
227
+ rb_define_const(moduleNativeType, "ULONG", t);
228
+ rb_define_const(moduleFFI, "TYPE_ULONG", t);
229
+ }
230
+ }
data/ext/ffi_c/Type.h ADDED
@@ -0,0 +1,28 @@
1
+ #ifndef _TYPE_H
2
+ #define _TYPE_H
3
+
4
+ #include <ruby.h>
5
+ #include <ffi.h>
6
+
7
+ #ifdef __cplusplus
8
+ extern "C" {
9
+ #endif
10
+
11
+
12
+ typedef struct Type_ {
13
+ NativeType nativeType;
14
+ ffi_type* ffiType;
15
+ int size;
16
+ int alignment;
17
+ } Type;
18
+
19
+ extern VALUE rbffi_TypeClass;
20
+ extern int rbffi_Type_GetIntValue(VALUE type);
21
+
22
+
23
+ #ifdef __cplusplus
24
+ }
25
+ #endif
26
+
27
+ #endif /* _TYPE_H */
28
+
data/ext/ffi_c/Types.c ADDED
@@ -0,0 +1,118 @@
1
+ #include <ruby.h>
2
+ #include "Pointer.h"
3
+ #include "rbffi.h"
4
+ #include "Callback.h"
5
+ #include "Types.h"
6
+
7
+ static ID id_find = 0;
8
+
9
+ ffi_type*
10
+ rbffi_NativeType_ToFFI(NativeType type)
11
+ {
12
+ switch (type) {
13
+ case NATIVE_VOID:
14
+ return &ffi_type_void;
15
+ case NATIVE_INT8:
16
+ return &ffi_type_sint8;
17
+ case NATIVE_UINT8:
18
+ return &ffi_type_uint8;
19
+ case NATIVE_INT16:
20
+ return &ffi_type_sint16;
21
+ case NATIVE_UINT16:
22
+ return &ffi_type_uint16;
23
+ case NATIVE_BOOL:
24
+ case NATIVE_INT32:
25
+ case NATIVE_ENUM:
26
+ return &ffi_type_sint32;
27
+ case NATIVE_UINT32:
28
+ return &ffi_type_uint32;
29
+ case NATIVE_INT64:
30
+ return &ffi_type_sint64;
31
+ case NATIVE_UINT64:
32
+ return &ffi_type_uint64;
33
+ case NATIVE_FLOAT32:
34
+ return &ffi_type_float;
35
+ case NATIVE_FLOAT64:
36
+ return &ffi_type_double;
37
+ case NATIVE_STRING:
38
+ case NATIVE_RBXSTRING:
39
+ case NATIVE_POINTER:
40
+ case NATIVE_BUFFER_IN:
41
+ case NATIVE_BUFFER_OUT:
42
+ case NATIVE_BUFFER_INOUT:
43
+ case NATIVE_CALLBACK:
44
+ return &ffi_type_pointer;
45
+ default:
46
+ return NULL;
47
+ }
48
+ }
49
+
50
+ VALUE
51
+ rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr, VALUE enums)
52
+ {
53
+ switch (type->nativeType) {
54
+ case NATIVE_VOID:
55
+ return Qnil;
56
+ case NATIVE_INT8:
57
+ return INT2NUM((signed char) *(ffi_sarg *) ptr);
58
+ case NATIVE_INT16:
59
+ return INT2NUM((signed short) *(ffi_sarg *) ptr);
60
+ case NATIVE_INT32:
61
+ return INT2NUM((signed int) *(ffi_sarg *) ptr);
62
+ case NATIVE_UINT8:
63
+ return UINT2NUM((unsigned char) *(ffi_arg *) ptr);
64
+ case NATIVE_UINT16:
65
+ return UINT2NUM((unsigned short) *(ffi_arg *) ptr);
66
+ case NATIVE_UINT32:
67
+ return UINT2NUM((unsigned int) *(ffi_arg *) ptr);
68
+ case NATIVE_INT64:
69
+ return LL2NUM(*(signed long long *) ptr);
70
+ case NATIVE_UINT64:
71
+ return ULL2NUM(*(unsigned long long *) ptr);
72
+ case NATIVE_FLOAT32:
73
+ return rb_float_new(*(float *) ptr);
74
+ case NATIVE_FLOAT64:
75
+ return rb_float_new(*(double *) ptr);
76
+ case NATIVE_STRING:
77
+ return (*(char **)ptr) ? rb_tainted_str_new2(*(char **) ptr) : Qnil;
78
+ case NATIVE_POINTER:
79
+ return rbffi_Pointer_NewInstance(*(void **) ptr);
80
+ case NATIVE_BOOL:
81
+ return ((int) *(ffi_arg *) ptr) ? Qtrue : Qfalse;
82
+ case NATIVE_ENUM:
83
+ {
84
+ VALUE enum_obj = rb_funcall(enums, id_find, 1, rbType);
85
+ if (enum_obj == Qnil) {
86
+ VALUE s = rb_inspect(rbType);
87
+ rb_raise(rb_eRuntimeError, "Unknown enumeration: %s", StringValueCStr(s));
88
+ }
89
+ return rb_funcall(enum_obj, id_find, 1, INT2NUM((unsigned int) *(ffi_arg *) ptr));
90
+ }
91
+ case NATIVE_CALLBACK: {
92
+ CallbackInfo* cbInfo;
93
+ VALUE argv[6];
94
+ VALUE funcptr = rbffi_Pointer_NewInstance(*(void **) ptr);
95
+
96
+ Data_Get_Struct(rbType, CallbackInfo, cbInfo);
97
+ argv[0] = funcptr;
98
+ argv[1] = cbInfo->rbParameterTypes;
99
+ argv[2] = ID2SYM(rb_intern("cb")); // just shove a dummy value
100
+ argv[3] = cbInfo->rbReturnType;
101
+ argv[4] = rb_str_new2("default");
102
+ argv[5] = Qnil;
103
+
104
+ return rb_class_new_instance(6, argv, rbffi_InvokerClass);
105
+ }
106
+
107
+ default:
108
+ rb_raise(rb_eRuntimeError, "Unknown type: %d", type->nativeType);
109
+ return Qnil;
110
+ }
111
+ }
112
+
113
+ void
114
+ rbffi_Types_Init(VALUE moduleFFI)
115
+ {
116
+ id_find = rb_intern("find");
117
+ }
118
+
data/ext/ffi_c/Types.h ADDED
@@ -0,0 +1,54 @@
1
+ #ifndef _TYPES_H
2
+ #define _TYPES_H
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+ #ifdef VOID
8
+ # undef VOID
9
+ #endif
10
+ typedef enum {
11
+ NATIVE_VOID,
12
+ NATIVE_INT8,
13
+ NATIVE_UINT8,
14
+ NATIVE_INT16,
15
+ NATIVE_UINT16,
16
+ NATIVE_INT32,
17
+ NATIVE_UINT32,
18
+ NATIVE_INT64,
19
+ NATIVE_UINT64,
20
+ NATIVE_FLOAT32,
21
+ NATIVE_FLOAT64,
22
+ NATIVE_POINTER,
23
+ NATIVE_CALLBACK,
24
+ NATIVE_BUFFER_IN,
25
+ NATIVE_BUFFER_OUT,
26
+ NATIVE_BUFFER_INOUT,
27
+ NATIVE_CHAR_ARRAY,
28
+ NATIVE_BOOL,
29
+
30
+ /**
31
+ * An immutable string. Nul terminated, but only copies in to the native function
32
+ */
33
+ NATIVE_STRING,
34
+ /** A Rubinus :string arg - copies data both ways, and nul terminates */
35
+ NATIVE_RBXSTRING,
36
+ /** The function takes a variable number of arguments */
37
+ NATIVE_VARARGS,
38
+ /** A typedef-ed enum */
39
+ NATIVE_ENUM,
40
+ } NativeType;
41
+
42
+ #include <ffi.h>
43
+ #include "Type.h"
44
+
45
+ extern ffi_type* rbffi_NativeType_ToFFI(NativeType type);
46
+ VALUE rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr, VALUE enums);
47
+ void rbffi_Types_Init(VALUE moduleFFI);
48
+
49
+ #ifdef __cplusplus
50
+ }
51
+ #endif
52
+
53
+ #endif /* _TYPES_H */
54
+