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/Thread.c
ADDED
@@ -0,0 +1,352 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2010 Wayne Meissner
|
3
|
+
*
|
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 <stdbool.h>
|
32
|
+
#else
|
33
|
+
# include "win32/stdbool.h"
|
34
|
+
# include "win32/stdint.h"
|
35
|
+
#endif
|
36
|
+
|
37
|
+
#if defined(__CYGWIN__) || !defined(_WIN32)
|
38
|
+
# include <pthread.h>
|
39
|
+
# include <errno.h>
|
40
|
+
# include <signal.h>
|
41
|
+
# include <unistd.h>
|
42
|
+
#else
|
43
|
+
# include <winsock2.h>
|
44
|
+
# define _WINSOCKAPI_
|
45
|
+
# include <windows.h>
|
46
|
+
#endif
|
47
|
+
#include <fcntl.h>
|
48
|
+
#include "Thread.h"
|
49
|
+
|
50
|
+
#ifdef _WIN32
|
51
|
+
static volatile DWORD frame_thread_key = TLS_OUT_OF_INDEXES;
|
52
|
+
#else
|
53
|
+
static pthread_key_t thread_data_key;
|
54
|
+
struct thread_data {
|
55
|
+
rbffi_frame_t* frame;
|
56
|
+
};
|
57
|
+
static inline struct thread_data* thread_data_get(void);
|
58
|
+
|
59
|
+
#endif
|
60
|
+
|
61
|
+
rbffi_frame_t*
|
62
|
+
rbffi_frame_current(void)
|
63
|
+
{
|
64
|
+
#ifdef _WIN32
|
65
|
+
return (rbffi_frame_t *) TlsGetValue(frame_thread_key);
|
66
|
+
#else
|
67
|
+
struct thread_data* td = (struct thread_data *) pthread_getspecific(thread_data_key);
|
68
|
+
return td != NULL ? td->frame : NULL;
|
69
|
+
#endif
|
70
|
+
}
|
71
|
+
|
72
|
+
void
|
73
|
+
rbffi_frame_push(rbffi_frame_t* frame)
|
74
|
+
{
|
75
|
+
memset(frame, 0, sizeof(*frame));
|
76
|
+
frame->has_gvl = true;
|
77
|
+
frame->exc = Qnil;
|
78
|
+
|
79
|
+
#ifdef _WIN32
|
80
|
+
frame->prev = TlsGetValue(frame_thread_key);
|
81
|
+
TlsSetValue(frame_thread_key, frame);
|
82
|
+
#else
|
83
|
+
frame->td = thread_data_get();
|
84
|
+
frame->prev = frame->td->frame;
|
85
|
+
frame->td->frame = frame;
|
86
|
+
#endif
|
87
|
+
}
|
88
|
+
|
89
|
+
void
|
90
|
+
rbffi_frame_pop(rbffi_frame_t* frame)
|
91
|
+
{
|
92
|
+
#ifdef _WIN32
|
93
|
+
TlsSetValue(frame_thread_key, frame->prev);
|
94
|
+
#else
|
95
|
+
frame->td->frame = frame->prev;
|
96
|
+
#endif
|
97
|
+
}
|
98
|
+
|
99
|
+
#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL))
|
100
|
+
|
101
|
+
#if !defined(_WIN32)
|
102
|
+
|
103
|
+
struct BlockingThread {
|
104
|
+
pthread_t tid;
|
105
|
+
VALUE (*fn)(void *);
|
106
|
+
void *data;
|
107
|
+
void (*ubf)(void *);
|
108
|
+
void *data2;
|
109
|
+
VALUE retval;
|
110
|
+
int wrfd;
|
111
|
+
int rdfd;
|
112
|
+
};
|
113
|
+
|
114
|
+
static void*
|
115
|
+
rbffi_blocking_thread(void* args)
|
116
|
+
{
|
117
|
+
struct BlockingThread* thr = (struct BlockingThread *) args;
|
118
|
+
char c = 1;
|
119
|
+
VALUE retval;
|
120
|
+
|
121
|
+
retval = (*thr->fn)(thr->data);
|
122
|
+
|
123
|
+
pthread_testcancel();
|
124
|
+
|
125
|
+
thr->retval = retval;
|
126
|
+
|
127
|
+
write(thr->wrfd, &c, sizeof(c));
|
128
|
+
|
129
|
+
return NULL;
|
130
|
+
}
|
131
|
+
|
132
|
+
static VALUE
|
133
|
+
wait_for_thread(void *data)
|
134
|
+
{
|
135
|
+
struct BlockingThread* thr = (struct BlockingThread *) data;
|
136
|
+
char c;
|
137
|
+
|
138
|
+
if (read(thr->rdfd, &c, 1) < 1) {
|
139
|
+
rb_thread_wait_fd(thr->rdfd);
|
140
|
+
while (read(thr->rdfd, &c, 1) < 1 && rb_io_wait_readable(thr->rdfd) == Qtrue) {
|
141
|
+
;
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
return Qnil;
|
146
|
+
}
|
147
|
+
|
148
|
+
static VALUE
|
149
|
+
cleanup_blocking_thread(void *data, VALUE exc)
|
150
|
+
{
|
151
|
+
struct BlockingThread* thr = (struct BlockingThread *) data;
|
152
|
+
|
153
|
+
if (thr->ubf != (void (*)(void *)) -1) {
|
154
|
+
(*thr->ubf)(thr->data2);
|
155
|
+
} else {
|
156
|
+
pthread_kill(thr->tid, SIGVTALRM);
|
157
|
+
}
|
158
|
+
|
159
|
+
return exc;
|
160
|
+
}
|
161
|
+
|
162
|
+
VALUE
|
163
|
+
rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2)
|
164
|
+
{
|
165
|
+
struct BlockingThread* thr;
|
166
|
+
int fd[2];
|
167
|
+
VALUE exc;
|
168
|
+
|
169
|
+
if (pipe(fd) < 0) {
|
170
|
+
rb_raise(rb_eSystemCallError, "pipe(2) failed");
|
171
|
+
return Qnil;
|
172
|
+
}
|
173
|
+
fcntl(fd[0], F_SETFL, fcntl(fd[0], F_GETFL) | O_NONBLOCK);
|
174
|
+
|
175
|
+
thr = ALLOC_N(struct BlockingThread, 1);
|
176
|
+
thr->rdfd = fd[0];
|
177
|
+
thr->wrfd = fd[1];
|
178
|
+
thr->fn = func;
|
179
|
+
thr->data = data1;
|
180
|
+
thr->ubf = ubf;
|
181
|
+
thr->data2 = data2;
|
182
|
+
thr->retval = Qnil;
|
183
|
+
|
184
|
+
if (pthread_create(&thr->tid, NULL, rbffi_blocking_thread, thr) != 0) {
|
185
|
+
close(fd[0]);
|
186
|
+
close(fd[1]);
|
187
|
+
xfree(thr);
|
188
|
+
rb_raise(rb_eSystemCallError, "pipe(2) failed");
|
189
|
+
return Qnil;
|
190
|
+
}
|
191
|
+
|
192
|
+
exc = rb_rescue2(wait_for_thread, (VALUE) thr, cleanup_blocking_thread, (VALUE) thr,
|
193
|
+
rb_eException);
|
194
|
+
|
195
|
+
pthread_join(thr->tid, NULL);
|
196
|
+
close(fd[1]);
|
197
|
+
close(fd[0]);
|
198
|
+
xfree(thr);
|
199
|
+
|
200
|
+
if (exc != Qnil) {
|
201
|
+
rb_exc_raise(exc);
|
202
|
+
}
|
203
|
+
|
204
|
+
return thr->retval;
|
205
|
+
}
|
206
|
+
|
207
|
+
#else
|
208
|
+
/* win32 implementation */
|
209
|
+
|
210
|
+
struct BlockingThread {
|
211
|
+
HANDLE tid;
|
212
|
+
VALUE (*fn)(void *);
|
213
|
+
void *data;
|
214
|
+
void (*ubf)(void *);
|
215
|
+
void *data2;
|
216
|
+
VALUE retval;
|
217
|
+
int wrfd;
|
218
|
+
int rdfd;
|
219
|
+
};
|
220
|
+
|
221
|
+
static DWORD __stdcall
|
222
|
+
rbffi_blocking_thread(LPVOID args)
|
223
|
+
{
|
224
|
+
struct BlockingThread* thr = (struct BlockingThread *) args;
|
225
|
+
char c = 1;
|
226
|
+
VALUE retval;
|
227
|
+
|
228
|
+
retval = (*thr->fn)(thr->data);
|
229
|
+
thr->retval = retval;
|
230
|
+
|
231
|
+
write(thr->wrfd, &c, sizeof(c));
|
232
|
+
|
233
|
+
return 0;
|
234
|
+
}
|
235
|
+
|
236
|
+
static VALUE
|
237
|
+
wait_for_thread(void *data)
|
238
|
+
{
|
239
|
+
struct BlockingThread* thr = (struct BlockingThread *) data;
|
240
|
+
char c, res;
|
241
|
+
fd_set rfds;
|
242
|
+
|
243
|
+
FD_ZERO(&rfds);
|
244
|
+
FD_SET(thr->rdfd, &rfds);
|
245
|
+
rb_thread_select(thr->rdfd + 1, &rfds, NULL, NULL, NULL);
|
246
|
+
read(thr->rdfd, &c, 1);
|
247
|
+
return Qnil;
|
248
|
+
}
|
249
|
+
|
250
|
+
static VALUE
|
251
|
+
cleanup_blocking_thread(void *data, VALUE exc)
|
252
|
+
{
|
253
|
+
struct BlockingThread* thr = (struct BlockingThread *) data;
|
254
|
+
|
255
|
+
if (thr->ubf != (void (*)(void *)) -1) {
|
256
|
+
(*thr->ubf)(thr->data2);
|
257
|
+
} else {
|
258
|
+
TerminateThread(thr->tid, 0);
|
259
|
+
}
|
260
|
+
|
261
|
+
return exc;
|
262
|
+
}
|
263
|
+
|
264
|
+
VALUE
|
265
|
+
rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2)
|
266
|
+
{
|
267
|
+
struct BlockingThread* thr;
|
268
|
+
int fd[2];
|
269
|
+
VALUE exc;
|
270
|
+
DWORD state;
|
271
|
+
DWORD res;
|
272
|
+
|
273
|
+
if (_pipe(fd, 1024, O_BINARY) == -1) {
|
274
|
+
rb_raise(rb_eSystemCallError, "_pipe() failed");
|
275
|
+
return Qnil;
|
276
|
+
}
|
277
|
+
|
278
|
+
thr = ALLOC_N(struct BlockingThread, 1);
|
279
|
+
thr->rdfd = fd[0];
|
280
|
+
thr->wrfd = fd[1];
|
281
|
+
thr->fn = func;
|
282
|
+
thr->data = data1;
|
283
|
+
thr->ubf = ubf;
|
284
|
+
thr->data2 = data2;
|
285
|
+
thr->retval = Qnil;
|
286
|
+
|
287
|
+
thr->tid = CreateThread(NULL, 0, rbffi_blocking_thread, thr, 0, NULL);
|
288
|
+
if (!thr->tid) {
|
289
|
+
close(fd[0]);
|
290
|
+
close(fd[1]);
|
291
|
+
xfree(thr);
|
292
|
+
rb_raise(rb_eSystemCallError, "CreateThread() failed");
|
293
|
+
return Qnil;
|
294
|
+
}
|
295
|
+
|
296
|
+
exc = rb_rescue2(wait_for_thread, (VALUE) thr, cleanup_blocking_thread, (VALUE) thr,
|
297
|
+
rb_eException);
|
298
|
+
|
299
|
+
/* The thread should be finished, already. */
|
300
|
+
WaitForSingleObject(thr->tid, INFINITE);
|
301
|
+
CloseHandle(thr->tid);
|
302
|
+
close(fd[1]);
|
303
|
+
close(fd[0]);
|
304
|
+
xfree(thr);
|
305
|
+
|
306
|
+
if (exc != Qnil) {
|
307
|
+
rb_exc_raise(exc);
|
308
|
+
}
|
309
|
+
|
310
|
+
return thr->retval;
|
311
|
+
}
|
312
|
+
|
313
|
+
#endif /* !_WIN32 */
|
314
|
+
|
315
|
+
#endif /* HAVE_RB_THREAD_BLOCKING_REGION */
|
316
|
+
|
317
|
+
#ifndef _WIN32
|
318
|
+
static struct thread_data* thread_data_init(void);
|
319
|
+
|
320
|
+
static inline struct thread_data*
|
321
|
+
thread_data_get(void)
|
322
|
+
{
|
323
|
+
struct thread_data* td = (struct thread_data *) pthread_getspecific(thread_data_key);
|
324
|
+
return td != NULL ? td : thread_data_init();
|
325
|
+
}
|
326
|
+
|
327
|
+
static struct thread_data*
|
328
|
+
thread_data_init(void)
|
329
|
+
{
|
330
|
+
struct thread_data* td = calloc(1, sizeof(struct thread_data));
|
331
|
+
|
332
|
+
pthread_setspecific(thread_data_key, td);
|
333
|
+
|
334
|
+
return td;
|
335
|
+
}
|
336
|
+
|
337
|
+
static void
|
338
|
+
thread_data_free(void *ptr)
|
339
|
+
{
|
340
|
+
free(ptr);
|
341
|
+
}
|
342
|
+
#endif
|
343
|
+
|
344
|
+
void
|
345
|
+
rbffi_Thread_Init(VALUE moduleFFI)
|
346
|
+
{
|
347
|
+
#ifdef _WIN32
|
348
|
+
frame_thread_key = TlsAlloc();
|
349
|
+
#else
|
350
|
+
pthread_key_create(&thread_data_key, thread_data_free);
|
351
|
+
#endif
|
352
|
+
}
|
data/ext/ffi_c/Thread.h
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2010 Wayne Meissner
|
3
|
+
*
|
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 RBFFI_THREAD_H
|
31
|
+
#define RBFFI_THREAD_H
|
32
|
+
|
33
|
+
#ifndef _MSC_VER
|
34
|
+
# include <stdbool.h>
|
35
|
+
#else
|
36
|
+
# include "win32/stdbool.h"
|
37
|
+
# include "win32/stdint.h"
|
38
|
+
#endif
|
39
|
+
#include <ruby.h>
|
40
|
+
#include "extconf.h"
|
41
|
+
|
42
|
+
#ifdef __cplusplus
|
43
|
+
extern "C" {
|
44
|
+
#endif
|
45
|
+
|
46
|
+
|
47
|
+
#ifdef _WIN32
|
48
|
+
# include <windows.h>
|
49
|
+
#else
|
50
|
+
# include <pthread.h>
|
51
|
+
#endif
|
52
|
+
|
53
|
+
typedef struct {
|
54
|
+
#ifdef _WIN32
|
55
|
+
DWORD id;
|
56
|
+
#else
|
57
|
+
pthread_t id;
|
58
|
+
#endif
|
59
|
+
bool valid;
|
60
|
+
bool has_gvl;
|
61
|
+
VALUE exc;
|
62
|
+
} rbffi_thread_t;
|
63
|
+
|
64
|
+
typedef struct rbffi_frame {
|
65
|
+
#ifndef _WIN32
|
66
|
+
struct thread_data* td;
|
67
|
+
#endif
|
68
|
+
struct rbffi_frame* prev;
|
69
|
+
bool has_gvl;
|
70
|
+
VALUE exc;
|
71
|
+
} rbffi_frame_t;
|
72
|
+
|
73
|
+
rbffi_frame_t* rbffi_frame_current(void);
|
74
|
+
void rbffi_frame_push(rbffi_frame_t* frame);
|
75
|
+
void rbffi_frame_pop(rbffi_frame_t* frame);
|
76
|
+
|
77
|
+
#ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL
|
78
|
+
# define rbffi_thread_blocking_region rb_thread_call_without_gvl
|
79
|
+
|
80
|
+
#elif defined(HAVE_RB_THREAD_BLOCKING_REGION)
|
81
|
+
# define rbffi_thread_blocking_region rb_thread_blocking_region
|
82
|
+
|
83
|
+
#else
|
84
|
+
|
85
|
+
VALUE rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2);
|
86
|
+
|
87
|
+
#endif
|
88
|
+
|
89
|
+
|
90
|
+
#ifdef __cplusplus
|
91
|
+
}
|
92
|
+
#endif
|
93
|
+
|
94
|
+
#endif /* RBFFI_THREAD_H */
|
95
|
+
|
data/ext/ffi_c/Type.c
ADDED
@@ -0,0 +1,397 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2009, Wayne Meissner
|
3
|
+
*
|
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
|
+
|
34
|
+
#include <sys/types.h>
|
35
|
+
#include <ruby.h>
|
36
|
+
#include <ffi.h>
|
37
|
+
#include "rbffi.h"
|
38
|
+
#include "compat.h"
|
39
|
+
#include "Types.h"
|
40
|
+
#include "Type.h"
|
41
|
+
|
42
|
+
|
43
|
+
typedef struct BuiltinType_ {
|
44
|
+
Type type;
|
45
|
+
char* name;
|
46
|
+
} BuiltinType;
|
47
|
+
|
48
|
+
static void builtin_type_free(BuiltinType *);
|
49
|
+
|
50
|
+
VALUE rbffi_TypeClass = Qnil;
|
51
|
+
|
52
|
+
static VALUE classBuiltinType = Qnil;
|
53
|
+
static VALUE moduleNativeType = Qnil;
|
54
|
+
static VALUE typeMap = Qnil, sizeMap = Qnil;
|
55
|
+
static ID id_find_type = 0, id_type_size = 0, id_size = 0;
|
56
|
+
|
57
|
+
static VALUE
|
58
|
+
type_allocate(VALUE klass)
|
59
|
+
{
|
60
|
+
Type* type;
|
61
|
+
VALUE obj = Data_Make_Struct(klass, Type, NULL, -1, type);
|
62
|
+
|
63
|
+
type->nativeType = -1;
|
64
|
+
type->ffiType = &ffi_type_void;
|
65
|
+
|
66
|
+
return obj;
|
67
|
+
}
|
68
|
+
|
69
|
+
/*
|
70
|
+
* Document-method: initialize
|
71
|
+
* call-seq: initialize(value)
|
72
|
+
* @param [Fixnum,Type] value
|
73
|
+
* @return [self]
|
74
|
+
*/
|
75
|
+
static VALUE
|
76
|
+
type_initialize(VALUE self, VALUE value)
|
77
|
+
{
|
78
|
+
Type* type;
|
79
|
+
Type* other;
|
80
|
+
|
81
|
+
Data_Get_Struct(self, Type, type);
|
82
|
+
|
83
|
+
if (FIXNUM_P(value)) {
|
84
|
+
type->nativeType = FIX2INT(value);
|
85
|
+
} else if (rb_obj_is_kind_of(value, rbffi_TypeClass)) {
|
86
|
+
Data_Get_Struct(value, Type, other);
|
87
|
+
type->nativeType = other->nativeType;
|
88
|
+
type->ffiType = other->ffiType;
|
89
|
+
} else {
|
90
|
+
rb_raise(rb_eArgError, "wrong type");
|
91
|
+
}
|
92
|
+
|
93
|
+
return self;
|
94
|
+
}
|
95
|
+
|
96
|
+
/*
|
97
|
+
* call-seq: type.size
|
98
|
+
* @return [Fixnum]
|
99
|
+
* Return type's size, in bytes.
|
100
|
+
*/
|
101
|
+
static VALUE
|
102
|
+
type_size(VALUE self)
|
103
|
+
{
|
104
|
+
Type *type;
|
105
|
+
|
106
|
+
Data_Get_Struct(self, Type, type);
|
107
|
+
|
108
|
+
return INT2FIX(type->ffiType->size);
|
109
|
+
}
|
110
|
+
|
111
|
+
/*
|
112
|
+
* call-seq: type.alignment
|
113
|
+
* @return [Fixnum]
|
114
|
+
* Get Type alignment.
|
115
|
+
*/
|
116
|
+
static VALUE
|
117
|
+
type_alignment(VALUE self)
|
118
|
+
{
|
119
|
+
Type *type;
|
120
|
+
|
121
|
+
Data_Get_Struct(self, Type, type);
|
122
|
+
|
123
|
+
return INT2FIX(type->ffiType->alignment);
|
124
|
+
}
|
125
|
+
|
126
|
+
/*
|
127
|
+
* call-seq: type.inspect
|
128
|
+
* @return [String]
|
129
|
+
* Inspect {Type} object.
|
130
|
+
*/
|
131
|
+
static VALUE
|
132
|
+
type_inspect(VALUE self)
|
133
|
+
{
|
134
|
+
char buf[100];
|
135
|
+
Type *type;
|
136
|
+
|
137
|
+
Data_Get_Struct(self, Type, type);
|
138
|
+
|
139
|
+
snprintf(buf, sizeof(buf), "#<%s:%p size=%d alignment=%d>",
|
140
|
+
rb_obj_classname(self), type, (int) type->ffiType->size, (int) type->ffiType->alignment);
|
141
|
+
|
142
|
+
return rb_str_new2(buf);
|
143
|
+
}
|
144
|
+
|
145
|
+
static VALUE
|
146
|
+
builtin_type_new(VALUE klass, int nativeType, ffi_type* ffiType, const char* name)
|
147
|
+
{
|
148
|
+
BuiltinType* type;
|
149
|
+
VALUE obj = Qnil;
|
150
|
+
|
151
|
+
obj = Data_Make_Struct(klass, BuiltinType, NULL, builtin_type_free, type);
|
152
|
+
|
153
|
+
type->name = strdup(name);
|
154
|
+
type->type.nativeType = nativeType;
|
155
|
+
type->type.ffiType = ffiType;
|
156
|
+
|
157
|
+
return obj;
|
158
|
+
}
|
159
|
+
|
160
|
+
static void
|
161
|
+
builtin_type_free(BuiltinType *type)
|
162
|
+
{
|
163
|
+
free(type->name);
|
164
|
+
xfree(type);
|
165
|
+
}
|
166
|
+
|
167
|
+
/*
|
168
|
+
* call-seq: type.inspect
|
169
|
+
* @return [String]
|
170
|
+
* Inspect {Type::Builtin} object.
|
171
|
+
*/
|
172
|
+
static VALUE
|
173
|
+
builtin_type_inspect(VALUE self)
|
174
|
+
{
|
175
|
+
char buf[100];
|
176
|
+
BuiltinType *type;
|
177
|
+
|
178
|
+
Data_Get_Struct(self, BuiltinType, type);
|
179
|
+
snprintf(buf, sizeof(buf), "#<%s:%s size=%d alignment=%d>",
|
180
|
+
rb_obj_classname(self), type->name, (int) type->type.ffiType->size, type->type.ffiType->alignment);
|
181
|
+
|
182
|
+
return rb_str_new2(buf);
|
183
|
+
}
|
184
|
+
|
185
|
+
int
|
186
|
+
rbffi_type_size(VALUE type)
|
187
|
+
{
|
188
|
+
int t = TYPE(type);
|
189
|
+
|
190
|
+
if (t == T_FIXNUM || t == T_BIGNUM) {
|
191
|
+
return NUM2INT(type);
|
192
|
+
|
193
|
+
} else if (t == T_SYMBOL) {
|
194
|
+
/*
|
195
|
+
* Try looking up directly in the type and size maps
|
196
|
+
*/
|
197
|
+
VALUE nType;
|
198
|
+
if ((nType = rb_hash_lookup(typeMap, type)) != Qnil) {
|
199
|
+
if (rb_obj_is_kind_of(nType, rbffi_TypeClass)) {
|
200
|
+
Type* type;
|
201
|
+
Data_Get_Struct(nType, Type, type);
|
202
|
+
return (int) type->ffiType->size;
|
203
|
+
|
204
|
+
} else if (rb_respond_to(nType, id_size)) {
|
205
|
+
return NUM2INT(rb_funcall2(nType, id_size, 0, NULL));
|
206
|
+
}
|
207
|
+
}
|
208
|
+
|
209
|
+
/* Not found - call up to the ruby version to resolve */
|
210
|
+
return NUM2INT(rb_funcall2(rbffi_FFIModule, id_type_size, 1, &type));
|
211
|
+
|
212
|
+
} else {
|
213
|
+
return NUM2INT(rb_funcall2(type, id_size, 0, NULL));
|
214
|
+
}
|
215
|
+
}
|
216
|
+
|
217
|
+
VALUE
|
218
|
+
rbffi_Type_Lookup(VALUE name)
|
219
|
+
{
|
220
|
+
int t = TYPE(name);
|
221
|
+
if (t == T_SYMBOL || t == T_STRING) {
|
222
|
+
/*
|
223
|
+
* Try looking up directly in the type Map
|
224
|
+
*/
|
225
|
+
VALUE nType;
|
226
|
+
if ((nType = rb_hash_lookup(typeMap, name)) != Qnil && rb_obj_is_kind_of(nType, rbffi_TypeClass)) {
|
227
|
+
return nType;
|
228
|
+
}
|
229
|
+
} else if (rb_obj_is_kind_of(name, rbffi_TypeClass)) {
|
230
|
+
|
231
|
+
return name;
|
232
|
+
}
|
233
|
+
|
234
|
+
/* Nothing found - let caller handle raising exceptions */
|
235
|
+
return Qnil;
|
236
|
+
}
|
237
|
+
|
238
|
+
/**
|
239
|
+
* rbffi_Type_Find() is like rbffi_Type_Lookup, but an error is raised if the
|
240
|
+
* type is not found.
|
241
|
+
*/
|
242
|
+
VALUE
|
243
|
+
rbffi_Type_Find(VALUE name)
|
244
|
+
{
|
245
|
+
VALUE rbType = rbffi_Type_Lookup(name);
|
246
|
+
|
247
|
+
if (!RTEST(rbType)) {
|
248
|
+
VALUE s = rb_inspect(name);
|
249
|
+
rb_raise(rb_eTypeError, "invalid type, %s", RSTRING_PTR(s));
|
250
|
+
RB_GC_GUARD(s);
|
251
|
+
}
|
252
|
+
|
253
|
+
return rbType;
|
254
|
+
}
|
255
|
+
|
256
|
+
void
|
257
|
+
rbffi_Type_Init(VALUE moduleFFI)
|
258
|
+
{
|
259
|
+
/*
|
260
|
+
* Document-class: FFI::Type
|
261
|
+
* This class manages C types.
|
262
|
+
*
|
263
|
+
* It embbed {FFI::Type::Builtin} objects as constants (for names,
|
264
|
+
* see {FFI::NativeType}).
|
265
|
+
*/
|
266
|
+
rbffi_TypeClass = rb_define_class_under(moduleFFI, "Type", rb_cObject);
|
267
|
+
|
268
|
+
/*
|
269
|
+
* Document-constant: FFI::TypeDefs
|
270
|
+
*/
|
271
|
+
rb_define_const(moduleFFI, "TypeDefs", typeMap = rb_hash_new());
|
272
|
+
rb_define_const(moduleFFI, "SizeTypes", sizeMap = rb_hash_new());
|
273
|
+
rb_global_variable(&typeMap);
|
274
|
+
rb_global_variable(&sizeMap);
|
275
|
+
id_find_type = rb_intern("find_type");
|
276
|
+
id_type_size = rb_intern("type_size");
|
277
|
+
id_size = rb_intern("size");
|
278
|
+
|
279
|
+
/*
|
280
|
+
* Document-class: FFI::Type::Builtin
|
281
|
+
* Class for Built-in types.
|
282
|
+
*/
|
283
|
+
classBuiltinType = rb_define_class_under(rbffi_TypeClass, "Builtin", rbffi_TypeClass);
|
284
|
+
/*
|
285
|
+
* Document-module: FFI::NativeType
|
286
|
+
* This module defines constants for native (C) types.
|
287
|
+
*
|
288
|
+
* ==Native type constants
|
289
|
+
* Native types are defined by constants :
|
290
|
+
* * INT8, SCHAR, CHAR
|
291
|
+
* * UINT8, UCHAR
|
292
|
+
* * INT16, SHORT, SSHORT
|
293
|
+
* * UINT16, USHORT
|
294
|
+
* * INT32,, INT, SINT
|
295
|
+
* * UINT32, UINT
|
296
|
+
* * INT64, LONG_LONG, SLONG_LONG
|
297
|
+
* * UINT64, ULONG_LONG
|
298
|
+
* * LONG, SLONG
|
299
|
+
* * ULONG
|
300
|
+
* * FLOAT32, FLOAT
|
301
|
+
* * FLOAT64, DOUBLE
|
302
|
+
* * POINTER
|
303
|
+
* * CALLBACK
|
304
|
+
* * FUNCTION
|
305
|
+
* * CHAR_ARRAY
|
306
|
+
* * BOOL
|
307
|
+
* * STRING (immutable string, nul terminated)
|
308
|
+
* * STRUCT (struct-b-value param or result)
|
309
|
+
* * ARRAY (array type definition)
|
310
|
+
* * MAPPED (custom native type)
|
311
|
+
* For function return type only :
|
312
|
+
* * VOID
|
313
|
+
* For function argument type only :
|
314
|
+
* * BUFFER_IN
|
315
|
+
* * BUFFER_OUT
|
316
|
+
* * VARARGS (function takes a variable number of arguments)
|
317
|
+
*
|
318
|
+
* All these constants are exported to {FFI} module prefixed with "TYPE_".
|
319
|
+
* They are objets from {FFI::Type::Builtin} class.
|
320
|
+
*/
|
321
|
+
moduleNativeType = rb_define_module_under(moduleFFI, "NativeType");
|
322
|
+
|
323
|
+
/*
|
324
|
+
* Document-global: FFI::Type
|
325
|
+
*/
|
326
|
+
rb_global_variable(&rbffi_TypeClass);
|
327
|
+
rb_global_variable(&classBuiltinType);
|
328
|
+
rb_global_variable(&moduleNativeType);
|
329
|
+
|
330
|
+
rb_define_alloc_func(rbffi_TypeClass, type_allocate);
|
331
|
+
rb_define_method(rbffi_TypeClass, "initialize", type_initialize, 1);
|
332
|
+
rb_define_method(rbffi_TypeClass, "size", type_size, 0);
|
333
|
+
rb_define_method(rbffi_TypeClass, "alignment", type_alignment, 0);
|
334
|
+
rb_define_method(rbffi_TypeClass, "inspect", type_inspect, 0);
|
335
|
+
|
336
|
+
/* Make Type::Builtin non-allocatable */
|
337
|
+
rb_undef_method(CLASS_OF(classBuiltinType), "new");
|
338
|
+
rb_define_method(classBuiltinType, "inspect", builtin_type_inspect, 0);
|
339
|
+
|
340
|
+
rb_global_variable(&rbffi_TypeClass);
|
341
|
+
rb_global_variable(&classBuiltinType);
|
342
|
+
|
343
|
+
/* Define all the builtin types */
|
344
|
+
#define T(x, ffiType) do { \
|
345
|
+
VALUE t = Qnil; \
|
346
|
+
rb_define_const(rbffi_TypeClass, #x, t = builtin_type_new(classBuiltinType, NATIVE_##x, ffiType, #x)); \
|
347
|
+
rb_define_const(moduleNativeType, #x, t); \
|
348
|
+
rb_define_const(moduleFFI, "TYPE_" #x, t); \
|
349
|
+
} while(0)
|
350
|
+
|
351
|
+
#define A(old_type, new_type) do { \
|
352
|
+
VALUE t = rb_const_get(rbffi_TypeClass, rb_intern(#old_type)); \
|
353
|
+
rb_const_set(rbffi_TypeClass, rb_intern(#new_type), t); \
|
354
|
+
} while(0)
|
355
|
+
|
356
|
+
/*
|
357
|
+
* Document-constant: FFI::Type::Builtin::VOID
|
358
|
+
*/
|
359
|
+
T(VOID, &ffi_type_void);
|
360
|
+
T(INT8, &ffi_type_sint8);
|
361
|
+
A(INT8, SCHAR);
|
362
|
+
A(INT8, CHAR);
|
363
|
+
T(UINT8, &ffi_type_uint8);
|
364
|
+
A(UINT8, UCHAR);
|
365
|
+
|
366
|
+
T(INT16, &ffi_type_sint16);
|
367
|
+
A(INT16, SHORT);
|
368
|
+
A(INT16, SSHORT);
|
369
|
+
T(UINT16, &ffi_type_uint16);
|
370
|
+
A(UINT16, USHORT);
|
371
|
+
T(INT32, &ffi_type_sint32);
|
372
|
+
A(INT32, INT);
|
373
|
+
A(INT32, SINT);
|
374
|
+
T(UINT32, &ffi_type_uint32);
|
375
|
+
A(UINT32, UINT);
|
376
|
+
T(INT64, &ffi_type_sint64);
|
377
|
+
A(INT64, LONG_LONG);
|
378
|
+
A(INT64, SLONG_LONG);
|
379
|
+
T(UINT64, &ffi_type_uint64);
|
380
|
+
A(UINT64, ULONG_LONG);
|
381
|
+
T(LONG, &ffi_type_slong);
|
382
|
+
A(LONG, SLONG);
|
383
|
+
T(ULONG, &ffi_type_ulong);
|
384
|
+
T(FLOAT32, &ffi_type_float);
|
385
|
+
A(FLOAT32, FLOAT);
|
386
|
+
T(FLOAT64, &ffi_type_double);
|
387
|
+
A(FLOAT64, DOUBLE);
|
388
|
+
T(LONGDOUBLE, &ffi_type_longdouble);
|
389
|
+
T(POINTER, &ffi_type_pointer);
|
390
|
+
T(STRING, &ffi_type_pointer);
|
391
|
+
T(BUFFER_IN, &ffi_type_pointer);
|
392
|
+
T(BUFFER_OUT, &ffi_type_pointer);
|
393
|
+
T(BUFFER_INOUT, &ffi_type_pointer);
|
394
|
+
T(BOOL, &ffi_type_uchar);
|
395
|
+
T(VARARGS, &ffi_type_void);
|
396
|
+
}
|
397
|
+
|