ffi 1.9.3-x64-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/COPYING +49 -0
- data/LICENSE +24 -0
- data/README.md +109 -0
- data/Rakefile +220 -0
- data/ext/ffi_c/AbstractMemory.c +1032 -0
- data/ext/ffi_c/AbstractMemory.h +175 -0
- data/ext/ffi_c/ArrayType.c +162 -0
- data/ext/ffi_c/ArrayType.h +59 -0
- data/ext/ffi_c/Buffer.c +365 -0
- data/ext/ffi_c/Call.c +465 -0
- data/ext/ffi_c/Call.h +93 -0
- data/ext/ffi_c/ClosurePool.c +283 -0
- data/ext/ffi_c/ClosurePool.h +57 -0
- data/ext/ffi_c/DataConverter.c +91 -0
- data/ext/ffi_c/DynamicLibrary.c +333 -0
- data/ext/ffi_c/DynamicLibrary.h +49 -0
- data/ext/ffi_c/Function.c +999 -0
- data/ext/ffi_c/Function.h +87 -0
- data/ext/ffi_c/FunctionInfo.c +271 -0
- data/ext/ffi_c/LastError.c +184 -0
- data/ext/ffi_c/LastError.h +47 -0
- data/ext/ffi_c/LongDouble.c +63 -0
- data/ext/ffi_c/LongDouble.h +51 -0
- data/ext/ffi_c/MappedType.c +168 -0
- data/ext/ffi_c/MappedType.h +59 -0
- data/ext/ffi_c/MemoryPointer.c +197 -0
- data/ext/ffi_c/MemoryPointer.h +53 -0
- data/ext/ffi_c/MethodHandle.c +360 -0
- data/ext/ffi_c/MethodHandle.h +55 -0
- data/ext/ffi_c/Platform.c +121 -0
- data/ext/ffi_c/Platform.h +45 -0
- data/ext/ffi_c/Pointer.c +508 -0
- data/ext/ffi_c/Pointer.h +63 -0
- data/ext/ffi_c/Struct.c +828 -0
- data/ext/ffi_c/Struct.h +106 -0
- data/ext/ffi_c/StructByReference.c +190 -0
- data/ext/ffi_c/StructByReference.h +50 -0
- data/ext/ffi_c/StructByValue.c +150 -0
- data/ext/ffi_c/StructByValue.h +55 -0
- data/ext/ffi_c/StructLayout.c +698 -0
- data/ext/ffi_c/Thread.c +352 -0
- data/ext/ffi_c/Thread.h +95 -0
- data/ext/ffi_c/Type.c +397 -0
- data/ext/ffi_c/Type.h +62 -0
- data/ext/ffi_c/Types.c +139 -0
- data/ext/ffi_c/Types.h +89 -0
- data/ext/ffi_c/Variadic.c +276 -0
- data/ext/ffi_c/compat.h +83 -0
- data/ext/ffi_c/extconf.rb +64 -0
- data/ext/ffi_c/ffi.c +98 -0
- data/ext/ffi_c/libffi.bsd.mk +34 -0
- data/ext/ffi_c/libffi.darwin.mk +95 -0
- data/ext/ffi_c/libffi.gnu.mk +31 -0
- data/ext/ffi_c/libffi.mk +13 -0
- data/ext/ffi_c/libffi.vc.mk +26 -0
- data/ext/ffi_c/libffi.vc64.mk +26 -0
- data/ext/ffi_c/libffi/ChangeLog +4600 -0
- data/ext/ffi_c/libffi/ChangeLog.libffi +584 -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 +196 -0
- data/ext/ffi_c/libffi/Makefile.in +1820 -0
- data/ext/ffi_c/libffi/Makefile.vc +141 -0
- data/ext/ffi_c/libffi/Makefile.vc64 +141 -0
- data/ext/ffi_c/libffi/README +342 -0
- data/ext/ffi_c/libffi/acinclude.m4 +92 -0
- data/ext/ffi_c/libffi/aclocal.m4 +1873 -0
- data/ext/ffi_c/libffi/build-ios.sh +67 -0
- data/ext/ffi_c/libffi/compile +143 -0
- data/ext/ffi_c/libffi/config.guess +1501 -0
- data/ext/ffi_c/libffi/config.sub +1705 -0
- data/ext/ffi_c/libffi/configure +17191 -0
- data/ext/ffi_c/libffi/configure.ac +496 -0
- data/ext/ffi_c/libffi/configure.host +11 -0
- data/ext/ffi_c/libffi/depcomp +630 -0
- data/ext/ffi_c/libffi/doc/libffi.info +593 -0
- data/ext/ffi_c/libffi/doc/libffi.texi +600 -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 +199 -0
- data/ext/ffi_c/libffi/fficonfig.hw +57 -0
- data/ext/ffi_c/libffi/include/Makefile.am +9 -0
- data/ext/ffi_c/libffi/include/Makefile.in +487 -0
- data/ext/ffi_c/libffi/include/ffi.h.in +427 -0
- data/ext/ffi_c/libffi/include/ffi.h.vc +427 -0
- data/ext/ffi_c/libffi/include/ffi.h.vc64 +427 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +126 -0
- data/ext/ffi_c/libffi/install-sh +520 -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/ltmain.sh +9636 -0
- data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +176 -0
- data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +195 -0
- data/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 +76 -0
- data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +63 -0
- data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +70 -0
- data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +300 -0
- data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +215 -0
- data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +79 -0
- data/ext/ffi_c/libffi/m4/libtool.m4 +7831 -0
- data/ext/ffi_c/libffi/m4/ltoptions.m4 +369 -0
- data/ext/ffi_c/libffi/m4/ltsugar.m4 +123 -0
- data/ext/ffi_c/libffi/m4/ltversion.m4 +23 -0
- data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +98 -0
- data/ext/ffi_c/libffi/man/Makefile.am +8 -0
- data/ext/ffi_c/libffi/man/Makefile.in +466 -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 +376 -0
- data/ext/ffi_c/libffi/msvcc.sh +197 -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 +387 -0
- data/ext/ffi_c/libffi/src/arm/ffi.c +728 -0
- data/ext/ffi_c/libffi/src/arm/ffitarget.h +65 -0
- data/ext/ffi_c/libffi/src/arm/gentramp.sh +118 -0
- data/ext/ffi_c/libffi/src/arm/sysv.S +497 -0
- data/ext/ffi_c/libffi/src/arm/trampoline.S +4450 -0
- data/ext/ffi_c/libffi/src/avr32/ffi.c +423 -0
- data/ext/ffi_c/libffi/src/avr32/ffitarget.h +50 -0
- data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
- data/ext/ffi_c/libffi/src/closures.c +615 -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 +5161 -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 +57 -0
- data/ext/ffi_c/libffi/src/ia64/ffi.c +582 -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 +356 -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 +288 -0
- data/ext/ffi_c/libffi/src/m68k/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/m68k/sysv.S +270 -0
- data/ext/ffi_c/libffi/src/mips/ffi.c +1036 -0
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +242 -0
- data/ext/ffi_c/libffi/src/mips/n32.S +591 -0
- data/ext/ffi_c/libffi/src/mips/o32.S +381 -0
- data/ext/ffi_c/libffi/src/moxie/eabi.S +128 -0
- data/ext/ffi_c/libffi/src/moxie/ffi.c +276 -0
- data/ext/ffi_c/libffi/src/pa/ffi.c +719 -0
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +78 -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 +328 -0
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +445 -0
- data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
- data/ext/ffi_c/libffi/src/powerpc/darwin.S +383 -0
- data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +575 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +1448 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +1359 -0
- data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +139 -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 +219 -0
- data/ext/ffi_c/libffi/src/prep_cif.c +177 -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 +62 -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 +468 -0
- data/ext/ffi_c/libffi/src/sh64/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/sh64/sysv.S +539 -0
- data/ext/ffi_c/libffi/src/sparc/ffi.c +669 -0
- data/ext/ffi_c/libffi/src/sparc/ffitarget.h +68 -0
- data/ext/ffi_c/libffi/src/sparc/v8.S +313 -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 +444 -0
- data/ext/ffi_c/libffi/src/x86/darwin64.S +416 -0
- data/ext/ffi_c/libffi/src/x86/ffi.c +644 -0
- data/ext/ffi_c/libffi/src/x86/ffi64.c +635 -0
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +121 -0
- data/ext/ffi_c/libffi/src/x86/freebsd.S +458 -0
- data/ext/ffi_c/libffi/src/x86/sysv.S +468 -0
- data/ext/ffi_c/libffi/src/x86/unix64.S +426 -0
- data/ext/ffi_c/libffi/src/x86/win32.S +1065 -0
- data/ext/ffi_c/libffi/src/x86/win64.S +468 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.am +80 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.in +500 -0
- data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
- data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +300 -0
- data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +350 -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 +32 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +89 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +81 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +81 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +82 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +89 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +92 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +90 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +64 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +94 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +95 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +96 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +102 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +89 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +91 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +93 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +113 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +90 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +95 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +90 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +90 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +90 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +109 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +124 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +113 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +117 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +97 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +88 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +90 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +91 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +93 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +91 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +92 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +134 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +117 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +95 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +91 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +91 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +92 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +91 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +91 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +93 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +43 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +60 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +60 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +74 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +74 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +91 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +74 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +140 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +43 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +47 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +43 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +36 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +26 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +153 -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 +58 -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/huge_struct.c +342 -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 +152 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +161 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +133 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +110 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +111 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +111 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +112 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +131 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +111 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +131 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +131 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +90 -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 +43 -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/stret_large.c +145 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +125 -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.call/testclosure.c +70 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +96 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +35 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +124 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
- data/ext/ffi_c/libffi/texinfo.tex +7210 -0
- data/ext/ffi_c/rbffi.h +57 -0
- data/ext/ffi_c/rbffi_endian.h +59 -0
- data/ext/ffi_c/win32/stdbool.h +8 -0
- data/ext/ffi_c/win32/stdint.h +201 -0
- data/ffi.gemspec +22 -0
- data/gen/Rakefile +30 -0
- data/lib/ffi.rb +28 -0
- data/lib/ffi/autopointer.rb +194 -0
- data/lib/ffi/buffer.rb +4 -0
- data/lib/ffi/callback.rb +4 -0
- data/lib/ffi/enum.rb +173 -0
- data/lib/ffi/errno.rb +43 -0
- data/lib/ffi/ffi.rb +44 -0
- data/lib/ffi/io.rb +62 -0
- data/lib/ffi/library.rb +499 -0
- data/lib/ffi/managedstruct.rb +84 -0
- data/lib/ffi/memorypointer.rb +1 -0
- data/lib/ffi/platform.rb +148 -0
- data/lib/ffi/platform/arm-linux/types.conf +104 -0
- data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
- data/lib/ffi/platform/i386-darwin/types.conf +100 -0
- data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
- data/lib/ffi/platform/i386-gnu/types.conf +107 -0
- data/lib/ffi/platform/i386-linux/types.conf +103 -0
- data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
- data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
- data/lib/ffi/platform/i386-solaris/types.conf +122 -0
- data/lib/ffi/platform/i386-windows/types.conf +105 -0
- data/lib/ffi/platform/ia64-linux/types.conf +104 -0
- data/lib/ffi/platform/mips-linux/types.conf +102 -0
- data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
- data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
- data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
- data/lib/ffi/platform/powerpc-linux/types.conf +100 -0
- data/lib/ffi/platform/s390-linux/types.conf +102 -0
- data/lib/ffi/platform/s390x-linux/types.conf +102 -0
- data/lib/ffi/platform/sparc-linux/types.conf +102 -0
- data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
- data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
- data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
- data/lib/ffi/platform/x86_64-darwin/types.conf +100 -0
- data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
- data/lib/ffi/platform/x86_64-linux/types.conf +102 -0
- data/lib/ffi/platform/x86_64-netbsd/types.conf +126 -0
- data/lib/ffi/platform/x86_64-openbsd/types.conf +128 -0
- data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
- data/lib/ffi/platform/x86_64-windows/types.conf +27 -0
- data/lib/ffi/pointer.rb +134 -0
- data/lib/ffi/struct.rb +367 -0
- data/lib/ffi/struct_layout_builder.rb +222 -0
- data/lib/ffi/tools/const_generator.rb +229 -0
- data/lib/ffi/tools/generator.rb +60 -0
- data/lib/ffi/tools/generator_task.rb +36 -0
- data/lib/ffi/tools/struct_generator.rb +194 -0
- data/lib/ffi/tools/types_generator.rb +135 -0
- data/lib/ffi/types.rb +190 -0
- data/lib/ffi/union.rb +43 -0
- data/lib/ffi/variadic.rb +78 -0
- data/lib/ffi/version.rb +4 -0
- data/lib/ffi_c.so +0 -0
- data/libtest/Benchmark.c +52 -0
- data/libtest/BoolTest.c +34 -0
- data/libtest/BufferTest.c +31 -0
- data/libtest/ClosureTest.c +190 -0
- data/libtest/EnumTest.c +34 -0
- data/libtest/FunctionTest.c +58 -0
- data/libtest/GNUmakefile +149 -0
- data/libtest/GlobalVariable.c +62 -0
- data/libtest/LastErrorTest.c +21 -0
- data/libtest/NumberTest.c +132 -0
- data/libtest/PointerTest.c +63 -0
- data/libtest/ReferenceTest.c +23 -0
- data/libtest/StringTest.c +34 -0
- data/libtest/StructTest.c +243 -0
- data/libtest/UnionTest.c +43 -0
- data/libtest/VariadicTest.c +62 -0
- data/spec/ffi/async_callback_spec.rb +35 -0
- data/spec/ffi/bool_spec.rb +29 -0
- data/spec/ffi/buffer_spec.rb +251 -0
- data/spec/ffi/callback_spec.rb +667 -0
- data/spec/ffi/custom_param_type.rb +36 -0
- data/spec/ffi/custom_type_spec.rb +74 -0
- data/spec/ffi/dup_spec.rb +54 -0
- data/spec/ffi/enum_spec.rb +220 -0
- data/spec/ffi/errno_spec.rb +18 -0
- data/spec/ffi/ffi_spec.rb +29 -0
- data/spec/ffi/function_spec.rb +76 -0
- data/spec/ffi/library_spec.rb +216 -0
- data/spec/ffi/long_double.rb +30 -0
- data/spec/ffi/managed_struct_spec.rb +57 -0
- data/spec/ffi/number_spec.rb +236 -0
- data/spec/ffi/pointer_spec.rb +265 -0
- data/spec/ffi/rbx/attach_function_spec.rb +28 -0
- data/spec/ffi/rbx/memory_pointer_spec.rb +123 -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 +33 -0
- data/spec/ffi/string_spec.rb +108 -0
- data/spec/ffi/strptr_spec.rb +50 -0
- data/spec/ffi/struct_by_ref_spec.rb +43 -0
- data/spec/ffi/struct_callback_spec.rb +69 -0
- data/spec/ffi/struct_initialize_spec.rb +35 -0
- data/spec/ffi/struct_packed_spec.rb +51 -0
- data/spec/ffi/struct_spec.rb +748 -0
- data/spec/ffi/typedef_spec.rb +78 -0
- data/spec/ffi/union_spec.rb +65 -0
- data/spec/ffi/variadic_spec.rb +92 -0
- data/spec/spec.opts +4 -0
- metadata +562 -0
data/ext/ffi_c/Type.h
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2009, Wayne Meissner
|
3
|
+
* Copyright (C) 2009 Luc Heinrich <luc@honk-honk.com>
|
4
|
+
*
|
5
|
+
* This file is part of ruby-ffi.
|
6
|
+
*
|
7
|
+
* All rights reserved.
|
8
|
+
*
|
9
|
+
* Redistribution and use in source and binary forms, with or without
|
10
|
+
* modification, are permitted provided that the following conditions are met:
|
11
|
+
*
|
12
|
+
* * Redistributions of source code must retain the above copyright notice, this
|
13
|
+
* list of conditions and the following disclaimer.
|
14
|
+
* * Redistributions in binary form must reproduce the above copyright notice
|
15
|
+
* this list of conditions and the following disclaimer in the documentation
|
16
|
+
* and/or other materials provided with the distribution.
|
17
|
+
* * Neither the name of the Evan Phoenix nor the names of its contributors
|
18
|
+
* may be used to endorse or promote products derived from this software
|
19
|
+
* without specific prior written permission.
|
20
|
+
*
|
21
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
22
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
23
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
24
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
25
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
26
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
27
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
28
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
29
|
+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
*
|
32
|
+
*/
|
33
|
+
|
34
|
+
#ifndef RBFFI_TYPE_H
|
35
|
+
#define RBFFI_TYPE_H
|
36
|
+
|
37
|
+
#include <ruby.h>
|
38
|
+
#include <ffi.h>
|
39
|
+
|
40
|
+
#ifdef __cplusplus
|
41
|
+
extern "C" {
|
42
|
+
#endif
|
43
|
+
|
44
|
+
typedef struct Type_ Type;
|
45
|
+
|
46
|
+
#include "Types.h"
|
47
|
+
|
48
|
+
struct Type_ {
|
49
|
+
NativeType nativeType;
|
50
|
+
ffi_type* ffiType;
|
51
|
+
};
|
52
|
+
|
53
|
+
extern VALUE rbffi_TypeClass;
|
54
|
+
extern VALUE rbffi_Type_Lookup(VALUE type);
|
55
|
+
extern VALUE rbffi_Type_Find(VALUE type);
|
56
|
+
|
57
|
+
#ifdef __cplusplus
|
58
|
+
}
|
59
|
+
#endif
|
60
|
+
|
61
|
+
#endif /* RBFFI_TYPE_H */
|
62
|
+
|
data/ext/ffi_c/Types.c
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2009, Wayne Meissner
|
3
|
+
* Copyright (c) 2009, Luc Heinrich
|
4
|
+
* Copyright (c) 2009, Aman Gupta.
|
5
|
+
*
|
6
|
+
* Copyright (c) 2008-2013, Ruby FFI project contributors
|
7
|
+
* All rights reserved.
|
8
|
+
*
|
9
|
+
* Redistribution and use in source and binary forms, with or without
|
10
|
+
* modification, are permitted provided that the following conditions are met:
|
11
|
+
* * Redistributions of source code must retain the above copyright
|
12
|
+
* notice, this list of conditions and the following disclaimer.
|
13
|
+
* * Redistributions in binary form must reproduce the above copyright
|
14
|
+
* notice, this list of conditions and the following disclaimer in the
|
15
|
+
* documentation and/or other materials provided with the distribution.
|
16
|
+
* * Neither the name of the Ruby FFI project nor the
|
17
|
+
* names of its contributors may be used to endorse or promote products
|
18
|
+
* derived from this software without specific prior written permission.
|
19
|
+
*
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
21
|
+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
22
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
23
|
+
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
24
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
25
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
26
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
27
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
28
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
29
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
30
|
+
*/
|
31
|
+
|
32
|
+
#include <ruby.h>
|
33
|
+
#include "Pointer.h"
|
34
|
+
#include "rbffi.h"
|
35
|
+
#include "Function.h"
|
36
|
+
#include "StructByValue.h"
|
37
|
+
#include "Types.h"
|
38
|
+
#include "Struct.h"
|
39
|
+
#include "MappedType.h"
|
40
|
+
#include "MemoryPointer.h"
|
41
|
+
#include "LongDouble.h"
|
42
|
+
|
43
|
+
static ID id_from_native = 0;
|
44
|
+
|
45
|
+
|
46
|
+
VALUE
|
47
|
+
rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr)
|
48
|
+
{
|
49
|
+
switch (type->nativeType) {
|
50
|
+
case NATIVE_VOID:
|
51
|
+
return Qnil;
|
52
|
+
case NATIVE_INT8:
|
53
|
+
return INT2NUM((signed char) *(ffi_sarg *) ptr);
|
54
|
+
case NATIVE_INT16:
|
55
|
+
return INT2NUM((signed short) *(ffi_sarg *) ptr);
|
56
|
+
case NATIVE_INT32:
|
57
|
+
return INT2NUM((signed int) *(ffi_sarg *) ptr);
|
58
|
+
case NATIVE_LONG:
|
59
|
+
return LONG2NUM((signed long) *(ffi_sarg *) ptr);
|
60
|
+
case NATIVE_INT64:
|
61
|
+
return LL2NUM(*(signed long long *) ptr);
|
62
|
+
|
63
|
+
case NATIVE_UINT8:
|
64
|
+
return UINT2NUM((unsigned char) *(ffi_arg *) ptr);
|
65
|
+
case NATIVE_UINT16:
|
66
|
+
return UINT2NUM((unsigned short) *(ffi_arg *) ptr);
|
67
|
+
case NATIVE_UINT32:
|
68
|
+
return UINT2NUM((unsigned int) *(ffi_arg *) ptr);
|
69
|
+
case NATIVE_ULONG:
|
70
|
+
return ULONG2NUM((unsigned long) *(ffi_arg *) ptr);
|
71
|
+
case NATIVE_UINT64:
|
72
|
+
return ULL2NUM(*(unsigned long long *) ptr);
|
73
|
+
|
74
|
+
case NATIVE_FLOAT32:
|
75
|
+
return rb_float_new(*(float *) ptr);
|
76
|
+
case NATIVE_FLOAT64:
|
77
|
+
return rb_float_new(*(double *) ptr);
|
78
|
+
|
79
|
+
case NATIVE_LONGDOUBLE:
|
80
|
+
return rbffi_longdouble_new(*(long double *) ptr);
|
81
|
+
|
82
|
+
case NATIVE_STRING:
|
83
|
+
return (*(void **) ptr != NULL) ? rb_tainted_str_new2(*(char **) ptr) : Qnil;
|
84
|
+
case NATIVE_POINTER:
|
85
|
+
return rbffi_Pointer_NewInstance(*(void **) ptr);
|
86
|
+
case NATIVE_BOOL:
|
87
|
+
return ((unsigned char) *(ffi_arg *) ptr) ? Qtrue : Qfalse;
|
88
|
+
|
89
|
+
case NATIVE_FUNCTION:
|
90
|
+
case NATIVE_CALLBACK: {
|
91
|
+
return *(void **) ptr != NULL
|
92
|
+
? rbffi_Function_NewInstance(rbType, rbffi_Pointer_NewInstance(*(void **) ptr))
|
93
|
+
: Qnil;
|
94
|
+
}
|
95
|
+
|
96
|
+
case NATIVE_STRUCT: {
|
97
|
+
StructByValue* sbv = (StructByValue *)type;
|
98
|
+
AbstractMemory* mem;
|
99
|
+
VALUE rbMemory = rbffi_MemoryPointer_NewInstance(1, sbv->base.ffiType->size, false);
|
100
|
+
|
101
|
+
Data_Get_Struct(rbMemory, AbstractMemory, mem);
|
102
|
+
memcpy(mem->address, ptr, sbv->base.ffiType->size);
|
103
|
+
RB_GC_GUARD(rbMemory);
|
104
|
+
RB_GC_GUARD(rbType);
|
105
|
+
|
106
|
+
return rb_class_new_instance(1, &rbMemory, sbv->rbStructClass);
|
107
|
+
}
|
108
|
+
|
109
|
+
case NATIVE_MAPPED: {
|
110
|
+
/*
|
111
|
+
* For mapped types, first convert to the real native type, then upcall to
|
112
|
+
* ruby to convert to the expected return type
|
113
|
+
*/
|
114
|
+
MappedType* m = (MappedType *) type;
|
115
|
+
VALUE values[2], rbReturnValue;
|
116
|
+
|
117
|
+
values[0] = rbffi_NativeValue_ToRuby(m->type, m->rbType, ptr);
|
118
|
+
values[1] = Qnil;
|
119
|
+
|
120
|
+
|
121
|
+
rbReturnValue = rb_funcall2(m->rbConverter, id_from_native, 2, values);
|
122
|
+
RB_GC_GUARD(values[0]);
|
123
|
+
RB_GC_GUARD(rbType);
|
124
|
+
|
125
|
+
return rbReturnValue;
|
126
|
+
}
|
127
|
+
|
128
|
+
default:
|
129
|
+
rb_raise(rb_eRuntimeError, "Unknown type: %d", type->nativeType);
|
130
|
+
return Qnil;
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
void
|
135
|
+
rbffi_Types_Init(VALUE moduleFFI)
|
136
|
+
{
|
137
|
+
id_from_native = rb_intern("from_native");
|
138
|
+
}
|
139
|
+
|
data/ext/ffi_c/Types.h
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2008, 2009, Wayne Meissner
|
3
|
+
* Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com>
|
4
|
+
*
|
5
|
+
* Copyright (c) 2008-2013, Ruby FFI project contributors
|
6
|
+
* All rights reserved.
|
7
|
+
*
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
9
|
+
* modification, are permitted provided that the following conditions are met:
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
12
|
+
* * Redistributions in binary form must reproduce the above copyright
|
13
|
+
* notice, this list of conditions and the following disclaimer in the
|
14
|
+
* documentation and/or other materials provided with the distribution.
|
15
|
+
* * Neither the name of the Ruby FFI project nor the
|
16
|
+
* names of its contributors may be used to endorse or promote products
|
17
|
+
* derived from this software without specific prior written permission.
|
18
|
+
*
|
19
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
22
|
+
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
23
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
24
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
25
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
26
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
28
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
*/
|
30
|
+
|
31
|
+
#ifndef RBFFI_TYPES_H
|
32
|
+
#define RBFFI_TYPES_H
|
33
|
+
|
34
|
+
#ifdef __cplusplus
|
35
|
+
extern "C" {
|
36
|
+
#endif
|
37
|
+
|
38
|
+
typedef enum {
|
39
|
+
NATIVE_VOID,
|
40
|
+
NATIVE_INT8,
|
41
|
+
NATIVE_UINT8,
|
42
|
+
NATIVE_INT16,
|
43
|
+
NATIVE_UINT16,
|
44
|
+
NATIVE_INT32,
|
45
|
+
NATIVE_UINT32,
|
46
|
+
NATIVE_INT64,
|
47
|
+
NATIVE_UINT64,
|
48
|
+
NATIVE_LONG,
|
49
|
+
NATIVE_ULONG,
|
50
|
+
NATIVE_FLOAT32,
|
51
|
+
NATIVE_FLOAT64,
|
52
|
+
NATIVE_LONGDOUBLE,
|
53
|
+
NATIVE_POINTER,
|
54
|
+
NATIVE_CALLBACK,
|
55
|
+
NATIVE_FUNCTION,
|
56
|
+
NATIVE_BUFFER_IN,
|
57
|
+
NATIVE_BUFFER_OUT,
|
58
|
+
NATIVE_BUFFER_INOUT,
|
59
|
+
NATIVE_CHAR_ARRAY,
|
60
|
+
NATIVE_BOOL,
|
61
|
+
|
62
|
+
/** An immutable string. Nul terminated, but only copies in to the native function */
|
63
|
+
NATIVE_STRING,
|
64
|
+
|
65
|
+
/** The function takes a variable number of arguments */
|
66
|
+
NATIVE_VARARGS,
|
67
|
+
|
68
|
+
/** Struct-by-value param or result */
|
69
|
+
NATIVE_STRUCT,
|
70
|
+
|
71
|
+
/** An array type definition */
|
72
|
+
NATIVE_ARRAY,
|
73
|
+
|
74
|
+
/** Custom native type */
|
75
|
+
NATIVE_MAPPED,
|
76
|
+
} NativeType;
|
77
|
+
|
78
|
+
#include <ffi.h>
|
79
|
+
#include "Type.h"
|
80
|
+
|
81
|
+
VALUE rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr);
|
82
|
+
void rbffi_Types_Init(VALUE moduleFFI);
|
83
|
+
|
84
|
+
#ifdef __cplusplus
|
85
|
+
}
|
86
|
+
#endif
|
87
|
+
|
88
|
+
#endif /* RBFFI_TYPES_H */
|
89
|
+
|
@@ -0,0 +1,276 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2008-2010 Wayne Meissner
|
3
|
+
* Copyright (C) 2009 Andrea Fazzi <andrea.fazzi@alcacoop.it>
|
4
|
+
* Copyright (c) 2008-2013, Ruby FFI project contributors
|
5
|
+
* All rights reserved.
|
6
|
+
*
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
8
|
+
* modification, are permitted provided that the following conditions are met:
|
9
|
+
* * Redistributions of source code must retain the above copyright
|
10
|
+
* notice, this list of conditions and the following disclaimer.
|
11
|
+
* * Redistributions in binary form must reproduce the above copyright
|
12
|
+
* notice, this list of conditions and the following disclaimer in the
|
13
|
+
* documentation and/or other materials provided with the distribution.
|
14
|
+
* * Neither the name of the Ruby FFI project nor the
|
15
|
+
* names of its contributors may be used to endorse or promote products
|
16
|
+
* derived from this software without specific prior written permission.
|
17
|
+
*
|
18
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
19
|
+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
20
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
22
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
23
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
24
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
25
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
27
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
*/
|
29
|
+
|
30
|
+
#ifndef _MSC_VER
|
31
|
+
#include <sys/param.h>
|
32
|
+
#endif
|
33
|
+
#include <sys/types.h>
|
34
|
+
|
35
|
+
#include <stdio.h>
|
36
|
+
#ifndef _MSC_VER
|
37
|
+
# include <stdint.h>
|
38
|
+
# include <stdbool.h>
|
39
|
+
#else
|
40
|
+
# include "win32/stdbool.h"
|
41
|
+
# include "win32/stdint.h"
|
42
|
+
#endif
|
43
|
+
#include <ruby.h>
|
44
|
+
|
45
|
+
#include <ffi.h>
|
46
|
+
#include "rbffi.h"
|
47
|
+
#include "compat.h"
|
48
|
+
|
49
|
+
#include "AbstractMemory.h"
|
50
|
+
#include "Pointer.h"
|
51
|
+
#include "Types.h"
|
52
|
+
#include "Type.h"
|
53
|
+
#include "LastError.h"
|
54
|
+
#include "MethodHandle.h"
|
55
|
+
#include "Call.h"
|
56
|
+
#include "Thread.h"
|
57
|
+
|
58
|
+
typedef struct VariadicInvoker_ {
|
59
|
+
VALUE rbAddress;
|
60
|
+
VALUE rbReturnType;
|
61
|
+
VALUE rbEnums;
|
62
|
+
|
63
|
+
Type* returnType;
|
64
|
+
ffi_abi abi;
|
65
|
+
void* function;
|
66
|
+
int paramCount;
|
67
|
+
} VariadicInvoker;
|
68
|
+
|
69
|
+
|
70
|
+
static VALUE variadic_allocate(VALUE klass);
|
71
|
+
static VALUE variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes,
|
72
|
+
VALUE rbReturnType, VALUE options);
|
73
|
+
static void variadic_mark(VariadicInvoker *);
|
74
|
+
|
75
|
+
static VALUE classVariadicInvoker = Qnil;
|
76
|
+
|
77
|
+
|
78
|
+
static VALUE
|
79
|
+
variadic_allocate(VALUE klass)
|
80
|
+
{
|
81
|
+
VariadicInvoker *invoker;
|
82
|
+
VALUE obj = Data_Make_Struct(klass, VariadicInvoker, variadic_mark, -1, invoker);
|
83
|
+
|
84
|
+
invoker->rbAddress = Qnil;
|
85
|
+
invoker->rbEnums = Qnil;
|
86
|
+
invoker->rbReturnType = Qnil;
|
87
|
+
|
88
|
+
return obj;
|
89
|
+
}
|
90
|
+
|
91
|
+
static void
|
92
|
+
variadic_mark(VariadicInvoker *invoker)
|
93
|
+
{
|
94
|
+
rb_gc_mark(invoker->rbEnums);
|
95
|
+
rb_gc_mark(invoker->rbAddress);
|
96
|
+
rb_gc_mark(invoker->rbReturnType);
|
97
|
+
}
|
98
|
+
|
99
|
+
static VALUE
|
100
|
+
variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes, VALUE rbReturnType, VALUE options)
|
101
|
+
{
|
102
|
+
VariadicInvoker* invoker = NULL;
|
103
|
+
VALUE retval = Qnil;
|
104
|
+
VALUE convention = Qnil;
|
105
|
+
VALUE fixed = Qnil;
|
106
|
+
#if defined(_WIN32) || defined(__WIN32__)
|
107
|
+
VALUE rbConventionStr;
|
108
|
+
#endif
|
109
|
+
int i;
|
110
|
+
|
111
|
+
Check_Type(options, T_HASH);
|
112
|
+
convention = rb_hash_aref(options, ID2SYM(rb_intern("convention")));
|
113
|
+
|
114
|
+
Data_Get_Struct(self, VariadicInvoker, invoker);
|
115
|
+
invoker->rbEnums = rb_hash_aref(options, ID2SYM(rb_intern("enums")));
|
116
|
+
invoker->rbAddress = rbFunction;
|
117
|
+
invoker->function = rbffi_AbstractMemory_Cast(rbFunction, rbffi_PointerClass)->address;
|
118
|
+
|
119
|
+
#if (defined(_WIN32) || defined(__WIN32__)) && defined(FFI_STDCALL)
|
120
|
+
rbConventionStr = rb_funcall2(convention, rb_intern("to_s"), 0, NULL);
|
121
|
+
invoker->abi = (RTEST(convention) && strcmp(StringValueCStr(rbConventionStr), "stdcall") == 0)
|
122
|
+
? FFI_STDCALL : FFI_DEFAULT_ABI;
|
123
|
+
#else
|
124
|
+
invoker->abi = FFI_DEFAULT_ABI;
|
125
|
+
#endif
|
126
|
+
|
127
|
+
invoker->rbReturnType = rbffi_Type_Lookup(rbReturnType);
|
128
|
+
if (!RTEST(invoker->rbReturnType)) {
|
129
|
+
VALUE typeName = rb_funcall2(rbReturnType, rb_intern("inspect"), 0, NULL);
|
130
|
+
rb_raise(rb_eTypeError, "Invalid return type (%s)", RSTRING_PTR(typeName));
|
131
|
+
}
|
132
|
+
|
133
|
+
Data_Get_Struct(rbReturnType, Type, invoker->returnType);
|
134
|
+
|
135
|
+
invoker->paramCount = -1;
|
136
|
+
|
137
|
+
fixed = rb_ary_new2(RARRAY_LEN(rbParameterTypes) - 1);
|
138
|
+
for (i = 0; i < RARRAY_LEN(rbParameterTypes); ++i) {
|
139
|
+
VALUE entry = rb_ary_entry(rbParameterTypes, i);
|
140
|
+
VALUE rbType = rbffi_Type_Lookup(entry);
|
141
|
+
Type* type;
|
142
|
+
|
143
|
+
if (!RTEST(rbType)) {
|
144
|
+
VALUE typeName = rb_funcall2(entry, rb_intern("inspect"), 0, NULL);
|
145
|
+
rb_raise(rb_eTypeError, "Invalid parameter type (%s)", RSTRING_PTR(typeName));
|
146
|
+
}
|
147
|
+
Data_Get_Struct(rbType, Type, type);
|
148
|
+
if (type->nativeType != NATIVE_VARARGS) {
|
149
|
+
rb_ary_push(fixed, entry);
|
150
|
+
}
|
151
|
+
}
|
152
|
+
/*
|
153
|
+
* @fixed and @type_map are used by the parameter mangling ruby code
|
154
|
+
*/
|
155
|
+
rb_iv_set(self, "@fixed", fixed);
|
156
|
+
rb_iv_set(self, "@type_map", rb_hash_aref(options, ID2SYM(rb_intern("type_map"))));
|
157
|
+
|
158
|
+
return retval;
|
159
|
+
}
|
160
|
+
|
161
|
+
static VALUE
|
162
|
+
variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
|
163
|
+
{
|
164
|
+
VariadicInvoker* invoker;
|
165
|
+
FFIStorage* params;
|
166
|
+
void* retval;
|
167
|
+
ffi_cif cif;
|
168
|
+
void** ffiValues;
|
169
|
+
ffi_type** ffiParamTypes;
|
170
|
+
ffi_type* ffiReturnType;
|
171
|
+
Type** paramTypes;
|
172
|
+
VALUE* argv;
|
173
|
+
int paramCount = 0, i;
|
174
|
+
ffi_status ffiStatus;
|
175
|
+
rbffi_frame_t frame = { 0 };
|
176
|
+
|
177
|
+
Check_Type(parameterTypes, T_ARRAY);
|
178
|
+
Check_Type(parameterValues, T_ARRAY);
|
179
|
+
|
180
|
+
Data_Get_Struct(self, VariadicInvoker, invoker);
|
181
|
+
paramCount = (int) RARRAY_LEN(parameterTypes);
|
182
|
+
paramTypes = ALLOCA_N(Type *, paramCount);
|
183
|
+
ffiParamTypes = ALLOCA_N(ffi_type *, paramCount);
|
184
|
+
params = ALLOCA_N(FFIStorage, paramCount);
|
185
|
+
ffiValues = ALLOCA_N(void*, paramCount);
|
186
|
+
argv = ALLOCA_N(VALUE, paramCount);
|
187
|
+
retval = alloca(MAX(invoker->returnType->ffiType->size, FFI_SIZEOF_ARG));
|
188
|
+
|
189
|
+
for (i = 0; i < paramCount; ++i) {
|
190
|
+
VALUE rbType = rb_ary_entry(parameterTypes, i);
|
191
|
+
|
192
|
+
if (!rb_obj_is_kind_of(rbType, rbffi_TypeClass)) {
|
193
|
+
rb_raise(rb_eTypeError, "wrong type. Expected (FFI::Type)");
|
194
|
+
}
|
195
|
+
Data_Get_Struct(rbType, Type, paramTypes[i]);
|
196
|
+
|
197
|
+
switch (paramTypes[i]->nativeType) {
|
198
|
+
case NATIVE_INT8:
|
199
|
+
case NATIVE_INT16:
|
200
|
+
case NATIVE_INT32:
|
201
|
+
rbType = rb_const_get(rbffi_TypeClass, rb_intern("INT32"));
|
202
|
+
Data_Get_Struct(rbType, Type, paramTypes[i]);
|
203
|
+
break;
|
204
|
+
case NATIVE_UINT8:
|
205
|
+
case NATIVE_UINT16:
|
206
|
+
case NATIVE_UINT32:
|
207
|
+
rbType = rb_const_get(rbffi_TypeClass, rb_intern("UINT32"));
|
208
|
+
Data_Get_Struct(rbType, Type, paramTypes[i]);
|
209
|
+
break;
|
210
|
+
|
211
|
+
case NATIVE_FLOAT32:
|
212
|
+
rbType = rb_const_get(rbffi_TypeClass, rb_intern("DOUBLE"));
|
213
|
+
Data_Get_Struct(rbType, Type, paramTypes[i]);
|
214
|
+
break;
|
215
|
+
|
216
|
+
default:
|
217
|
+
break;
|
218
|
+
}
|
219
|
+
|
220
|
+
|
221
|
+
ffiParamTypes[i] = paramTypes[i]->ffiType;
|
222
|
+
if (ffiParamTypes[i] == NULL) {
|
223
|
+
rb_raise(rb_eArgError, "Invalid parameter type #%x", paramTypes[i]->nativeType);
|
224
|
+
}
|
225
|
+
argv[i] = rb_ary_entry(parameterValues, i);
|
226
|
+
}
|
227
|
+
|
228
|
+
ffiReturnType = invoker->returnType->ffiType;
|
229
|
+
if (ffiReturnType == NULL) {
|
230
|
+
rb_raise(rb_eArgError, "Invalid return type");
|
231
|
+
}
|
232
|
+
#ifdef HAVE_FFI_PREP_CIF_VAR
|
233
|
+
ffiStatus = ffi_prep_cif_var(&cif, invoker->abi, paramCount, paramCount, ffiReturnType, ffiParamTypes);
|
234
|
+
#else
|
235
|
+
ffiStatus = ffi_prep_cif(&cif, invoker->abi, paramCount, ffiReturnType, ffiParamTypes);
|
236
|
+
#endif
|
237
|
+
switch (ffiStatus) {
|
238
|
+
case FFI_BAD_ABI:
|
239
|
+
rb_raise(rb_eArgError, "Invalid ABI specified");
|
240
|
+
case FFI_BAD_TYPEDEF:
|
241
|
+
rb_raise(rb_eArgError, "Invalid argument type specified");
|
242
|
+
case FFI_OK:
|
243
|
+
break;
|
244
|
+
default:
|
245
|
+
rb_raise(rb_eArgError, "Unknown FFI error");
|
246
|
+
}
|
247
|
+
|
248
|
+
rbffi_SetupCallParams(paramCount, argv, -1, paramTypes, params,
|
249
|
+
ffiValues, NULL, 0, invoker->rbEnums);
|
250
|
+
|
251
|
+
rbffi_frame_push(&frame);
|
252
|
+
ffi_call(&cif, FFI_FN(invoker->function), retval, ffiValues);
|
253
|
+
rbffi_frame_pop(&frame);
|
254
|
+
|
255
|
+
rbffi_save_errno();
|
256
|
+
|
257
|
+
if (RTEST(frame.exc) && frame.exc != Qnil) {
|
258
|
+
rb_exc_raise(frame.exc);
|
259
|
+
}
|
260
|
+
|
261
|
+
return rbffi_NativeValue_ToRuby(invoker->returnType, invoker->rbReturnType, retval);
|
262
|
+
}
|
263
|
+
|
264
|
+
|
265
|
+
void
|
266
|
+
rbffi_Variadic_Init(VALUE moduleFFI)
|
267
|
+
{
|
268
|
+
classVariadicInvoker = rb_define_class_under(moduleFFI, "VariadicInvoker", rb_cObject);
|
269
|
+
rb_global_variable(&classVariadicInvoker);
|
270
|
+
|
271
|
+
rb_define_alloc_func(classVariadicInvoker, variadic_allocate);
|
272
|
+
|
273
|
+
rb_define_method(classVariadicInvoker, "initialize", variadic_initialize, 4);
|
274
|
+
rb_define_method(classVariadicInvoker, "invoke", variadic_invoke, 2);
|
275
|
+
}
|
276
|
+
|