ffi 0.4.0-x86-mswin32
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 +142 -0
- data/ext/ffi_c/AbstractMemory.c +412 -0
- data/ext/ffi_c/AbstractMemory.h +68 -0
- data/ext/ffi_c/AutoPointer.c +60 -0
- data/ext/ffi_c/AutoPointer.h +18 -0
- data/ext/ffi_c/Buffer.c +171 -0
- data/ext/ffi_c/Callback.c +374 -0
- data/ext/ffi_c/Callback.h +47 -0
- data/ext/ffi_c/DynamicLibrary.c +213 -0
- data/ext/ffi_c/DynamicLibrary.h +22 -0
- data/ext/ffi_c/Invoker.c +962 -0
- data/ext/ffi_c/LastError.c +135 -0
- data/ext/ffi_c/LastError.h +18 -0
- data/ext/ffi_c/MemoryPointer.c +156 -0
- data/ext/ffi_c/MemoryPointer.h +20 -0
- data/ext/ffi_c/NullPointer.c +143 -0
- data/ext/ffi_c/Platform.c +59 -0
- data/ext/ffi_c/Platform.h +16 -0
- data/ext/ffi_c/Pointer.c +164 -0
- data/ext/ffi_c/Pointer.h +25 -0
- data/ext/ffi_c/Struct.c +477 -0
- data/ext/ffi_c/Struct.h +26 -0
- data/ext/ffi_c/Type.c +230 -0
- data/ext/ffi_c/Type.h +28 -0
- data/ext/ffi_c/Types.c +118 -0
- data/ext/ffi_c/Types.h +54 -0
- data/ext/ffi_c/compat.h +22 -0
- data/ext/ffi_c/endian.h +40 -0
- data/ext/ffi_c/extconf.rb +31 -0
- data/ext/ffi_c/ffi.c +76 -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 +23 -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 +96 -0
- data/lib/ffi/io.rb +21 -0
- data/lib/ffi/library.rb +243 -0
- data/lib/ffi/managedstruct.rb +55 -0
- data/lib/ffi/memorypointer.rb +73 -0
- data/lib/ffi/platform.rb +78 -0
- data/lib/ffi/pointer.rb +119 -0
- data/lib/ffi/struct.rb +354 -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 +17 -0
- data/lib/ffi/variadic.rb +30 -0
- data/spec/ffi/bool_spec.rb +24 -0
- data/spec/ffi/buffer_spec.rb +196 -0
- data/spec/ffi/callback_spec.rb +560 -0
- data/spec/ffi/enum_spec.rb +164 -0
- data/spec/ffi/errno_spec.rb +13 -0
- data/spec/ffi/library_spec.rb +144 -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 +41 -0
- data/spec/ffi/struct_initialize_spec.rb +30 -0
- data/spec/ffi/struct_spec.rb +476 -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 +375 -0
@@ -0,0 +1,107 @@
|
|
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
|
+
/* { dg-do run } */
|
10
|
+
#include "ffitest.h"
|
11
|
+
|
12
|
+
typedef struct cls_struct_6byte {
|
13
|
+
unsigned short a;
|
14
|
+
unsigned short b;
|
15
|
+
unsigned char c;
|
16
|
+
unsigned char d;
|
17
|
+
} cls_struct_6byte;
|
18
|
+
|
19
|
+
cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1,
|
20
|
+
struct cls_struct_6byte a2)
|
21
|
+
{
|
22
|
+
struct cls_struct_6byte 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_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
38
|
+
void* userdata __UNUSED__)
|
39
|
+
{
|
40
|
+
|
41
|
+
struct cls_struct_6byte a1, a2;
|
42
|
+
|
43
|
+
a1 = *(struct cls_struct_6byte*)(args[0]);
|
44
|
+
a2 = *(struct cls_struct_6byte*)(args[1]);
|
45
|
+
|
46
|
+
*(cls_struct_6byte*)resp = cls_struct_6byte_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_6byte g_dbl = { 127, 120, 1, 128 };
|
73
|
+
struct cls_struct_6byte f_dbl = { 12, 128, 9, 127 };
|
74
|
+
struct cls_struct_6byte res_dbl;
|
75
|
+
|
76
|
+
cls_struct_fields[0] = &ffi_type_ushort;
|
77
|
+
cls_struct_fields[1] = &ffi_type_ushort;
|
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_6byte_fn), &res_dbl, args_dbl);
|
94
|
+
/* { dg-output "127 120 1 128 12 128 9 127: 139 248 10 255" } */
|
95
|
+
printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
|
96
|
+
/* { dg-output "\nres: 139 248 10 255" } */
|
97
|
+
|
98
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_6byte_gn, NULL) == FFI_OK);
|
99
|
+
|
100
|
+
res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(pcl))(g_dbl, f_dbl);
|
101
|
+
/* { dg-output "\n127 120 1 128 12 128 9 127: 139 248 10 255" } */
|
102
|
+
printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
|
103
|
+
/* { dg-output "\nres: 139 248 10 255" } */
|
104
|
+
|
105
|
+
|
106
|
+
exit(0);
|
107
|
+
}
|
@@ -0,0 +1,125 @@
|
|
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> 20050708 */
|
7
|
+
|
8
|
+
/* { dg-do run } */
|
9
|
+
#include "ffitest.h"
|
10
|
+
|
11
|
+
typedef struct cls_struct_7byte {
|
12
|
+
unsigned char a;
|
13
|
+
unsigned char b;
|
14
|
+
unsigned char c;
|
15
|
+
unsigned char d;
|
16
|
+
unsigned char e;
|
17
|
+
unsigned char f;
|
18
|
+
unsigned char g;
|
19
|
+
} cls_struct_7byte;
|
20
|
+
|
21
|
+
cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1,
|
22
|
+
struct cls_struct_7byte a2)
|
23
|
+
{
|
24
|
+
struct cls_struct_7byte result;
|
25
|
+
|
26
|
+
result.a = a1.a + a2.a;
|
27
|
+
result.b = a1.b + a2.b;
|
28
|
+
result.c = a1.c + a2.c;
|
29
|
+
result.d = a1.d + a2.d;
|
30
|
+
result.e = a1.e + a2.e;
|
31
|
+
result.f = a1.f + a2.f;
|
32
|
+
result.g = a1.g + a2.g;
|
33
|
+
|
34
|
+
printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d %d\n",
|
35
|
+
a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g,
|
36
|
+
a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g,
|
37
|
+
result.a, result.b, result.c, result.d, result.e, result.f, result.g);
|
38
|
+
|
39
|
+
return result;
|
40
|
+
}
|
41
|
+
|
42
|
+
static void
|
43
|
+
cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
44
|
+
void* userdata __UNUSED__)
|
45
|
+
{
|
46
|
+
|
47
|
+
struct cls_struct_7byte a1, a2;
|
48
|
+
|
49
|
+
a1 = *(struct cls_struct_7byte*)(args[0]);
|
50
|
+
a2 = *(struct cls_struct_7byte*)(args[1]);
|
51
|
+
|
52
|
+
*(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2);
|
53
|
+
}
|
54
|
+
|
55
|
+
int main (void)
|
56
|
+
{
|
57
|
+
ffi_cif cif;
|
58
|
+
#ifndef USING_MMAP
|
59
|
+
static ffi_closure cl;
|
60
|
+
#endif
|
61
|
+
ffi_closure *pcl;
|
62
|
+
void* args_dbl[5];
|
63
|
+
ffi_type* cls_struct_fields[8];
|
64
|
+
ffi_type cls_struct_type;
|
65
|
+
ffi_type* dbl_arg_types[5];
|
66
|
+
|
67
|
+
#ifdef USING_MMAP
|
68
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
69
|
+
#else
|
70
|
+
pcl = &cl;
|
71
|
+
#endif
|
72
|
+
|
73
|
+
cls_struct_type.size = 0;
|
74
|
+
cls_struct_type.alignment = 0;
|
75
|
+
cls_struct_type.type = FFI_TYPE_STRUCT;
|
76
|
+
cls_struct_type.elements = cls_struct_fields;
|
77
|
+
|
78
|
+
struct cls_struct_7byte g_dbl = { 127, 120, 1, 3, 4, 5, 6 };
|
79
|
+
struct cls_struct_7byte f_dbl = { 12, 128, 9, 3, 4, 5, 6 };
|
80
|
+
struct cls_struct_7byte res_dbl = { 0, 0, 0, 0, 0, 0, 0 };
|
81
|
+
|
82
|
+
cls_struct_fields[0] = &ffi_type_uchar;
|
83
|
+
cls_struct_fields[1] = &ffi_type_uchar;
|
84
|
+
cls_struct_fields[2] = &ffi_type_uchar;
|
85
|
+
cls_struct_fields[3] = &ffi_type_uchar;
|
86
|
+
cls_struct_fields[4] = &ffi_type_uchar;
|
87
|
+
cls_struct_fields[5] = &ffi_type_uchar;
|
88
|
+
cls_struct_fields[6] = &ffi_type_uchar;
|
89
|
+
cls_struct_fields[7] = NULL;
|
90
|
+
|
91
|
+
dbl_arg_types[0] = &cls_struct_type;
|
92
|
+
dbl_arg_types[1] = &cls_struct_type;
|
93
|
+
dbl_arg_types[2] = NULL;
|
94
|
+
|
95
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
|
96
|
+
dbl_arg_types) == FFI_OK);
|
97
|
+
|
98
|
+
args_dbl[0] = &g_dbl;
|
99
|
+
args_dbl[1] = &f_dbl;
|
100
|
+
args_dbl[2] = NULL;
|
101
|
+
|
102
|
+
ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl);
|
103
|
+
/* { dg-output "127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */
|
104
|
+
printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
|
105
|
+
res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
|
106
|
+
/* { dg-output "\nres: 139 248 10 6 8 10 12" } */
|
107
|
+
|
108
|
+
res_dbl.a = 0;
|
109
|
+
res_dbl.b = 0;
|
110
|
+
res_dbl.c = 0;
|
111
|
+
res_dbl.d = 0;
|
112
|
+
res_dbl.e = 0;
|
113
|
+
res_dbl.f = 0;
|
114
|
+
res_dbl.g = 0;
|
115
|
+
|
116
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_7byte_gn, NULL) == FFI_OK);
|
117
|
+
|
118
|
+
res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(pcl))(g_dbl, f_dbl);
|
119
|
+
/* { dg-output "\n127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */
|
120
|
+
printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
|
121
|
+
res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
|
122
|
+
/* { dg-output "\nres: 139 248 10 6 8 10 12" } */
|
123
|
+
|
124
|
+
exit(0);
|
125
|
+
}
|
@@ -0,0 +1,105 @@
|
|
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_7byte {
|
12
|
+
unsigned short a;
|
13
|
+
unsigned short b;
|
14
|
+
unsigned char c;
|
15
|
+
unsigned short d;
|
16
|
+
} cls_struct_7byte;
|
17
|
+
|
18
|
+
cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1,
|
19
|
+
struct cls_struct_7byte a2)
|
20
|
+
{
|
21
|
+
struct cls_struct_7byte result;
|
22
|
+
|
23
|
+
result.a = a1.a + a2.a;
|
24
|
+
result.b = a1.b + a2.b;
|
25
|
+
result.c = a1.c + a2.c;
|
26
|
+
result.d = a1.d + a2.d;
|
27
|
+
|
28
|
+
printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d,
|
29
|
+
a2.a, a2.b, a2.c, a2.d,
|
30
|
+
result.a, result.b, result.c, result.d);
|
31
|
+
|
32
|
+
return result;
|
33
|
+
}
|
34
|
+
|
35
|
+
static void
|
36
|
+
cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
37
|
+
void* userdata __UNUSED__)
|
38
|
+
{
|
39
|
+
|
40
|
+
struct cls_struct_7byte a1, a2;
|
41
|
+
|
42
|
+
a1 = *(struct cls_struct_7byte*)(args[0]);
|
43
|
+
a2 = *(struct cls_struct_7byte*)(args[1]);
|
44
|
+
|
45
|
+
*(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2);
|
46
|
+
}
|
47
|
+
|
48
|
+
int main (void)
|
49
|
+
{
|
50
|
+
ffi_cif cif;
|
51
|
+
#ifndef USING_MMAP
|
52
|
+
static ffi_closure cl;
|
53
|
+
#endif
|
54
|
+
ffi_closure *pcl;
|
55
|
+
void* args_dbl[5];
|
56
|
+
ffi_type* cls_struct_fields[5];
|
57
|
+
ffi_type cls_struct_type;
|
58
|
+
ffi_type* dbl_arg_types[5];
|
59
|
+
|
60
|
+
#ifdef USING_MMAP
|
61
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
62
|
+
#else
|
63
|
+
pcl = &cl;
|
64
|
+
#endif
|
65
|
+
|
66
|
+
cls_struct_type.size = 0;
|
67
|
+
cls_struct_type.alignment = 0;
|
68
|
+
cls_struct_type.type = FFI_TYPE_STRUCT;
|
69
|
+
cls_struct_type.elements = cls_struct_fields;
|
70
|
+
|
71
|
+
struct cls_struct_7byte g_dbl = { 127, 120, 1, 254 };
|
72
|
+
struct cls_struct_7byte f_dbl = { 12, 128, 9, 255 };
|
73
|
+
struct cls_struct_7byte res_dbl;
|
74
|
+
|
75
|
+
cls_struct_fields[0] = &ffi_type_ushort;
|
76
|
+
cls_struct_fields[1] = &ffi_type_ushort;
|
77
|
+
cls_struct_fields[2] = &ffi_type_uchar;
|
78
|
+
cls_struct_fields[3] = &ffi_type_ushort;
|
79
|
+
cls_struct_fields[4] = NULL;
|
80
|
+
|
81
|
+
dbl_arg_types[0] = &cls_struct_type;
|
82
|
+
dbl_arg_types[1] = &cls_struct_type;
|
83
|
+
dbl_arg_types[2] = NULL;
|
84
|
+
|
85
|
+
CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
|
86
|
+
dbl_arg_types) == FFI_OK);
|
87
|
+
|
88
|
+
args_dbl[0] = &g_dbl;
|
89
|
+
args_dbl[1] = &f_dbl;
|
90
|
+
args_dbl[2] = NULL;
|
91
|
+
|
92
|
+
ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl);
|
93
|
+
/* { dg-output "127 120 1 254 12 128 9 255: 139 248 10 509" } */
|
94
|
+
printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
|
95
|
+
/* { dg-output "\nres: 139 248 10 509" } */
|
96
|
+
|
97
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_7byte_gn, NULL) == FFI_OK);
|
98
|
+
|
99
|
+
res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(pcl))(g_dbl, f_dbl);
|
100
|
+
/* { dg-output "\n127 120 1 254 12 128 9 255: 139 248 10 509" } */
|
101
|
+
printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
|
102
|
+
/* { dg-output "\nres: 139 248 10 509" } */
|
103
|
+
|
104
|
+
exit(0);
|
105
|
+
}
|
@@ -0,0 +1,96 @@
|
|
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_8byte {
|
12
|
+
int a;
|
13
|
+
float b;
|
14
|
+
} cls_struct_8byte;
|
15
|
+
|
16
|
+
cls_struct_8byte cls_struct_8byte_fn(struct cls_struct_8byte a1,
|
17
|
+
struct cls_struct_8byte a2)
|
18
|
+
{
|
19
|
+
struct cls_struct_8byte result;
|
20
|
+
|
21
|
+
result.a = a1.a + a2.a;
|
22
|
+
result.b = a1.b + a2.b;
|
23
|
+
|
24
|
+
printf("%d %g %d %g: %d %g\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
|
25
|
+
|
26
|
+
return result;
|
27
|
+
}
|
28
|
+
|
29
|
+
static void
|
30
|
+
cls_struct_8byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
|
31
|
+
void* userdata __UNUSED__)
|
32
|
+
{
|
33
|
+
|
34
|
+
struct cls_struct_8byte a1, a2;
|
35
|
+
|
36
|
+
a1 = *(struct cls_struct_8byte*)(args[0]);
|
37
|
+
a2 = *(struct cls_struct_8byte*)(args[1]);
|
38
|
+
|
39
|
+
*(cls_struct_8byte*)resp = cls_struct_8byte_fn(a1, a2);
|
40
|
+
}
|
41
|
+
|
42
|
+
int main (void)
|
43
|
+
{
|
44
|
+
ffi_cif cif;
|
45
|
+
#ifndef USING_MMAP
|
46
|
+
static ffi_closure cl;
|
47
|
+
#endif
|
48
|
+
ffi_closure *pcl;
|
49
|
+
void* args_dbl[5];
|
50
|
+
ffi_type* cls_struct_fields[4];
|
51
|
+
ffi_type cls_struct_type;
|
52
|
+
ffi_type* dbl_arg_types[5];
|
53
|
+
|
54
|
+
#ifdef USING_MMAP
|
55
|
+
pcl = allocate_mmap (sizeof(ffi_closure));
|
56
|
+
#else
|
57
|
+
pcl = &cl;
|
58
|
+
#endif
|
59
|
+
|
60
|
+
cls_struct_type.size = 0;
|
61
|
+
cls_struct_type.alignment = 0;
|
62
|
+
cls_struct_type.type = FFI_TYPE_STRUCT;
|
63
|
+
cls_struct_type.elements = cls_struct_fields;
|
64
|
+
|
65
|
+
struct cls_struct_8byte g_dbl = { 1, 2.0 };
|
66
|
+
struct cls_struct_8byte f_dbl = { 4, 5.0 };
|
67
|
+
struct cls_struct_8byte res_dbl;
|
68
|
+
|
69
|
+
cls_struct_fields[0] = &ffi_type_sint;
|
70
|
+
cls_struct_fields[1] = &ffi_type_float;
|
71
|
+
cls_struct_fields[2] = 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_8byte_fn), &res_dbl, args_dbl);
|
85
|
+
/* { dg-output "1 2 4 5: 5 7" } */
|
86
|
+
printf("res: %d %g\n", res_dbl.a, res_dbl.b);
|
87
|
+
/* { dg-output "\nres: 5 7" } */
|
88
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_8byte_gn, NULL) == FFI_OK);
|
89
|
+
|
90
|
+
res_dbl = ((cls_struct_8byte(*)(cls_struct_8byte, cls_struct_8byte))(pcl))(g_dbl, f_dbl);
|
91
|
+
/* { dg-output "\n1 2 4 5: 5 7" } */
|
92
|
+
printf("res: %d %g\n", res_dbl.a, res_dbl.b);
|
93
|
+
/* { dg-output "\nres: 5 7" } */
|
94
|
+
|
95
|
+
exit(0);
|
96
|
+
}
|
@@ -0,0 +1,98 @@
|
|
1
|
+
/* Area: ffi_call, closure_call
|
2
|
+
Purpose: Check structure passing with different structure size.
|
3
|
+
Depending on the ABI. Darwin/AIX do double-word
|
4
|
+
alignment of the struct if the first element is a double.
|
5
|
+
Check that it does not here.
|
6
|
+
Limitations: none.
|
7
|
+
PR: none.
|
8
|
+
Originator: <andreast@gcc.gnu.org> 20030914 */
|
9
|
+
|
10
|
+
/* { dg-do run } */
|
11
|
+
#include "ffitest.h"
|
12
|
+
|
13
|
+
typedef struct cls_struct_9byte {
|
14
|
+
int a;
|
15
|
+
double b;
|
16
|
+
} cls_struct_9byte;
|
17
|
+
|
18
|
+
cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1,
|
19
|
+
struct cls_struct_9byte b2)
|
20
|
+
{
|
21
|
+
struct cls_struct_9byte result;
|
22
|
+
|
23
|
+
result.a = b1.a + b2.a;
|
24
|
+
result.b = b1.b + b2.b;
|
25
|
+
|
26
|
+
printf("%d %g %d %g: %d %g\n", b1.a, b1.b, b2.a, b2.b,
|
27
|
+
result.a, result.b);
|
28
|
+
|
29
|
+
return result;
|
30
|
+
}
|
31
|
+
|
32
|
+
static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp,
|
33
|
+
void** args, void* userdata __UNUSED__)
|
34
|
+
{
|
35
|
+
struct cls_struct_9byte b1, b2;
|
36
|
+
|
37
|
+
b1 = *(struct cls_struct_9byte*)(args[0]);
|
38
|
+
b2 = *(struct cls_struct_9byte*)(args[1]);
|
39
|
+
|
40
|
+
*(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2);
|
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[3];
|
51
|
+
ffi_type* cls_struct_fields[3];
|
52
|
+
ffi_type cls_struct_type;
|
53
|
+
ffi_type* dbl_arg_types[3];
|
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_9byte h_dbl = { 7, 8.0};
|
67
|
+
struct cls_struct_9byte j_dbl = { 1, 9.0};
|
68
|
+
struct cls_struct_9byte res_dbl;
|
69
|
+
|
70
|
+
cls_struct_fields[0] = &ffi_type_sint;
|
71
|
+
cls_struct_fields[1] = &ffi_type_double;
|
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] = &h_dbl;
|
82
|
+
args_dbl[1] = &j_dbl;
|
83
|
+
args_dbl[2] = NULL;
|
84
|
+
|
85
|
+
ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl);
|
86
|
+
/* { dg-output "7 8 1 9: 8 17" } */
|
87
|
+
printf("res: %d %g\n", res_dbl.a, res_dbl.b);
|
88
|
+
/* { dg-output "\nres: 8 17" } */
|
89
|
+
|
90
|
+
CHECK(ffi_prep_closure(pcl, &cif, cls_struct_9byte_gn, NULL) == FFI_OK);
|
91
|
+
|
92
|
+
res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(pcl))(h_dbl, j_dbl);
|
93
|
+
/* { dg-output "\n7 8 1 9: 8 17" } */
|
94
|
+
printf("res: %d %g\n", res_dbl.a, res_dbl.b);
|
95
|
+
/* { dg-output "\nres: 8 17" } */
|
96
|
+
|
97
|
+
exit(0);
|
98
|
+
}
|