ffi 1.10.0

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 (530) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +43 -0
  5. data/.yardopts +5 -0
  6. data/CHANGELOG.md +98 -0
  7. data/COPYING +49 -0
  8. data/Gemfile +15 -0
  9. data/LICENSE +24 -0
  10. data/LICENSE.SPECS +22 -0
  11. data/README.md +112 -0
  12. data/Rakefile +268 -0
  13. data/appveyor.yml +22 -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 +520 -0
  20. data/ext/ffi_c/Call.h +110 -0
  21. data/ext/ffi_c/ClosurePool.c +283 -0
  22. data/ext/ffi_c/ClosurePool.h +57 -0
  23. data/ext/ffi_c/DataConverter.c +91 -0
  24. data/ext/ffi_c/DynamicLibrary.c +339 -0
  25. data/ext/ffi_c/DynamicLibrary.h +98 -0
  26. data/ext/ffi_c/Function.c +1001 -0
  27. data/ext/ffi_c/Function.h +87 -0
  28. data/ext/ffi_c/FunctionInfo.c +271 -0
  29. data/ext/ffi_c/LastError.c +229 -0
  30. data/ext/ffi_c/LastError.h +47 -0
  31. data/ext/ffi_c/LongDouble.c +63 -0
  32. data/ext/ffi_c/LongDouble.h +51 -0
  33. data/ext/ffi_c/MappedType.c +168 -0
  34. data/ext/ffi_c/MappedType.h +59 -0
  35. data/ext/ffi_c/MemoryPointer.c +197 -0
  36. data/ext/ffi_c/MemoryPointer.h +53 -0
  37. data/ext/ffi_c/MethodHandle.c +358 -0
  38. data/ext/ffi_c/MethodHandle.h +55 -0
  39. data/ext/ffi_c/Platform.c +129 -0
  40. data/ext/ffi_c/Platform.h +45 -0
  41. data/ext/ffi_c/Pointer.c +508 -0
  42. data/ext/ffi_c/Pointer.h +63 -0
  43. data/ext/ffi_c/Struct.c +829 -0
  44. data/ext/ffi_c/Struct.h +106 -0
  45. data/ext/ffi_c/StructByReference.c +190 -0
  46. data/ext/ffi_c/StructByReference.h +50 -0
  47. data/ext/ffi_c/StructByValue.c +150 -0
  48. data/ext/ffi_c/StructByValue.h +55 -0
  49. data/ext/ffi_c/StructLayout.c +698 -0
  50. data/ext/ffi_c/Thread.c +353 -0
  51. data/ext/ffi_c/Thread.h +95 -0
  52. data/ext/ffi_c/Type.c +397 -0
  53. data/ext/ffi_c/Type.h +62 -0
  54. data/ext/ffi_c/Types.c +139 -0
  55. data/ext/ffi_c/Types.h +89 -0
  56. data/ext/ffi_c/Variadic.c +304 -0
  57. data/ext/ffi_c/compat.h +78 -0
  58. data/ext/ffi_c/extconf.rb +72 -0
  59. data/ext/ffi_c/ffi.c +98 -0
  60. data/ext/ffi_c/libffi.bsd.mk +40 -0
  61. data/ext/ffi_c/libffi.darwin.mk +105 -0
  62. data/ext/ffi_c/libffi.gnu.mk +32 -0
  63. data/ext/ffi_c/libffi.mk +18 -0
  64. data/ext/ffi_c/libffi.vc.mk +26 -0
  65. data/ext/ffi_c/libffi.vc64.mk +26 -0
  66. data/ext/ffi_c/libffi/.appveyor.yml +50 -0
  67. data/ext/ffi_c/libffi/.github/issue_template.md +10 -0
  68. data/ext/ffi_c/libffi/.gitignore +38 -0
  69. data/ext/ffi_c/libffi/.travis.yml +34 -0
  70. data/ext/ffi_c/libffi/.travis/ar-lib +270 -0
  71. data/ext/ffi_c/libffi/.travis/build.sh +34 -0
  72. data/ext/ffi_c/libffi/.travis/compile +351 -0
  73. data/ext/ffi_c/libffi/.travis/install.sh +22 -0
  74. data/ext/ffi_c/libffi/.travis/moxie-sim.exp +60 -0
  75. data/ext/ffi_c/libffi/.travis/site.exp +18 -0
  76. data/ext/ffi_c/libffi/ChangeLog.libffi +584 -0
  77. data/ext/ffi_c/libffi/ChangeLog.libffi-3.1 +6000 -0
  78. data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
  79. data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
  80. data/ext/ffi_c/libffi/LICENSE +21 -0
  81. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +352 -0
  82. data/ext/ffi_c/libffi/Makefile.am +166 -0
  83. data/ext/ffi_c/libffi/README.md +461 -0
  84. data/ext/ffi_c/libffi/acinclude.m4 +479 -0
  85. data/ext/ffi_c/libffi/autogen.sh +2 -0
  86. data/ext/ffi_c/libffi/config.guess +1466 -0
  87. data/ext/ffi_c/libffi/config.sub +1836 -0
  88. data/ext/ffi_c/libffi/configure.ac +390 -0
  89. data/ext/ffi_c/libffi/configure.host +289 -0
  90. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +203 -0
  91. data/ext/ffi_c/libffi/include/Makefile.am +9 -0
  92. data/ext/ffi_c/libffi/include/ffi.h.in +511 -0
  93. data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
  94. data/ext/ffi_c/libffi/include/ffi_common.h +149 -0
  95. data/ext/ffi_c/libffi/libffi.map.in +80 -0
  96. data/ext/ffi_c/libffi/libffi.pc.in +11 -0
  97. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +1043 -0
  98. data/ext/ffi_c/libffi/libtool-version +29 -0
  99. data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
  100. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +71 -0
  101. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +194 -0
  102. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +122 -0
  103. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +74 -0
  104. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +87 -0
  105. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +70 -0
  106. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +302 -0
  107. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +263 -0
  108. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +89 -0
  109. data/ext/ffi_c/libffi/m4/ax_require_defined.m4 +37 -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/msvcc.sh +328 -0
  116. data/ext/ffi_c/libffi/src/aarch64/ffi.c +941 -0
  117. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +81 -0
  118. data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
  119. data/ext/ffi_c/libffi/src/aarch64/sysv.S +438 -0
  120. data/ext/ffi_c/libffi/src/alpha/ffi.c +521 -0
  121. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +57 -0
  122. data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
  123. data/ext/ffi_c/libffi/src/alpha/osf.S +282 -0
  124. data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
  125. data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
  126. data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
  127. data/ext/ffi_c/libffi/src/arm/ffi.c +819 -0
  128. data/ext/ffi_c/libffi/src/arm/ffitarget.h +82 -0
  129. data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
  130. data/ext/ffi_c/libffi/src/arm/sysv.S +383 -0
  131. data/ext/ffi_c/libffi/src/avr32/ffi.c +423 -0
  132. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +55 -0
  133. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  134. data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
  135. data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
  136. data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
  137. data/ext/ffi_c/libffi/src/closures.c +966 -0
  138. data/ext/ffi_c/libffi/src/cris/ffi.c +386 -0
  139. data/ext/ffi_c/libffi/src/cris/ffitarget.h +56 -0
  140. data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
  141. data/ext/ffi_c/libffi/src/debug.c +64 -0
  142. data/ext/ffi_c/libffi/src/dlmalloc.c +5166 -0
  143. data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
  144. data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
  145. data/ext/ffi_c/libffi/src/frv/ffitarget.h +62 -0
  146. data/ext/ffi_c/libffi/src/ia64/ffi.c +604 -0
  147. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +56 -0
  148. data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
  149. data/ext/ffi_c/libffi/src/ia64/unix.S +567 -0
  150. data/ext/ffi_c/libffi/src/java_raw_api.c +374 -0
  151. data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
  152. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +53 -0
  153. data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
  154. data/ext/ffi_c/libffi/src/m68k/ffi.c +362 -0
  155. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +54 -0
  156. data/ext/ffi_c/libffi/src/m68k/sysv.S +357 -0
  157. data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
  158. data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
  159. data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
  160. data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
  161. data/ext/ffi_c/libffi/src/metag/ffitarget.h +53 -0
  162. data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
  163. data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
  164. data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
  165. data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
  166. data/ext/ffi_c/libffi/src/mips/ffi.c +1130 -0
  167. data/ext/ffi_c/libffi/src/mips/ffitarget.h +244 -0
  168. data/ext/ffi_c/libffi/src/mips/n32.S +663 -0
  169. data/ext/ffi_c/libffi/src/mips/o32.S +502 -0
  170. data/ext/ffi_c/libffi/src/moxie/eabi.S +101 -0
  171. data/ext/ffi_c/libffi/src/moxie/ffi.c +285 -0
  172. data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
  173. data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
  174. data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
  175. data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
  176. data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
  177. data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
  178. data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
  179. data/ext/ffi_c/libffi/src/pa/ffi.c +719 -0
  180. data/ext/ffi_c/libffi/src/pa/ffitarget.h +85 -0
  181. data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
  182. data/ext/ffi_c/libffi/src/pa/linux.S +357 -0
  183. data/ext/ffi_c/libffi/src/powerpc/aix.S +566 -0
  184. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +694 -0
  185. data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
  186. data/ext/ffi_c/libffi/src/powerpc/darwin.S +378 -0
  187. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +571 -0
  188. data/ext/ffi_c/libffi/src/powerpc/ffi.c +173 -0
  189. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +1440 -0
  190. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +974 -0
  191. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
  192. data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
  193. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +198 -0
  194. data/ext/ffi_c/libffi/src/powerpc/linux64.S +228 -0
  195. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +488 -0
  196. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +397 -0
  197. data/ext/ffi_c/libffi/src/powerpc/sysv.S +175 -0
  198. data/ext/ffi_c/libffi/src/prep_cif.c +261 -0
  199. data/ext/ffi_c/libffi/src/raw_api.c +267 -0
  200. data/ext/ffi_c/libffi/src/riscv/ffi.c +445 -0
  201. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +68 -0
  202. data/ext/ffi_c/libffi/src/riscv/sysv.S +214 -0
  203. data/ext/ffi_c/libffi/src/s390/ffi.c +756 -0
  204. data/ext/ffi_c/libffi/src/s390/ffitarget.h +70 -0
  205. data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
  206. data/ext/ffi_c/libffi/src/s390/sysv.S +325 -0
  207. data/ext/ffi_c/libffi/src/sh/ffi.c +717 -0
  208. data/ext/ffi_c/libffi/src/sh/ffitarget.h +54 -0
  209. data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
  210. data/ext/ffi_c/libffi/src/sh64/ffi.c +469 -0
  211. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +58 -0
  212. data/ext/ffi_c/libffi/src/sh64/sysv.S +539 -0
  213. data/ext/ffi_c/libffi/src/sparc/ffi.c +468 -0
  214. data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
  215. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +81 -0
  216. data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
  217. data/ext/ffi_c/libffi/src/sparc/v8.S +443 -0
  218. data/ext/ffi_c/libffi/src/sparc/v9.S +440 -0
  219. data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
  220. data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
  221. data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
  222. data/ext/ffi_c/libffi/src/types.c +108 -0
  223. data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
  224. data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
  225. data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
  226. data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
  227. data/ext/ffi_c/libffi/src/x86/ffi.c +753 -0
  228. data/ext/ffi_c/libffi/src/x86/ffi64.c +884 -0
  229. data/ext/ffi_c/libffi/src/x86/ffitarget.h +147 -0
  230. data/ext/ffi_c/libffi/src/x86/ffiw64.c +308 -0
  231. data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
  232. data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
  233. data/ext/ffi_c/libffi/src/x86/sysv.S +1043 -0
  234. data/ext/ffi_c/libffi/src/x86/unix64.S +525 -0
  235. data/ext/ffi_c/libffi/src/x86/win64.S +232 -0
  236. data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
  237. data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
  238. data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
  239. data/ext/ffi_c/libffi/src/xtensa/sysv.S +258 -0
  240. data/ext/ffi_c/libffi/stamp-h.in +1 -0
  241. data/ext/ffi_c/libffi/testsuite/Makefile.am +117 -0
  242. data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
  243. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +636 -0
  244. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +283 -0
  245. data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +28 -0
  247. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +78 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +50 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +58 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1745 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2885 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +743 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +46 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +43 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +89 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +81 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +81 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +82 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +89 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +92 -0
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +90 -0
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c +55 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +94 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +95 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +96 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +102 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +89 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +91 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +93 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +113 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +90 -0
  274. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +95 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +90 -0
  276. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +90 -0
  277. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c +95 -0
  278. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +98 -0
  279. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +90 -0
  280. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +109 -0
  281. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +98 -0
  282. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +124 -0
  283. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +113 -0
  284. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +99 -0
  285. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +117 -0
  286. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +97 -0
  287. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +88 -0
  288. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +90 -0
  289. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +91 -0
  290. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +93 -0
  291. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +91 -0
  292. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +92 -0
  293. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +132 -0
  294. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +115 -0
  295. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +95 -0
  296. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +91 -0
  297. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +91 -0
  298. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +92 -0
  299. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +91 -0
  300. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +91 -0
  301. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +93 -0
  302. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  303. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +43 -0
  304. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +61 -0
  305. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +42 -0
  306. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  307. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +61 -0
  308. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
  309. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
  310. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +74 -0
  311. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +74 -0
  312. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +86 -0
  313. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +91 -0
  314. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +74 -0
  315. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +86 -0
  316. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  317. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +142 -0
  318. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +44 -0
  319. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +42 -0
  320. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +42 -0
  321. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
  322. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +42 -0
  323. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
  324. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +43 -0
  325. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
  326. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
  327. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +47 -0
  328. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +43 -0
  329. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
  330. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +36 -0
  331. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +26 -0
  332. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +138 -0
  333. data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
  334. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +60 -0
  335. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +60 -0
  336. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +74 -0
  337. data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
  338. data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
  339. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +341 -0
  340. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +59 -0
  341. data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
  342. data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
  343. data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
  344. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +52 -0
  345. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +152 -0
  346. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +161 -0
  347. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +134 -0
  348. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
  349. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +110 -0
  350. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +111 -0
  351. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +111 -0
  352. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +112 -0
  353. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +131 -0
  354. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +111 -0
  355. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +131 -0
  356. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +131 -0
  357. data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
  358. data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
  359. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +90 -0
  360. data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
  361. data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  362. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +36 -0
  363. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  364. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  365. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
  366. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  367. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  368. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  369. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  370. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
  371. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +43 -0
  372. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
  373. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
  374. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
  375. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
  376. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  377. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  378. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  379. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +125 -0
  380. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
  381. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
  382. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
  383. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
  384. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +67 -0
  385. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +57 -0
  386. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
  387. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +60 -0
  388. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +64 -0
  389. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +66 -0
  390. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
  391. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
  392. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +81 -0
  393. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +68 -0
  394. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  395. data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
  396. data/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest.cc +117 -0
  397. data/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc +54 -0
  398. data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
  399. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
  400. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
  401. data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
  402. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
  403. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
  404. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
  405. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
  406. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
  407. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
  408. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
  409. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
  410. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
  411. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
  412. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
  413. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
  414. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
  415. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
  416. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
  417. data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
  418. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp +36 -0
  419. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
  420. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
  421. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
  422. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
  423. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
  424. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
  425. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
  426. data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
  427. data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
  428. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
  429. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
  430. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
  431. data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
  432. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
  433. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
  434. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
  435. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
  436. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
  437. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
  438. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
  439. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
  440. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
  441. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
  442. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
  443. data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
  444. data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
  445. data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
  446. data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
  447. data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
  448. data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
  449. data/ext/ffi_c/rbffi.h +57 -0
  450. data/ext/ffi_c/rbffi_endian.h +59 -0
  451. data/ext/ffi_c/win32/stdbool.h +8 -0
  452. data/ext/ffi_c/win32/stdint.h +201 -0
  453. data/ffi.gemspec +36 -0
  454. data/lib/ffi.rb +20 -0
  455. data/lib/ffi/autopointer.rb +203 -0
  456. data/lib/ffi/buffer.rb +4 -0
  457. data/lib/ffi/callback.rb +4 -0
  458. data/lib/ffi/enum.rb +296 -0
  459. data/lib/ffi/errno.rb +43 -0
  460. data/lib/ffi/ffi.rb +44 -0
  461. data/lib/ffi/io.rb +62 -0
  462. data/lib/ffi/library.rb +588 -0
  463. data/lib/ffi/managedstruct.rb +84 -0
  464. data/lib/ffi/memorypointer.rb +1 -0
  465. data/lib/ffi/platform.rb +170 -0
  466. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  467. data/lib/ffi/platform/aarch64-freebsd12/types.conf +128 -0
  468. data/lib/ffi/platform/aarch64-linux/types.conf +104 -0
  469. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  470. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  471. data/lib/ffi/platform/arm-linux/types.conf +104 -0
  472. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  473. data/lib/ffi/platform/i386-darwin/types.conf +100 -0
  474. data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
  475. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  476. data/lib/ffi/platform/i386-gnu/types.conf +107 -0
  477. data/lib/ffi/platform/i386-linux/types.conf +103 -0
  478. data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
  479. data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
  480. data/lib/ffi/platform/i386-solaris/types.conf +122 -0
  481. data/lib/ffi/platform/i386-windows/types.conf +105 -0
  482. data/lib/ffi/platform/ia64-linux/types.conf +104 -0
  483. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  484. data/lib/ffi/platform/mips64-linux/types.conf +104 -0
  485. data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
  486. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  487. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
  488. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
  489. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
  490. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -0
  491. data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
  492. data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
  493. data/lib/ffi/platform/powerpc-linux/types.conf +100 -0
  494. data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
  495. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  496. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  497. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  498. data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
  499. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  500. data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
  501. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  502. data/lib/ffi/platform/x86_64-darwin/types.conf +126 -0
  503. data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
  504. data/lib/ffi/platform/x86_64-freebsd12/types.conf +128 -0
  505. data/lib/ffi/platform/x86_64-linux/types.conf +102 -0
  506. data/lib/ffi/platform/x86_64-netbsd/types.conf +128 -0
  507. data/lib/ffi/platform/x86_64-openbsd/types.conf +134 -0
  508. data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
  509. data/lib/ffi/platform/x86_64-windows/types.conf +120 -0
  510. data/lib/ffi/pointer.rb +160 -0
  511. data/lib/ffi/struct.rb +371 -0
  512. data/lib/ffi/struct_layout_builder.rb +227 -0
  513. data/lib/ffi/tools/const_generator.rb +229 -0
  514. data/lib/ffi/tools/generator.rb +60 -0
  515. data/lib/ffi/tools/generator_task.rb +36 -0
  516. data/lib/ffi/tools/struct_generator.rb +194 -0
  517. data/lib/ffi/tools/types_generator.rb +134 -0
  518. data/lib/ffi/types.rb +194 -0
  519. data/lib/ffi/union.rb +43 -0
  520. data/lib/ffi/variadic.rb +78 -0
  521. data/lib/ffi/version.rb +3 -0
  522. data/samples/getlogin.rb +8 -0
  523. data/samples/getpid.rb +8 -0
  524. data/samples/gettimeofday.rb +18 -0
  525. data/samples/hello.rb +7 -0
  526. data/samples/inotify.rb +60 -0
  527. data/samples/pty.rb +76 -0
  528. data/samples/qsort.rb +21 -0
  529. data/samples/sample_helper.rb +6 -0
  530. metadata +658 -0
