remogatto-ffi 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (324) hide show
  1. data/LICENSE +51 -0
  2. data/README.rdoc +69 -0
  3. data/Rakefile +144 -0
  4. data/ext/ffi_c/AbstractMemory.c +489 -0
  5. data/ext/ffi_c/AbstractMemory.h +160 -0
  6. data/ext/ffi_c/ArrayType.c +129 -0
  7. data/ext/ffi_c/ArrayType.h +58 -0
  8. data/ext/ffi_c/AutoPointer.c +61 -0
  9. data/ext/ffi_c/AutoPointer.h +18 -0
  10. data/ext/ffi_c/Buffer.c +187 -0
  11. data/ext/ffi_c/Call.c +431 -0
  12. data/ext/ffi_c/Call.h +77 -0
  13. data/ext/ffi_c/DynamicLibrary.c +216 -0
  14. data/ext/ffi_c/DynamicLibrary.h +22 -0
  15. data/ext/ffi_c/Function.c +498 -0
  16. data/ext/ffi_c/Function.h +73 -0
  17. data/ext/ffi_c/FunctionInfo.c +213 -0
  18. data/ext/ffi_c/LastError.c +159 -0
  19. data/ext/ffi_c/LastError.h +18 -0
  20. data/ext/ffi_c/MemoryPointer.c +178 -0
  21. data/ext/ffi_c/MemoryPointer.h +20 -0
  22. data/ext/ffi_c/MethodHandle.c +356 -0
  23. data/ext/ffi_c/MethodHandle.h +53 -0
  24. data/ext/ffi_c/Platform.c +59 -0
  25. data/ext/ffi_c/Platform.h +16 -0
  26. data/ext/ffi_c/Pointer.c +217 -0
  27. data/ext/ffi_c/Pointer.h +49 -0
  28. data/ext/ffi_c/Struct.c +770 -0
  29. data/ext/ffi_c/Struct.h +80 -0
  30. data/ext/ffi_c/StructByValue.c +140 -0
  31. data/ext/ffi_c/StructByValue.h +53 -0
  32. data/ext/ffi_c/StructLayout.c +450 -0
  33. data/ext/ffi_c/Type.c +329 -0
  34. data/ext/ffi_c/Type.h +57 -0
  35. data/ext/ffi_c/Types.c +103 -0
  36. data/ext/ffi_c/Types.h +85 -0
  37. data/ext/ffi_c/Variadic.c +260 -0
  38. data/ext/ffi_c/compat.h +72 -0
  39. data/ext/ffi_c/endian.h +40 -0
  40. data/ext/ffi_c/extconf.rb +34 -0
  41. data/ext/ffi_c/ffi.c +80 -0
  42. data/ext/ffi_c/libffi.bsd.mk +34 -0
  43. data/ext/ffi_c/libffi.darwin.mk +75 -0
  44. data/ext/ffi_c/libffi.gnu.mk +29 -0
  45. data/ext/ffi_c/libffi.mk +13 -0
  46. data/ext/ffi_c/libffi/ChangeLog +3243 -0
  47. data/ext/ffi_c/libffi/ChangeLog.libffi +347 -0
  48. data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
  49. data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
  50. data/ext/ffi_c/libffi/LICENSE +21 -0
  51. data/ext/ffi_c/libffi/Makefile.am +177 -0
  52. data/ext/ffi_c/libffi/Makefile.in +1640 -0
  53. data/ext/ffi_c/libffi/README +328 -0
  54. data/ext/ffi_c/libffi/TODO +1 -0
  55. data/ext/ffi_c/libffi/acinclude.m4 +92 -0
  56. data/ext/ffi_c/libffi/aclocal.m4 +7516 -0
  57. data/ext/ffi_c/libffi/compile +142 -0
  58. data/ext/ffi_c/libffi/config.guess +1516 -0
  59. data/ext/ffi_c/libffi/config.sub +1626 -0
  60. data/ext/ffi_c/libffi/configure +24414 -0
  61. data/ext/ffi_c/libffi/configure.ac +365 -0
  62. data/ext/ffi_c/libffi/configure.host +11 -0
  63. data/ext/ffi_c/libffi/depcomp +584 -0
  64. data/ext/ffi_c/libffi/doc/libffi.info +533 -0
  65. data/ext/ffi_c/libffi/doc/libffi.texi +541 -0
  66. data/ext/ffi_c/libffi/doc/stamp-vti +4 -0
  67. data/ext/ffi_c/libffi/doc/version.texi +4 -0
  68. data/ext/ffi_c/libffi/fficonfig.h.in +160 -0
  69. data/ext/ffi_c/libffi/include/Makefile.am +9 -0
  70. data/ext/ffi_c/libffi/include/Makefile.in +422 -0
  71. data/ext/ffi_c/libffi/include/ffi.h.in +393 -0
  72. data/ext/ffi_c/libffi/include/ffi_common.h +98 -0
  73. data/ext/ffi_c/libffi/install-sh +323 -0
  74. data/ext/ffi_c/libffi/libffi.pc.in +10 -0
  75. data/ext/ffi_c/libffi/libtool-version +29 -0
  76. data/ext/ffi_c/libffi/ltcf-c.sh +861 -0
  77. data/ext/ffi_c/libffi/ltcf-cxx.sh +1069 -0
  78. data/ext/ffi_c/libffi/ltcf-gcj.sh +700 -0
  79. data/ext/ffi_c/libffi/ltconfig +2862 -0
  80. data/ext/ffi_c/libffi/ltmain.sh +6930 -0
  81. data/ext/ffi_c/libffi/man/Makefile.am +8 -0
  82. data/ext/ffi_c/libffi/man/Makefile.in +395 -0
  83. data/ext/ffi_c/libffi/man/ffi.3 +31 -0
  84. data/ext/ffi_c/libffi/man/ffi_call.3 +103 -0
  85. data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +66 -0
  86. data/ext/ffi_c/libffi/mdate-sh +201 -0
  87. data/ext/ffi_c/libffi/missing +353 -0
  88. data/ext/ffi_c/libffi/mkinstalldirs +158 -0
  89. data/ext/ffi_c/libffi/src/alpha/ffi.c +284 -0
  90. data/ext/ffi_c/libffi/src/alpha/ffitarget.h +48 -0
  91. data/ext/ffi_c/libffi/src/alpha/osf.S +366 -0
  92. data/ext/ffi_c/libffi/src/arm/ffi.c +309 -0
  93. data/ext/ffi_c/libffi/src/arm/ffitarget.h +49 -0
  94. data/ext/ffi_c/libffi/src/arm/sysv.S +299 -0
  95. data/ext/ffi_c/libffi/src/closures.c +596 -0
  96. data/ext/ffi_c/libffi/src/cris/ffi.c +383 -0
  97. data/ext/ffi_c/libffi/src/cris/ffitarget.h +51 -0
  98. data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
  99. data/ext/ffi_c/libffi/src/debug.c +59 -0
  100. data/ext/ffi_c/libffi/src/dlmalloc.c +5099 -0
  101. data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
  102. data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
  103. data/ext/ffi_c/libffi/src/frv/ffitarget.h +61 -0
  104. data/ext/ffi_c/libffi/src/ia64/ffi.c +580 -0
  105. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +50 -0
  106. data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
  107. data/ext/ffi_c/libffi/src/ia64/unix.S +560 -0
  108. data/ext/ffi_c/libffi/src/java_raw_api.c +359 -0
  109. data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
  110. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +48 -0
  111. data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
  112. data/ext/ffi_c/libffi/src/m68k/ffi.c +278 -0
  113. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +49 -0
  114. data/ext/ffi_c/libffi/src/m68k/sysv.S +234 -0
  115. data/ext/ffi_c/libffi/src/mips/ffi.c +926 -0
  116. data/ext/ffi_c/libffi/src/mips/ffitarget.h +202 -0
  117. data/ext/ffi_c/libffi/src/mips/n32.S +534 -0
  118. data/ext/ffi_c/libffi/src/mips/o32.S +381 -0
  119. data/ext/ffi_c/libffi/src/pa/ffi.c +709 -0
  120. data/ext/ffi_c/libffi/src/pa/ffitarget.h +77 -0
  121. data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
  122. data/ext/ffi_c/libffi/src/pa/linux.S +357 -0
  123. data/ext/ffi_c/libffi/src/powerpc/aix.S +225 -0
  124. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +247 -0
  125. data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
  126. data/ext/ffi_c/libffi/src/powerpc/darwin.S +245 -0
  127. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +317 -0
  128. data/ext/ffi_c/libffi/src/powerpc/ffi.c +1429 -0
  129. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +800 -0
  130. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +118 -0
  131. data/ext/ffi_c/libffi/src/powerpc/linux64.S +187 -0
  132. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +236 -0
  133. data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +327 -0
  134. data/ext/ffi_c/libffi/src/powerpc/sysv.S +230 -0
  135. data/ext/ffi_c/libffi/src/prep_cif.c +174 -0
  136. data/ext/ffi_c/libffi/src/raw_api.c +254 -0
  137. data/ext/ffi_c/libffi/src/s390/ffi.c +780 -0
  138. data/ext/ffi_c/libffi/src/s390/ffitarget.h +60 -0
  139. data/ext/ffi_c/libffi/src/s390/sysv.S +434 -0
  140. data/ext/ffi_c/libffi/src/sh/ffi.c +716 -0
  141. data/ext/ffi_c/libffi/src/sh/ffitarget.h +49 -0
  142. data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
  143. data/ext/ffi_c/libffi/src/sh64/ffi.c +453 -0
  144. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +53 -0
  145. data/ext/ffi_c/libffi/src/sh64/sysv.S +530 -0
  146. data/ext/ffi_c/libffi/src/sparc/ffi.c +610 -0
  147. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +66 -0
  148. data/ext/ffi_c/libffi/src/sparc/v8.S +272 -0
  149. data/ext/ffi_c/libffi/src/sparc/v9.S +307 -0
  150. data/ext/ffi_c/libffi/src/types.c +77 -0
  151. data/ext/ffi_c/libffi/src/x86/darwin.S +443 -0
  152. data/ext/ffi_c/libffi/src/x86/darwin64.S +416 -0
  153. data/ext/ffi_c/libffi/src/x86/ffi.c +475 -0
  154. data/ext/ffi_c/libffi/src/x86/ffi64.c +572 -0
  155. data/ext/ffi_c/libffi/src/x86/ffitarget.h +90 -0
  156. data/ext/ffi_c/libffi/src/x86/freebsd.S +458 -0
  157. data/ext/ffi_c/libffi/src/x86/sysv.S +437 -0
  158. data/ext/ffi_c/libffi/src/x86/unix64.S +418 -0
  159. data/ext/ffi_c/libffi/src/x86/win32.S +391 -0
  160. data/ext/ffi_c/libffi/testsuite/Makefile.am +71 -0
  161. data/ext/ffi_c/libffi/testsuite/Makefile.in +447 -0
  162. data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
  163. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +289 -0
  164. data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +263 -0
  165. data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +36 -0
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +97 -0
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +89 -0
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +89 -0
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +90 -0
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +97 -0
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +99 -0
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +98 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +72 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +102 -0
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +103 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +104 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +110 -0
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +97 -0
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +99 -0
  181. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +101 -0
  182. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +121 -0
  183. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +98 -0
  184. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +103 -0
  185. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +98 -0
  186. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +98 -0
  187. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +106 -0
  188. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +98 -0
  189. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +117 -0
  190. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +106 -0
  191. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +132 -0
  192. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +121 -0
  193. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +107 -0
  194. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +125 -0
  195. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +105 -0
  196. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +96 -0
  197. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +98 -0
  198. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +99 -0
  199. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +101 -0
  200. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +99 -0
  201. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +100 -0
  202. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +101 -0
  203. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +99 -0
  204. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +99 -0
  205. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +99 -0
  206. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +99 -0
  207. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +99 -0
  208. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +100 -0
  209. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +51 -0
  210. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +51 -0
  211. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +82 -0
  212. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +82 -0
  213. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +94 -0
  214. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +99 -0
  215. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +82 -0
  216. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +94 -0
  217. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +52 -0
  218. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +50 -0
  219. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +50 -0
  220. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +50 -0
  221. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +51 -0
  222. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +54 -0
  223. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +51 -0
  224. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +86 -0
  225. data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
  226. data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +58 -0
  227. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +57 -0
  228. data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +72 -0
  229. data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
  230. data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +69 -0
  231. data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +63 -0
  232. data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +53 -0
  233. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +160 -0
  234. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +169 -0
  235. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +141 -0
  236. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +118 -0
  237. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +119 -0
  238. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +119 -0
  239. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +120 -0
  240. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +139 -0
  241. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +119 -0
  242. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +139 -0
  243. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +139 -0
  244. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +98 -0
  245. data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
  246. data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  247. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +35 -0
  248. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  249. data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  250. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
  251. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  252. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  253. data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  254. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  255. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
  256. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +42 -0
  257. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
  258. data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
  259. data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
  260. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
  261. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
  262. data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
  263. data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +65 -0
  264. data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
  265. data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +59 -0
  266. data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +63 -0
  267. data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +65 -0
  268. data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
  269. data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
  270. data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +80 -0
  271. data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +67 -0
  272. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +86 -0
  273. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +38 -0
  274. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +123 -0
  275. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
  276. data/ext/ffi_c/libffi/texinfo.tex +7482 -0
  277. data/ext/ffi_c/rbffi.h +26 -0
  278. data/gen/Rakefile +12 -0
  279. data/lib/ffi.rb +11 -0
  280. data/lib/ffi/autopointer.rb +61 -0
  281. data/lib/ffi/buffer.rb +0 -0
  282. data/lib/ffi/callback.rb +10 -0
  283. data/lib/ffi/enum.rb +78 -0
  284. data/lib/ffi/errno.rb +8 -0
  285. data/lib/ffi/ffi.rb +99 -0
  286. data/lib/ffi/io.rb +21 -0
  287. data/lib/ffi/library.rb +218 -0
  288. data/lib/ffi/managedstruct.rb +55 -0
  289. data/lib/ffi/memorypointer.rb +73 -0
  290. data/lib/ffi/platform.rb +78 -0
  291. data/lib/ffi/pointer.rb +119 -0
  292. data/lib/ffi/struct.rb +164 -0
  293. data/lib/ffi/tools/const_generator.rb +177 -0
  294. data/lib/ffi/tools/generator.rb +58 -0
  295. data/lib/ffi/tools/generator_task.rb +35 -0
  296. data/lib/ffi/tools/struct_generator.rb +194 -0
  297. data/lib/ffi/tools/types_generator.rb +123 -0
  298. data/lib/ffi/types.rb +153 -0
  299. data/lib/ffi/union.rb +12 -0
  300. data/lib/ffi/variadic.rb +25 -0
  301. data/spec/ffi/bool_spec.rb +24 -0
  302. data/spec/ffi/buffer_spec.rb +202 -0
  303. data/spec/ffi/callback_spec.rb +591 -0
  304. data/spec/ffi/enum_spec.rb +164 -0
  305. data/spec/ffi/errno_spec.rb +13 -0
  306. data/spec/ffi/function_spec.rb +47 -0
  307. data/spec/ffi/library_spec.rb +144 -0
  308. data/spec/ffi/managed_struct_spec.rb +56 -0
  309. data/spec/ffi/number_spec.rb +231 -0
  310. data/spec/ffi/pointer_spec.rb +195 -0
  311. data/spec/ffi/rbx/attach_function_spec.rb +27 -0
  312. data/spec/ffi/rbx/memory_pointer_spec.rb +102 -0
  313. data/spec/ffi/rbx/spec_helper.rb +1 -0
  314. data/spec/ffi/rbx/struct_spec.rb +13 -0
  315. data/spec/ffi/spec_helper.rb +17 -0
  316. data/spec/ffi/string_spec.rb +103 -0
  317. data/spec/ffi/struct_callback_spec.rb +62 -0
  318. data/spec/ffi/struct_initialize_spec.rb +30 -0
  319. data/spec/ffi/struct_spec.rb +529 -0
  320. data/spec/ffi/typedef_spec.rb +48 -0
  321. data/spec/ffi/union_spec.rb +60 -0
  322. data/spec/ffi/variadic_spec.rb +84 -0
  323. data/spec/spec.opts +4 -0
  324. metadata +432 -0
