ffi 1.11.2

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.
Files changed (542) hide show
  1. checksums.yaml +7 -0
  2. data/.appveyor.yml +27 -0
  3. data/.gitignore +25 -0
  4. data/.gitmodules +4 -0
  5. data/.travis.yml +42 -0
  6. data/.yardopts +5 -0
  7. data/CHANGELOG.md +147 -0
  8. data/COPYING +49 -0
  9. data/Gemfile +15 -0
  10. data/LICENSE +24 -0
  11. data/LICENSE.SPECS +22 -0
  12. data/README.md +115 -0
  13. data/Rakefile +196 -0
  14. data/ext/ffi_c/AbstractMemory.c +1109 -0
  15. data/ext/ffi_c/AbstractMemory.h +175 -0
  16. data/ext/ffi_c/ArrayType.c +162 -0
  17. data/ext/ffi_c/ArrayType.h +59 -0
  18. data/ext/ffi_c/Buffer.c +365 -0
  19. data/ext/ffi_c/Call.c +503 -0
  20. data/ext/ffi_c/Call.h +107 -0
  21. data/ext/ffi_c/ClosurePool.c +283 -0
  22. data/ext/ffi_c/ClosurePool.h +57 -0
  23. data/ext/ffi_c/DynamicLibrary.c +339 -0
  24. data/ext/ffi_c/DynamicLibrary.h +98 -0
  25. data/ext/ffi_c/Function.c +917 -0
  26. data/ext/ffi_c/Function.h +87 -0
  27. data/ext/ffi_c/FunctionInfo.c +271 -0
  28. data/ext/ffi_c/LastError.c +229 -0
  29. data/ext/ffi_c/LastError.h +47 -0
  30. data/ext/ffi_c/LongDouble.c +63 -0
  31. data/ext/ffi_c/LongDouble.h +51 -0
  32. data/ext/ffi_c/MappedType.c +168 -0
  33. data/ext/ffi_c/MappedType.h +59 -0
  34. data/ext/ffi_c/MemoryPointer.c +197 -0
  35. data/ext/ffi_c/MemoryPointer.h +53 -0
  36. data/ext/ffi_c/MethodHandle.c +358 -0
  37. data/ext/ffi_c/MethodHandle.h +55 -0
  38. data/ext/ffi_c/Platform.c +82 -0
  39. data/ext/ffi_c/Platform.h +45 -0
  40. data/ext/ffi_c/Pointer.c +508 -0
  41. data/ext/ffi_c/Pointer.h +63 -0
  42. data/ext/ffi_c/Struct.c +829 -0
  43. data/ext/ffi_c/Struct.h +106 -0
  44. data/ext/ffi_c/StructByValue.c +150 -0
  45. data/ext/ffi_c/StructByValue.h +55 -0
  46. data/ext/ffi_c/StructLayout.c +698 -0
  47. data/ext/ffi_c/Thread.c +137 -0
  48. data/ext/ffi_c/Thread.h +84 -0
  49. data/ext/ffi_c/Type.c +379 -0
  50. data/ext/ffi_c/Type.h +61 -0
  51. data/ext/ffi_c/Types.c +139 -0
  52. data/ext/ffi_c/Types.h +89 -0
  53. data/ext/ffi_c/Variadic.c +298 -0
  54. data/ext/ffi_c/compat.h +78 -0
  55. data/ext/ffi_c/extconf.rb +86 -0
  56. data/ext/ffi_c/ffi.c +93 -0
  57. data/ext/ffi_c/libffi.bsd.mk +40 -0
  58. data/ext/ffi_c/libffi.darwin.mk +105 -0
  59. data/ext/ffi_c/libffi.gnu.mk +32 -0
  60. data/ext/ffi_c/libffi.mk +18 -0
  61. data/ext/ffi_c/libffi.vc.mk +26 -0
  62. data/ext/ffi_c/libffi.vc64.mk +26 -0
  63. data/ext/ffi_c/libffi/.appveyor.yml +66 -0
  64. data/ext/ffi_c/libffi/.gitattributes +4 -0
  65. data/ext/ffi_c/libffi/.github/issue_template.md +10 -0
  66. data/ext/ffi_c/libffi/.gitignore +38 -0
  67. data/ext/ffi_c/libffi/.travis.yml +63 -0
  68. data/ext/ffi_c/libffi/.travis/ar-lib +270 -0
  69. data/ext/ffi_c/libffi/.travis/build-in-container.sh +22 -0
  70. data/ext/ffi_c/libffi/.travis/build.sh +110 -0
  71. data/ext/ffi_c/libffi/.travis/compile +351 -0
  72. data/ext/ffi_c/libffi/.travis/install.sh +43 -0
  73. data/ext/ffi_c/libffi/.travis/moxie-sim.exp +60 -0
  74. data/ext/ffi_c/libffi/.travis/site.exp +18 -0
  75. data/ext/ffi_c/libffi/ChangeLog.libffi +584 -0
  76. data/ext/ffi_c/libffi/ChangeLog.libffi-3.1 +6000 -0
  77. data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
  78. data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
  79. data/ext/ffi_c/libffi/LICENSE +21 -0
  80. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +353 -0
  81. data/ext/ffi_c/libffi/Makefile.am +158 -0
  82. data/ext/ffi_c/libffi/README.md +470 -0
  83. data/ext/ffi_c/libffi/acinclude.m4 +479 -0
  84. data/ext/ffi_c/libffi/autogen.sh +2 -0
  85. data/ext/ffi_c/libffi/config.guess +1466 -0
  86. data/ext/ffi_c/libffi/config.sub +1836 -0
  87. data/ext/ffi_c/libffi/configure.ac +394 -0
  88. data/ext/ffi_c/libffi/configure.host +303 -0
  89. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +203 -0
  90. data/ext/ffi_c/libffi/include/Makefile.am +9 -0
  91. data/ext/ffi_c/libffi/include/ffi.h.in +515 -0
  92. data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
  93. data/ext/ffi_c/libffi/include/ffi_common.h +153 -0
  94. data/ext/ffi_c/libffi/libffi.map.in +80 -0
  95. data/ext/ffi_c/libffi/libffi.pc.in +11 -0
  96. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +1043 -0
  97. data/ext/ffi_c/libffi/libtool-version +29 -0
  98. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  99. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +71 -0
  100. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +194 -0
  101. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +122 -0
  102. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +74 -0
  103. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +87 -0
  104. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +70 -0
  105. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +302 -0
  106. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +263 -0
  107. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +89 -0
  108. data/ext/ffi_c/libffi/m4/ax_require_defined.m4 +37 -0
  109. data/ext/ffi_c/libffi/make_sunver.pl +333 -0
  110. data/ext/ffi_c/libffi/man/Makefile.am +8 -0
  111. data/ext/ffi_c/libffi/man/ffi.3 +41 -0
  112. data/ext/ffi_c/libffi/man/ffi_call.3 +103 -0
  113. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +68 -0
  114. data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
  115. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
  116. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
  117. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
  118. data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
  119. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +511 -0
  120. data/ext/ffi_c/libffi/msvcc.sh +353 -0
  121. data/ext/ffi_c/libffi/src/aarch64/ffi.c +1009 -0
  122. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +92 -0
  123. data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
  124. data/ext/ffi_c/libffi/src/aarch64/sysv.S +440 -0
  125. data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +506 -0
  126. data/ext/ffi_c/libffi/src/alpha/ffi.c +521 -0
  127. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +57 -0
  128. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  129. data/ext/ffi_c/libffi/src/alpha/osf.S +282 -0
  130. data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
  131. data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
  132. data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
  133. data/ext/ffi_c/libffi/src/arm/ffi.c +854 -0
  134. data/ext/ffi_c/libffi/src/arm/ffitarget.h +89 -0
  135. data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
  136. data/ext/ffi_c/libffi/src/arm/sysv.S +385 -0
  137. data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
  138. data/ext/ffi_c/libffi/src/avr32/ffi.c +423 -0
  139. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +55 -0
  140. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  141. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  142. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  143. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  144. data/ext/ffi_c/libffi/src/closures.c +990 -0
  145. data/ext/ffi_c/libffi/src/cris/ffi.c +386 -0
  146. data/ext/ffi_c/libffi/src/cris/ffitarget.h +56 -0
  147. data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
  148. data/ext/ffi_c/libffi/src/debug.c +64 -0
  149. data/ext/ffi_c/libffi/src/dlmalloc.c +5166 -0
  150. data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
  151. data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
  152. data/ext/ffi_c/libffi/src/frv/ffitarget.h +62 -0
  153. data/ext/ffi_c/libffi/src/ia64/ffi.c +604 -0
  154. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +56 -0
  155. data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
  156. data/ext/ffi_c/libffi/src/ia64/unix.S +567 -0
  157. data/ext/ffi_c/libffi/src/java_raw_api.c +374 -0
  158. data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
  159. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +53 -0
  160. data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
  161. data/ext/ffi_c/libffi/src/m68k/ffi.c +362 -0
  162. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +54 -0
  163. data/ext/ffi_c/libffi/src/m68k/sysv.S +357 -0
  164. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  165. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  166. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  167. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  168. data/ext/ffi_c/libffi/src/metag/ffitarget.h +53 -0
  169. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  170. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  171. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  172. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  173. data/ext/ffi_c/libffi/src/mips/ffi.c +1130 -0
  174. data/ext/ffi_c/libffi/src/mips/ffitarget.h +244 -0
  175. data/ext/ffi_c/libffi/src/mips/n32.S +663 -0
  176. data/ext/ffi_c/libffi/src/mips/o32.S +502 -0
  177. data/ext/ffi_c/libffi/src/moxie/eabi.S +101 -0
  178. data/ext/ffi_c/libffi/src/moxie/ffi.c +285 -0
  179. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  180. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  181. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  182. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  183. data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
  184. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  185. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  186. data/ext/ffi_c/libffi/src/pa/ffi.c +719 -0
  187. data/ext/ffi_c/libffi/src/pa/ffitarget.h +85 -0
  188. data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
  189. data/ext/ffi_c/libffi/src/pa/linux.S +378 -0
  190. data/ext/ffi_c/libffi/src/powerpc/aix.S +566 -0
  191. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +694 -0
  192. data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
  193. data/ext/ffi_c/libffi/src/powerpc/darwin.S +378 -0
  194. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +571 -0
  195. data/ext/ffi_c/libffi/src/powerpc/ffi.c +174 -0
  196. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +1440 -0
  197. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1007 -0
  198. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
  199. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  200. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +198 -0
  201. data/ext/ffi_c/libffi/src/powerpc/linux64.S +228 -0
  202. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +488 -0
  203. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +397 -0
  204. data/ext/ffi_c/libffi/src/powerpc/sysv.S +175 -0
  205. data/ext/ffi_c/libffi/src/prep_cif.c +263 -0
  206. data/ext/ffi_c/libffi/src/raw_api.c +267 -0
  207. data/ext/ffi_c/libffi/src/riscv/ffi.c +481 -0
  208. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +69 -0
  209. data/ext/ffi_c/libffi/src/riscv/sysv.S +293 -0
  210. data/ext/ffi_c/libffi/src/s390/ffi.c +756 -0
  211. data/ext/ffi_c/libffi/src/s390/ffitarget.h +70 -0
  212. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  213. data/ext/ffi_c/libffi/src/s390/sysv.S +325 -0
  214. data/ext/ffi_c/libffi/src/sh/ffi.c +717 -0
  215. data/ext/ffi_c/libffi/src/sh/ffitarget.h +54 -0
  216. data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
  217. data/ext/ffi_c/libffi/src/sh64/ffi.c +469 -0
  218. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +58 -0
  219. data/ext/ffi_c/libffi/src/sh64/sysv.S +539 -0
  220. data/ext/ffi_c/libffi/src/sparc/ffi.c +468 -0
  221. data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
  222. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +81 -0
  223. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  224. data/ext/ffi_c/libffi/src/sparc/v8.S +443 -0
  225. data/ext/ffi_c/libffi/src/sparc/v9.S +440 -0
  226. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  227. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  228. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  229. data/ext/ffi_c/libffi/src/types.c +108 -0
  230. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  231. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  232. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  233. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  234. data/ext/ffi_c/libffi/src/x86/ffi.c +761 -0
  235. data/ext/ffi_c/libffi/src/x86/ffi64.c +886 -0
  236. data/ext/ffi_c/libffi/src/x86/ffitarget.h +147 -0
  237. data/ext/ffi_c/libffi/src/x86/ffiw64.c +311 -0
  238. data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
  239. data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
  240. data/ext/ffi_c/libffi/src/x86/sysv.S +1129 -0
  241. data/ext/ffi_c/libffi/src/x86/sysv_intel.S +995 -0
  242. data/ext/ffi_c/libffi/src/x86/unix64.S +566 -0
  243. data/ext/ffi_c/libffi/src/x86/win64.S +237 -0
  244. data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
  245. data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
  246. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
  247. data/ext/ffi_c/libffi/src/xtensa/sysv.S +258 -0
  248. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  249. data/ext/ffi_c/libffi/testsuite/Makefile.am +119 -0
  250. data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
  251. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +657 -0
  252. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +283 -0
  253. data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +28 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +78 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +50 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +58 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1745 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2885 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +743 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +46 -0
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +43 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +89 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +81 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +81 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +82 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +89 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +92 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +90 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c +55 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +94 -0
  274. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +95 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +96 -0
  276. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +102 -0
  277. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +89 -0
  278. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +91 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +93 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +113 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +90 -0
  282. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +95 -0
  283. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +90 -0
  284. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +90 -0
  285. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c +95 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +98 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +90 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +109 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +98 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +124 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +113 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +99 -0
  293. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +117 -0
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +97 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +88 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +90 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +91 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +93 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +91 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +92 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +132 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +115 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +95 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +91 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +91 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +92 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +91 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +91 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +93 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +43 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +61 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +42 -0
  314. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  315. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +61 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +74 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +74 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +86 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +91 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +74 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +86 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +142 -0
  326. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +44 -0
  327. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +42 -0
  328. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +42 -0
  329. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
  330. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +42 -0
  331. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
  332. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +43 -0
  333. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +47 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +43 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +36 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +26 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +138 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +60 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +61 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +74 -0
  345. data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
  346. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
  347. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +341 -0
  348. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +59 -0
  349. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  350. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  351. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  352. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +52 -0
  353. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +152 -0
  354. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +161 -0
  355. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +134 -0
  356. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
  357. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +110 -0
  358. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +111 -0
  359. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +111 -0
  360. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +112 -0
  361. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +131 -0
  362. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +111 -0
  363. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +131 -0
  364. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +131 -0
  365. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  366. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  367. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +90 -0
  368. data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
  369. data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  370. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +36 -0
  371. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  372. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  373. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
  374. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  375. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  376. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  377. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  378. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
  379. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +43 -0
  380. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
  381. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
  382. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
  383. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
  384. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  385. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  386. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  387. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +125 -0
  388. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
  389. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  390. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  391. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  392. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +67 -0
  393. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +57 -0
  394. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
  395. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +60 -0
  396. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +64 -0
  397. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +66 -0
  398. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
  399. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
  400. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +81 -0
  401. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +68 -0
  402. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  403. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  404. data/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest.cc +117 -0
  405. data/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc +54 -0
  406. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
  407. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
  408. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
  409. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
  410. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  411. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  412. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  413. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  414. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  415. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  416. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  417. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  418. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  419. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  420. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  421. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  422. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  423. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  424. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  425. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  426. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp +36 -0
  427. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  428. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  429. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  430. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  431. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  432. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  433. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  434. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  435. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  436. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  437. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  438. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  439. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  440. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  441. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  442. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  443. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  444. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  445. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  446. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  447. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  448. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  449. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  450. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  451. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  452. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  453. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  454. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  455. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  456. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  457. data/ext/ffi_c/rbffi.h +55 -0
  458. data/ext/ffi_c/rbffi_endian.h +59 -0
  459. data/ext/ffi_c/win32/stdbool.h +8 -0
  460. data/ext/ffi_c/win32/stdint.h +201 -0
  461. data/ffi.gemspec +43 -0
  462. data/lib/ffi.rb +20 -0
  463. data/lib/ffi/autopointer.rb +203 -0
  464. data/lib/ffi/buffer.rb +4 -0
  465. data/lib/ffi/callback.rb +4 -0
  466. data/lib/ffi/data_converter.rb +67 -0
  467. data/lib/ffi/enum.rb +296 -0
  468. data/lib/ffi/errno.rb +43 -0
  469. data/lib/ffi/ffi.rb +45 -0
  470. data/lib/ffi/io.rb +62 -0
  471. data/lib/ffi/library.rb +588 -0
  472. data/lib/ffi/managedstruct.rb +84 -0
  473. data/lib/ffi/memorypointer.rb +1 -0
  474. data/lib/ffi/platform.rb +175 -0
  475. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  476. data/lib/ffi/platform/aarch64-freebsd12/types.conf +128 -0
  477. data/lib/ffi/platform/aarch64-linux/types.conf +104 -0
  478. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  479. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  480. data/lib/ffi/platform/arm-linux/types.conf +104 -0
  481. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  482. data/lib/ffi/platform/i386-darwin/types.conf +100 -0
  483. data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
  484. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  485. data/lib/ffi/platform/i386-gnu/types.conf +107 -0
  486. data/lib/ffi/platform/i386-linux/types.conf +103 -0
  487. data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
  488. data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
  489. data/lib/ffi/platform/i386-solaris/types.conf +122 -0
  490. data/lib/ffi/platform/i386-windows/types.conf +105 -0
  491. data/lib/ffi/platform/ia64-linux/types.conf +104 -0
  492. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  493. data/lib/ffi/platform/mips64-linux/types.conf +104 -0
  494. data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
  495. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  496. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
  497. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
  498. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
  499. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -0
  500. data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
  501. data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
  502. data/lib/ffi/platform/powerpc-linux/types.conf +100 -0
  503. data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
  504. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  505. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  506. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  507. data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
  508. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  509. data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
  510. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  511. data/lib/ffi/platform/x86_64-darwin/types.conf +126 -0
  512. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +148 -0
  513. data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
  514. data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
  515. data/lib/ffi/platform/x86_64-linux/types.conf +111 -0
  516. data/lib/ffi/platform/x86_64-netbsd/types.conf +128 -0
  517. data/lib/ffi/platform/x86_64-openbsd/types.conf +134 -0
  518. data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
  519. data/lib/ffi/platform/x86_64-windows/types.conf +120 -0
  520. data/lib/ffi/pointer.rb +160 -0
  521. data/lib/ffi/struct.rb +311 -0
  522. data/lib/ffi/struct_by_reference.rb +72 -0
  523. data/lib/ffi/struct_layout.rb +96 -0
  524. data/lib/ffi/struct_layout_builder.rb +227 -0
  525. data/lib/ffi/tools/const_generator.rb +230 -0
  526. data/lib/ffi/tools/generator.rb +105 -0
  527. data/lib/ffi/tools/generator_task.rb +32 -0
  528. data/lib/ffi/tools/struct_generator.rb +194 -0
  529. data/lib/ffi/tools/types_generator.rb +135 -0
  530. data/lib/ffi/types.rb +194 -0
  531. data/lib/ffi/union.rb +43 -0
  532. data/lib/ffi/variadic.rb +78 -0
  533. data/lib/ffi/version.rb +3 -0
  534. data/samples/getlogin.rb +8 -0
  535. data/samples/getpid.rb +8 -0
  536. data/samples/gettimeofday.rb +18 -0
  537. data/samples/hello.rb +7 -0
  538. data/samples/inotify.rb +60 -0
  539. data/samples/pty.rb +76 -0
  540. data/samples/qsort.rb +21 -0
  541. data/samples/sample_helper.rb +6 -0
  542. metadata +677 -0
