ffi 0.5.0-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ffi might be problematic. Click here for more details.
- data/LICENSE +51 -0
- data/README.rdoc +69 -0
- data/Rakefile +191 -0
- data/ext/ffi_c/AbstractMemory.c +489 -0
- data/ext/ffi_c/AbstractMemory.h +160 -0
- data/ext/ffi_c/ArrayType.c +129 -0
- data/ext/ffi_c/ArrayType.h +58 -0
- data/ext/ffi_c/AutoPointer.c +61 -0
- data/ext/ffi_c/AutoPointer.h +18 -0
- data/ext/ffi_c/Buffer.c +187 -0
- data/ext/ffi_c/Call.c +853 -0
- data/ext/ffi_c/Call.h +86 -0
- data/ext/ffi_c/ClosurePool.c +302 -0
- data/ext/ffi_c/ClosurePool.h +29 -0
- data/ext/ffi_c/DynamicLibrary.c +216 -0
- data/ext/ffi_c/DynamicLibrary.h +22 -0
- data/ext/ffi_c/Function.c +478 -0
- data/ext/ffi_c/Function.h +80 -0
- data/ext/ffi_c/FunctionInfo.c +221 -0
- data/ext/ffi_c/LastError.c +159 -0
- data/ext/ffi_c/LastError.h +18 -0
- data/ext/ffi_c/MemoryPointer.c +178 -0
- data/ext/ffi_c/MemoryPointer.h +20 -0
- data/ext/ffi_c/MethodHandle.c +346 -0
- data/ext/ffi_c/MethodHandle.h +53 -0
- data/ext/ffi_c/Platform.c +59 -0
- data/ext/ffi_c/Platform.h +16 -0
- data/ext/ffi_c/Pointer.c +224 -0
- data/ext/ffi_c/Pointer.h +49 -0
- data/ext/ffi_c/Struct.c +770 -0
- data/ext/ffi_c/Struct.h +80 -0
- data/ext/ffi_c/StructByValue.c +140 -0
- data/ext/ffi_c/StructByValue.h +53 -0
- data/ext/ffi_c/StructLayout.c +450 -0
- data/ext/ffi_c/Type.c +329 -0
- data/ext/ffi_c/Type.h +57 -0
- data/ext/ffi_c/Types.c +103 -0
- data/ext/ffi_c/Types.h +85 -0
- data/ext/ffi_c/Variadic.c +260 -0
- data/ext/ffi_c/compat.h +72 -0
- data/ext/ffi_c/endian.h +40 -0
- data/ext/ffi_c/extconf.rb +30 -0
- data/ext/ffi_c/ffi.c +82 -0
- data/ext/ffi_c/libffi.bsd.mk +34 -0
- data/ext/ffi_c/libffi.darwin.mk +75 -0
- data/ext/ffi_c/libffi.gnu.mk +29 -0
- data/ext/ffi_c/libffi.mk +13 -0
- data/ext/ffi_c/libffi/ChangeLog +3243 -0
- data/ext/ffi_c/libffi/ChangeLog.libffi +347 -0
- data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
- data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
- data/ext/ffi_c/libffi/LICENSE +21 -0
- data/ext/ffi_c/libffi/Makefile.am +177 -0
- data/ext/ffi_c/libffi/Makefile.in +1640 -0
- data/ext/ffi_c/libffi/README +328 -0
- data/ext/ffi_c/libffi/TODO +1 -0
- data/ext/ffi_c/libffi/acinclude.m4 +92 -0
- data/ext/ffi_c/libffi/aclocal.m4 +7516 -0
- data/ext/ffi_c/libffi/compile +142 -0
- data/ext/ffi_c/libffi/config.guess +1516 -0
- data/ext/ffi_c/libffi/config.sub +1626 -0
- data/ext/ffi_c/libffi/configure +24414 -0
- data/ext/ffi_c/libffi/configure.ac +365 -0
- data/ext/ffi_c/libffi/configure.host +11 -0
- data/ext/ffi_c/libffi/depcomp +584 -0
- data/ext/ffi_c/libffi/doc/libffi.info +533 -0
- data/ext/ffi_c/libffi/doc/libffi.texi +541 -0
- data/ext/ffi_c/libffi/doc/stamp-vti +4 -0
- data/ext/ffi_c/libffi/doc/version.texi +4 -0
- data/ext/ffi_c/libffi/fficonfig.h.in +160 -0
- data/ext/ffi_c/libffi/include/Makefile.am +9 -0
- data/ext/ffi_c/libffi/include/Makefile.in +422 -0
- data/ext/ffi_c/libffi/include/ffi.h.in +393 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +98 -0
- data/ext/ffi_c/libffi/install-sh +323 -0
- data/ext/ffi_c/libffi/libffi.pc.in +10 -0
- data/ext/ffi_c/libffi/libtool-version +29 -0
- data/ext/ffi_c/libffi/ltcf-c.sh +861 -0
- data/ext/ffi_c/libffi/ltcf-cxx.sh +1069 -0
- data/ext/ffi_c/libffi/ltcf-gcj.sh +700 -0
- data/ext/ffi_c/libffi/ltconfig +2862 -0
- data/ext/ffi_c/libffi/ltmain.sh +6930 -0
- data/ext/ffi_c/libffi/man/Makefile.am +8 -0
- data/ext/ffi_c/libffi/man/Makefile.in +395 -0
- data/ext/ffi_c/libffi/man/ffi.3 +31 -0
- data/ext/ffi_c/libffi/man/ffi_call.3 +103 -0
- data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +66 -0
- data/ext/ffi_c/libffi/mdate-sh +201 -0
- data/ext/ffi_c/libffi/missing +353 -0
- data/ext/ffi_c/libffi/mkinstalldirs +158 -0
- data/ext/ffi_c/libffi/src/alpha/ffi.c +284 -0
- data/ext/ffi_c/libffi/src/alpha/ffitarget.h +48 -0
- data/ext/ffi_c/libffi/src/alpha/osf.S +366 -0
- data/ext/ffi_c/libffi/src/arm/ffi.c +309 -0
- data/ext/ffi_c/libffi/src/arm/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/arm/sysv.S +299 -0
- data/ext/ffi_c/libffi/src/closures.c +596 -0
- data/ext/ffi_c/libffi/src/cris/ffi.c +383 -0
- data/ext/ffi_c/libffi/src/cris/ffitarget.h +51 -0
- data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
- data/ext/ffi_c/libffi/src/debug.c +59 -0
- data/ext/ffi_c/libffi/src/dlmalloc.c +5099 -0
- data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
- data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
- data/ext/ffi_c/libffi/src/frv/ffitarget.h +61 -0
- data/ext/ffi_c/libffi/src/ia64/ffi.c +580 -0
- data/ext/ffi_c/libffi/src/ia64/ffitarget.h +50 -0
- data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
- data/ext/ffi_c/libffi/src/ia64/unix.S +560 -0
- data/ext/ffi_c/libffi/src/java_raw_api.c +359 -0
- data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
- data/ext/ffi_c/libffi/src/m32r/ffitarget.h +48 -0
- data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
- data/ext/ffi_c/libffi/src/m68k/ffi.c +278 -0
- data/ext/ffi_c/libffi/src/m68k/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/m68k/sysv.S +234 -0
- data/ext/ffi_c/libffi/src/mips/ffi.c +926 -0
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +202 -0
- data/ext/ffi_c/libffi/src/mips/n32.S +534 -0
- data/ext/ffi_c/libffi/src/mips/o32.S +381 -0
- data/ext/ffi_c/libffi/src/pa/ffi.c +709 -0
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +77 -0
- data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
- data/ext/ffi_c/libffi/src/pa/linux.S +357 -0
- data/ext/ffi_c/libffi/src/powerpc/aix.S +225 -0
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +247 -0
- data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
- data/ext/ffi_c/libffi/src/powerpc/darwin.S +245 -0
- data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +317 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +1429 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +800 -0
- data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +118 -0
- data/ext/ffi_c/libffi/src/powerpc/linux64.S +187 -0
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +236 -0
- data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +327 -0
- data/ext/ffi_c/libffi/src/powerpc/sysv.S +230 -0
- data/ext/ffi_c/libffi/src/prep_cif.c +174 -0
- data/ext/ffi_c/libffi/src/raw_api.c +254 -0
- data/ext/ffi_c/libffi/src/s390/ffi.c +780 -0
- data/ext/ffi_c/libffi/src/s390/ffitarget.h +60 -0
- data/ext/ffi_c/libffi/src/s390/sysv.S +434 -0
- data/ext/ffi_c/libffi/src/sh/ffi.c +716 -0
- data/ext/ffi_c/libffi/src/sh/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
- data/ext/ffi_c/libffi/src/sh64/ffi.c +453 -0
- data/ext/ffi_c/libffi/src/sh64/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/sh64/sysv.S +530 -0
- data/ext/ffi_c/libffi/src/sparc/ffi.c +610 -0
- data/ext/ffi_c/libffi/src/sparc/ffitarget.h +66 -0
- data/ext/ffi_c/libffi/src/sparc/v8.S +272 -0
- data/ext/ffi_c/libffi/src/sparc/v9.S +307 -0
- data/ext/ffi_c/libffi/src/types.c +77 -0
- data/ext/ffi_c/libffi/src/x86/darwin.S +443 -0
- data/ext/ffi_c/libffi/src/x86/darwin64.S +416 -0
- data/ext/ffi_c/libffi/src/x86/ffi.c +475 -0
- data/ext/ffi_c/libffi/src/x86/ffi64.c +572 -0
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +90 -0
- data/ext/ffi_c/libffi/src/x86/freebsd.S +458 -0
- data/ext/ffi_c/libffi/src/x86/sysv.S +437 -0
- data/ext/ffi_c/libffi/src/x86/unix64.S +418 -0
- data/ext/ffi_c/libffi/src/x86/win32.S +391 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.am +71 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.in +447 -0
- data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
- data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +289 -0
- data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +263 -0
- data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +36 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +97 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +89 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +89 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +90 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +97 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +72 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +102 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +103 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +104 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +110 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +97 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +101 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +121 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +103 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +106 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +117 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +106 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +132 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +121 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +107 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +125 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +105 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +96 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +101 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +100 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +101 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +100 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +82 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +82 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +94 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +82 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +94 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +52 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +50 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +50 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +50 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +54 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +58 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +57 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +72 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +69 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +63 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +53 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +160 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +169 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +141 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +118 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +119 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +119 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +120 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +139 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +119 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +139 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +139 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +35 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +65 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +59 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +63 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +65 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +80 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +67 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +38 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +123 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
- data/ext/ffi_c/libffi/texinfo.tex +7482 -0
- data/ext/ffi_c/rbffi.h +26 -0
- data/gen/Rakefile +12 -0
- data/lib/1.8/ffi_c.so +0 -0
- data/lib/1.9/ffi_c.so +0 -0
- data/lib/ffi.rb +11 -0
- data/lib/ffi/autopointer.rb +61 -0
- data/lib/ffi/buffer.rb +0 -0
- data/lib/ffi/callback.rb +10 -0
- data/lib/ffi/enum.rb +78 -0
- data/lib/ffi/errno.rb +8 -0
- data/lib/ffi/ffi.rb +99 -0
- data/lib/ffi/io.rb +21 -0
- data/lib/ffi/library.rb +218 -0
- data/lib/ffi/managedstruct.rb +55 -0
- data/lib/ffi/memorypointer.rb +73 -0
- data/lib/ffi/platform.rb +88 -0
- data/lib/ffi/pointer.rb +119 -0
- data/lib/ffi/struct.rb +183 -0
- data/lib/ffi/tools/const_generator.rb +177 -0
- data/lib/ffi/tools/generator.rb +58 -0
- data/lib/ffi/tools/generator_task.rb +35 -0
- data/lib/ffi/tools/struct_generator.rb +194 -0
- data/lib/ffi/tools/types_generator.rb +123 -0
- data/lib/ffi/types.rb +153 -0
- data/lib/ffi/union.rb +12 -0
- data/lib/ffi/variadic.rb +25 -0
- data/spec/ffi/bool_spec.rb +24 -0
- data/spec/ffi/buffer_spec.rb +202 -0
- data/spec/ffi/callback_spec.rb +591 -0
- data/spec/ffi/enum_spec.rb +164 -0
- data/spec/ffi/errno_spec.rb +13 -0
- data/spec/ffi/function_spec.rb +73 -0
- data/spec/ffi/library_spec.rb +148 -0
- data/spec/ffi/managed_struct_spec.rb +56 -0
- data/spec/ffi/number_spec.rb +231 -0
- data/spec/ffi/pointer_spec.rb +195 -0
- data/spec/ffi/rbx/attach_function_spec.rb +27 -0
- data/spec/ffi/rbx/memory_pointer_spec.rb +102 -0
- data/spec/ffi/rbx/spec_helper.rb +1 -0
- data/spec/ffi/rbx/struct_spec.rb +13 -0
- data/spec/ffi/spec_helper.rb +17 -0
- data/spec/ffi/string_spec.rb +103 -0
- data/spec/ffi/struct_callback_spec.rb +64 -0
- data/spec/ffi/struct_initialize_spec.rb +30 -0
- data/spec/ffi/struct_spec.rb +529 -0
- data/spec/ffi/typedef_spec.rb +48 -0
- data/spec/ffi/union_spec.rb +60 -0
- data/spec/ffi/variadic_spec.rb +84 -0
- data/spec/spec.opts +4 -0
- metadata +396 -0
@@ -0,0 +1,97 @@
|
|
1
|
+
/* Area: ffi_call, closure_call
|
2
|
+
Purpose: Check structure passing with different structure size.
|
3
|
+
Especially with small structures which may fit in one
|
4
|
+
register. Depending on the ABI.
|
5
|
+
Limitations: none.
|
6
|
+
PR: none.
|
7
|
+
Originator: <andreast@gcc.gnu.org> 20030902 */
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
/* { dg-do run } */
|
12
|
+
#include "ffitest.h"
|
13
|
+
|
14
|
+
typedef struct cls_struct_1_1byte {
|
15
|
+
unsigned char a;
|
16
|
+
} cls_struct_1_1byte;
|
17
|
+
|
18
|
+
cls_struct_1_1byte cls_struct_1_1byte_fn(struct cls_struct_1_1byte a1,
|
19
|
+
struct cls_struct_1_1byte a2)
|
20
|
+
{
|
21
|
+
struct cls_struct_1_1byte result;
|
22
|
+
|
23
|
+
result.a = a1.a + a2.a;
|
24
|
+
|
25
|
+
printf("%d %d: %d\n", a1.a, a2.a, result.a);
|
26
|
+
|
27
|
+
return result;
|
28
|
+
}
|
29
|
+
|
30
|
+
static void
|
31
|
+
cls_struct_1_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
32
|
+
void* userdata __UNUSED__)
|
33
|
+
{
|
34
|
+
|
35
|
+
struct cls_struct_1_1byte a1, a2;
|
36
|
+
|
37
|
+
a1 = *(struct cls_struct_1_1byte*)(args[0]);
|
38
|
+
a2 = *(struct cls_struct_1_1byte*)(args[1]);
|
39
|
+
|
40
|
+
*(cls_struct_1_1byte*)resp = cls_struct_1_1byte_fn(a1, a2);
|
41
|
+
}
|
42
|
+
|
43
|
+
int main (void)
|
44
|
+
{
|
45
|
+
ffi_cif cif;
|
46
|
+
#ifndef USING_MMAP
|
47
|
+
static ffi_closure cl;
|
48
|
+
#endif
|
49
|
+
ffi_closure *pcl;
|
50
|
+
void* args_dbl[5];
|
51
|
+
ffi_type* cls_struct_fields[2];
|
52
|
+
ffi_type cls_struct_type;
|
53
|
+
ffi_type* dbl_arg_types[5];
|
54
|
+
|
55
|
+
#ifdef USING_MMAP
|
56
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
57
|
+
#else
|
58
|
+
pcl = &cl;
|
59
|
+
#endif
|
60
|
+
|
61
|
+
cls_struct_type.size = 0;
|
62
|
+
cls_struct_type.alignment = 0;
|
63
|
+
cls_struct_type.type = FFI_TYPE_STRUCT;
|
64
|
+
cls_struct_type.elements = cls_struct_fields;
|
65
|
+
|
66
|
+
struct cls_struct_1_1byte g_dbl = { 12 };
|
67
|
+
struct cls_struct_1_1byte f_dbl = { 178 };
|
68
|
+
struct cls_struct_1_1byte res_dbl;
|
69
|
+
|
70
|
+
cls_struct_fields[0] = &ffi_type_uchar;
|
71
|
+
cls_struct_fields[1] = NULL;
|
72
|
+
|
73
|
+
dbl_arg_types[0] = &cls_struct_type;
|
74
|
+
dbl_arg_types[1] = &cls_struct_type;
|
75
|
+
dbl_arg_types[2] = NULL;
|
76
|
+
|
77
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
|
78
|
+
dbl_arg_types) == FFI_OK);
|
79
|
+
|
80
|
+
args_dbl[0] = &g_dbl;
|
81
|
+
args_dbl[1] = &f_dbl;
|
82
|
+
args_dbl[2] = NULL;
|
83
|
+
|
84
|
+
ffi_call(&cif, FFI_FN(cls_struct_1_1byte_fn), &res_dbl, args_dbl);
|
85
|
+
/* { dg-output "12 178: 190" } */
|
86
|
+
printf("res: %d\n", res_dbl.a);
|
87
|
+
/* { dg-output "\nres: 190" } */
|
88
|
+
|
89
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_1_1byte_gn, NULL) == FFI_OK);
|
90
|
+
|
91
|
+
res_dbl = ((cls_struct_1_1byte(*)(cls_struct_1_1byte, cls_struct_1_1byte))(pcl))(g_dbl, f_dbl);
|
92
|
+
/* { dg-output "\n12 178: 190" } */
|
93
|
+
printf("res: %d\n", res_dbl.a);
|
94
|
+
/* { dg-output "\nres: 190" } */
|
95
|
+
|
96
|
+
exit(0);
|
97
|
+
}
|
@@ -0,0 +1,99 @@
|
|
1
|
+
/* Area: ffi_call, closure_call
|
2
|
+
Purpose: Check structure passing with different structure size.
|
3
|
+
Depending on the ABI. Check overlapping.
|
4
|
+
Limitations: none.
|
5
|
+
PR: none.
|
6
|
+
Originator: <andreast@gcc.gnu.org> 20030828 */
|
7
|
+
|
8
|
+
/* { dg-do run } */
|
9
|
+
#include "ffitest.h"
|
10
|
+
|
11
|
+
typedef struct cls_struct_20byte {
|
12
|
+
double a;
|
13
|
+
double b;
|
14
|
+
int c;
|
15
|
+
} cls_struct_20byte;
|
16
|
+
|
17
|
+
cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1,
|
18
|
+
struct cls_struct_20byte a2)
|
19
|
+
{
|
20
|
+
struct cls_struct_20byte result;
|
21
|
+
|
22
|
+
result.a = a1.a + a2.a;
|
23
|
+
result.b = a1.b + a2.b;
|
24
|
+
result.c = a1.c + a2.c;
|
25
|
+
|
26
|
+
printf("%g %g %d %g %g %d: %g %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c,
|
27
|
+
result.a, result.b, result.c);
|
28
|
+
return result;
|
29
|
+
}
|
30
|
+
|
31
|
+
static void
|
32
|
+
cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
33
|
+
void* userdata __UNUSED__)
|
34
|
+
{
|
35
|
+
struct cls_struct_20byte a1, a2;
|
36
|
+
|
37
|
+
a1 = *(struct cls_struct_20byte*)(args[0]);
|
38
|
+
a2 = *(struct cls_struct_20byte*)(args[1]);
|
39
|
+
|
40
|
+
*(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2);
|
41
|
+
}
|
42
|
+
|
43
|
+
int main (void)
|
44
|
+
{
|
45
|
+
ffi_cif cif;
|
46
|
+
#ifndef USING_MMAP
|
47
|
+
static ffi_closure cl;
|
48
|
+
#endif
|
49
|
+
ffi_closure *pcl;
|
50
|
+
void* args_dbl[5];
|
51
|
+
ffi_type* cls_struct_fields[4];
|
52
|
+
ffi_type cls_struct_type;
|
53
|
+
ffi_type* dbl_arg_types[5];
|
54
|
+
|
55
|
+
#ifdef USING_MMAP
|
56
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
57
|
+
#else
|
58
|
+
pcl = &cl;
|
59
|
+
#endif
|
60
|
+
|
61
|
+
cls_struct_type.size = 0;
|
62
|
+
cls_struct_type.alignment = 0;
|
63
|
+
cls_struct_type.type = FFI_TYPE_STRUCT;
|
64
|
+
cls_struct_type.elements = cls_struct_fields;
|
65
|
+
|
66
|
+
struct cls_struct_20byte g_dbl = { 1.0, 2.0, 3 };
|
67
|
+
struct cls_struct_20byte f_dbl = { 4.0, 5.0, 7 };
|
68
|
+
struct cls_struct_20byte res_dbl;
|
69
|
+
|
70
|
+
cls_struct_fields[0] = &ffi_type_double;
|
71
|
+
cls_struct_fields[1] = &ffi_type_double;
|
72
|
+
cls_struct_fields[2] = &ffi_type_sint;
|
73
|
+
cls_struct_fields[3] = NULL;
|
74
|
+
|
75
|
+
dbl_arg_types[0] = &cls_struct_type;
|
76
|
+
dbl_arg_types[1] = &cls_struct_type;
|
77
|
+
dbl_arg_types[2] = NULL;
|
78
|
+
|
79
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
|
80
|
+
dbl_arg_types) == FFI_OK);
|
81
|
+
|
82
|
+
args_dbl[0] = &g_dbl;
|
83
|
+
args_dbl[1] = &f_dbl;
|
84
|
+
args_dbl[2] = NULL;
|
85
|
+
|
86
|
+
ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl);
|
87
|
+
/* { dg-output "1 2 3 4 5 7: 5 7 10" } */
|
88
|
+
printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
|
89
|
+
/* { dg-output "\nres: 5 7 10" } */
|
90
|
+
|
91
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_20byte_gn, NULL) == FFI_OK);
|
92
|
+
|
93
|
+
res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(pcl))(g_dbl, f_dbl);
|
94
|
+
/* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */
|
95
|
+
printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
|
96
|
+
/* { dg-output "\nres: 5 7 10" } */
|
97
|
+
|
98
|
+
exit(0);
|
99
|
+
}
|
@@ -0,0 +1,101 @@
|
|
1
|
+
/* Area: ffi_call, closure_call
|
2
|
+
Purpose: Check structure passing with different structure size.
|
3
|
+
Depending on the ABI. Check overlapping.
|
4
|
+
Limitations: none.
|
5
|
+
PR: none.
|
6
|
+
Originator: <andreast@gcc.gnu.org> 20030828 */
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
/* { dg-do run } */
|
11
|
+
#include "ffitest.h"
|
12
|
+
|
13
|
+
typedef struct cls_struct_20byte {
|
14
|
+
int a;
|
15
|
+
double b;
|
16
|
+
double c;
|
17
|
+
} cls_struct_20byte;
|
18
|
+
|
19
|
+
cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1,
|
20
|
+
struct cls_struct_20byte a2)
|
21
|
+
{
|
22
|
+
struct cls_struct_20byte result;
|
23
|
+
|
24
|
+
result.a = a1.a + a2.a;
|
25
|
+
result.b = a1.b + a2.b;
|
26
|
+
result.c = a1.c + a2.c;
|
27
|
+
|
28
|
+
printf("%d %g %g %d %g %g: %d %g %g\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c,
|
29
|
+
result.a, result.b, result.c);
|
30
|
+
return result;
|
31
|
+
}
|
32
|
+
|
33
|
+
static void
|
34
|
+
cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
35
|
+
void* userdata __UNUSED__)
|
36
|
+
{
|
37
|
+
struct cls_struct_20byte a1, a2;
|
38
|
+
|
39
|
+
a1 = *(struct cls_struct_20byte*)(args[0]);
|
40
|
+
a2 = *(struct cls_struct_20byte*)(args[1]);
|
41
|
+
|
42
|
+
*(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2);
|
43
|
+
}
|
44
|
+
|
45
|
+
int main (void)
|
46
|
+
{
|
47
|
+
ffi_cif cif;
|
48
|
+
#ifndef USING_MMAP
|
49
|
+
static ffi_closure cl;
|
50
|
+
#endif
|
51
|
+
ffi_closure *pcl;
|
52
|
+
void* args_dbl[3];
|
53
|
+
ffi_type* cls_struct_fields[4];
|
54
|
+
ffi_type cls_struct_type;
|
55
|
+
ffi_type* dbl_arg_types[3];
|
56
|
+
|
57
|
+
#ifdef USING_MMAP
|
58
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
59
|
+
#else
|
60
|
+
pcl = &cl;
|
61
|
+
#endif
|
62
|
+
|
63
|
+
cls_struct_type.size = 0;
|
64
|
+
cls_struct_type.alignment = 0;
|
65
|
+
cls_struct_type.type = FFI_TYPE_STRUCT;
|
66
|
+
cls_struct_type.elements = cls_struct_fields;
|
67
|
+
|
68
|
+
struct cls_struct_20byte g_dbl = { 1, 2.0, 3.0 };
|
69
|
+
struct cls_struct_20byte f_dbl = { 4, 5.0, 7.0 };
|
70
|
+
struct cls_struct_20byte res_dbl;
|
71
|
+
|
72
|
+
cls_struct_fields[0] = &ffi_type_sint;
|
73
|
+
cls_struct_fields[1] = &ffi_type_double;
|
74
|
+
cls_struct_fields[2] = &ffi_type_double;
|
75
|
+
cls_struct_fields[3] = NULL;
|
76
|
+
|
77
|
+
dbl_arg_types[0] = &cls_struct_type;
|
78
|
+
dbl_arg_types[1] = &cls_struct_type;
|
79
|
+
dbl_arg_types[2] = NULL;
|
80
|
+
|
81
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
|
82
|
+
dbl_arg_types) == FFI_OK);
|
83
|
+
|
84
|
+
args_dbl[0] = &g_dbl;
|
85
|
+
args_dbl[1] = &f_dbl;
|
86
|
+
args_dbl[2] = NULL;
|
87
|
+
|
88
|
+
ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl);
|
89
|
+
/* { dg-output "1 2 3 4 5 7: 5 7 10" } */
|
90
|
+
printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c);
|
91
|
+
/* { dg-output "\nres: 5 7 10" } */
|
92
|
+
|
93
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_20byte_gn, NULL) == FFI_OK);
|
94
|
+
|
95
|
+
res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(pcl))(g_dbl, f_dbl);
|
96
|
+
/* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */
|
97
|
+
printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c);
|
98
|
+
/* { dg-output "\nres: 5 7 10" } */
|
99
|
+
|
100
|
+
exit(0);
|
101
|
+
}
|
@@ -0,0 +1,121 @@
|
|
1
|
+
/* Area: ffi_call, closure_call
|
2
|
+
Purpose: Check structure passing with different structure size.
|
3
|
+
Depending on the ABI. Check overlapping.
|
4
|
+
Limitations: none.
|
5
|
+
PR: none.
|
6
|
+
Originator: <andreast@gcc.gnu.org> 20030828 */
|
7
|
+
|
8
|
+
/* { dg-do run } */
|
9
|
+
#include "ffitest.h"
|
10
|
+
|
11
|
+
typedef struct cls_struct_24byte {
|
12
|
+
double a;
|
13
|
+
double b;
|
14
|
+
int c;
|
15
|
+
float d;
|
16
|
+
} cls_struct_24byte;
|
17
|
+
|
18
|
+
cls_struct_24byte cls_struct_24byte_fn(struct cls_struct_24byte b0,
|
19
|
+
struct cls_struct_24byte b1,
|
20
|
+
struct cls_struct_24byte b2,
|
21
|
+
struct cls_struct_24byte b3)
|
22
|
+
{
|
23
|
+
struct cls_struct_24byte result;
|
24
|
+
|
25
|
+
result.a = b0.a + b1.a + b2.a + b3.a;
|
26
|
+
result.b = b0.b + b1.b + b2.b + b3.b;
|
27
|
+
result.c = b0.c + b1.c + b2.c + b3.c;
|
28
|
+
result.d = b0.d + b1.d + b2.d + b3.d;
|
29
|
+
|
30
|
+
printf("%g %g %d %g %g %g %d %g %g %g %d %g %g %g %d %g: %g %g %d %g\n",
|
31
|
+
b0.a, b0.b, b0.c, b0.d,
|
32
|
+
b1.a, b1.b, b1.c, b1.d,
|
33
|
+
b2.a, b2.b, b2.c, b2.d,
|
34
|
+
b3.a, b3.b, b3.c, b2.d,
|
35
|
+
result.a, result.b, result.c, result.d);
|
36
|
+
|
37
|
+
return result;
|
38
|
+
}
|
39
|
+
|
40
|
+
static void
|
41
|
+
cls_struct_24byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
42
|
+
void* userdata __UNUSED__)
|
43
|
+
{
|
44
|
+
struct cls_struct_24byte b0, b1, b2, b3;
|
45
|
+
|
46
|
+
b0 = *(struct cls_struct_24byte*)(args[0]);
|
47
|
+
b1 = *(struct cls_struct_24byte*)(args[1]);
|
48
|
+
b2 = *(struct cls_struct_24byte*)(args[2]);
|
49
|
+
b3 = *(struct cls_struct_24byte*)(args[3]);
|
50
|
+
|
51
|
+
*(cls_struct_24byte*)resp = cls_struct_24byte_fn(b0, b1, b2, b3);
|
52
|
+
}
|
53
|
+
|
54
|
+
int main (void)
|
55
|
+
{
|
56
|
+
ffi_cif cif;
|
57
|
+
#ifndef USING_MMAP
|
58
|
+
static ffi_closure cl;
|
59
|
+
#endif
|
60
|
+
ffi_closure *pcl;
|
61
|
+
void* args_dbl[5];
|
62
|
+
ffi_type* cls_struct_fields[5];
|
63
|
+
ffi_type cls_struct_type;
|
64
|
+
ffi_type* dbl_arg_types[5];
|
65
|
+
|
66
|
+
#ifdef USING_MMAP
|
67
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
68
|
+
#else
|
69
|
+
pcl = &cl;
|
70
|
+
#endif
|
71
|
+
|
72
|
+
cls_struct_type.size = 0;
|
73
|
+
cls_struct_type.alignment = 0;
|
74
|
+
cls_struct_type.type = FFI_TYPE_STRUCT;
|
75
|
+
cls_struct_type.elements = cls_struct_fields;
|
76
|
+
|
77
|
+
struct cls_struct_24byte e_dbl = { 9.0, 2.0, 6, 5.0 };
|
78
|
+
struct cls_struct_24byte f_dbl = { 1.0, 2.0, 3, 7.0 };
|
79
|
+
struct cls_struct_24byte g_dbl = { 4.0, 5.0, 7, 9.0 };
|
80
|
+
struct cls_struct_24byte h_dbl = { 8.0, 6.0, 1, 4.0 };
|
81
|
+
struct cls_struct_24byte res_dbl;
|
82
|
+
|
83
|
+
cls_struct_fields[0] = &ffi_type_double;
|
84
|
+
cls_struct_fields[1] = &ffi_type_double;
|
85
|
+
cls_struct_fields[2] = &ffi_type_sint;
|
86
|
+
cls_struct_fields[3] = &ffi_type_float;
|
87
|
+
cls_struct_fields[4] = NULL;
|
88
|
+
|
89
|
+
dbl_arg_types[0] = &cls_struct_type;
|
90
|
+
dbl_arg_types[1] = &cls_struct_type;
|
91
|
+
dbl_arg_types[2] = &cls_struct_type;
|
92
|
+
dbl_arg_types[3] = &cls_struct_type;
|
93
|
+
dbl_arg_types[4] = NULL;
|
94
|
+
|
95
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
|
96
|
+
dbl_arg_types) == FFI_OK);
|
97
|
+
|
98
|
+
args_dbl[0] = &e_dbl;
|
99
|
+
args_dbl[1] = &f_dbl;
|
100
|
+
args_dbl[2] = &g_dbl;
|
101
|
+
args_dbl[3] = &h_dbl;
|
102
|
+
args_dbl[4] = NULL;
|
103
|
+
|
104
|
+
ffi_call(&cif, FFI_FN(cls_struct_24byte_fn), &res_dbl, args_dbl);
|
105
|
+
/* { dg-output "9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */
|
106
|
+
printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
|
107
|
+
/* { dg-output "\nres: 22 15 17 25" } */
|
108
|
+
|
109
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_24byte_gn, NULL) == FFI_OK);
|
110
|
+
|
111
|
+
res_dbl = ((cls_struct_24byte(*)(cls_struct_24byte,
|
112
|
+
cls_struct_24byte,
|
113
|
+
cls_struct_24byte,
|
114
|
+
cls_struct_24byte))
|
115
|
+
(pcl))(e_dbl, f_dbl, g_dbl, h_dbl);
|
116
|
+
/* { dg-output "\n9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */
|
117
|
+
printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
|
118
|
+
/* { dg-output "\nres: 22 15 17 25" } */
|
119
|
+
|
120
|
+
exit(0);
|
121
|
+
}
|
@@ -0,0 +1,98 @@
|
|
1
|
+
/* Area: ffi_call, closure_call
|
2
|
+
Purpose: Check structure passing with different structure size.
|
3
|
+
Especially with small structures which may fit in one
|
4
|
+
register. Depending on the ABI.
|
5
|
+
Limitations: none.
|
6
|
+
PR: none.
|
7
|
+
Originator: <andreast@gcc.gnu.org> 20030828 */
|
8
|
+
|
9
|
+
/* { dg-do run } */
|
10
|
+
#include "ffitest.h"
|
11
|
+
|
12
|
+
typedef struct cls_struct_2byte {
|
13
|
+
unsigned char a;
|
14
|
+
unsigned char b;
|
15
|
+
} cls_struct_2byte;
|
16
|
+
|
17
|
+
cls_struct_2byte cls_struct_2byte_fn(struct cls_struct_2byte a1,
|
18
|
+
struct cls_struct_2byte a2)
|
19
|
+
{
|
20
|
+
struct cls_struct_2byte result;
|
21
|
+
|
22
|
+
result.a = a1.a + a2.a;
|
23
|
+
result.b = a1.b + a2.b;
|
24
|
+
|
25
|
+
printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
|
26
|
+
|
27
|
+
return result;
|
28
|
+
}
|
29
|
+
|
30
|
+
static void
|
31
|
+
cls_struct_2byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
32
|
+
void* userdata __UNUSED__)
|
33
|
+
{
|
34
|
+
|
35
|
+
struct cls_struct_2byte a1, a2;
|
36
|
+
|
37
|
+
a1 = *(struct cls_struct_2byte*)(args[0]);
|
38
|
+
a2 = *(struct cls_struct_2byte*)(args[1]);
|
39
|
+
|
40
|
+
*(cls_struct_2byte*)resp = cls_struct_2byte_fn(a1, a2);
|
41
|
+
}
|
42
|
+
|
43
|
+
int main (void)
|
44
|
+
{
|
45
|
+
ffi_cif cif;
|
46
|
+
#ifndef USING_MMAP
|
47
|
+
static ffi_closure cl;
|
48
|
+
#endif
|
49
|
+
ffi_closure *pcl;
|
50
|
+
void* args_dbl[5];
|
51
|
+
ffi_type* cls_struct_fields[4];
|
52
|
+
ffi_type cls_struct_type;
|
53
|
+
ffi_type* dbl_arg_types[5];
|
54
|
+
|
55
|
+
#ifdef USING_MMAP
|
56
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
57
|
+
#else
|
58
|
+
pcl = &cl;
|
59
|
+
#endif
|
60
|
+
|
61
|
+
cls_struct_type.size = 0;
|
62
|
+
cls_struct_type.alignment = 0;
|
63
|
+
cls_struct_type.type = FFI_TYPE_STRUCT;
|
64
|
+
cls_struct_type.elements = cls_struct_fields;
|
65
|
+
|
66
|
+
struct cls_struct_2byte g_dbl = { 12, 127 };
|
67
|
+
struct cls_struct_2byte f_dbl = { 1, 13 };
|
68
|
+
struct cls_struct_2byte res_dbl;
|
69
|
+
|
70
|
+
cls_struct_fields[0] = &ffi_type_uchar;
|
71
|
+
cls_struct_fields[1] = &ffi_type_uchar;
|
72
|
+
cls_struct_fields[2] = NULL;
|
73
|
+
|
74
|
+
dbl_arg_types[0] = &cls_struct_type;
|
75
|
+
dbl_arg_types[1] = &cls_struct_type;
|
76
|
+
dbl_arg_types[2] = NULL;
|
77
|
+
|
78
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
|
79
|
+
dbl_arg_types) == FFI_OK);
|
80
|
+
|
81
|
+
args_dbl[0] = &g_dbl;
|
82
|
+
args_dbl[1] = &f_dbl;
|
83
|
+
args_dbl[2] = NULL;
|
84
|
+
|
85
|
+
ffi_call(&cif, FFI_FN(cls_struct_2byte_fn), &res_dbl, args_dbl);
|
86
|
+
/* { dg-output "12 127 1 13: 13 140" } */
|
87
|
+
printf("res: %d %d\n", res_dbl.a, res_dbl.b);
|
88
|
+
/* { dg-output "\nres: 13 140" } */
|
89
|
+
|
90
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_2byte_gn, NULL) == FFI_OK);
|
91
|
+
|
92
|
+
res_dbl = ((cls_struct_2byte(*)(cls_struct_2byte, cls_struct_2byte))(pcl))(g_dbl, f_dbl);
|
93
|
+
/* { dg-output "\n12 127 1 13: 13 140" } */
|
94
|
+
printf("res: %d %d\n", res_dbl.a, res_dbl.b);
|
95
|
+
/* { dg-output "\nres: 13 140" } */
|
96
|
+
|
97
|
+
exit(0);
|
98
|
+
}
|