@@ -0,0 +1,366 @@
1
+ /* -----------------------------------------------------------------------
2
+ osf.S - Copyright (c) 1998, 2001, 2007, 2008 Red Hat
3
+
4
+ Alpha/OSF Foreign Function Interface
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining
7
+ a copy of this software and associated documentation files (the
8
+ ``Software''), to deal in the Software without restriction, including
9
+ without limitation the rights to use, copy, modify, merge, publish,
10
+ distribute, sublicense, and/or sell copies of the Software, and to
11
+ permit persons to whom the Software is furnished to do so, subject to
12
+ the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included
15
+ in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24
+ DEALINGS IN THE SOFTWARE.
25
+ ----------------------------------------------------------------------- */
26
+
27
+ #define LIBFFI_ASM
28
+ #include <fficonfig.h>
29
+ #include <ffi.h>
30
+
31
+ .arch ev6
32
+ .text
33
+
34
+ /* ffi_call_osf (void *args, unsigned long bytes, unsigned flags,
35
+ void *raddr, void (*fnaddr)(void));
36
+
37
+ Bit o trickiness here -- ARGS+BYTES is the base of the stack frame
38
+ for this function. This has been allocated by ffi_call. We also
39
+ deallocate some of the stack that has been alloca'd. */
40
+
41
+ .align 3
42
+ .globl ffi_call_osf
43
+ .ent ffi_call_osf
44
+ FFI_HIDDEN(ffi_call_osf)
45
+
46
+ ffi_call_osf:
47
+ .frame $15, 32, $26, 0
48
+ .mask 0x4008000, -32
49
+ $LFB1:
50
+ addq $16,$17,$1
51
+ mov $16, $30
52
+ stq $26, 0($1)
53
+ stq $15, 8($1)
54
+ stq $18, 16($1)
55
+ mov $1, $15
56
+ $LCFI1:
57
+ .prologue 0
58
+
59
+ stq $19, 24($1)
60
+ mov $20, $27
61
+
62
+ # Load up all of the (potential) argument registers.
63
+ ldq $16, 0($30)
64
+ ldt $f16, 0($30)
65
+ ldt $f17, 8($30)
66
+ ldq $17, 8($30)
67
+ ldt $f18, 16($30)
68
+ ldq $18, 16($30)
69
+ ldt $f19, 24($30)
70
+ ldq $19, 24($30)
71
+ ldt $f20, 32($30)
72
+ ldq $20, 32($30)
73
+ ldt $f21, 40($30)
74
+ ldq $21, 40($30)
75
+
76
+ # Deallocate the register argument area.
77
+ lda $30, 48($30)
78
+
79
+ jsr $26, ($27), 0
80
+ ldgp $29, 0($26)
81
+
82
+ # If the return value pointer is NULL, assume no return value.
83
+ ldq $19, 24($15)
84
+ ldq $18, 16($15)
85
+ ldq $26, 0($15)
86
+ $LCFI2:
87
+ beq $19, $noretval
88
+
89
+ # Store the return value out in the proper type.
90
+ cmpeq $18, FFI_TYPE_INT, $1
91
+ bne $1, $retint
92
+ cmpeq $18, FFI_TYPE_FLOAT, $2
93
+ bne $2, $retfloat
94
+ cmpeq $18, FFI_TYPE_DOUBLE, $3
95
+ bne $3, $retdouble
96
+
97
+ .align 3
98
+ $noretval:
99
+ ldq $15, 8($15)
100
+ ret
101
+
102
+ .align 4
103
+ $retint:
104
+ stq $0, 0($19)
105
+ nop
106
+ ldq $15, 8($15)
107
+ ret
108
+
109
+ .align 4
110
+ $retfloat:
111
+ sts $f0, 0($19)
112
+ nop
113
+ ldq $15, 8($15)
114
+ ret
115
+
116
+ .align 4
117
+ $retdouble:
118
+ stt $f0, 0($19)
119
+ nop
120
+ ldq $15, 8($15)
121
+ ret
122
+ $LFE1:
123
+
124
+ .end ffi_call_osf
125
+
126
+ /* ffi_closure_osf(...)
127
+
128
+ Receives the closure argument in $1. */
129
+
130
+ .align 3
131
+ .globl ffi_closure_osf
132
+ .ent ffi_closure_osf
133
+ FFI_HIDDEN(ffi_closure_osf)
134
+
135
+ ffi_closure_osf:
136
+ .frame $30, 16*8, $26, 0
137
+ .mask 0x4000000, -16*8
138
+ $LFB2:
139
+ ldgp $29, 0($27)
140
+ subq $30, 16*8, $30
141
+ $LCFI5:
142
+ stq $26, 0($30)
143
+ $LCFI6:
144
+ .prologue 1
145
+
146
+ # Store all of the potential argument registers in va_list format.
147
+ stt $f16, 4*8($30)
148
+ stt $f17, 5*8($30)
149
+ stt $f18, 6*8($30)
150
+ stt $f19, 7*8($30)
151
+ stt $f20, 8*8($30)
152
+ stt $f21, 9*8($30)
153
+ stq $16, 10*8($30)
154
+ stq $17, 11*8($30)
155
+ stq $18, 12*8($30)
156
+ stq $19, 13*8($30)
157
+ stq $20, 14*8($30)
158
+ stq $21, 15*8($30)
159
+
160
+ # Call ffi_closure_osf_inner to do the bulk of the work.
161
+ mov $1, $16
162
+ lda $17, 2*8($30)
163
+ lda $18, 10*8($30)
164
+ jsr $26, ffi_closure_osf_inner
165
+ ldgp $29, 0($26)
166
+ ldq $26, 0($30)
167
+
168
+ # Load up the return value in the proper type.
169
+ lda $1, $load_table
170
+ s4addq $0, $1, $1
171
+ ldl $1, 0($1)
172
+ addq $1, $29, $1
173
+ jmp $31, ($1), $load_32
174
+
175
+ .align 4
176
+ $load_none:
177
+ addq $30, 16*8, $30
178
+ ret
179
+
180
+ .align 4
181
+ $load_float:
182
+ lds $f0, 16($30)
183
+ nop
184
+ addq $30, 16*8, $30
185
+ ret
186
+
187
+ .align 4
188
+ $load_double:
189
+ ldt $f0, 16($30)
190
+ nop
191
+ addq $30, 16*8, $30
192
+ ret
193
+
194
+ .align 4
195
+ $load_u8:
196
+ #ifdef __alpha_bwx__
197
+ ldbu $0, 16($30)
198
+ nop
199
+ #else
200
+ ldq $0, 16($30)
201
+ and $0, 255, $0
202
+ #endif
203
+ addq $30, 16*8, $30
204
+ ret
205
+
206
+ .align 4
207
+ $load_s8:
208
+ #ifdef __alpha_bwx__
209
+ ldbu $0, 16($30)
210
+ sextb $0, $0
211
+ #else
212
+ ldq $0, 16($30)
213
+ sll $0, 56, $0
214
+ sra $0, 56, $0
215
+ #endif
216
+ addq $30, 16*8, $30
217
+ ret
218
+
219
+ .align 4
220
+ $load_u16:
221
+ #ifdef __alpha_bwx__
222
+ ldwu $0, 16($30)
223
+ nop
224
+ #else
225
+ ldq $0, 16($30)
226
+ zapnot $0, 3, $0
227
+ #endif
228
+ addq $30, 16*8, $30
229
+ ret
230
+
231
+ .align 4
232
+ $load_s16:
233
+ #ifdef __alpha_bwx__
234
+ ldwu $0, 16($30)
235
+ sextw $0, $0
236
+ #else
237
+ ldq $0, 16($30)
238
+ sll $0, 48, $0
239
+ sra $0, 48, $0
240
+ #endif
241
+ addq $30, 16*8, $30
242
+ ret
243
+
244
+ .align 4
245
+ $load_32:
246
+ ldl $0, 16($30)
247
+ nop
248
+ addq $30, 16*8, $30
249
+ ret
250
+
251
+ .align 4
252
+ $load_64:
253
+ ldq $0, 16($30)
254
+ nop
255
+ addq $30, 16*8, $30
256
+ ret
257
+ $LFE2:
258
+
259
+ .end ffi_closure_osf
260
+
261
+ #ifdef __ELF__
262
+ .section .rodata
263
+ #else
264
+ .rdata
265
+ #endif
266
+ $load_table:
267
+ .gprel32 $load_none # FFI_TYPE_VOID
268
+ .gprel32 $load_32 # FFI_TYPE_INT
269
+ .gprel32 $load_float # FFI_TYPE_FLOAT
270
+ .gprel32 $load_double # FFI_TYPE_DOUBLE
271
+ .gprel32 $load_none # FFI_TYPE_LONGDOUBLE
272
+ .gprel32 $load_u8 # FFI_TYPE_UINT8
273
+ .gprel32 $load_s8 # FFI_TYPE_SINT8
274
+ .gprel32 $load_u16 # FFI_TYPE_UINT16
275
+ .gprel32 $load_s16 # FFI_TYPE_SINT16
276
+ .gprel32 $load_32 # FFI_TYPE_UINT32
277
+ .gprel32 $load_32 # FFI_TYPE_SINT32
278
+ .gprel32 $load_64 # FFI_TYPE_UINT64
279
+ .gprel32 $load_64 # FFI_TYPE_SINT64
280
+ .gprel32 $load_none # FFI_TYPE_STRUCT
281
+ .gprel32 $load_64 # FFI_TYPE_POINTER
282
+
283
+ /* Assert that the table above is in sync with ffi.h. */
284
+
285
+ #if FFI_TYPE_FLOAT != 2 \
286
+ || FFI_TYPE_DOUBLE != 3 \
287
+ || FFI_TYPE_UINT8 != 5 \
288
+ || FFI_TYPE_SINT8 != 6 \
289
+ || FFI_TYPE_UINT16 != 7 \
290
+ || FFI_TYPE_SINT16 != 8 \
291
+ || FFI_TYPE_UINT32 != 9 \
292
+ || FFI_TYPE_SINT32 != 10 \
293
+ || FFI_TYPE_UINT64 != 11 \
294
+ || FFI_TYPE_SINT64 != 12 \
295
+ || FFI_TYPE_STRUCT != 13 \
296
+ || FFI_TYPE_POINTER != 14 \
297
+ || FFI_TYPE_LAST != 14
298
+ #error "osf.S out of sync with ffi.h"
299
+ #endif
300
+
301
+ #ifdef __ELF__
302
+ .section .eh_frame,EH_FRAME_FLAGS,@progbits
303
+ __FRAME_BEGIN__:
304
+ .4byte $LECIE1-$LSCIE1 # Length of Common Information Entry
305
+ $LSCIE1:
306
+ .4byte 0x0 # CIE Identifier Tag
307
+ .byte 0x1 # CIE Version
308
+ .ascii "zR\0" # CIE Augmentation
309
+ .byte 0x1 # uleb128 0x1; CIE Code Alignment Factor
310
+ .byte 0x78 # sleb128 -8; CIE Data Alignment Factor
311
+ .byte 26 # CIE RA Column
312
+ .byte 0x1 # uleb128 0x1; Augmentation size
313
+ .byte 0x1b # FDE Encoding (pcrel sdata4)
314
+ .byte 0xc # DW_CFA_def_cfa
315
+ .byte 30 # uleb128 column 30
316
+ .byte 0 # uleb128 offset 0
317
+ .align 3
318
+ $LECIE1:
319
+ $LSFDE1:
320
+ .4byte $LEFDE1-$LASFDE1 # FDE Length
321
+ $LASFDE1:
322
+ .4byte $LASFDE1-__FRAME_BEGIN__ # FDE CIE offset
323
+ .4byte $LFB1-. # FDE initial location
324
+ .4byte $LFE1-$LFB1 # FDE address range
325
+ .byte 0x0 # uleb128 0x0; Augmentation size
326
+
327
+ .byte 0x4 # DW_CFA_advance_loc4
328
+ .4byte $LCFI1-$LFB1
329
+ .byte 0x9a # DW_CFA_offset, column 26
330
+ .byte 4 # uleb128 4*-8
331
+ .byte 0x8f # DW_CFA_offset, column 15
332
+ .byte 0x3 # uleb128 3*-8
333
+ .byte 0xc # DW_CFA_def_cfa
334
+ .byte 15 # uleb128 column 15
335
+ .byte 32 # uleb128 offset 32
336
+
337
+ .byte 0x4 # DW_CFA_advance_loc4
338
+ .4byte $LCFI2-$LCFI1
339
+ .byte 0xda # DW_CFA_restore, column 26
340
+ .align 3
341
+ $LEFDE1:
342
+
343
+ $LSFDE3:
344
+ .4byte $LEFDE3-$LASFDE3 # FDE Length
345
+ $LASFDE3:
346
+ .4byte $LASFDE3-__FRAME_BEGIN__ # FDE CIE offset
347
+ .4byte $LFB2-. # FDE initial location
348
+ .4byte $LFE2-$LFB2 # FDE address range
349
+ .byte 0x0 # uleb128 0x0; Augmentation size
350
+
351
+ .byte 0x4 # DW_CFA_advance_loc4
352
+ .4byte $LCFI5-$LFB2
353
+ .byte 0xe # DW_CFA_def_cfa_offset
354
+ .byte 0x80,0x1 # uleb128 128
355
+
356
+ .byte 0x4 # DW_CFA_advance_loc4
357
+ .4byte $LCFI6-$LCFI5
358
+ .byte 0x9a # DW_CFA_offset, column 26
359
+ .byte 16 # uleb128 offset 16*-8
360
+ .align 3
361
+ $LEFDE3:
362
+
363
+ #ifdef __linux__
364
+ .section .note.GNU-stack,"",@progbits
365
+ #endif
366
+ #endif
@@ -0,0 +1,309 @@
1
+ /* -----------------------------------------------------------------------
2
+ ffi.c - Copyright (c) 1998, 2008 Red Hat, Inc.
3
+
4
+ ARM Foreign Function Interface
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining
7
+ a copy of this software and associated documentation files (the
8
+ ``Software''), to deal in the Software without restriction, including
9
+ without limitation the rights to use, copy, modify, merge, publish,
10
+ distribute, sublicense, and/or sell copies of the Software, and to
11
+ permit persons to whom the Software is furnished to do so, subject to
12
+ the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included
15
+ in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24
+ DEALINGS IN THE SOFTWARE.
25
+ ----------------------------------------------------------------------- */
26
+
27
+ #include <ffi.h>
28
+ #include <ffi_common.h>
29
+
30
+ #include <stdlib.h>
31
+
32
+ /* ffi_prep_args is called by the assembly routine once stack space
33
+ has been allocated for the function's arguments */
34
+
35
+ void ffi_prep_args(char *stack, extended_cif *ecif)
36
+ {
37
+ register unsigned int i;
38
+ register void **p_argv;
39
+ register char *argp;
40
+ register ffi_type **p_arg;
41
+
42
+ argp = stack;
43
+
44
+ if ( ecif->cif->flags == FFI_TYPE_STRUCT ) {
45
+ *(void **) argp = ecif->rvalue;
46
+ argp += 4;
47
+ }
48
+
49
+ p_argv = ecif->avalue;
50
+
51
+ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
52
+ (i != 0);
53
+ i--, p_arg++)
54
+ {
55
+ size_t z;
56
+
57
+ /* Align if necessary */
58
+ if (((*p_arg)->alignment - 1) & (unsigned) argp) {
59
+ argp = (char *) ALIGN(argp, (*p_arg)->alignment);
60
+ }
61
+
62
+ if ((*p_arg)->type == FFI_TYPE_STRUCT)
63
+ argp = (char *) ALIGN(argp, 4);
64
+
65
+ z = (*p_arg)->size;
66
+ if (z < sizeof(int))
67
+ {
68
+ z = sizeof(int);
69
+ switch ((*p_arg)->type)
70
+ {
71
+ case FFI_TYPE_SINT8:
72
+ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
73
+ break;
74
+
75
+ case FFI_TYPE_UINT8:
76
+ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
77
+ break;
78
+
79
+ case FFI_TYPE_SINT16:
80
+ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
81
+ break;
82
+
83
+ case FFI_TYPE_UINT16:
84
+ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
85
+ break;
86
+
87
+ case FFI_TYPE_STRUCT:
88
+ memcpy(argp, *p_argv, (*p_arg)->size);
89
+ break;
90
+
91
+ default:
92
+ FFI_ASSERT(0);
93
+ }
94
+ }
95
+ else if (z == sizeof(int))
96
+ {
97
+ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
98
+ }
99
+ else
100
+ {
101
+ memcpy(argp, *p_argv, z);
102
+ }
103
+ p_argv++;
104
+ argp += z;
105
+ }
106
+
107
+ return;
108
+ }
109
+
110
+ /* Perform machine dependent cif processing */
111
+ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
112
+ {
113
+ /* Round the stack up to a multiple of 8 bytes. This isn't needed
114
+ everywhere, but it is on some platforms, and it doesn't harm anything
115
+ when it isn't needed. */
116
+ cif->bytes = (cif->bytes + 7) & ~7;
117
+
118
+ /* Set the return type flag */
119
+ switch (cif->rtype->type)
120
+ {
121
+ case FFI_TYPE_VOID:
122
+ case FFI_TYPE_FLOAT:
123
+ case FFI_TYPE_DOUBLE:
124
+ cif->flags = (unsigned) cif->rtype->type;
125
+ break;
126
+
127
+ case FFI_TYPE_SINT64:
128
+ case FFI_TYPE_UINT64:
129
+ cif->flags = (unsigned) FFI_TYPE_SINT64;
130
+ break;
131
+
132
+ case FFI_TYPE_STRUCT:
133
+ if (cif->rtype->size <= 4)
134
+ /* A Composite Type not larger than 4 bytes is returned in r0. */
135
+ cif->flags = (unsigned)FFI_TYPE_INT;
136
+ else
137
+ /* A Composite Type larger than 4 bytes, or whose size cannot
138
+ be determined statically ... is stored in memory at an
139
+ address passed [in r0]. */
140
+ cif->flags = (unsigned)FFI_TYPE_STRUCT;
141
+ break;
142
+
143
+ default:
144
+ cif->flags = FFI_TYPE_INT;
145
+ break;
146
+ }
147
+
148
+ return FFI_OK;
149
+ }
150
+
151
+ extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
152
+ unsigned, unsigned, unsigned *, void (*fn)(void));
153
+
154
+ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
155
+ {
156
+ extended_cif ecif;
157
+
158
+ int small_struct = (cif->flags == FFI_TYPE_INT
159
+ && cif->rtype->type == FFI_TYPE_STRUCT);
160
+
161
+ ecif.cif = cif;
162
+ ecif.avalue = avalue;
163
+
164
+ unsigned int temp;
165
+
166
+ /* If the return value is a struct and we don't have a return */
167
+ /* value address then we need to make one */
168
+
169
+ if ((rvalue == NULL) &&
170
+ (cif->flags == FFI_TYPE_STRUCT))
171
+ {
172
+ ecif.rvalue = alloca(cif->rtype->size);
173
+ }
174
+ else if (small_struct)
175
+ ecif.rvalue = &temp;
176
+ else
177
+ ecif.rvalue = rvalue;
178
+
179
+ switch (cif->abi)
180
+ {
181
+ case FFI_SYSV:
182
+ ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue,
183
+ fn);
184
+
185
+ break;
186
+ default:
187
+ FFI_ASSERT(0);
188
+ break;
189
+ }
190
+ if (small_struct)
191
+ memcpy (rvalue, &temp, cif->rtype->size);
192
+ }
193
+
194
+ /** private members **/
195
+
196
+ static void ffi_prep_incoming_args_SYSV (char *stack, void **ret,
197
+ void** args, ffi_cif* cif);
198
+
199
+ void ffi_closure_SYSV (ffi_closure *);
200
+
201
+ /* This function is jumped to by the trampoline */
202
+
203
+ unsigned int
204
+ ffi_closure_SYSV_inner (closure, respp, args)
205
+ ffi_closure *closure;
206
+ void **respp;
207
+ void *args;
208
+ {
209
+ // our various things...
210
+ ffi_cif *cif;
211
+ void **arg_area;
212
+
213
+ cif = closure->cif;
214
+ arg_area = (void**) alloca (cif->nargs * sizeof (void*));
215
+
216
+ /* this call will initialize ARG_AREA, such that each
217
+ * element in that array points to the corresponding
218
+ * value on the stack; and if the function returns
219
+ * a structure, it will re-set RESP to point to the
220
+ * structure return address. */
221
+
222
+ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif);
223
+
224
+ (closure->fun) (cif, *respp, arg_area, closure->user_data);
225
+
226
+ return cif->flags;
227
+ }
228
+
229
+ /*@-exportheader@*/
230
+ static void
231
+ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
232
+ void **avalue, ffi_cif *cif)
233
+ /*@=exportheader@*/
234
+ {
235
+ register unsigned int i;
236
+ register void **p_argv;
237
+ register char *argp;
238
+ register ffi_type **p_arg;
239
+
240
+ argp = stack;
241
+
242
+ if ( cif->flags == FFI_TYPE_STRUCT ) {
243
+ *rvalue = *(void **) argp;
244
+ argp += 4;
245
+ }
246
+
247
+ p_argv = avalue;
248
+
249
+ for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++)
250
+ {
251
+ size_t z;
252
+
253
+ size_t alignment = (*p_arg)->alignment;
254
+ if (alignment < 4)
255
+ alignment = 4;
256
+ /* Align if necessary */
257
+ if ((alignment - 1) & (unsigned) argp) {
258
+ argp = (char *) ALIGN(argp, alignment);
259
+ }
260
+
261
+ z = (*p_arg)->size;
262
+
263
+ /* because we're little endian, this is what it turns into. */
264
+
265
+ *p_argv = (void*) argp;
266
+
267
+ p_argv++;
268
+ argp += z;
269
+ }
270
+
271
+ return;
272
+ }
273
+
274
+ /* How to make a trampoline. */
275
+
276
+ #define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \
277
+ ({ unsigned char *__tramp = (unsigned char*)(TRAMP); \
278
+ unsigned int __fun = (unsigned int)(FUN); \
279
+ unsigned int __ctx = (unsigned int)(CTX); \
280
+ *(unsigned int*) &__tramp[0] = 0xe92d000f; /* stmfd sp!, {r0-r3} */ \
281
+ *(unsigned int*) &__tramp[4] = 0xe59f0000; /* ldr r0, [pc] */ \
282
+ *(unsigned int*) &__tramp[8] = 0xe59ff000; /* ldr pc, [pc] */ \
283
+ *(unsigned int*) &__tramp[12] = __ctx; \
284
+ *(unsigned int*) &__tramp[16] = __fun; \
285
+ __clear_cache((&__tramp[0]), (&__tramp[19])); \
286
+ })
287
+
288
+
289
+ /* the cif must already be prep'ed */
290
+
291
+ ffi_status
292
+ ffi_prep_closure_loc (ffi_closure* closure,
293
+ ffi_cif* cif,
294
+ void (*fun)(ffi_cif*,void*,void**,void*),
295
+ void *user_data,
296
+ void *codeloc)
297
+ {
298
+ FFI_ASSERT (cif->abi == FFI_SYSV);
299
+
300
+ FFI_INIT_TRAMPOLINE (&closure->tramp[0], \
301
+ &ffi_closure_SYSV, \
302
+ codeloc);
303
+
304
+ closure->cif = cif;
305
+ closure->user_data = user_data;
306
+ closure->fun = fun;
307
+
308
+ return FFI_OK;
309
+ }