@@ -0,0 +1,122 @@
1
+ rbx.platform.typedef.*caddr_t = char
2
+ rbx.platform.typedef.blkcnt64_t = long
3
+ rbx.platform.typedef.blkcnt_t = long
4
+ rbx.platform.typedef.blksize_t = int
5
+ rbx.platform.typedef.clock_t = long
6
+ rbx.platform.typedef.clockid_t = int
7
+ rbx.platform.typedef.cnt_t = short
8
+ rbx.platform.typedef.cpu_flag_t = ushort
9
+ rbx.platform.typedef.ctid_t = int
10
+ rbx.platform.typedef.daddr_t = long
11
+ rbx.platform.typedef.datalink_id_t = uint
12
+ rbx.platform.typedef.dev_t = ulong
13
+ rbx.platform.typedef.diskaddr_t = ulong_long
14
+ rbx.platform.typedef.disp_lock_t = uchar
15
+ rbx.platform.typedef.fd_mask = long
16
+ rbx.platform.typedef.fds_mask = long
17
+ rbx.platform.typedef.fsblkcnt64_t = ulong
18
+ rbx.platform.typedef.fsblkcnt_t = ulong
19
+ rbx.platform.typedef.fsfilcnt64_t = ulong
20
+ rbx.platform.typedef.fsfilcnt_t = ulong
21
+ rbx.platform.typedef.gid_t = uint
22
+ rbx.platform.typedef.hrtime_t = long_long
23
+ rbx.platform.typedef.id_t = int
24
+ rbx.platform.typedef.in_addr_t = uint
25
+ rbx.platform.typedef.in_port_t = ushort
26
+ rbx.platform.typedef.index_t = short
27
+ rbx.platform.typedef.ino64_t = ulong
28
+ rbx.platform.typedef.ino_t = ulong
29
+ rbx.platform.typedef.int16_t = short
30
+ rbx.platform.typedef.int32_t = int
31
+ rbx.platform.typedef.int64_t = long
32
+ rbx.platform.typedef.int8_t = char
33
+ rbx.platform.typedef.int_fast16_t = int
34
+ rbx.platform.typedef.int_fast32_t = int
35
+ rbx.platform.typedef.int_fast64_t = long
36
+ rbx.platform.typedef.int_fast8_t = char
37
+ rbx.platform.typedef.int_least16_t = short
38
+ rbx.platform.typedef.int_least32_t = int
39
+ rbx.platform.typedef.int_least64_t = long
40
+ rbx.platform.typedef.int_least8_t = char
41
+ rbx.platform.typedef.intmax_t = long
42
+ rbx.platform.typedef.intptr_t = long
43
+ rbx.platform.typedef.ipaddr_t = uint
44
+ rbx.platform.typedef.k_fltset_t = uint
45
+ rbx.platform.typedef.key_t = int
46
+ rbx.platform.typedef.len_t = ulong_long
47
+ rbx.platform.typedef.lgrp_id_t = int
48
+ rbx.platform.typedef.lock_t = uchar
49
+ rbx.platform.typedef.longlong_t = long_long
50
+ rbx.platform.typedef.major_t = uint
51
+ rbx.platform.typedef.minor_t = uint
52
+ rbx.platform.typedef.mode_t = uint
53
+ rbx.platform.typedef.model_t = uint
54
+ rbx.platform.typedef.nfds_t = ulong
55
+ rbx.platform.typedef.nlink_t = uint
56
+ rbx.platform.typedef.o_dev_t = short
57
+ rbx.platform.typedef.o_gid_t = ushort
58
+ rbx.platform.typedef.o_ino_t = ushort
59
+ rbx.platform.typedef.o_mode_t = ushort
60
+ rbx.platform.typedef.o_nlink_t = short
61
+ rbx.platform.typedef.o_pid_t = short
62
+ rbx.platform.typedef.o_uid_t = ushort
63
+ rbx.platform.typedef.off64_t = long
64
+ rbx.platform.typedef.off_t = long
65
+ rbx.platform.typedef.offset_t = long_long
66
+ rbx.platform.typedef.pad64_t = long
67
+ rbx.platform.typedef.pfn_t = ulong
68
+ rbx.platform.typedef.pgcnt_t = ulong
69
+ rbx.platform.typedef.pid_t = int
70
+ rbx.platform.typedef.poolid_t = int
71
+ rbx.platform.typedef.pri_t = short
72
+ rbx.platform.typedef.projid_t = int
73
+ rbx.platform.typedef.pthread_key_t = uint
74
+ rbx.platform.typedef.pthread_t = uint
75
+ rbx.platform.typedef.ptrdiff_t = long
76
+ rbx.platform.typedef.rlim64_t = ulong_long
77
+ rbx.platform.typedef.rlim_t = ulong
78
+ rbx.platform.typedef.sa_family_t = ushort
79
+ rbx.platform.typedef.size_t = ulong
80
+ rbx.platform.typedef.socklen_t = uint
81
+ rbx.platform.typedef.spgcnt_t = long
82
+ rbx.platform.typedef.ssize_t = long
83
+ rbx.platform.typedef.suseconds_t = long
84
+ rbx.platform.typedef.sysid_t = short
85
+ rbx.platform.typedef.t_scalar_t = int
86
+ rbx.platform.typedef.t_uscalar_t = uint
87
+ rbx.platform.typedef.taskid_t = int
88
+ rbx.platform.typedef.time_t = long
89
+ rbx.platform.typedef.timer_t = int
90
+ rbx.platform.typedef.u_char = uchar
91
+ rbx.platform.typedef.u_int = uint
92
+ rbx.platform.typedef.u_long = ulong
93
+ rbx.platform.typedef.u_longlong_t = ulong_long
94
+ rbx.platform.typedef.u_offset_t = ulong_long
95
+ rbx.platform.typedef.u_short = ushort
96
+ rbx.platform.typedef.uchar_t = uchar
97
+ rbx.platform.typedef.uid_t = uint
98
+ rbx.platform.typedef.uint = uint
99
+ rbx.platform.typedef.uint16_t = ushort
100
+ rbx.platform.typedef.uint32_t = uint
101
+ rbx.platform.typedef.uint64_t = ulong
102
+ rbx.platform.typedef.uint8_t = uchar
103
+ rbx.platform.typedef.uint_fast16_t = uint
104
+ rbx.platform.typedef.uint_fast32_t = uint
105
+ rbx.platform.typedef.uint_fast64_t = ulong
106
+ rbx.platform.typedef.uint_fast8_t = uchar
107
+ rbx.platform.typedef.uint_least16_t = ushort
108
+ rbx.platform.typedef.uint_least32_t = uint
109
+ rbx.platform.typedef.uint_least64_t = ulong
110
+ rbx.platform.typedef.uint_least8_t = uchar
111
+ rbx.platform.typedef.uint_t = uint
112
+ rbx.platform.typedef.uintmax_t = ulong
113
+ rbx.platform.typedef.uintptr_t = ulong
114
+ rbx.platform.typedef.ulong = ulong
115
+ rbx.platform.typedef.ulong_t = ulong
116
+ rbx.platform.typedef.unchar = uchar
117
+ rbx.platform.typedef.upad64_t = ulong
118
+ rbx.platform.typedef.use_t = uchar
119
+ rbx.platform.typedef.useconds_t = uint
120
+ rbx.platform.typedef.ushort = ushort
121
+ rbx.platform.typedef.ushort_t = ushort
122
+ rbx.platform.typedef.zoneid_t = int
@@ -0,0 +1,120 @@
1
+ rbx.platform.typedef.*addr_t = char
2
+ rbx.platform.typedef.__ULong = ulong
3
+ rbx.platform.typedef.__blkcnt32_t = long
4
+ rbx.platform.typedef.__blkcnt64_t = long_long
5
+ rbx.platform.typedef.__dev16_t = short
6
+ rbx.platform.typedef.__dev32_t = ulong
7
+ rbx.platform.typedef.__dev_t = short
8
+ rbx.platform.typedef.__gid16_t = ushort
9
+ rbx.platform.typedef.__gid32_t = ulong
10
+ rbx.platform.typedef.__gid_t = ushort
11
+ rbx.platform.typedef.__ino32_t = ulong
12
+ rbx.platform.typedef.__ino64_t = ulong_long
13
+ rbx.platform.typedef.__int16_t = short
14
+ rbx.platform.typedef.__int32_t = int
15
+ rbx.platform.typedef.__int64_t = long_long
16
+ rbx.platform.typedef.__int8_t = char
17
+ rbx.platform.typedef.__int_least16_t = short
18
+ rbx.platform.typedef.__int_least32_t = int
19
+ rbx.platform.typedef.__loff_t = long_long
20
+ rbx.platform.typedef.__off_t = long
21
+ rbx.platform.typedef.__pid_t = int
22
+ rbx.platform.typedef.__time32_t = long
23
+ rbx.platform.typedef.__time64_t = long_long
24
+ rbx.platform.typedef.__uid16_t = ushort
25
+ rbx.platform.typedef.__uid32_t = ulong
26
+ rbx.platform.typedef.__uid_t = ushort
27
+ rbx.platform.typedef.__uint16_t = ushort
28
+ rbx.platform.typedef.__uint32_t = uint
29
+ rbx.platform.typedef.__uint64_t = ulong_long
30
+ rbx.platform.typedef.__uint8_t = uchar
31
+ rbx.platform.typedef.__uint_least16_t = ushort
32
+ rbx.platform.typedef.__uint_least32_t = uint
33
+ rbx.platform.typedef._dev_t = uint
34
+ rbx.platform.typedef._fpos64_t = long_long
35
+ rbx.platform.typedef._fpos_t = long_long
36
+ rbx.platform.typedef._ino_t = ushort
37
+ rbx.platform.typedef._mode_t = ushort
38
+ rbx.platform.typedef._off64_t = long_long
39
+ rbx.platform.typedef._off_t = long
40
+ rbx.platform.typedef._sigset_t = ulong_long
41
+ rbx.platform.typedef._ssize_t = long_long
42
+ rbx.platform.typedef.blkcnt_t = long_long
43
+ rbx.platform.typedef.blksize_t = long
44
+ rbx.platform.typedef.caddr_t = string
45
+ rbx.platform.typedef.clock_t = ulong
46
+ rbx.platform.typedef.clockid_t = ulong
47
+ rbx.platform.typedef.daddr_t = long
48
+ rbx.platform.typedef.dev_t = uint
49
+ rbx.platform.typedef.errno_t = int
50
+ rbx.platform.typedef.fd_mask = long
51
+ rbx.platform.typedef.fpos_t = long_long
52
+ rbx.platform.typedef.fsblkcnt_t = ulong
53
+ rbx.platform.typedef.fsfilcnt_t = ulong
54
+ rbx.platform.typedef.gid_t = ulong
55
+ rbx.platform.typedef.id_t = ulong
56
+ rbx.platform.typedef.ino_t = ushort
57
+ rbx.platform.typedef.int16_t = short
58
+ rbx.platform.typedef.int32_t = int
59
+ rbx.platform.typedef.int64_t = long_long
60
+ rbx.platform.typedef.int8_t = char
61
+ rbx.platform.typedef.int_fast16_t = int
62
+ rbx.platform.typedef.int_fast32_t = int
63
+ rbx.platform.typedef.int_fast64_t = long_long
64
+ rbx.platform.typedef.int_fast8_t = char
65
+ rbx.platform.typedef.int_least16_t = short
66
+ rbx.platform.typedef.int_least32_t = int
67
+ rbx.platform.typedef.int_least64_t = long_long
68
+ rbx.platform.typedef.int_least8_t = char
69
+ rbx.platform.typedef.intmax_t = long_long
70
+ rbx.platform.typedef.intptr_t = long_long
71
+ rbx.platform.typedef.key_t = long_long
72
+ rbx.platform.typedef.loff_t = long_long
73
+ rbx.platform.typedef.mode_t = ushort
74
+ rbx.platform.typedef.nlink_t = ushort
75
+ rbx.platform.typedef.off_t = long_long
76
+ rbx.platform.typedef.pid_t = int
77
+ rbx.platform.typedef.ptrdiff_t = long_long
78
+ rbx.platform.typedef.register_t = int
79
+ rbx.platform.typedef.rlim_t = ulong
80
+ rbx.platform.typedef.sa_family_t = ushort
81
+ rbx.platform.typedef.sig_atomic_t = int
82
+ rbx.platform.typedef.sigset_t = ulong
83
+ rbx.platform.typedef.size_t = ulong_long
84
+ rbx.platform.typedef.socklen_t = int
85
+ rbx.platform.typedef.ssize_t = int
86
+ rbx.platform.typedef.suseconds_t = long
87
+ rbx.platform.typedef.time_t = long_long
88
+ rbx.platform.typedef.timer_t = ulong
89
+ rbx.platform.typedef.u_char = uchar
90
+ rbx.platform.typedef.u_int = uint
91
+ rbx.platform.typedef.u_int16_t = ushort
92
+ rbx.platform.typedef.u_int32_t = uint
93
+ rbx.platform.typedef.u_int64_t = ulong_long
94
+ rbx.platform.typedef.u_int8_t = uchar
95
+ rbx.platform.typedef.u_long = ulong
96
+ rbx.platform.typedef.u_short = ushort
97
+ rbx.platform.typedef.uid_t = ulong
98
+ rbx.platform.typedef.uint = uint
99
+ rbx.platform.typedef.uint16_t = ushort
100
+ rbx.platform.typedef.uint32_t = uint
101
+ rbx.platform.typedef.uint64_t = ulong_long
102
+ rbx.platform.typedef.uint8_t = uchar
103
+ rbx.platform.typedef.uint_fast16_t = uint
104
+ rbx.platform.typedef.uint_fast32_t = uint
105
+ rbx.platform.typedef.uint_fast64_t = ulong_long
106
+ rbx.platform.typedef.uint_fast8_t = uchar
107
+ rbx.platform.typedef.uint_least16_t = ushort
108
+ rbx.platform.typedef.uint_least32_t = uint
109
+ rbx.platform.typedef.uint_least64_t = ulong_long
110
+ rbx.platform.typedef.uint_least8_t = uchar
111
+ rbx.platform.typedef.uintmax_t = ulong_long
112
+ rbx.platform.typedef.uintptr_t = ulong_long
113
+ rbx.platform.typedef.ulong = ulong
114
+ rbx.platform.typedef.useconds_t = ulong
115
+ rbx.platform.typedef.ushort = ushort
116
+ rbx.platform.typedef.vm_offset_t = ulong
117
+ rbx.platform.typedef.vm_size_t = ulong
118
+ rbx.platform.typedef.wchar_t = ushort
119
+ rbx.platform.typedef.wctype_t = ushort
120
+ rbx.platform.typedef.wint_t = uint
@@ -0,0 +1,160 @@
1
+ #
2
+ # Copyright (C) 2008, 2009 Wayne Meissner
3
+ # Copyright (c) 2007, 2008 Evan Phoenix
4
+ #
5
+ # This file is part of ruby-ffi.
6
+ #
7
+ # All rights reserved.
8
+ #
9
+ # Redistribution and use in source and binary forms, with or without
10
+ # modification, are permitted provided that the following conditions are met:
11
+ #
12
+ # * Redistributions of source code must retain the above copyright notice, this
13
+ # list of conditions and the following disclaimer.
14
+ # * Redistributions in binary form must reproduce the above copyright notice
15
+ # this list of conditions and the following disclaimer in the documentation
16
+ # and/or other materials provided with the distribution.
17
+ # * Neither the name of the Ruby FFI project nor the names of its contributors
18
+ # may be used to endorse or promote products derived from this software
19
+ # without specific prior written permission.
20
+ #
21
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
25
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ #
32
+
33
+ require 'ffi/platform'
34
+ module FFI
35
+ class Pointer
36
+
37
+ # Pointer size
38
+ SIZE = Platform::ADDRESS_SIZE / 8
39
+
40
+ # Return the size of a pointer on the current platform, in bytes
41
+ # @return [Numeric]
42
+ def self.size
43
+ SIZE
44
+ end
45
+
46
+ # @param [nil,Numeric] len length of string to return
47
+ # @return [String]
48
+ # Read pointer's contents as a string, or the first +len+ bytes of the
49
+ # equivalent string if +len+ is not +nil+.
50
+ def read_string(len=nil)
51
+ if len
52
+ return ''.b if len == 0
53
+ get_bytes(0, len)
54
+ else
55
+ get_string(0)
56
+ end
57
+ end
58
+
59
+ # @param [Numeric] len length of string to return
60
+ # @return [String]
61
+ # Read the first +len+ bytes of pointer's contents as a string.
62
+ #
63
+ # Same as:
64
+ # ptr.read_string(len) # with len not nil
65
+ def read_string_length(len)
66
+ get_bytes(0, len)
67
+ end
68
+
69
+ # @return [String]
70
+ # Read pointer's contents as a string.
71
+ #
72
+ # Same as:
73
+ # ptr.read_string # with no len
74
+ def read_string_to_null
75
+ get_string(0)
76
+ end
77
+
78
+ # @param [String] str string to write
79
+ # @param [Numeric] len length of string to return
80
+ # @return [self]
81
+ # Write +len+ first bytes of +str+ in pointer's contents.
82
+ #
83
+ # Same as:
84
+ # ptr.write_string(str, len) # with len not nil
85
+ def write_string_length(str, len)
86
+ put_bytes(0, str, 0, len)
87
+ end
88
+
89
+ # @param [String] str string to write
90
+ # @param [Numeric] len length of string to return
91
+ # @return [self]
92
+ # Write +str+ in pointer's contents, or first +len+ bytes if
93
+ # +len+ is not +nil+.
94
+ def write_string(str, len=nil)
95
+ len = str.bytesize unless len
96
+ # Write the string data without NUL termination
97
+ put_bytes(0, str, 0, len)
98
+ end
99
+
100
+ # @param [Type] type type of data to read from pointer's contents
101
+ # @param [Symbol] reader method to send to +self+ to read +type+
102
+ # @param [Numeric] length
103
+ # @return [Array]
104
+ # Read an array of +type+ of length +length+.
105
+ # @example
106
+ # ptr.read_array_of_type(TYPE_UINT8, :read_uint8, 4) # -> [1, 2, 3, 4]
107
+ def read_array_of_type(type, reader, length)
108
+ ary = []
109
+ size = FFI.type_size(type)
110
+ tmp = self
111
+ length.times { |j|
112
+ ary << tmp.send(reader)
113
+ tmp += size unless j == length-1 # avoid OOB
114
+ }
115
+ ary
116
+ end
117
+
118
+ # @param [Type] type type of data to write to pointer's contents
119
+ # @param [Symbol] writer method to send to +self+ to write +type+
120
+ # @param [Array] ary
121
+ # @return [self]
122
+ # Write +ary+ in pointer's contents as +type+.
123
+ # @example
124
+ # ptr.write_array_of_type(TYPE_UINT8, :put_uint8, [1, 2, 3 ,4])
125
+ def write_array_of_type(type, writer, ary)
126
+ size = FFI.type_size(type)
127
+ ary.each_with_index { |val, i|
128
+ break unless i < self.size
129
+ self.send(writer, i * size, val)
130
+ }
131
+ self
132
+ end
133
+
134
+ # @return [self]
135
+ def to_ptr
136
+ self
137
+ end
138
+
139
+ # @param [Symbol,Type] type of data to read
140
+ # @return [Object]
141
+ # Read pointer's contents as +type+
142
+ #
143
+ # Same as:
144
+ # ptr.get(type, 0)
145
+ def read(type)
146
+ get(type, 0)
147
+ end
148
+
149
+ # @param [Symbol,Type] type of data to read
150
+ # @param [Object] value to write
151
+ # @return [nil]
152
+ # Write +value+ of type +type+ to pointer's content
153
+ #
154
+ # Same as:
155
+ # ptr.put(type, 0)
156
+ def write(type, value)
157
+ put(type, 0, value)
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,311 @@
1
+ #
2
+ # Copyright (C) 2008-2010 Wayne Meissner
3
+ # Copyright (C) 2008, 2009 Andrea Fazzi
4
+ # Copyright (C) 2008, 2009 Luc Heinrich
5
+ #
6
+ # This file is part of ruby-ffi.
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice, this
14
+ # list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the Ruby FFI project nor the names of its contributors
19
+ # may be used to endorse or promote products derived from this software
20
+ # without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
26
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
+ #
33
+
34
+ require 'ffi/platform'
35
+ require 'ffi/struct_layout'
36
+ require 'ffi/struct_layout_builder'
37
+ require 'ffi/struct_by_reference'
38
+
39
+ module FFI
40
+
41
+ class Struct
42
+
43
+ # Get struct size
44
+ # @return [Numeric]
45
+ def size
46
+ self.class.size
47
+ end
48
+
49
+ # @return [Fixnum] Struct alignment
50
+ def alignment
51
+ self.class.alignment
52
+ end
53
+ alias_method :align, :alignment
54
+
55
+ # (see FFI::StructLayout#offset_of)
56
+ def offset_of(name)
57
+ self.class.offset_of(name)
58
+ end
59
+
60
+ # (see FFI::StructLayout#members)
61
+ def members
62
+ self.class.members
63
+ end
64
+
65
+ # @return [Array]
66
+ # Get array of values from Struct fields.
67
+ def values
68
+ members.map { |m| self[m] }
69
+ end
70
+
71
+ # (see FFI::StructLayout#offsets)
72
+ def offsets
73
+ self.class.offsets
74
+ end
75
+
76
+ # Clear the struct content.
77
+ # @return [self]
78
+ def clear
79
+ pointer.clear
80
+ self
81
+ end
82
+
83
+ # Get {Pointer} to struct content.
84
+ # @return [AbstractMemory]
85
+ def to_ptr
86
+ pointer
87
+ end
88
+
89
+ # Get struct size
90
+ # @return [Numeric]
91
+ def self.size
92
+ defined?(@layout) ? @layout.size : defined?(@size) ? @size : 0
93
+ end
94
+
95
+ # set struct size
96
+ # @param [Numeric] size
97
+ # @return [size]
98
+ def self.size=(size)
99
+ raise ArgumentError, "Size already set" if defined?(@size) || defined?(@layout)
100
+ @size = size
101
+ end
102
+
103
+ # @return (see Struct#alignment)
104
+ def self.alignment
105
+ @layout.alignment
106
+ end
107
+
108
+ # (see FFI::Type#members)
109
+ def self.members
110
+ @layout.members
111
+ end
112
+
113
+ # (see FFI::StructLayout#offsets)
114
+ def self.offsets
115
+ @layout.offsets
116
+ end
117
+
118
+ # (see FFI::StructLayout#offset_of)
119
+ def self.offset_of(name)
120
+ @layout.offset_of(name)
121
+ end
122
+
123
+ def self.in
124
+ ptr(:in)
125
+ end
126
+
127
+ def self.out
128
+ ptr(:out)
129
+ end
130
+
131
+ def self.ptr(flags = :inout)
132
+ @ref_data_type ||= Type::Mapped.new(StructByReference.new(self))
133
+ end
134
+
135
+ def self.val
136
+ @val_data_type ||= StructByValue.new(self)
137
+ end
138
+
139
+ def self.by_value
140
+ self.val
141
+ end
142
+
143
+ def self.by_ref(flags = :inout)
144
+ self.ptr(flags)
145
+ end
146
+
147
+ class ManagedStructConverter < StructByReference
148
+
149
+ # @param [Struct] struct_class
150
+ def initialize(struct_class)
151
+ super(struct_class)
152
+
153
+ raise NoMethodError, "release() not implemented for class #{struct_class}" unless struct_class.respond_to? :release
154
+ @method = struct_class.method(:release)
155
+ end
156
+
157
+ # @param [Pointer] ptr
158
+ # @param [nil] ctx
159
+ # @return [Struct]
160
+ def from_native(ptr, ctx)
161
+ struct_class.new(AutoPointer.new(ptr, @method))
162
+ end
163
+ end
164
+
165
+ def self.auto_ptr
166
+ @managed_type ||= Type::Mapped.new(ManagedStructConverter.new(self))
167
+ end
168
+
169
+
170
+ class << self
171
+ public
172
+
173
+ # @return [StructLayout]
174
+ # @overload layout
175
+ # @return [StructLayout]
176
+ # Get struct layout.
177
+ # @overload layout(*spec)
178
+ # @param [Array<Symbol, Integer>,Array(Hash)] spec
179
+ # @return [StructLayout]
180
+ # Create struct layout from +spec+.
181
+ # @example Creating a layout from an array +spec+
182
+ # class MyStruct < Struct
183
+ # layout :field1, :int,
184
+ # :field2, :pointer,
185
+ # :field3, :string
186
+ # end
187
+ # @example Creating a layout from an array +spec+ with offset
188
+ # class MyStructWithOffset < Struct
189
+ # layout :field1, :int,
190
+ # :field2, :pointer, 6, # set offset to 6 for this field
191
+ # :field3, :string
192
+ # end
193
+ # @example Creating a layout from a hash +spec+ (Ruby 1.9 only)
194
+ # class MyStructFromHash < Struct
195
+ # layout :field1 => :int,
196
+ # :field2 => :pointer,
197
+ # :field3 => :string
198
+ # end
199
+ # @example Creating a layout with pointers to functions
200
+ # class MyFunctionTable < Struct
201
+ # layout :function1, callback([:int, :int], :int),
202
+ # :function2, callback([:pointer], :void),
203
+ # :field3, :string
204
+ # end
205
+ # @note Creating a layout from a hash +spec+ is supported only for Ruby 1.9.
206
+ def layout(*spec)
207
+ #raise RuntimeError, "struct layout already defined for #{self.inspect}" if defined?(@layout)
208
+ return @layout if spec.size == 0
209
+
210
+ builder = StructLayoutBuilder.new
211
+ builder.union = self < Union
212
+ builder.packed = @packed if defined?(@packed)
213
+ builder.alignment = @min_alignment if defined?(@min_alignment)
214
+
215
+ if spec[0].kind_of?(Hash)
216
+ hash_layout(builder, spec)
217
+ else
218
+ array_layout(builder, spec)
219
+ end
220
+ builder.size = @size if defined?(@size) && @size > builder.size
221
+ cspec = builder.build
222
+ @layout = cspec unless self == Struct
223
+ @size = cspec.size
224
+ return cspec
225
+ end
226
+
227
+
228
+ protected
229
+
230
+ def callback(params, ret)
231
+ mod = enclosing_module
232
+ FFI::CallbackInfo.new(find_type(ret, mod), params.map { |e| find_type(e, mod) })
233
+ end
234
+
235
+ def packed(packed = 1)
236
+ @packed = packed
237
+ end
238
+ alias :pack :packed
239
+
240
+ def aligned(alignment = 1)
241
+ @min_alignment = alignment
242
+ end
243
+ alias :align :aligned
244
+
245
+ def enclosing_module
246
+ begin
247
+ mod = self.name.split("::")[0..-2].inject(Object) { |obj, c| obj.const_get(c) }
248
+ (mod < FFI::Library || mod < FFI::Struct || mod.respond_to?(:find_type)) ? mod : nil
249
+ rescue Exception
250
+ nil
251
+ end
252
+ end
253
+
254
+
255
+ def find_field_type(type, mod = enclosing_module)
256
+ if type.kind_of?(Class) && type < Struct
257
+ FFI::Type::Struct.new(type)
258
+
259
+ elsif type.kind_of?(Class) && type < FFI::StructLayout::Field
260
+ type
261
+
262
+ elsif type.kind_of?(::Array)
263
+ FFI::Type::Array.new(find_field_type(type[0]), type[1])
264
+
265
+ else
266
+ find_type(type, mod)
267
+ end
268
+ end
269
+
270
+ def find_type(type, mod = enclosing_module)
271
+ if mod
272
+ mod.find_type(type)
273
+ end || FFI.find_type(type)
274
+ end
275
+
276
+ private
277
+
278
+ # @param [StructLayoutBuilder] builder
279
+ # @param [Hash] spec
280
+ # @return [builder]
281
+ # Add hash +spec+ to +builder+.
282
+ def hash_layout(builder, spec)
283
+ spec[0].each do |name, type|
284
+ builder.add name, find_field_type(type), nil
285
+ end
286
+ end
287
+
288
+ # @param [StructLayoutBuilder] builder
289
+ # @param [Array<Symbol, Integer>] spec
290
+ # @return [builder]
291
+ # Add array +spec+ to +builder+.
292
+ def array_layout(builder, spec)
293
+ i = 0
294
+ while i < spec.size
295
+ name, type = spec[i, 2]
296
+ i += 2
297
+
298
+ # If the next param is a Integer, it specifies the offset
299
+ if spec[i].kind_of?(Integer)
300
+ offset = spec[i]
301
+ i += 1
302
+ else
303
+ offset = nil
304
+ end
305
+
306
+ builder.add name, find_field_type(type), offset
307
+ end
308
+ end
309
+ end
310
+ end
311
+ end