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,103 @@
|
|
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
|
+
/* { dg-do run } */
|
10
|
+
#include "ffitest.h"
|
11
|
+
|
12
|
+
typedef struct cls_struct_3_1byte {
|
13
|
+
unsigned char a;
|
14
|
+
unsigned char b;
|
15
|
+
unsigned char c;
|
16
|
+
} cls_struct_3_1byte;
|
17
|
+
|
18
|
+
cls_struct_3_1byte cls_struct_3_1byte_fn(struct cls_struct_3_1byte a1,
|
19
|
+
struct cls_struct_3_1byte a2)
|
20
|
+
{
|
21
|
+
struct cls_struct_3_1byte result;
|
22
|
+
|
23
|
+
result.a = a1.a + a2.a;
|
24
|
+
result.b = a1.b + a2.b;
|
25
|
+
result.c = a1.c + a2.c;
|
26
|
+
|
27
|
+
printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c,
|
28
|
+
a2.a, a2.b, a2.c,
|
29
|
+
result.a, result.b, result.c);
|
30
|
+
|
31
|
+
return result;
|
32
|
+
}
|
33
|
+
|
34
|
+
static void
|
35
|
+
cls_struct_3_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
36
|
+
void* userdata __UNUSED__)
|
37
|
+
{
|
38
|
+
|
39
|
+
struct cls_struct_3_1byte a1, a2;
|
40
|
+
|
41
|
+
a1 = *(struct cls_struct_3_1byte*)(args[0]);
|
42
|
+
a2 = *(struct cls_struct_3_1byte*)(args[1]);
|
43
|
+
|
44
|
+
*(cls_struct_3_1byte*)resp = cls_struct_3_1byte_fn(a1, a2);
|
45
|
+
}
|
46
|
+
|
47
|
+
int main (void)
|
48
|
+
{
|
49
|
+
ffi_cif cif;
|
50
|
+
#ifndef USING_MMAP
|
51
|
+
static ffi_closure cl;
|
52
|
+
#endif
|
53
|
+
ffi_closure *pcl;
|
54
|
+
void* args_dbl[5];
|
55
|
+
ffi_type* cls_struct_fields[4];
|
56
|
+
ffi_type cls_struct_type;
|
57
|
+
ffi_type* dbl_arg_types[5];
|
58
|
+
|
59
|
+
#ifdef USING_MMAP
|
60
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
61
|
+
#else
|
62
|
+
pcl = &cl;
|
63
|
+
#endif
|
64
|
+
|
65
|
+
cls_struct_type.size = 0;
|
66
|
+
cls_struct_type.alignment = 0;
|
67
|
+
cls_struct_type.type = FFI_TYPE_STRUCT;
|
68
|
+
cls_struct_type.elements = cls_struct_fields;
|
69
|
+
|
70
|
+
struct cls_struct_3_1byte g_dbl = { 12, 13, 14 };
|
71
|
+
struct cls_struct_3_1byte f_dbl = { 178, 179, 180 };
|
72
|
+
struct cls_struct_3_1byte res_dbl;
|
73
|
+
|
74
|
+
cls_struct_fields[0] = &ffi_type_uchar;
|
75
|
+
cls_struct_fields[1] = &ffi_type_uchar;
|
76
|
+
cls_struct_fields[2] = &ffi_type_uchar;
|
77
|
+
cls_struct_fields[3] = NULL;
|
78
|
+
|
79
|
+
dbl_arg_types[0] = &cls_struct_type;
|
80
|
+
dbl_arg_types[1] = &cls_struct_type;
|
81
|
+
dbl_arg_types[2] = NULL;
|
82
|
+
|
83
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
|
84
|
+
dbl_arg_types) == FFI_OK);
|
85
|
+
|
86
|
+
args_dbl[0] = &g_dbl;
|
87
|
+
args_dbl[1] = &f_dbl;
|
88
|
+
args_dbl[2] = NULL;
|
89
|
+
|
90
|
+
ffi_call(&cif, FFI_FN(cls_struct_3_1byte_fn), &res_dbl, args_dbl);
|
91
|
+
/* { dg-output "12 13 14 178 179 180: 190 192 194" } */
|
92
|
+
printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
|
93
|
+
/* { dg-output "\nres: 190 192 194" } */
|
94
|
+
|
95
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_3_1byte_gn, NULL) == FFI_OK);
|
96
|
+
|
97
|
+
res_dbl = ((cls_struct_3_1byte(*)(cls_struct_3_1byte, cls_struct_3_1byte))(pcl))(g_dbl, f_dbl);
|
98
|
+
/* { dg-output "\n12 13 14 178 179 180: 190 192 194" } */
|
99
|
+
printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
|
100
|
+
/* { dg-output "\nres: 190 192 194" } */
|
101
|
+
|
102
|
+
exit(0);
|
103
|
+
}
|
@@ -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. Check overlapping.
|
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_3byte {
|
13
|
+
unsigned short a;
|
14
|
+
unsigned char b;
|
15
|
+
} cls_struct_3byte;
|
16
|
+
|
17
|
+
cls_struct_3byte cls_struct_3byte_fn(struct cls_struct_3byte a1,
|
18
|
+
struct cls_struct_3byte a2)
|
19
|
+
{
|
20
|
+
struct cls_struct_3byte 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_3byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
32
|
+
void* userdata __UNUSED__)
|
33
|
+
{
|
34
|
+
|
35
|
+
struct cls_struct_3byte a1, a2;
|
36
|
+
|
37
|
+
a1 = *(struct cls_struct_3byte*)(args[0]);
|
38
|
+
a2 = *(struct cls_struct_3byte*)(args[1]);
|
39
|
+
|
40
|
+
*(cls_struct_3byte*)resp = cls_struct_3byte_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_3byte g_dbl = { 12, 119 };
|
67
|
+
struct cls_struct_3byte f_dbl = { 1, 15 };
|
68
|
+
struct cls_struct_3byte res_dbl;
|
69
|
+
|
70
|
+
cls_struct_fields[0] = &ffi_type_ushort;
|
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_3byte_fn), &res_dbl, args_dbl);
|
86
|
+
/* { dg-output "12 119 1 15: 13 134" } */
|
87
|
+
printf("res: %d %d\n", res_dbl.a, res_dbl.b);
|
88
|
+
/* { dg-output "\nres: 13 134" } */
|
89
|
+
|
90
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_3byte_gn, NULL) == FFI_OK);
|
91
|
+
|
92
|
+
res_dbl = ((cls_struct_3byte(*)(cls_struct_3byte, cls_struct_3byte))(pcl))(g_dbl, f_dbl);
|
93
|
+
/* { dg-output "\n12 119 1 15: 13 134" } */
|
94
|
+
printf("res: %d %d\n", res_dbl.a, res_dbl.b);
|
95
|
+
/* { dg-output "\nres: 13 134" } */
|
96
|
+
|
97
|
+
exit(0);
|
98
|
+
}
|
@@ -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. Check overlapping.
|
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_3byte_1 {
|
13
|
+
unsigned char a;
|
14
|
+
unsigned short b;
|
15
|
+
} cls_struct_3byte_1;
|
16
|
+
|
17
|
+
cls_struct_3byte_1 cls_struct_3byte_fn1(struct cls_struct_3byte_1 a1,
|
18
|
+
struct cls_struct_3byte_1 a2)
|
19
|
+
{
|
20
|
+
struct cls_struct_3byte_1 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_3byte_gn1(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
32
|
+
void* userdata __UNUSED__)
|
33
|
+
{
|
34
|
+
|
35
|
+
struct cls_struct_3byte_1 a1, a2;
|
36
|
+
|
37
|
+
a1 = *(struct cls_struct_3byte_1*)(args[0]);
|
38
|
+
a2 = *(struct cls_struct_3byte_1*)(args[1]);
|
39
|
+
|
40
|
+
*(cls_struct_3byte_1*)resp = cls_struct_3byte_fn1(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_3byte_1 g_dbl = { 15, 125 };
|
67
|
+
struct cls_struct_3byte_1 f_dbl = { 9, 19 };
|
68
|
+
struct cls_struct_3byte_1 res_dbl;
|
69
|
+
|
70
|
+
cls_struct_fields[0] = &ffi_type_uchar;
|
71
|
+
cls_struct_fields[1] = &ffi_type_ushort;
|
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_3byte_fn1), &res_dbl, args_dbl);
|
86
|
+
/* { dg-output "15 125 9 19: 24 144" } */
|
87
|
+
printf("res: %d %d\n", res_dbl.a, res_dbl.b);
|
88
|
+
/* { dg-output "\nres: 24 144" } */
|
89
|
+
|
90
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_3byte_gn1, NULL) == FFI_OK);
|
91
|
+
|
92
|
+
res_dbl = ((cls_struct_3byte_1(*)(cls_struct_3byte_1, cls_struct_3byte_1))(pcl))(g_dbl, f_dbl);
|
93
|
+
/* { dg-output "\n15 125 9 19: 24 144" } */
|
94
|
+
printf("res: %d %d\n", res_dbl.a, res_dbl.b);
|
95
|
+
/* { dg-output "\nres: 24 144" } */
|
96
|
+
|
97
|
+
exit(0);
|
98
|
+
}
|
@@ -0,0 +1,106 @@
|
|
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
|
+
/* { dg-do run } */
|
10
|
+
#include "ffitest.h"
|
11
|
+
|
12
|
+
typedef struct cls_struct_4_1byte {
|
13
|
+
unsigned char a;
|
14
|
+
unsigned char b;
|
15
|
+
unsigned char c;
|
16
|
+
unsigned char d;
|
17
|
+
} cls_struct_4_1byte;
|
18
|
+
|
19
|
+
cls_struct_4_1byte cls_struct_4_1byte_fn(struct cls_struct_4_1byte a1,
|
20
|
+
struct cls_struct_4_1byte a2)
|
21
|
+
{
|
22
|
+
struct cls_struct_4_1byte result;
|
23
|
+
|
24
|
+
result.a = a1.a + a2.a;
|
25
|
+
result.b = a1.b + a2.b;
|
26
|
+
result.c = a1.c + a2.c;
|
27
|
+
result.d = a1.d + a2.d;
|
28
|
+
|
29
|
+
printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d,
|
30
|
+
a2.a, a2.b, a2.c, a2.d,
|
31
|
+
result.a, result.b, result.c, result.d);
|
32
|
+
|
33
|
+
return result;
|
34
|
+
}
|
35
|
+
|
36
|
+
static void
|
37
|
+
cls_struct_4_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
38
|
+
void* userdata __UNUSED__)
|
39
|
+
{
|
40
|
+
|
41
|
+
struct cls_struct_4_1byte a1, a2;
|
42
|
+
|
43
|
+
a1 = *(struct cls_struct_4_1byte*)(args[0]);
|
44
|
+
a2 = *(struct cls_struct_4_1byte*)(args[1]);
|
45
|
+
|
46
|
+
*(cls_struct_4_1byte*)resp = cls_struct_4_1byte_fn(a1, a2);
|
47
|
+
}
|
48
|
+
|
49
|
+
int main (void)
|
50
|
+
{
|
51
|
+
ffi_cif cif;
|
52
|
+
#ifndef USING_MMAP
|
53
|
+
static ffi_closure cl;
|
54
|
+
#endif
|
55
|
+
ffi_closure *pcl;
|
56
|
+
void* args_dbl[5];
|
57
|
+
ffi_type* cls_struct_fields[5];
|
58
|
+
ffi_type cls_struct_type;
|
59
|
+
ffi_type* dbl_arg_types[5];
|
60
|
+
|
61
|
+
#ifdef USING_MMAP
|
62
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
63
|
+
#else
|
64
|
+
pcl = &cl;
|
65
|
+
#endif
|
66
|
+
|
67
|
+
cls_struct_type.size = 0;
|
68
|
+
cls_struct_type.alignment = 0;
|
69
|
+
cls_struct_type.type = FFI_TYPE_STRUCT;
|
70
|
+
cls_struct_type.elements = cls_struct_fields;
|
71
|
+
|
72
|
+
struct cls_struct_4_1byte g_dbl = { 12, 13, 14, 15 };
|
73
|
+
struct cls_struct_4_1byte f_dbl = { 178, 179, 180, 181 };
|
74
|
+
struct cls_struct_4_1byte res_dbl;
|
75
|
+
|
76
|
+
cls_struct_fields[0] = &ffi_type_uchar;
|
77
|
+
cls_struct_fields[1] = &ffi_type_uchar;
|
78
|
+
cls_struct_fields[2] = &ffi_type_uchar;
|
79
|
+
cls_struct_fields[3] = &ffi_type_uchar;
|
80
|
+
cls_struct_fields[4] = NULL;
|
81
|
+
|
82
|
+
dbl_arg_types[0] = &cls_struct_type;
|
83
|
+
dbl_arg_types[1] = &cls_struct_type;
|
84
|
+
dbl_arg_types[2] = NULL;
|
85
|
+
|
86
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
|
87
|
+
dbl_arg_types) == FFI_OK);
|
88
|
+
|
89
|
+
args_dbl[0] = &g_dbl;
|
90
|
+
args_dbl[1] = &f_dbl;
|
91
|
+
args_dbl[2] = NULL;
|
92
|
+
|
93
|
+
ffi_call(&cif, FFI_FN(cls_struct_4_1byte_fn), &res_dbl, args_dbl);
|
94
|
+
/* { dg-output "12 13 14 15 178 179 180 181: 190 192 194 196" } */
|
95
|
+
printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
|
96
|
+
/* { dg-output "\nres: 190 192 194 196" } */
|
97
|
+
|
98
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_4_1byte_gn, NULL) == FFI_OK);
|
99
|
+
|
100
|
+
res_dbl = ((cls_struct_4_1byte(*)(cls_struct_4_1byte, cls_struct_4_1byte))(pcl))(g_dbl, f_dbl);
|
101
|
+
/* { dg-output "\n12 13 14 15 178 179 180 181: 190 192 194 196" } */
|
102
|
+
printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
|
103
|
+
/* { dg-output "\nres: 190 192 194 196" } */
|
104
|
+
|
105
|
+
exit(0);
|
106
|
+
}
|
@@ -0,0 +1,98 @@
|
|
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
|
+
|
10
|
+
#include "ffitest.h"
|
11
|
+
|
12
|
+
typedef struct cls_struct_4byte {
|
13
|
+
unsigned short a;
|
14
|
+
unsigned short b;
|
15
|
+
} cls_struct_4byte;
|
16
|
+
|
17
|
+
cls_struct_4byte cls_struct_4byte_fn(struct cls_struct_4byte a1,
|
18
|
+
struct cls_struct_4byte a2)
|
19
|
+
{
|
20
|
+
struct cls_struct_4byte 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_4byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
32
|
+
void* userdata __UNUSED__)
|
33
|
+
{
|
34
|
+
|
35
|
+
struct cls_struct_4byte a1, a2;
|
36
|
+
|
37
|
+
a1 = *(struct cls_struct_4byte*)(args[0]);
|
38
|
+
a2 = *(struct cls_struct_4byte*)(args[1]);
|
39
|
+
|
40
|
+
*(cls_struct_4byte*)resp = cls_struct_4byte_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_4byte g_dbl = { 127, 120 };
|
67
|
+
struct cls_struct_4byte f_dbl = { 12, 128 };
|
68
|
+
struct cls_struct_4byte res_dbl;
|
69
|
+
|
70
|
+
cls_struct_fields[0] = &ffi_type_ushort;
|
71
|
+
cls_struct_fields[1] = &ffi_type_ushort;
|
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_4byte_fn), &res_dbl, args_dbl);
|
86
|
+
/* { dg-output "127 120 12 128: 139 248" } */
|
87
|
+
printf("res: %d %d\n", res_dbl.a, res_dbl.b);
|
88
|
+
/* { dg-output "\nres: 139 248" } */
|
89
|
+
|
90
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_4byte_gn, NULL) == FFI_OK);
|
91
|
+
|
92
|
+
res_dbl = ((cls_struct_4byte(*)(cls_struct_4byte, cls_struct_4byte))(pcl))(g_dbl, f_dbl);
|
93
|
+
/* { dg-output "\n127 120 12 128: 139 248" } */
|
94
|
+
printf("res: %d %d\n", res_dbl.a, res_dbl.b);
|
95
|
+
/* { dg-output "\nres: 139 248" } */
|
96
|
+
|
97
|
+
exit(0);
|
98
|
+
}
|