@@ -0,0 +1,353 @@
1
+ /*
2
+ * Copyright (c) 2010 Wayne Meissner
3
+ *
4
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are met:
9
+ * * Redistributions of source code must retain the above copyright
10
+ * notice, this list of conditions and the following disclaimer.
11
+ * * Redistributions in binary form must reproduce the above copyright
12
+ * notice, this list of conditions and the following disclaimer in the
13
+ * documentation and/or other materials provided with the distribution.
14
+ * * Neither the name of the Ruby FFI project nor the
15
+ * names of its contributors may be used to endorse or promote products
16
+ * derived from this software without specific prior written permission.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
22
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ */
29
+
30
+ #include <stddef.h>
31
+ #ifndef _MSC_VER
32
+ #include <stdbool.h>
33
+ #else
34
+ # include "win32/stdbool.h"
35
+ # include "win32/stdint.h"
36
+ #endif
37
+
38
+ #if defined(__CYGWIN__) || !defined(_WIN32)
39
+ # include <pthread.h>
40
+ # include <errno.h>
41
+ # include <signal.h>
42
+ # include <unistd.h>
43
+ #else
44
+ # include <winsock2.h>
45
+ # define _WINSOCKAPI_
46
+ # include <windows.h>
47
+ #endif
48
+ #include <fcntl.h>
49
+ #include "Thread.h"
50
+
51
+ #ifdef _WIN32
52
+ static volatile DWORD frame_thread_key = TLS_OUT_OF_INDEXES;
53
+ #else
54
+ static pthread_key_t thread_data_key;
55
+ struct thread_data {
56
+ rbffi_frame_t* frame;
57
+ };
58
+ static inline struct thread_data* thread_data_get(void);
59
+
60
+ #endif
61
+
62
+ rbffi_frame_t*
63
+ rbffi_frame_current(void)
64
+ {
65
+ #ifdef _WIN32
66
+ return (rbffi_frame_t *) TlsGetValue(frame_thread_key);
67
+ #else
68
+ struct thread_data* td = (struct thread_data *) pthread_getspecific(thread_data_key);
69
+ return td != NULL ? td->frame : NULL;
70
+ #endif
71
+ }
72
+
73
+ void
74
+ rbffi_frame_push(rbffi_frame_t* frame)
75
+ {
76
+ memset(frame, 0, sizeof(*frame));
77
+ frame->has_gvl = true;
78
+ frame->exc = Qnil;
79
+
80
+ #ifdef _WIN32
81
+ frame->prev = TlsGetValue(frame_thread_key);
82
+ TlsSetValue(frame_thread_key, frame);
83
+ #else
84
+ frame->td = thread_data_get();
85
+ frame->prev = frame->td->frame;
86
+ frame->td->frame = frame;
87
+ #endif
88
+ }
89
+
90
+ void
91
+ rbffi_frame_pop(rbffi_frame_t* frame)
92
+ {
93
+ #ifdef _WIN32
94
+ TlsSetValue(frame_thread_key, frame->prev);
95
+ #else
96
+ frame->td->frame = frame->prev;
97
+ #endif
98
+ }
99
+
100
+ #if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL))
101
+
102
+ #if !defined(_WIN32)
103
+
104
+ struct BlockingThread {
105
+ pthread_t tid;
106
+ VALUE (*fn)(void *);
107
+ void *data;
108
+ void (*ubf)(void *);
109
+ void *data2;
110
+ VALUE retval;
111
+ int wrfd;
112
+ int rdfd;
113
+ };
114
+
115
+ static void*
116
+ rbffi_blocking_thread(void* args)
117
+ {
118
+ struct BlockingThread* thr = (struct BlockingThread *) args;
119
+ char c = 1;
120
+ VALUE retval;
121
+
122
+ retval = (*thr->fn)(thr->data);
123
+
124
+ pthread_testcancel();
125
+
126
+ thr->retval = retval;
127
+
128
+ write(thr->wrfd, &c, sizeof(c));
129
+
130
+ return NULL;
131
+ }
132
+
133
+ static VALUE
134
+ wait_for_thread(void *data)
135
+ {
136
+ struct BlockingThread* thr = (struct BlockingThread *) data;
137
+ char c;
138
+
139
+ if (read(thr->rdfd, &c, 1) < 1) {
140
+ rb_thread_wait_fd(thr->rdfd);
141
+ while (read(thr->rdfd, &c, 1) < 1 && rb_io_wait_readable(thr->rdfd) == Qtrue) {
142
+ ;
143
+ }
144
+ }
145
+
146
+ return Qnil;
147
+ }
148
+
149
+ static VALUE
150
+ cleanup_blocking_thread(void *data, VALUE exc)
151
+ {
152
+ struct BlockingThread* thr = (struct BlockingThread *) data;
153
+
154
+ if (thr->ubf != (void (*)(void *)) -1) {
155
+ (*thr->ubf)(thr->data2);
156
+ } else {
157
+ pthread_kill(thr->tid, SIGVTALRM);
158
+ }
159
+
160
+ return exc;
161
+ }
162
+
163
+ VALUE
164
+ rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2)
165
+ {
166
+ struct BlockingThread* thr;
167
+ int fd[2];
168
+ VALUE exc;
169
+
170
+ if (pipe(fd) < 0) {
171
+ rb_raise(rb_eSystemCallError, "pipe(2) failed");
172
+ return Qnil;
173
+ }
174
+ fcntl(fd[0], F_SETFL, fcntl(fd[0], F_GETFL) | O_NONBLOCK);
175
+
176
+ thr = ALLOC_N(struct BlockingThread, 1);
177
+ thr->rdfd = fd[0];
178
+ thr->wrfd = fd[1];
179
+ thr->fn = func;
180
+ thr->data = data1;
181
+ thr->ubf = ubf;
182
+ thr->data2 = data2;
183
+ thr->retval = Qnil;
184
+
185
+ if (pthread_create(&thr->tid, NULL, rbffi_blocking_thread, thr) != 0) {
186
+ close(fd[0]);
187
+ close(fd[1]);
188
+ xfree(thr);
189
+ rb_raise(rb_eSystemCallError, "pipe(2) failed");
190
+ return Qnil;
191
+ }
192
+
193
+ exc = rb_rescue2(wait_for_thread, (VALUE) thr, cleanup_blocking_thread, (VALUE) thr,
194
+ rb_eException);
195
+
196
+ pthread_join(thr->tid, NULL);
197
+ close(fd[1]);
198
+ close(fd[0]);
199
+ xfree(thr);
200
+
201
+ if (exc != Qnil) {
202
+ rb_exc_raise(exc);
203
+ }
204
+
205
+ return thr->retval;
206
+ }
207
+
208
+ #else
209
+ /* win32 implementation */
210
+
211
+ struct BlockingThread {
212
+ HANDLE tid;
213
+ VALUE (*fn)(void *);
214
+ void *data;
215
+ void (*ubf)(void *);
216
+ void *data2;
217
+ VALUE retval;
218
+ int wrfd;
219
+ int rdfd;
220
+ };
221
+
222
+ static DWORD __stdcall
223
+ rbffi_blocking_thread(LPVOID args)
224
+ {
225
+ struct BlockingThread* thr = (struct BlockingThread *) args;
226
+ char c = 1;
227
+ VALUE retval;
228
+
229
+ retval = (*thr->fn)(thr->data);
230
+ thr->retval = retval;
231
+
232
+ write(thr->wrfd, &c, sizeof(c));
233
+
234
+ return 0;
235
+ }
236
+
237
+ static VALUE
238
+ wait_for_thread(void *data)
239
+ {
240
+ struct BlockingThread* thr = (struct BlockingThread *) data;
241
+ char c, res;
242
+ fd_set rfds;
243
+
244
+ FD_ZERO(&rfds);
245
+ FD_SET(thr->rdfd, &rfds);
246
+ rb_thread_select(thr->rdfd + 1, &rfds, NULL, NULL, NULL);
247
+ read(thr->rdfd, &c, 1);
248
+ return Qnil;
249
+ }
250
+
251
+ static VALUE
252
+ cleanup_blocking_thread(void *data, VALUE exc)
253
+ {
254
+ struct BlockingThread* thr = (struct BlockingThread *) data;
255
+
256
+ if (thr->ubf != (void (*)(void *)) -1) {
257
+ (*thr->ubf)(thr->data2);
258
+ } else {
259
+ TerminateThread(thr->tid, 0);
260
+ }
261
+
262
+ return exc;
263
+ }
264
+
265
+ VALUE
266
+ rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2)
267
+ {
268
+ struct BlockingThread* thr;
269
+ int fd[2];
270
+ VALUE exc;
271
+ DWORD state;
272
+ DWORD res;
273
+
274
+ if (_pipe(fd, 1024, O_BINARY) == -1) {
275
+ rb_raise(rb_eSystemCallError, "_pipe() failed");
276
+ return Qnil;
277
+ }
278
+
279
+ thr = ALLOC_N(struct BlockingThread, 1);
280
+ thr->rdfd = fd[0];
281
+ thr->wrfd = fd[1];
282
+ thr->fn = func;
283
+ thr->data = data1;
284
+ thr->ubf = ubf;
285
+ thr->data2 = data2;
286
+ thr->retval = Qnil;
287
+
288
+ thr->tid = CreateThread(NULL, 0, rbffi_blocking_thread, thr, 0, NULL);
289
+ if (!thr->tid) {
290
+ close(fd[0]);
291
+ close(fd[1]);
292
+ xfree(thr);
293
+ rb_raise(rb_eSystemCallError, "CreateThread() failed");
294
+ return Qnil;
295
+ }
296
+
297
+ exc = rb_rescue2(wait_for_thread, (VALUE) thr, cleanup_blocking_thread, (VALUE) thr,
298
+ rb_eException);
299
+
300
+ /* The thread should be finished, already. */
301
+ WaitForSingleObject(thr->tid, INFINITE);
302
+ CloseHandle(thr->tid);
303
+ close(fd[1]);
304
+ close(fd[0]);
305
+ xfree(thr);
306
+
307
+ if (exc != Qnil) {
308
+ rb_exc_raise(exc);
309
+ }
310
+
311
+ return thr->retval;
312
+ }
313
+
314
+ #endif /* !_WIN32 */
315
+
316
+ #endif /* HAVE_RB_THREAD_BLOCKING_REGION */
317
+
318
+ #ifndef _WIN32
319
+ static struct thread_data* thread_data_init(void);
320
+
321
+ static inline struct thread_data*
322
+ thread_data_get(void)
323
+ {
324
+ struct thread_data* td = (struct thread_data *) pthread_getspecific(thread_data_key);
325
+ return td != NULL ? td : thread_data_init();
326
+ }
327
+
328
+ static struct thread_data*
329
+ thread_data_init(void)
330
+ {
331
+ struct thread_data* td = calloc(1, sizeof(struct thread_data));
332
+
333
+ pthread_setspecific(thread_data_key, td);
334
+
335
+ return td;
336
+ }
337
+
338
+ static void
339
+ thread_data_free(void *ptr)
340
+ {
341
+ free(ptr);
342
+ }
343
+ #endif
344
+
345
+ void
346
+ rbffi_Thread_Init(VALUE moduleFFI)
347
+ {
348
+ #ifdef _WIN32
349
+ frame_thread_key = TlsAlloc();
350
+ #else
351
+ pthread_key_create(&thread_data_key, thread_data_free);
352
+ #endif
353
+ }
@@ -0,0 +1,95 @@
1
+ /*
2
+ * Copyright (c) 2010 Wayne Meissner
3
+ *
4
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are met:
9
+ * * Redistributions of source code must retain the above copyright
10
+ * notice, this list of conditions and the following disclaimer.
11
+ * * Redistributions in binary form must reproduce the above copyright
12
+ * notice, this list of conditions and the following disclaimer in the
13
+ * documentation and/or other materials provided with the distribution.
14
+ * * Neither the name of the Ruby FFI project nor the
15
+ * names of its contributors may be used to endorse or promote products
16
+ * derived from this software without specific prior written permission.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
22
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ */
29
+
30
+ #ifndef RBFFI_THREAD_H
31
+ #define RBFFI_THREAD_H
32
+
33
+ #ifndef _MSC_VER
34
+ # include <stdbool.h>
35
+ #else
36
+ # include "win32/stdbool.h"
37
+ # include "win32/stdint.h"
38
+ #endif
39
+ #include <ruby.h>
40
+ #include "extconf.h"
41
+
42
+ #ifdef __cplusplus
43
+ extern "C" {
44
+ #endif
45
+
46
+
47
+ #ifdef _WIN32
48
+ # include <windows.h>
49
+ #else
50
+ # include <pthread.h>
51
+ #endif
52
+
53
+ typedef struct {
54
+ #ifdef _WIN32
55
+ DWORD id;
56
+ #else
57
+ pthread_t id;
58
+ #endif
59
+ bool valid;
60
+ bool has_gvl;
61
+ VALUE exc;
62
+ } rbffi_thread_t;
63
+
64
+ typedef struct rbffi_frame {
65
+ #ifndef _WIN32
66
+ struct thread_data* td;
67
+ #endif
68
+ struct rbffi_frame* prev;
69
+ bool has_gvl;
70
+ VALUE exc;
71
+ } rbffi_frame_t;
72
+
73
+ rbffi_frame_t* rbffi_frame_current(void);
74
+ void rbffi_frame_push(rbffi_frame_t* frame);
75
+ void rbffi_frame_pop(rbffi_frame_t* frame);
76
+
77
+ #ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL
78
+ # define rbffi_thread_blocking_region rb_thread_call_without_gvl
79
+
80
+ #elif defined(HAVE_RB_THREAD_BLOCKING_REGION)
81
+ # define rbffi_thread_blocking_region rb_thread_blocking_region
82
+
83
+ #else
84
+
85
+ VALUE rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2);
86
+
87
+ #endif
88
+
89
+
90
+ #ifdef __cplusplus
91
+ }
92
+ #endif
93
+
94
+ #endif /* RBFFI_THREAD_H */
95
+
@@ -0,0 +1,397 @@
1
+ /*
2
+ * Copyright (c) 2009, Wayne Meissner
3
+ *
4
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are met:
9
+ * * Redistributions of source code must retain the above copyright
10
+ * notice, this list of conditions and the following disclaimer.
11
+ * * Redistributions in binary form must reproduce the above copyright
12
+ * notice, this list of conditions and the following disclaimer in the
13
+ * documentation and/or other materials provided with the distribution.
14
+ * * Neither the name of the Ruby FFI project nor the
15
+ * names of its contributors may be used to endorse or promote products
16
+ * derived from this software without specific prior written permission.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
22
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ */
29
+
30
+ #ifndef _MSC_VER
31
+ #include <sys/param.h>
32
+ #endif
33
+
34
+ #include <sys/types.h>
35
+ #include <ruby.h>
36
+ #include <ffi.h>
37
+ #include "rbffi.h"
38
+ #include "compat.h"
39
+ #include "Types.h"
40
+ #include "Type.h"
41
+
42
+
43
+ typedef struct BuiltinType_ {
44
+ Type type;
45
+ char* name;
46
+ } BuiltinType;
47
+
48
+ static void builtin_type_free(BuiltinType *);
49
+
50
+ VALUE rbffi_TypeClass = Qnil;
51
+
52
+ static VALUE classBuiltinType = Qnil;
53
+ static VALUE moduleNativeType = Qnil;
54
+ static VALUE typeMap = Qnil, sizeMap = Qnil;
55
+ static ID id_find_type = 0, id_type_size = 0, id_size = 0;
56
+
57
+ static VALUE
58
+ type_allocate(VALUE klass)
59
+ {
60
+ Type* type;
61
+ VALUE obj = Data_Make_Struct(klass, Type, NULL, -1, type);
62
+
63
+ type->nativeType = -1;
64
+ type->ffiType = &ffi_type_void;
65
+
66
+ return obj;
67
+ }
68
+
69
+ /*
70
+ * Document-method: initialize
71
+ * call-seq: initialize(value)
72
+ * @param [Fixnum,Type] value
73
+ * @return [self]
74
+ */
75
+ static VALUE
76
+ type_initialize(VALUE self, VALUE value)
77
+ {
78
+ Type* type;
79
+ Type* other;
80
+
81
+ Data_Get_Struct(self, Type, type);
82
+
83
+ if (FIXNUM_P(value)) {
84
+ type->nativeType = FIX2INT(value);
85
+ } else if (rb_obj_is_kind_of(value, rbffi_TypeClass)) {
86
+ Data_Get_Struct(value, Type, other);
87
+ type->nativeType = other->nativeType;
88
+ type->ffiType = other->ffiType;
89
+ } else {
90
+ rb_raise(rb_eArgError, "wrong type");
91
+ }
92
+
93
+ return self;
94
+ }
95
+
96
+ /*
97
+ * call-seq: type.size
98
+ * @return [Fixnum]
99
+ * Return type's size, in bytes.
100
+ */
101
+ static VALUE
102
+ type_size(VALUE self)
103
+ {
104
+ Type *type;
105
+
106
+ Data_Get_Struct(self, Type, type);
107
+
108
+ return INT2FIX(type->ffiType->size);
109
+ }
110
+
111
+ /*
112
+ * call-seq: type.alignment
113
+ * @return [Fixnum]
114
+ * Get Type alignment.
115
+ */
116
+ static VALUE
117
+ type_alignment(VALUE self)
118
+ {
119
+ Type *type;
120
+
121
+ Data_Get_Struct(self, Type, type);
122
+
123
+ return INT2FIX(type->ffiType->alignment);
124
+ }
125
+
126
+ /*
127
+ * call-seq: type.inspect
128
+ * @return [String]
129
+ * Inspect {Type} object.
130
+ */
131
+ static VALUE
132
+ type_inspect(VALUE self)
133
+ {
134
+ char buf[100];
135
+ Type *type;
136
+
137
+ Data_Get_Struct(self, Type, type);
138
+
139
+ snprintf(buf, sizeof(buf), "#<%s:%p size=%d alignment=%d>",
140
+ rb_obj_classname(self), type, (int) type->ffiType->size, (int) type->ffiType->alignment);
141
+
142
+ return rb_str_new2(buf);
143
+ }
144
+
145
+ static VALUE
146
+ builtin_type_new(VALUE klass, int nativeType, ffi_type* ffiType, const char* name)
147
+ {
148
+ BuiltinType* type;
149
+ VALUE obj = Qnil;
150
+
151
+ obj = Data_Make_Struct(klass, BuiltinType, NULL, builtin_type_free, type);
152
+
153
+ type->name = strdup(name);
154
+ type->type.nativeType = nativeType;
155
+ type->type.ffiType = ffiType;
156
+
157
+ return obj;
158
+ }
159
+
160
+ static void
161
+ builtin_type_free(BuiltinType *type)
162
+ {
163
+ free(type->name);
164
+ xfree(type);
165
+ }
166
+
167
+ /*
168
+ * call-seq: type.inspect
169
+ * @return [String]
170
+ * Inspect {Type::Builtin} object.
171
+ */
172
+ static VALUE
173
+ builtin_type_inspect(VALUE self)
174
+ {
175
+ char buf[100];
176
+ BuiltinType *type;
177
+
178
+ Data_Get_Struct(self, BuiltinType, type);
179
+ snprintf(buf, sizeof(buf), "#<%s:%s size=%d alignment=%d>",
180
+ rb_obj_classname(self), type->name, (int) type->type.ffiType->size, type->type.ffiType->alignment);
181
+
182
+ return rb_str_new2(buf);
183
+ }
184
+
185
+ int
186
+ rbffi_type_size(VALUE type)
187
+ {
188
+ int t = TYPE(type);
189
+
190
+ if (t == T_FIXNUM || t == T_BIGNUM) {
191
+ return NUM2INT(type);
192
+
193
+ } else if (t == T_SYMBOL) {
194
+ /*
195
+ * Try looking up directly in the type and size maps
196
+ */
197
+ VALUE nType;
198
+ if ((nType = rb_hash_lookup(typeMap, type)) != Qnil) {
199
+ if (rb_obj_is_kind_of(nType, rbffi_TypeClass)) {
200
+ Type* type;
201
+ Data_Get_Struct(nType, Type, type);
202
+ return (int) type->ffiType->size;
203
+
204
+ } else if (rb_respond_to(nType, id_size)) {
205
+ return NUM2INT(rb_funcall2(nType, id_size, 0, NULL));
206
+ }
207
+ }
208
+
209
+ /* Not found - call up to the ruby version to resolve */
210
+ return NUM2INT(rb_funcall2(rbffi_FFIModule, id_type_size, 1, &type));
211
+
212
+ } else {
213
+ return NUM2INT(rb_funcall2(type, id_size, 0, NULL));
214
+ }
215
+ }
216
+
217
+ VALUE
218
+ rbffi_Type_Lookup(VALUE name)
219
+ {
220
+ int t = TYPE(name);
221
+ if (t == T_SYMBOL || t == T_STRING) {
222
+ /*
223
+ * Try looking up directly in the type Map
224
+ */
225
+ VALUE nType;
226
+ if ((nType = rb_hash_lookup(typeMap, name)) != Qnil && rb_obj_is_kind_of(nType, rbffi_TypeClass)) {
227
+ return nType;
228
+ }
229
+ } else if (rb_obj_is_kind_of(name, rbffi_TypeClass)) {
230
+
231
+ return name;
232
+ }
233
+
234
+ /* Nothing found - let caller handle raising exceptions */
235
+ return Qnil;
236
+ }
237
+
238
+ /**
239
+ * rbffi_Type_Find() is like rbffi_Type_Lookup, but an error is raised if the
240
+ * type is not found.
241
+ */
242
+ VALUE
243
+ rbffi_Type_Find(VALUE name)
244
+ {
245
+ VALUE rbType = rbffi_Type_Lookup(name);
246
+
247
+ if (!RTEST(rbType)) {
248
+ VALUE s = rb_inspect(name);
249
+ rb_raise(rb_eTypeError, "invalid type, %s", RSTRING_PTR(s));
250
+ RB_GC_GUARD(s);
251
+ }
252
+
253
+ return rbType;
254
+ }
255
+
256
+ void
257
+ rbffi_Type_Init(VALUE moduleFFI)
258
+ {
259
+ /*
260
+ * Document-class: FFI::Type
261
+ * This class manages C types.
262
+ *
263
+ * It embbed {FFI::Type::Builtin} objects as constants (for names,
264
+ * see {FFI::NativeType}).
265
+ */
266
+ rbffi_TypeClass = rb_define_class_under(moduleFFI, "Type", rb_cObject);
267
+
268
+ /*
269
+ * Document-constant: FFI::TypeDefs
270
+ */
271
+ rb_define_const(moduleFFI, "TypeDefs", typeMap = rb_hash_new());
272
+ rb_define_const(moduleFFI, "SizeTypes", sizeMap = rb_hash_new());
273
+ rb_global_variable(&typeMap);
274
+ rb_global_variable(&sizeMap);
275
+ id_find_type = rb_intern("find_type");
276
+ id_type_size = rb_intern("type_size");
277
+ id_size = rb_intern("size");
278
+
279
+ /*
280
+ * Document-class: FFI::Type::Builtin
281
+ * Class for Built-in types.
282
+ */
283
+ classBuiltinType = rb_define_class_under(rbffi_TypeClass, "Builtin", rbffi_TypeClass);
284
+ /*
285
+ * Document-module: FFI::NativeType
286
+ * This module defines constants for native (C) types.
287
+ *
288
+ * ==Native type constants
289
+ * Native types are defined by constants :
290
+ * * INT8, SCHAR, CHAR
291
+ * * UINT8, UCHAR
292
+ * * INT16, SHORT, SSHORT
293
+ * * UINT16, USHORT
294
+ * * INT32,, INT, SINT
295
+ * * UINT32, UINT
296
+ * * INT64, LONG_LONG, SLONG_LONG
297
+ * * UINT64, ULONG_LONG
298
+ * * LONG, SLONG
299
+ * * ULONG
300
+ * * FLOAT32, FLOAT
301
+ * * FLOAT64, DOUBLE
302
+ * * POINTER
303
+ * * CALLBACK
304
+ * * FUNCTION
305
+ * * CHAR_ARRAY
306
+ * * BOOL
307
+ * * STRING (immutable string, nul terminated)
308
+ * * STRUCT (struct-b-value param or result)
309
+ * * ARRAY (array type definition)
310
+ * * MAPPED (custom native type)
311
+ * For function return type only :
312
+ * * VOID
313
+ * For function argument type only :
314
+ * * BUFFER_IN
315
+ * * BUFFER_OUT
316
+ * * VARARGS (function takes a variable number of arguments)
317
+ *
318
+ * All these constants are exported to {FFI} module prefixed with "TYPE_".
319
+ * They are objets from {FFI::Type::Builtin} class.
320
+ */
321
+ moduleNativeType = rb_define_module_under(moduleFFI, "NativeType");
322
+
323
+ /*
324
+ * Document-global: FFI::Type
325
+ */
326
+ rb_global_variable(&rbffi_TypeClass);
327
+ rb_global_variable(&classBuiltinType);
328
+ rb_global_variable(&moduleNativeType);
329
+
330
+ rb_define_alloc_func(rbffi_TypeClass, type_allocate);
331
+ rb_define_method(rbffi_TypeClass, "initialize", type_initialize, 1);
332
+ rb_define_method(rbffi_TypeClass, "size", type_size, 0);
333
+ rb_define_method(rbffi_TypeClass, "alignment", type_alignment, 0);
334
+ rb_define_method(rbffi_TypeClass, "inspect", type_inspect, 0);
335
+
336
+ /* Make Type::Builtin non-allocatable */
337
+ rb_undef_method(CLASS_OF(classBuiltinType), "new");
338
+ rb_define_method(classBuiltinType, "inspect", builtin_type_inspect, 0);
339
+
340
+ rb_global_variable(&rbffi_TypeClass);
341
+ rb_global_variable(&classBuiltinType);
342
+
343
+ /* Define all the builtin types */
344
+ #define T(x, ffiType) do { \
345
+ VALUE t = Qnil; \
346
+ rb_define_const(rbffi_TypeClass, #x, t = builtin_type_new(classBuiltinType, NATIVE_##x, ffiType, #x)); \
347
+ rb_define_const(moduleNativeType, #x, t); \
348
+ rb_define_const(moduleFFI, "TYPE_" #x, t); \
349
+ } while(0)
350
+
351
+ #define A(old_type, new_type) do { \
352
+ VALUE t = rb_const_get(rbffi_TypeClass, rb_intern(#old_type)); \
353
+ rb_const_set(rbffi_TypeClass, rb_intern(#new_type), t); \
354
+ } while(0)
355
+
356
+ /*
357
+ * Document-constant: FFI::Type::Builtin::VOID
358
+ */
359
+ T(VOID, &ffi_type_void);
360
+ T(INT8, &ffi_type_sint8);
361
+ A(INT8, SCHAR);
362
+ A(INT8, CHAR);
363
+ T(UINT8, &ffi_type_uint8);
364
+ A(UINT8, UCHAR);
365
+
366
+ T(INT16, &ffi_type_sint16);
367
+ A(INT16, SHORT);
368
+ A(INT16, SSHORT);
369
+ T(UINT16, &ffi_type_uint16);
370
+ A(UINT16, USHORT);
371
+ T(INT32, &ffi_type_sint32);
372
+ A(INT32, INT);
373
+ A(INT32, SINT);
374
+ T(UINT32, &ffi_type_uint32);
375
+ A(UINT32, UINT);
376
+ T(INT64, &ffi_type_sint64);
377
+ A(INT64, LONG_LONG);
378
+ A(INT64, SLONG_LONG);
379
+ T(UINT64, &ffi_type_uint64);
380
+ A(UINT64, ULONG_LONG);
381
+ T(LONG, &ffi_type_slong);
382
+ A(LONG, SLONG);
383
+ T(ULONG, &ffi_type_ulong);
384
+ T(FLOAT32, &ffi_type_float);
385
+ A(FLOAT32, FLOAT);
386
+ T(FLOAT64, &ffi_type_double);
387
+ A(FLOAT64, DOUBLE);
388
+ T(LONGDOUBLE, &ffi_type_longdouble);
389
+ T(POINTER, &ffi_type_pointer);
390
+ T(STRING, &ffi_type_pointer);
391
+ T(BUFFER_IN, &ffi_type_pointer);
392
+ T(BUFFER_OUT, &ffi_type_pointer);
393
+ T(BUFFER_INOUT, &ffi_type_pointer);
394
+ T(BOOL, &ffi_type_uchar);
395
+ T(VARARGS, &ffi_type_void);
396
+ }
397
+