ffi 0.4.0-x86-mswin32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

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,135 @@
1
+ #include <sys/param.h>
2
+ #include <sys/types.h>
3
+ #include <stdio.h>
4
+ #include <stdint.h>
5
+ #include <stdbool.h>
6
+ #include <errno.h>
7
+ #include <ruby.h>
8
+
9
+ #include "LastError.h"
10
+
11
+ #if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) && !defined(__WIN32__)
12
+ # include <pthread.h>
13
+ #endif
14
+
15
+ #if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) && !defined(__WIN32__)
16
+ # define USE_PTHREAD_LOCAL
17
+ #endif
18
+
19
+ typedef struct ThreadData {
20
+ int td_errno;
21
+ } ThreadData;
22
+
23
+ #if defined(USE_PTHREAD_LOCAL)
24
+ static pthread_key_t threadDataKey;
25
+ #endif
26
+
27
+ static inline ThreadData* thread_data_get(void);
28
+
29
+ #if defined(USE_PTHREAD_LOCAL)
30
+
31
+ static ThreadData*
32
+ thread_data_init(void)
33
+ {
34
+ ThreadData* td = ALLOC_N(ThreadData, 1);
35
+
36
+ memset(td, 0, sizeof(*td));
37
+ pthread_setspecific(threadDataKey, td);
38
+
39
+ return td;
40
+ }
41
+
42
+
43
+ static inline ThreadData*
44
+ thread_data_get(void)
45
+ {
46
+ ThreadData* td = pthread_getspecific(threadDataKey);
47
+ return td != NULL ? td : thread_data_init();
48
+ }
49
+
50
+ static void
51
+ thread_data_free(void *ptr)
52
+ {
53
+ xfree(ptr);
54
+ }
55
+
56
+ #else
57
+ static ID id_thread_data;
58
+
59
+ static ThreadData*
60
+ thread_data_init(void)
61
+ {
62
+ ThreadData* td;
63
+ VALUE obj;
64
+
65
+ obj = Data_Make_Struct(rb_cObject, ThreadData, NULL, -1, td);
66
+ rb_thread_local_aset(rb_thread_current(), id_thread_data, obj);
67
+
68
+ return td;
69
+ }
70
+
71
+ static inline ThreadData*
72
+ thread_data_get()
73
+ {
74
+ VALUE obj = rb_thread_local_aref(rb_thread_current(), id_thread_data);
75
+
76
+ if (obj != Qnil && TYPE(obj) == T_DATA) {
77
+ return (ThreadData *) DATA_PTR(obj);
78
+ }
79
+
80
+ return thread_data_init();
81
+ }
82
+
83
+ #endif
84
+
85
+
86
+ static VALUE
87
+ get_last_error(VALUE self)
88
+ {
89
+ return INT2NUM(thread_data_get()->td_errno);
90
+ }
91
+
92
+
93
+ static VALUE
94
+ set_last_error(VALUE self, VALUE error)
95
+ {
96
+
97
+ #ifdef _WIN32
98
+ SetLastError(NUM2INT(error));
99
+ #else
100
+ errno = NUM2INT(error);
101
+ #endif
102
+
103
+ return Qnil;
104
+ }
105
+
106
+
107
+ void
108
+ rbffi_save_errno(void)
109
+ {
110
+ int error = 0;
111
+
112
+ #ifdef _WIN32
113
+ error = GetLastError();
114
+ #else
115
+ error = errno;
116
+ #endif
117
+
118
+ thread_data_get()->td_errno = error;
119
+ }
120
+
121
+
122
+ void
123
+ rbffi_LastError_Init(VALUE moduleFFI)
124
+ {
125
+ VALUE moduleError = rb_define_module_under(moduleFFI, "LastError");
126
+
127
+ rb_define_module_function(moduleError, "error", get_last_error, 0);
128
+ rb_define_module_function(moduleError, "error=", set_last_error, 1);
129
+
130
+ #if defined(USE_PTHREAD_LOCAL)
131
+ pthread_key_create(&threadDataKey, thread_data_free);
132
+ #else
133
+ id_thread_data = rb_intern("ffi_thread_local_data");
134
+ #endif /* USE_PTHREAD_LOCAL */
135
+ }
@@ -0,0 +1,18 @@
1
+ #ifndef RBFFI_LASTERROR_H
2
+ #define RBFFI_LASTERROR_H
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+
9
+ void rbffi_LastError_Init(VALUE moduleFFI);
10
+
11
+ void rbffi_save_errno(void);
12
+
13
+ #ifdef __cplusplus
14
+ }
15
+ #endif
16
+
17
+ #endif /* RBFFI_LASTERROR_H */
18
+
@@ -0,0 +1,156 @@
1
+ #include <stdbool.h>
2
+ #include <stdint.h>
3
+ #include <limits.h>
4
+ #include <ruby.h>
5
+ #include "rbffi.h"
6
+ #include "AbstractMemory.h"
7
+ #include "Pointer.h"
8
+ #include "MemoryPointer.h"
9
+
10
+ typedef struct MemoryPointer {
11
+ AbstractMemory memory;
12
+ char* storage; /* start of malloc area */
13
+ int type_size;
14
+ bool autorelease;
15
+ bool allocated;
16
+ } MemoryPointer;
17
+
18
+ static VALUE memptr_allocate(VALUE klass);
19
+ static void memptr_release(MemoryPointer* ptr);
20
+ static VALUE memptr_malloc(VALUE self, long size, long count, bool clear);
21
+ static VALUE memptr_free(VALUE self);
22
+
23
+ VALUE rbffi_MemoryPointerClass;
24
+
25
+ #define MEMPTR(obj) ((MemoryPointer *) rbffi_AbstractMemory_Cast(obj, rbffi_MemoryPointerClass))
26
+
27
+ static ID plus_id = 0;
28
+
29
+ VALUE
30
+ rbffi_MemoryPointer_NewInstance(long size, long count, bool clear)
31
+ {
32
+ return memptr_malloc(memptr_allocate(rbffi_MemoryPointerClass), size, count, clear);
33
+ }
34
+
35
+ static VALUE
36
+ memptr_allocate(VALUE klass)
37
+ {
38
+ MemoryPointer* p;
39
+ VALUE obj = Data_Make_Struct(klass, MemoryPointer, NULL, memptr_release, p);
40
+ p->memory.ops = &rbffi_AbstractMemoryOps;
41
+
42
+ return obj;
43
+ }
44
+
45
+ static VALUE
46
+ memptr_initialize(int argc, VALUE* argv, VALUE self)
47
+ {
48
+ VALUE size = Qnil, count = Qnil, clear = Qnil;
49
+ int nargs = rb_scan_args(argc, argv, "12", &size, &count, &clear);
50
+
51
+ memptr_malloc(self, rbffi_type_size(size), nargs > 1 ? NUM2LONG(count) : 1,
52
+ RTEST(clear) || clear == Qnil);
53
+
54
+ if (rb_block_given_p()) {
55
+ return rb_ensure(rb_yield, self, memptr_free, self);
56
+ }
57
+
58
+ return self;
59
+ }
60
+
61
+ static VALUE
62
+ memptr_malloc(VALUE self, long size, long count, bool clear)
63
+ {
64
+ MemoryPointer* p;
65
+ unsigned long msize;
66
+
67
+ Data_Get_Struct(self, MemoryPointer, p);
68
+ p->type_size = size;
69
+
70
+ msize = size * count;
71
+
72
+ p->storage = malloc(msize + 7);
73
+ if (p->storage == NULL) {
74
+ rb_raise(rb_eNoMemError, "Failed to allocate memory size=%ld bytes", msize);
75
+ }
76
+ p->autorelease = true;
77
+ p->memory.size = msize;
78
+ /* ensure the memory is aligned on at least a 8 byte boundary */
79
+ p->memory.address = (char *) (((uintptr_t) p->storage + 0x7) & (uintptr_t) ~0x7UL);;
80
+ p->allocated = true;
81
+ if (clear && p->memory.size > 0) {
82
+ memset(p->memory.address, 0, p->memory.size);
83
+ }
84
+ return self;
85
+ }
86
+
87
+ static VALUE
88
+ memptr_inspect(VALUE self)
89
+ {
90
+ MemoryPointer* ptr = MEMPTR(self);
91
+ char tmp[100];
92
+ snprintf(tmp, sizeof(tmp), "#<MemoryPointer address=%p size=%lu>", ptr->memory.address, ptr->memory.size);
93
+ return rb_str_new2(tmp);
94
+ }
95
+
96
+ static VALUE
97
+ memptr_type_size(VALUE self)
98
+ {
99
+ return INT2FIX(MEMPTR(self)->type_size);
100
+ }
101
+
102
+ static VALUE
103
+ memptr_aref(VALUE self, VALUE which)
104
+ {
105
+ MemoryPointer* ptr = MEMPTR(self);
106
+ VALUE offset = INT2NUM(ptr->type_size * NUM2INT(which));
107
+ return rb_funcall2(self, plus_id, 1, &offset);
108
+ }
109
+
110
+ static VALUE
111
+ memptr_free(VALUE self)
112
+ {
113
+ MemoryPointer* ptr = MEMPTR(self);
114
+ if (ptr->allocated) {
115
+ if (ptr->storage != NULL) {
116
+ free(ptr->storage);
117
+ ptr->storage = NULL;
118
+ }
119
+ ptr->allocated = false;
120
+ }
121
+ return self;
122
+ }
123
+
124
+ static VALUE
125
+ memptr_autorelease(VALUE self, VALUE autorelease)
126
+ {
127
+ MEMPTR(self)->autorelease = autorelease == Qtrue;
128
+ return self;
129
+ }
130
+
131
+ static void
132
+ memptr_release(MemoryPointer* ptr)
133
+ {
134
+ if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) {
135
+ free(ptr->storage);
136
+ ptr->storage = NULL;
137
+ }
138
+ xfree(ptr);
139
+ }
140
+
141
+ void
142
+ rbffi_MemoryPointer_Init(VALUE moduleFFI)
143
+ {
144
+ rbffi_MemoryPointerClass = rb_define_class_under(moduleFFI, "MemoryPointer", rbffi_PointerClass);
145
+ rb_global_variable(&rbffi_MemoryPointerClass);
146
+
147
+ rb_define_alloc_func(rbffi_MemoryPointerClass, memptr_allocate);
148
+ rb_define_method(rbffi_MemoryPointerClass, "initialize", memptr_initialize, -1);
149
+ rb_define_method(rbffi_MemoryPointerClass, "inspect", memptr_inspect, 0);
150
+ rb_define_method(rbffi_MemoryPointerClass, "autorelease=", memptr_autorelease, 1);
151
+ rb_define_method(rbffi_MemoryPointerClass, "free", memptr_free, 0);
152
+ rb_define_method(rbffi_MemoryPointerClass, "type_size", memptr_type_size, 0);
153
+ rb_define_method(rbffi_MemoryPointerClass, "[]", memptr_aref, 1);
154
+
155
+ plus_id = rb_intern("+");
156
+ }
@@ -0,0 +1,20 @@
1
+
2
+ #ifndef _MEMORYPOINTER_H
3
+ #define _MEMORYPOINTER_H
4
+
5
+ #include <stdbool.h>
6
+ #include <ruby.h>
7
+
8
+ #ifdef __cplusplus
9
+ extern "C" {
10
+ #endif
11
+
12
+ extern void rbffi_MemoryPointer_Init(VALUE moduleFFI);
13
+ extern VALUE rbffi_MemoryPointerClass;
14
+ extern VALUE rbffi_MemoryPointer_NewInstance(long size, long count, bool clear);
15
+ #ifdef __cplusplus
16
+ }
17
+ #endif
18
+
19
+ #endif /* _MEMORYPOINTER_H */
20
+
@@ -0,0 +1,143 @@
1
+ #include <sys/types.h>
2
+ #include <stdbool.h>
3
+ #include <stdint.h>
4
+ #include <limits.h>
5
+ #include <ruby.h>
6
+ #include "rbffi.h"
7
+ #include "AbstractMemory.h"
8
+ #include "Pointer.h"
9
+
10
+ static VALUE NullPointerErrorClass;
11
+
12
+ VALUE rbffi_NullPointerClass;
13
+ VALUE rbffi_NullPointerSingleton;
14
+
15
+ static VALUE
16
+ nullptr_allocate(VALUE klass)
17
+ {
18
+ AbstractMemory* p;
19
+ VALUE retval;
20
+
21
+ retval = Data_Make_Struct(klass, AbstractMemory, NULL, -1, p);
22
+ p->address = 0;
23
+ p->size = 0;
24
+ p->ops = &rbffi_NullPointerOps;
25
+
26
+ return retval;
27
+ }
28
+
29
+ static VALUE
30
+ nullptr_op(int argc, VALUE* argv, VALUE self)
31
+ {
32
+ rb_raise(NullPointerErrorClass, "NULL Pointer access attempted");
33
+ return Qnil;
34
+ }
35
+
36
+ static VALUE
37
+ nullptr_op_get(AbstractMemory* ptr, long offset)
38
+ {
39
+ rb_raise(NullPointerErrorClass, "NULL Pointer access attempted");
40
+ return Qnil;
41
+ }
42
+
43
+ static void
44
+ nullptr_op_put(AbstractMemory* ptr, long offset, VALUE value)
45
+ {
46
+ rb_raise(NullPointerErrorClass, "NULL Pointer access attempted");
47
+ }
48
+
49
+ static VALUE
50
+ nullptr_inspect(VALUE self)
51
+ {
52
+ return rb_str_new2("#<NULL Pointer address=0x0>");
53
+ }
54
+
55
+ static VALUE
56
+ nullptr_null_p(VALUE self)
57
+ {
58
+ return Qtrue;
59
+ }
60
+
61
+ static VALUE
62
+ nullptr_equals(VALUE self, VALUE other)
63
+ {
64
+ AbstractMemory* p2;
65
+
66
+ if (!rb_obj_is_kind_of(other, rbffi_PointerClass)) {
67
+ rb_raise(rb_eArgError, "Comparing Pointer with non Pointer");
68
+ }
69
+
70
+ Data_Get_Struct(other, AbstractMemory, p2);
71
+
72
+ return p2->address == 0 ? Qtrue : Qfalse;
73
+ }
74
+
75
+ static VALUE
76
+ nullptr_address(VALUE self)
77
+ {
78
+ return INT2NUM(0);
79
+ }
80
+
81
+ static MemoryOp NullPointerMemoryOp = { nullptr_op_get, nullptr_op_put };
82
+
83
+ MemoryOps rbffi_NullPointerOps = {
84
+ .int8 = &NullPointerMemoryOp,
85
+ .uint8 = &NullPointerMemoryOp,
86
+ .int16 = &NullPointerMemoryOp,
87
+ .int16 = &NullPointerMemoryOp,
88
+ .int32 = &NullPointerMemoryOp,
89
+ .uint32 = &NullPointerMemoryOp,
90
+ .int64 = &NullPointerMemoryOp,
91
+ .uint64 = &NullPointerMemoryOp,
92
+ .float32 = &NullPointerMemoryOp,
93
+ .float64 = &NullPointerMemoryOp,
94
+ .pointer = &NullPointerMemoryOp,
95
+ .strptr = &NullPointerMemoryOp,
96
+ };
97
+
98
+ void
99
+ rbffi_NullPointer_Init(VALUE moduleFFI)
100
+ {
101
+ rbffi_NullPointerClass = rb_define_class_under(moduleFFI, "NullPointer", rbffi_PointerClass);
102
+ rb_global_variable(&rbffi_NullPointerClass);
103
+
104
+ NullPointerErrorClass = rb_define_class_under(moduleFFI, "NullPointerError", rb_eRuntimeError);
105
+ rb_global_variable(&NullPointerErrorClass);
106
+
107
+ rb_define_alloc_func(rbffi_NullPointerClass, nullptr_allocate);
108
+ rb_define_method(rbffi_NullPointerClass, "inspect", nullptr_inspect, 0);
109
+ rb_define_method(rbffi_NullPointerClass, "+", nullptr_op, -1);
110
+ rb_define_method(rbffi_NullPointerClass, "null?", nullptr_null_p, 0);
111
+ rb_define_method(rbffi_NullPointerClass, "address", nullptr_address, 0);
112
+ rb_define_method(rbffi_NullPointerClass, "==", nullptr_equals, 1);
113
+
114
+ #define NOP(name) \
115
+ rb_define_method(rbffi_NullPointerClass, "get_" #name, nullptr_op, -1); \
116
+ rb_define_method(rbffi_NullPointerClass, "put_" #name, nullptr_op, -1); \
117
+ rb_define_method(rbffi_NullPointerClass, "get_array_of_" #name, nullptr_op, -1); \
118
+ rb_define_method(rbffi_NullPointerClass, "put_array_of_" #name, nullptr_op, -1); \
119
+
120
+
121
+ NOP(int8); NOP(uint8); NOP(int16); NOP(uint16);
122
+ NOP(int32); NOP(uint32); NOP(int64); NOP(uint64); NOP(long); NOP(ulong);
123
+ NOP(float32); NOP(float64);
124
+ NOP(char); NOP(uchar); NOP(short); NOP(ushort);
125
+ NOP(int); NOP(uint); NOP(long_long); NOP(ulong_long);
126
+ NOP(float); NOP(double);
127
+
128
+ #undef NOP
129
+ #define NOP(name) \
130
+ rb_define_method(rbffi_NullPointerClass, "get_" #name, nullptr_op, -1); \
131
+ rb_define_method(rbffi_NullPointerClass, "put_" #name, nullptr_op, -1);
132
+
133
+ NOP(string); NOP(bytes); NOP(pointer); NOP(callback);
134
+
135
+ rb_define_method(rbffi_NullPointerClass, "clear", nullptr_op, -1); \
136
+ rb_define_method(rbffi_NullPointerClass, "total", nullptr_op, -1);
137
+
138
+ // Create a singleton instance of NullPointer that can be shared
139
+ rbffi_NullPointerSingleton = nullptr_allocate(rbffi_NullPointerClass);
140
+ rb_global_variable(&rbffi_NullPointerSingleton);
141
+ rb_define_const(rbffi_PointerClass, "NULL", rbffi_NullPointerSingleton);
142
+ }
143
+