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,195 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
2
|
+
require 'delegate'
|
3
|
+
require 'java' if RUBY_PLATFORM =~ /java/
|
4
|
+
|
5
|
+
module LibTest
|
6
|
+
attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int
|
7
|
+
attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer
|
8
|
+
attach_function :ptr_set_pointer, [ :pointer, :int, :pointer ], :void
|
9
|
+
attach_function :ptr_ret_pointer, [ :pointer, :int ], :pointer
|
10
|
+
end
|
11
|
+
describe "Pointer" do
|
12
|
+
include FFI
|
13
|
+
class ToPtrTest
|
14
|
+
def initialize(ptr)
|
15
|
+
@ptr = ptr
|
16
|
+
end
|
17
|
+
def to_ptr
|
18
|
+
@ptr
|
19
|
+
end
|
20
|
+
end
|
21
|
+
it "Any object implementing #to_ptr can be passed as a :pointer parameter" do
|
22
|
+
memory = FFI::MemoryPointer.new :long_long
|
23
|
+
magic = 0x12345678
|
24
|
+
memory.put_int32(0, magic)
|
25
|
+
tp = ToPtrTest.new(memory)
|
26
|
+
LibTest.ptr_ret_int32_t(tp, 0).should == magic
|
27
|
+
end
|
28
|
+
class PointerDelegate < DelegateClass(FFI::Pointer)
|
29
|
+
def initialize(ptr)
|
30
|
+
@ptr = ptr
|
31
|
+
end
|
32
|
+
def to_ptr
|
33
|
+
@ptr
|
34
|
+
end
|
35
|
+
end
|
36
|
+
it "A DelegateClass(Pointer) can be passed as a :pointer parameter" do
|
37
|
+
memory = FFI::MemoryPointer.new :long_long
|
38
|
+
magic = 0x12345678
|
39
|
+
memory.put_int32(0, magic)
|
40
|
+
ptr = PointerDelegate.new(memory)
|
41
|
+
LibTest.ptr_ret_int32_t(ptr, 0).should == magic
|
42
|
+
end
|
43
|
+
it "Fixnum cannot be used as a Pointer argument" do
|
44
|
+
lambda { LibTest.ptr_ret_int32(0, 0) }.should raise_error
|
45
|
+
end
|
46
|
+
it "Bignum cannot be used as a Pointer argument" do
|
47
|
+
lambda { LibTest.ptr_ret_int32(0xfee1deadbeefcafebabe, 0) }.should raise_error
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "pointer type methods" do
|
51
|
+
|
52
|
+
describe "#read_pointer" do
|
53
|
+
memory = FFI::MemoryPointer.new :pointer
|
54
|
+
LibTest.ptr_set_pointer(memory, 0, LibTest.ptr_from_address(0xdeadbeef))
|
55
|
+
memory.read_pointer.address.should == 0xdeadbeef
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#write_pointer" do
|
59
|
+
memory = FFI::MemoryPointer.new :pointer
|
60
|
+
memory.write_pointer(LibTest.ptr_from_address(0xdeadbeef))
|
61
|
+
LibTest.ptr_ret_pointer(memory, 0).address.should == 0xdeadbeef
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#read_array_of_pointer" do
|
65
|
+
values = [0x12345678, 0xfeedf00d, 0xdeadbeef]
|
66
|
+
memory = FFI::MemoryPointer.new :pointer, values.size
|
67
|
+
values.each_with_index do |address, j|
|
68
|
+
LibTest.ptr_set_pointer(memory, j * FFI.type_size(:pointer), LibTest.ptr_from_address(address))
|
69
|
+
end
|
70
|
+
array = memory.read_array_of_pointer(values.size)
|
71
|
+
values.each_with_index do |address, j|
|
72
|
+
array[j].address.should == address
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "#write_array_of_pointer" do
|
77
|
+
values = [0x12345678, 0xfeedf00d, 0xdeadbeef]
|
78
|
+
memory = FFI::MemoryPointer.new :pointer, values.size
|
79
|
+
memory.write_array_of_pointer(values.map { |address| LibTest.ptr_from_address(address) })
|
80
|
+
array = []
|
81
|
+
values.each_with_index do |address, j|
|
82
|
+
array << LibTest.ptr_ret_pointer(memory, j * FFI.type_size(:pointer))
|
83
|
+
end
|
84
|
+
values.each_with_index do |address, j|
|
85
|
+
array[j].address.should == address
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
describe 'NULL' do
|
92
|
+
it 'should be obtained using Pointer::NULL constant' do
|
93
|
+
null_ptr = FFI::Pointer::NULL
|
94
|
+
null_ptr.null?.should be_true
|
95
|
+
end
|
96
|
+
it 'should be obtained passing address 0 to constructor' do
|
97
|
+
FFI::Pointer.new(0).null?.should be_true
|
98
|
+
end
|
99
|
+
it 'should raise an error when attempting read/write operations on it' do
|
100
|
+
null_ptr = FFI::Pointer::NULL
|
101
|
+
lambda { null_ptr.read_int }.should raise_error(FFI::NullPointerError)
|
102
|
+
lambda { null_ptr.write_int(0xff1) }.should raise_error(FFI::NullPointerError)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
describe "AutoPointer" do
|
109
|
+
loop_count = 30
|
110
|
+
wiggle_room = 2 # GC rarely cleans up all objects. we can get most of them, and that's enough to determine if the basic functionality is working.
|
111
|
+
magic = 0x12345678
|
112
|
+
|
113
|
+
class AutoPointerTestHelper
|
114
|
+
@@count = 0
|
115
|
+
def self.release
|
116
|
+
@@count += 1 if @@count > 0
|
117
|
+
end
|
118
|
+
def self.reset
|
119
|
+
@@count = 0
|
120
|
+
end
|
121
|
+
def self.gc_everything(count)
|
122
|
+
loop = 5
|
123
|
+
while @@count < count && loop > 0
|
124
|
+
loop -= 1
|
125
|
+
if RUBY_PLATFORM =~ /java/
|
126
|
+
java.lang.System.gc
|
127
|
+
else
|
128
|
+
GC.start
|
129
|
+
end
|
130
|
+
sleep 0.05 unless @@count == count
|
131
|
+
end
|
132
|
+
@@count = 0
|
133
|
+
end
|
134
|
+
def self.finalizer
|
135
|
+
self.method(:release).to_proc
|
136
|
+
end
|
137
|
+
end
|
138
|
+
class AutoPointerSubclass < FFI::AutoPointer
|
139
|
+
def self.release(ptr); end
|
140
|
+
end
|
141
|
+
it "cleanup via default release method" do
|
142
|
+
AutoPointerSubclass.should_receive(:release).at_least(loop_count-wiggle_room).times
|
143
|
+
AutoPointerTestHelper.reset
|
144
|
+
loop_count.times do
|
145
|
+
# note that if we called
|
146
|
+
# AutoPointerTestHelper.method(:release).to_proc inline, we'd
|
147
|
+
# have a reference to the pointer and it would never get GC'd.
|
148
|
+
ap = AutoPointerSubclass.new(LibTest.ptr_from_address(magic))
|
149
|
+
end
|
150
|
+
AutoPointerTestHelper.gc_everything loop_count
|
151
|
+
end
|
152
|
+
|
153
|
+
it "cleanup when passed a proc" do
|
154
|
+
# NOTE: passing a proc is touchy, because it's so easy to create a memory leak.
|
155
|
+
#
|
156
|
+
# specifically, if we made an inline call to
|
157
|
+
#
|
158
|
+
# AutoPointerTestHelper.method(:release).to_proc
|
159
|
+
#
|
160
|
+
# we'd have a reference to the pointer and it would
|
161
|
+
# never get GC'd.
|
162
|
+
AutoPointerTestHelper.should_receive(:release).at_least(loop_count-wiggle_room).times
|
163
|
+
AutoPointerTestHelper.reset
|
164
|
+
loop_count.times do
|
165
|
+
ap = FFI::AutoPointer.new(LibTest.ptr_from_address(magic),
|
166
|
+
AutoPointerTestHelper.finalizer)
|
167
|
+
end
|
168
|
+
AutoPointerTestHelper.gc_everything loop_count
|
169
|
+
end
|
170
|
+
|
171
|
+
it "cleanup when passed a method" do
|
172
|
+
AutoPointerTestHelper.should_receive(:release).at_least(loop_count-wiggle_room).times
|
173
|
+
AutoPointerTestHelper.reset
|
174
|
+
loop_count.times do
|
175
|
+
ap = FFI::AutoPointer.new(LibTest.ptr_from_address(magic),
|
176
|
+
AutoPointerTestHelper.method(:release))
|
177
|
+
end
|
178
|
+
AutoPointerTestHelper.gc_everything loop_count
|
179
|
+
end
|
180
|
+
end
|
181
|
+
describe "AutoPointer#new" do
|
182
|
+
class AutoPointerSubclass < FFI::AutoPointer
|
183
|
+
def self.release(ptr); end
|
184
|
+
end
|
185
|
+
it "MemoryPointer argument raises ArgumentError" do
|
186
|
+
lambda { FFI::AutoPointer.new(FFI::MemoryPointer.new(:int))}.should raise_error(::TypeError)
|
187
|
+
end
|
188
|
+
it "AutoPointer argument raises ArgumentError" do
|
189
|
+
lambda { AutoPointerSubclass.new(AutoPointerSubclass.new(LibTest.ptr_from_address(0))) }.should raise_error(::TypeError)
|
190
|
+
end
|
191
|
+
it "Buffer argument raises ArgumentError" do
|
192
|
+
lambda { FFI::AutoPointer.new(FFI::Buffer.new(:int))}.should raise_error(::TypeError)
|
193
|
+
end
|
194
|
+
|
195
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
2
|
+
|
3
|
+
class Timeval < FFI::Struct
|
4
|
+
layout :tv_sec, :ulong, 0, :tv_usec, :ulong, 4
|
5
|
+
end
|
6
|
+
|
7
|
+
module LibC
|
8
|
+
extend FFI::Library
|
9
|
+
|
10
|
+
attach_function :gettimeofday, [:pointer, :pointer], :int
|
11
|
+
end
|
12
|
+
|
13
|
+
describe FFI::Library, "#attach_function" do
|
14
|
+
it "correctly returns a value for gettimeofday" do
|
15
|
+
t = Timeval.new
|
16
|
+
time = LibC.gettimeofday(t.pointer, nil)
|
17
|
+
time.should be_kind_of(Integer)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "correctly populates a struct for gettimeofday" do
|
21
|
+
t = Timeval.new
|
22
|
+
time = LibC.gettimeofday(t.pointer, nil)
|
23
|
+
t[:tv_sec].should be_kind_of(Numeric)
|
24
|
+
t[:tv_usec].should be_kind_of(Numeric)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
3
|
+
|
4
|
+
module CTest
|
5
|
+
extend FFI::Library
|
6
|
+
|
7
|
+
attach_function :strcat, [:pointer, :pointer], :pointer
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "MemoryPointer" do
|
11
|
+
it "makes a pointer from a string" do
|
12
|
+
m = FFI::MemoryPointer.from_string("FFI is Awesome")
|
13
|
+
m.type_size.should == 15
|
14
|
+
end
|
15
|
+
|
16
|
+
it "reads back a string" do
|
17
|
+
m = FFI::MemoryPointer.from_string("FFI is Awesome")
|
18
|
+
m.read_string.should == "FFI is Awesome"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "makes a pointer for a certain number of bytes" do
|
22
|
+
m = FFI::MemoryPointer.new(8)
|
23
|
+
m.write_array_of_int([1,2])
|
24
|
+
m.read_array_of_int(2).should == [1,2]
|
25
|
+
end
|
26
|
+
|
27
|
+
it "allows access to an element of the pointer (as an array)" do
|
28
|
+
m = FFI::MemoryPointer.new(:int, 2)
|
29
|
+
m.write_array_of_int([1,2])
|
30
|
+
m[0].read_int.should == 1
|
31
|
+
m[1].read_int.should == 2
|
32
|
+
end
|
33
|
+
|
34
|
+
it "allows writing as an int" do
|
35
|
+
m = FFI::MemoryPointer.new(:int)
|
36
|
+
m.write_int(1)
|
37
|
+
m.read_int.should == 1
|
38
|
+
end
|
39
|
+
|
40
|
+
it "allows writing as a long" do
|
41
|
+
m = FFI::MemoryPointer.new(:long)
|
42
|
+
m.write_long(10)
|
43
|
+
m.read_long.should == 10
|
44
|
+
end
|
45
|
+
|
46
|
+
it "raises an error if you try putting a long into a pointer of size 1" do
|
47
|
+
m = FFI::MemoryPointer.new(1)
|
48
|
+
lambda { m.write_long(10) }.should raise_error
|
49
|
+
end
|
50
|
+
|
51
|
+
it "raises an error if you try putting an int into a pointer of size 1" do
|
52
|
+
m = FFI::MemoryPointer.new(1)
|
53
|
+
lambda { m.write_int(10) }.should raise_error
|
54
|
+
end
|
55
|
+
# it "does not raise IndexError for opaque pointers" do
|
56
|
+
# m = FFI::MemoryPointer.new(8)
|
57
|
+
# p2 = FFI::MemoryPointer.new(1024)
|
58
|
+
# m.write_long(p2.address)
|
59
|
+
# p = m.read_pointer
|
60
|
+
# lambda { p.write_int(10) }.should_not raise_error
|
61
|
+
# end
|
62
|
+
|
63
|
+
it "makes a pointer for a certain type" do
|
64
|
+
m = FFI::MemoryPointer.new(:int)
|
65
|
+
m.write_int(10)
|
66
|
+
m.read_int.should == 10
|
67
|
+
end
|
68
|
+
|
69
|
+
it "makes a memory pointer for a number of a certain type" do
|
70
|
+
m = FFI::MemoryPointer.new(:int, 2)
|
71
|
+
m.write_array_of_int([1,2])
|
72
|
+
m.read_array_of_int(2).should == [1,2]
|
73
|
+
end
|
74
|
+
|
75
|
+
it "makes a pointer for an object responding to #size" do
|
76
|
+
m = FFI::MemoryPointer.new(Struct.new(:size).new(8))
|
77
|
+
m.write_array_of_int([1,2])
|
78
|
+
m.read_array_of_int(2).should == [1,2]
|
79
|
+
end
|
80
|
+
|
81
|
+
it "makes a pointer for a number of an object responding to #size" do
|
82
|
+
m = FFI::MemoryPointer.new(Struct.new(:size).new(4), 2)
|
83
|
+
m.write_array_of_int([1,2])
|
84
|
+
m.read_array_of_int(2).should == [1,2]
|
85
|
+
end
|
86
|
+
it "MemoryPointer#address returns correct value" do
|
87
|
+
m = FFI::MemoryPointer.new(:long_long)
|
88
|
+
magic = 0x12345678
|
89
|
+
m.write_long(magic)
|
90
|
+
m.read_pointer.address.should == magic
|
91
|
+
end
|
92
|
+
it "MemoryPointer#null? returns true for zero value" do
|
93
|
+
m = FFI::MemoryPointer.new(:long_long)
|
94
|
+
m.write_long(0)
|
95
|
+
m.read_pointer.null?.should == true
|
96
|
+
end
|
97
|
+
it "MemoryPointer#null? returns false for non-zero value" do
|
98
|
+
m = FFI::MemoryPointer.new(:long_long)
|
99
|
+
m.write_long(0x12345678)
|
100
|
+
m.read_pointer.null?.should == false
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
2
|
+
|
3
|
+
class Timeval < FFI::Struct
|
4
|
+
layout :tv_sec, :ulong, 0, :tv_usec, :ulong, 4
|
5
|
+
end
|
6
|
+
|
7
|
+
describe FFI::Struct do
|
8
|
+
it "allows setting fields" do
|
9
|
+
t = Timeval.new
|
10
|
+
t[:tv_sec] = 12
|
11
|
+
t[:tv_sec].should == 12
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rbconfig'
|
3
|
+
require 'spec'
|
4
|
+
|
5
|
+
if ENV["MRI_FFI"]
|
6
|
+
$:.unshift File.join(File.dirname(__FILE__), "..", "..", "lib"),
|
7
|
+
File.join(File.dirname(__FILE__), "..", "..", "build", "#{Config::CONFIG['host_cpu''arch']}", "ffi_c", RUBY_VERSION)
|
8
|
+
end
|
9
|
+
require "ffi"
|
10
|
+
|
11
|
+
module TestLibrary
|
12
|
+
PATH = "build/libtest.#{FFI::Platform::LIBSUFFIX}"
|
13
|
+
end
|
14
|
+
module LibTest
|
15
|
+
extend FFI::Library
|
16
|
+
ffi_lib TestLibrary::PATH
|
17
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
2
|
+
describe "String tests" do
|
3
|
+
include FFI
|
4
|
+
module StrLibTest
|
5
|
+
extend FFI::Library
|
6
|
+
ffi_lib TestLibrary::PATH
|
7
|
+
attach_function :ptr_ret_pointer, [ :pointer, :int], :string
|
8
|
+
attach_function :string_equals, [ :string, :string ], :int
|
9
|
+
attach_function :string_dummy, [ :string ], :void
|
10
|
+
attach_function :string_null, [ ], :string
|
11
|
+
end
|
12
|
+
it "MemoryPointer#get_string returns a tainted string" do
|
13
|
+
mp = MemoryPointer.new 1024
|
14
|
+
mp.put_string(0, "test\0")
|
15
|
+
str = mp.get_string(0)
|
16
|
+
str.tainted?.should == true
|
17
|
+
end
|
18
|
+
it "String returned by a method is tainted" do
|
19
|
+
mp = MemoryPointer.new :pointer
|
20
|
+
sp = MemoryPointer.new 1024
|
21
|
+
sp.put_string(0, "test")
|
22
|
+
mp.put_pointer(0, sp)
|
23
|
+
str = StrLibTest.ptr_ret_pointer(mp, 0)
|
24
|
+
str.should == "test"
|
25
|
+
str.tainted?.should == true
|
26
|
+
end
|
27
|
+
it "Poison null byte raises error" do
|
28
|
+
s = "123\0abc"
|
29
|
+
lambda { StrLibTest.string_equals(s, s) }.should raise_error
|
30
|
+
end
|
31
|
+
it "Tainted String parameter should throw a SecurityError" do
|
32
|
+
$SAFE = 1
|
33
|
+
str = "test"
|
34
|
+
str.taint
|
35
|
+
begin
|
36
|
+
LibTest.string_equals(str, str).should == false
|
37
|
+
rescue SecurityError => e
|
38
|
+
end
|
39
|
+
end if false
|
40
|
+
it "casts nil as NULL pointer" do
|
41
|
+
StrLibTest.string_dummy(nil)
|
42
|
+
end
|
43
|
+
it "return nil for NULL char*" do
|
44
|
+
StrLibTest.string_null.should == nil
|
45
|
+
end
|
46
|
+
it "reads an array of strings until encountering a NULL pointer" do
|
47
|
+
strings = ["foo", "bar", "baz", "testing", "ffi"]
|
48
|
+
ptrary = MemoryPointer.new(:pointer, 6)
|
49
|
+
ary = strings.inject([]) do |a, str|
|
50
|
+
f = MemoryPointer.new(1024)
|
51
|
+
f.put_string(0, str)
|
52
|
+
a << f
|
53
|
+
end
|
54
|
+
ary.insert(3, nil)
|
55
|
+
ptrary.write_array_of_pointer(ary)
|
56
|
+
ptrary.get_array_of_string(0).should == ["foo", "bar", "baz"]
|
57
|
+
end
|
58
|
+
it "reads an array of strings of the size specified, substituting nil when a pointer is NULL" do
|
59
|
+
strings = ["foo", "bar", "baz", "testing", "ffi"]
|
60
|
+
ptrary = MemoryPointer.new(:pointer, 6)
|
61
|
+
ary = strings.inject([]) do |a, str|
|
62
|
+
f = MemoryPointer.new(1024)
|
63
|
+
f.put_string(0, str)
|
64
|
+
a << f
|
65
|
+
end
|
66
|
+
ary.insert(2, nil)
|
67
|
+
ptrary.write_array_of_pointer(ary)
|
68
|
+
ptrary.get_array_of_string(0, 4).should == ["foo", "bar", nil, "baz"]
|
69
|
+
end
|
70
|
+
it "reads an array of strings, taking a memory offset parameter" do
|
71
|
+
strings = ["foo", "bar", "baz", "testing", "ffi"]
|
72
|
+
ptrary = MemoryPointer.new(:pointer, 5)
|
73
|
+
ary = strings.inject([]) do |a, str|
|
74
|
+
f = MemoryPointer.new(1024)
|
75
|
+
f.put_string(0, str)
|
76
|
+
a << f
|
77
|
+
end
|
78
|
+
ptrary.write_array_of_pointer(ary)
|
79
|
+
ptrary.get_array_of_string(2 * FFI.type_size(:pointer), 3).should == ["baz", "testing", "ffi"]
|
80
|
+
end
|
81
|
+
it "raises an IndexError when trying to read an array of strings out of bounds" do
|
82
|
+
strings = ["foo", "bar", "baz", "testing", "ffi"]
|
83
|
+
ptrary = MemoryPointer.new(:pointer, 5)
|
84
|
+
ary = strings.inject([]) do |a, str|
|
85
|
+
f = MemoryPointer.new(1024)
|
86
|
+
f.put_string(0, str)
|
87
|
+
a << f
|
88
|
+
end
|
89
|
+
ptrary.write_array_of_pointer(ary)
|
90
|
+
lambda { ptrary.get_array_of_string(0, 6) }.should raise_error
|
91
|
+
end
|
92
|
+
it "raises an IndexError when trying to read an array of strings using a negative offset" do
|
93
|
+
strings = ["foo", "bar", "baz", "testing", "ffi"]
|
94
|
+
ptrary = MemoryPointer.new(:pointer, 5)
|
95
|
+
ary = strings.inject([]) do |a, str|
|
96
|
+
f = MemoryPointer.new(1024)
|
97
|
+
f.put_string(0, str)
|
98
|
+
a << f
|
99
|
+
end
|
100
|
+
ptrary.write_array_of_pointer(ary)
|
101
|
+
lambda { ptrary.get_array_of_string(-1) }.should raise_error
|
102
|
+
end
|
103
|
+
end
|