ffi 0.5.0-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ffi might be problematic. Click here for more details.
- data/LICENSE +51 -0
- data/README.rdoc +69 -0
- data/Rakefile +191 -0
- data/ext/ffi_c/AbstractMemory.c +489 -0
- data/ext/ffi_c/AbstractMemory.h +160 -0
- data/ext/ffi_c/ArrayType.c +129 -0
- data/ext/ffi_c/ArrayType.h +58 -0
- data/ext/ffi_c/AutoPointer.c +61 -0
- data/ext/ffi_c/AutoPointer.h +18 -0
- data/ext/ffi_c/Buffer.c +187 -0
- data/ext/ffi_c/Call.c +853 -0
- data/ext/ffi_c/Call.h +86 -0
- data/ext/ffi_c/ClosurePool.c +302 -0
- data/ext/ffi_c/ClosurePool.h +29 -0
- data/ext/ffi_c/DynamicLibrary.c +216 -0
- data/ext/ffi_c/DynamicLibrary.h +22 -0
- data/ext/ffi_c/Function.c +478 -0
- data/ext/ffi_c/Function.h +80 -0
- data/ext/ffi_c/FunctionInfo.c +221 -0
- data/ext/ffi_c/LastError.c +159 -0
- data/ext/ffi_c/LastError.h +18 -0
- data/ext/ffi_c/MemoryPointer.c +178 -0
- data/ext/ffi_c/MemoryPointer.h +20 -0
- data/ext/ffi_c/MethodHandle.c +346 -0
- data/ext/ffi_c/MethodHandle.h +53 -0
- data/ext/ffi_c/Platform.c +59 -0
- data/ext/ffi_c/Platform.h +16 -0
- data/ext/ffi_c/Pointer.c +224 -0
- data/ext/ffi_c/Pointer.h +49 -0
- data/ext/ffi_c/Struct.c +770 -0
- data/ext/ffi_c/Struct.h +80 -0
- data/ext/ffi_c/StructByValue.c +140 -0
- data/ext/ffi_c/StructByValue.h +53 -0
- data/ext/ffi_c/StructLayout.c +450 -0
- data/ext/ffi_c/Type.c +329 -0
- data/ext/ffi_c/Type.h +57 -0
- data/ext/ffi_c/Types.c +103 -0
- data/ext/ffi_c/Types.h +85 -0
- data/ext/ffi_c/Variadic.c +260 -0
- data/ext/ffi_c/compat.h +72 -0
- data/ext/ffi_c/endian.h +40 -0
- data/ext/ffi_c/extconf.rb +30 -0
- data/ext/ffi_c/ffi.c +82 -0
- data/ext/ffi_c/libffi.bsd.mk +34 -0
- data/ext/ffi_c/libffi.darwin.mk +75 -0
- data/ext/ffi_c/libffi.gnu.mk +29 -0
- data/ext/ffi_c/libffi.mk +13 -0
- data/ext/ffi_c/libffi/ChangeLog +3243 -0
- data/ext/ffi_c/libffi/ChangeLog.libffi +347 -0
- data/ext/ffi_c/libffi/ChangeLog.libgcj +40 -0
- data/ext/ffi_c/libffi/ChangeLog.v1 +764 -0
- data/ext/ffi_c/libffi/LICENSE +21 -0
- data/ext/ffi_c/libffi/Makefile.am +177 -0
- data/ext/ffi_c/libffi/Makefile.in +1640 -0
- data/ext/ffi_c/libffi/README +328 -0
- data/ext/ffi_c/libffi/TODO +1 -0
- data/ext/ffi_c/libffi/acinclude.m4 +92 -0
- data/ext/ffi_c/libffi/aclocal.m4 +7516 -0
- data/ext/ffi_c/libffi/compile +142 -0
- data/ext/ffi_c/libffi/config.guess +1516 -0
- data/ext/ffi_c/libffi/config.sub +1626 -0
- data/ext/ffi_c/libffi/configure +24414 -0
- data/ext/ffi_c/libffi/configure.ac +365 -0
- data/ext/ffi_c/libffi/configure.host +11 -0
- data/ext/ffi_c/libffi/depcomp +584 -0
- data/ext/ffi_c/libffi/doc/libffi.info +533 -0
- data/ext/ffi_c/libffi/doc/libffi.texi +541 -0
- data/ext/ffi_c/libffi/doc/stamp-vti +4 -0
- data/ext/ffi_c/libffi/doc/version.texi +4 -0
- data/ext/ffi_c/libffi/fficonfig.h.in +160 -0
- data/ext/ffi_c/libffi/include/Makefile.am +9 -0
- data/ext/ffi_c/libffi/include/Makefile.in +422 -0
- data/ext/ffi_c/libffi/include/ffi.h.in +393 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +98 -0
- data/ext/ffi_c/libffi/install-sh +323 -0
- data/ext/ffi_c/libffi/libffi.pc.in +10 -0
- data/ext/ffi_c/libffi/libtool-version +29 -0
- data/ext/ffi_c/libffi/ltcf-c.sh +861 -0
- data/ext/ffi_c/libffi/ltcf-cxx.sh +1069 -0
- data/ext/ffi_c/libffi/ltcf-gcj.sh +700 -0
- data/ext/ffi_c/libffi/ltconfig +2862 -0
- data/ext/ffi_c/libffi/ltmain.sh +6930 -0
- data/ext/ffi_c/libffi/man/Makefile.am +8 -0
- data/ext/ffi_c/libffi/man/Makefile.in +395 -0
- data/ext/ffi_c/libffi/man/ffi.3 +31 -0
- data/ext/ffi_c/libffi/man/ffi_call.3 +103 -0
- data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +66 -0
- data/ext/ffi_c/libffi/mdate-sh +201 -0
- data/ext/ffi_c/libffi/missing +353 -0
- data/ext/ffi_c/libffi/mkinstalldirs +158 -0
- data/ext/ffi_c/libffi/src/alpha/ffi.c +284 -0
- data/ext/ffi_c/libffi/src/alpha/ffitarget.h +48 -0
- data/ext/ffi_c/libffi/src/alpha/osf.S +366 -0
- data/ext/ffi_c/libffi/src/arm/ffi.c +309 -0
- data/ext/ffi_c/libffi/src/arm/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/arm/sysv.S +299 -0
- data/ext/ffi_c/libffi/src/closures.c +596 -0
- data/ext/ffi_c/libffi/src/cris/ffi.c +383 -0
- data/ext/ffi_c/libffi/src/cris/ffitarget.h +51 -0
- data/ext/ffi_c/libffi/src/cris/sysv.S +215 -0
- data/ext/ffi_c/libffi/src/debug.c +59 -0
- data/ext/ffi_c/libffi/src/dlmalloc.c +5099 -0
- data/ext/ffi_c/libffi/src/frv/eabi.S +128 -0
- data/ext/ffi_c/libffi/src/frv/ffi.c +292 -0
- data/ext/ffi_c/libffi/src/frv/ffitarget.h +61 -0
- data/ext/ffi_c/libffi/src/ia64/ffi.c +580 -0
- data/ext/ffi_c/libffi/src/ia64/ffitarget.h +50 -0
- data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +40 -0
- data/ext/ffi_c/libffi/src/ia64/unix.S +560 -0
- data/ext/ffi_c/libffi/src/java_raw_api.c +359 -0
- data/ext/ffi_c/libffi/src/m32r/ffi.c +232 -0
- data/ext/ffi_c/libffi/src/m32r/ffitarget.h +48 -0
- data/ext/ffi_c/libffi/src/m32r/sysv.S +121 -0
- data/ext/ffi_c/libffi/src/m68k/ffi.c +278 -0
- data/ext/ffi_c/libffi/src/m68k/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/m68k/sysv.S +234 -0
- data/ext/ffi_c/libffi/src/mips/ffi.c +926 -0
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +202 -0
- data/ext/ffi_c/libffi/src/mips/n32.S +534 -0
- data/ext/ffi_c/libffi/src/mips/o32.S +381 -0
- data/ext/ffi_c/libffi/src/pa/ffi.c +709 -0
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +77 -0
- data/ext/ffi_c/libffi/src/pa/hpux32.S +368 -0
- data/ext/ffi_c/libffi/src/pa/linux.S +357 -0
- data/ext/ffi_c/libffi/src/powerpc/aix.S +225 -0
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +247 -0
- data/ext/ffi_c/libffi/src/powerpc/asm.h +125 -0
- data/ext/ffi_c/libffi/src/powerpc/darwin.S +245 -0
- data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +317 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +1429 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +800 -0
- data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +118 -0
- data/ext/ffi_c/libffi/src/powerpc/linux64.S +187 -0
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +236 -0
- data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +327 -0
- data/ext/ffi_c/libffi/src/powerpc/sysv.S +230 -0
- data/ext/ffi_c/libffi/src/prep_cif.c +174 -0
- data/ext/ffi_c/libffi/src/raw_api.c +254 -0
- data/ext/ffi_c/libffi/src/s390/ffi.c +780 -0
- data/ext/ffi_c/libffi/src/s390/ffitarget.h +60 -0
- data/ext/ffi_c/libffi/src/s390/sysv.S +434 -0
- data/ext/ffi_c/libffi/src/sh/ffi.c +716 -0
- data/ext/ffi_c/libffi/src/sh/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/sh/sysv.S +850 -0
- data/ext/ffi_c/libffi/src/sh64/ffi.c +453 -0
- data/ext/ffi_c/libffi/src/sh64/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/sh64/sysv.S +530 -0
- data/ext/ffi_c/libffi/src/sparc/ffi.c +610 -0
- data/ext/ffi_c/libffi/src/sparc/ffitarget.h +66 -0
- data/ext/ffi_c/libffi/src/sparc/v8.S +272 -0
- data/ext/ffi_c/libffi/src/sparc/v9.S +307 -0
- data/ext/ffi_c/libffi/src/types.c +77 -0
- data/ext/ffi_c/libffi/src/x86/darwin.S +443 -0
- data/ext/ffi_c/libffi/src/x86/darwin64.S +416 -0
- data/ext/ffi_c/libffi/src/x86/ffi.c +475 -0
- data/ext/ffi_c/libffi/src/x86/ffi64.c +572 -0
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +90 -0
- data/ext/ffi_c/libffi/src/x86/freebsd.S +458 -0
- data/ext/ffi_c/libffi/src/x86/sysv.S +437 -0
- data/ext/ffi_c/libffi/src/x86/unix64.S +418 -0
- data/ext/ffi_c/libffi/src/x86/win32.S +391 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.am +71 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.in +447 -0
- data/ext/ffi_c/libffi/testsuite/config/default.exp +1 -0
- data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +289 -0
- data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +263 -0
- data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +45 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +36 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +97 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +89 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +89 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +90 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +97 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +72 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +102 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +103 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +104 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +110 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +97 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +101 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +121 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +103 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +106 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +117 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +106 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +132 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +121 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +107 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +125 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +105 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +96 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +101 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +100 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +101 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +100 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +82 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +82 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +94 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +82 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +94 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +52 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +50 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +50 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +50 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +54 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +59 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +58 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +57 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +72 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +62 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +69 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +63 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +53 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +160 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +169 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +141 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +118 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +119 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +119 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +120 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +139 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +119 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +139 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +139 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +98 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +59 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +35 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +35 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +36 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +49 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +34 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +41 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +36 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +38 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +38 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +38 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +65 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +67 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +59 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +63 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +65 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +64 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +74 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +80 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +67 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +38 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +123 -0
- data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
- data/ext/ffi_c/libffi/texinfo.tex +7482 -0
- data/ext/ffi_c/rbffi.h +26 -0
- data/gen/Rakefile +12 -0
- data/lib/1.8/ffi_c.so +0 -0
- data/lib/1.9/ffi_c.so +0 -0
- data/lib/ffi.rb +11 -0
- data/lib/ffi/autopointer.rb +61 -0
- data/lib/ffi/buffer.rb +0 -0
- data/lib/ffi/callback.rb +10 -0
- data/lib/ffi/enum.rb +78 -0
- data/lib/ffi/errno.rb +8 -0
- data/lib/ffi/ffi.rb +99 -0
- data/lib/ffi/io.rb +21 -0
- data/lib/ffi/library.rb +218 -0
- data/lib/ffi/managedstruct.rb +55 -0
- data/lib/ffi/memorypointer.rb +73 -0
- data/lib/ffi/platform.rb +88 -0
- data/lib/ffi/pointer.rb +119 -0
- data/lib/ffi/struct.rb +183 -0
- data/lib/ffi/tools/const_generator.rb +177 -0
- data/lib/ffi/tools/generator.rb +58 -0
- data/lib/ffi/tools/generator_task.rb +35 -0
- data/lib/ffi/tools/struct_generator.rb +194 -0
- data/lib/ffi/tools/types_generator.rb +123 -0
- data/lib/ffi/types.rb +153 -0
- data/lib/ffi/union.rb +12 -0
- data/lib/ffi/variadic.rb +25 -0
- data/spec/ffi/bool_spec.rb +24 -0
- data/spec/ffi/buffer_spec.rb +202 -0
- data/spec/ffi/callback_spec.rb +591 -0
- data/spec/ffi/enum_spec.rb +164 -0
- data/spec/ffi/errno_spec.rb +13 -0
- data/spec/ffi/function_spec.rb +73 -0
- data/spec/ffi/library_spec.rb +148 -0
- data/spec/ffi/managed_struct_spec.rb +56 -0
- data/spec/ffi/number_spec.rb +231 -0
- data/spec/ffi/pointer_spec.rb +195 -0
- data/spec/ffi/rbx/attach_function_spec.rb +27 -0
- data/spec/ffi/rbx/memory_pointer_spec.rb +102 -0
- data/spec/ffi/rbx/spec_helper.rb +1 -0
- data/spec/ffi/rbx/struct_spec.rb +13 -0
- data/spec/ffi/spec_helper.rb +17 -0
- data/spec/ffi/string_spec.rb +103 -0
- data/spec/ffi/struct_callback_spec.rb +64 -0
- data/spec/ffi/struct_initialize_spec.rb +30 -0
- data/spec/ffi/struct_spec.rb +529 -0
- data/spec/ffi/typedef_spec.rb +48 -0
- data/spec/ffi/union_spec.rb +60 -0
- data/spec/ffi/variadic_spec.rb +84 -0
- data/spec/spec.opts +4 -0
- metadata +396 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
#ifndef _LIBRARY_H
|
3
|
+
#define _LIBRARY_H
|
4
|
+
|
5
|
+
#ifdef __cplusplus
|
6
|
+
extern "C" {
|
7
|
+
#endif
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
typedef struct Library {
|
12
|
+
void* handle;
|
13
|
+
} Library;
|
14
|
+
|
15
|
+
extern void rbffi_DynamicLibrary_Init(VALUE ffiModule);
|
16
|
+
|
17
|
+
#ifdef __cplusplus
|
18
|
+
}
|
19
|
+
#endif
|
20
|
+
|
21
|
+
#endif /* _LIBRARY_H */
|
22
|
+
|
@@ -0,0 +1,478 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2009, Wayne Meissner
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* Redistribution and use in source and binary forms, with or without
|
6
|
+
* modification, are permitted provided that the following conditions are met:
|
7
|
+
*
|
8
|
+
* * Redistributions of source code must retain the above copyright notice, this
|
9
|
+
* list of conditions and the following disclaimer.
|
10
|
+
* * Redistributions in binary form must reproduce the above copyright notice
|
11
|
+
* this list of conditions and the following disclaimer in the documentation
|
12
|
+
* and/or other materials provided with the distribution.
|
13
|
+
* * The name of the author or authors may not be used to endorse or promote
|
14
|
+
* products derived from this software without specific prior written permission.
|
15
|
+
*
|
16
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
20
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
21
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
22
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
23
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
24
|
+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
25
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
*/
|
27
|
+
|
28
|
+
#include "MethodHandle.h"
|
29
|
+
|
30
|
+
|
31
|
+
#include <sys/param.h>
|
32
|
+
#include <sys/types.h>
|
33
|
+
#ifndef _WIN32
|
34
|
+
# include <sys/mman.h>
|
35
|
+
#endif
|
36
|
+
#include <stdio.h>
|
37
|
+
#include <stdint.h>
|
38
|
+
#include <stdbool.h>
|
39
|
+
#include <ruby.h>
|
40
|
+
|
41
|
+
#include <ffi.h>
|
42
|
+
#include "rbffi.h"
|
43
|
+
#include "compat.h"
|
44
|
+
|
45
|
+
#include "AbstractMemory.h"
|
46
|
+
#include "Pointer.h"
|
47
|
+
#include "Struct.h"
|
48
|
+
#include "Platform.h"
|
49
|
+
#include "Type.h"
|
50
|
+
#include "LastError.h"
|
51
|
+
#include "Call.h"
|
52
|
+
#include "ClosurePool.h"
|
53
|
+
#include "Function.h"
|
54
|
+
|
55
|
+
typedef struct Function_ {
|
56
|
+
AbstractMemory memory;
|
57
|
+
FunctionType* info;
|
58
|
+
MethodHandle* methodHandle;
|
59
|
+
bool autorelease;
|
60
|
+
Closure* closure;
|
61
|
+
VALUE rbProc;
|
62
|
+
VALUE rbFunctionInfo;
|
63
|
+
} Function;
|
64
|
+
|
65
|
+
static void function_mark(Function *);
|
66
|
+
static void function_free(Function *);
|
67
|
+
static VALUE function_init(VALUE self, VALUE rbFunctionInfo, VALUE rbProc);
|
68
|
+
static void callback_invoke(ffi_cif* cif, void* retval, void** parameters, void* user_data);
|
69
|
+
static bool callback_prep(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize);
|
70
|
+
|
71
|
+
VALUE rbffi_FunctionClass = Qnil;
|
72
|
+
|
73
|
+
static ID id_call = 0, id_cbtable = 0, id_cb_ref = 0;
|
74
|
+
|
75
|
+
static VALUE
|
76
|
+
function_allocate(VALUE klass)
|
77
|
+
{
|
78
|
+
Function *fn;
|
79
|
+
VALUE obj;
|
80
|
+
|
81
|
+
obj = Data_Make_Struct(klass, Function, function_mark, function_free, fn);
|
82
|
+
|
83
|
+
fn->memory.access = MEM_RD;
|
84
|
+
fn->memory.ops = &rbffi_AbstractMemoryOps;
|
85
|
+
|
86
|
+
fn->rbProc = Qnil;
|
87
|
+
fn->rbFunctionInfo = Qnil;
|
88
|
+
fn->autorelease = true;
|
89
|
+
|
90
|
+
return obj;
|
91
|
+
}
|
92
|
+
|
93
|
+
static void
|
94
|
+
function_mark(Function *fn)
|
95
|
+
{
|
96
|
+
rb_gc_mark(fn->rbProc);
|
97
|
+
rb_gc_mark(fn->rbFunctionInfo);
|
98
|
+
}
|
99
|
+
|
100
|
+
static void
|
101
|
+
function_free(Function *fn)
|
102
|
+
{
|
103
|
+
if (fn->methodHandle != NULL) {
|
104
|
+
rbffi_MethodHandle_Free(fn->methodHandle);
|
105
|
+
}
|
106
|
+
|
107
|
+
if (fn->closure != NULL && fn->autorelease) {
|
108
|
+
rbffi_Closure_Free(fn->closure);
|
109
|
+
}
|
110
|
+
|
111
|
+
xfree(fn);
|
112
|
+
}
|
113
|
+
|
114
|
+
static VALUE
|
115
|
+
function_initialize(int argc, VALUE* argv, VALUE self)
|
116
|
+
{
|
117
|
+
|
118
|
+
VALUE rbReturnType = Qnil, rbParamTypes = Qnil, rbProc = Qnil, rbOptions = Qnil;
|
119
|
+
VALUE rbFunctionInfo = Qnil;
|
120
|
+
VALUE infoArgv[3];
|
121
|
+
int nargs;
|
122
|
+
|
123
|
+
nargs = rb_scan_args(argc, argv, "22", &rbReturnType, &rbParamTypes, &rbProc, &rbOptions);
|
124
|
+
|
125
|
+
//
|
126
|
+
// Callback with block,
|
127
|
+
// e.g. Function.new(:int, [ :int ]) { |i| blah }
|
128
|
+
// or Function.new(:int, [ :int ], { :convention => :stdcall }) { |i| blah }
|
129
|
+
//
|
130
|
+
if (rb_block_given_p()) {
|
131
|
+
if (nargs > 3) {
|
132
|
+
rb_raise(rb_eArgError, "cannot create function with both proc/address and block");
|
133
|
+
}
|
134
|
+
rbOptions = rbProc;
|
135
|
+
rbProc = rb_block_proc();
|
136
|
+
} else {
|
137
|
+
// Callback with proc, or Function with address
|
138
|
+
// e.g. Function.new(:int, [ :int ], Proc.new { |i| })
|
139
|
+
// Function.new(:int, [ :int ], Proc.new { |i| }, { :convention => :stdcall })
|
140
|
+
// Function.new(:int, [ :int ], addr)
|
141
|
+
// Function.new(:int, [ :int ], addr, { :convention => :stdcall })
|
142
|
+
}
|
143
|
+
|
144
|
+
infoArgv[0] = rbReturnType;
|
145
|
+
infoArgv[1] = rbParamTypes;
|
146
|
+
infoArgv[2] = rbOptions;
|
147
|
+
rbFunctionInfo = rb_class_new_instance(rbOptions != Qnil ? 3 : 2, infoArgv, rbffi_FunctionTypeClass);
|
148
|
+
|
149
|
+
function_init(self, rbFunctionInfo, rbProc);
|
150
|
+
|
151
|
+
return self;
|
152
|
+
}
|
153
|
+
|
154
|
+
VALUE
|
155
|
+
rbffi_Function_NewInstance(VALUE rbFunctionInfo, VALUE rbProc)
|
156
|
+
{
|
157
|
+
return function_init(function_allocate(rbffi_FunctionClass), rbFunctionInfo, rbProc);
|
158
|
+
}
|
159
|
+
|
160
|
+
VALUE
|
161
|
+
rbffi_Function_ForProc(VALUE rbFunctionInfo, VALUE proc)
|
162
|
+
{
|
163
|
+
VALUE callback, cbref, cbTable;
|
164
|
+
Function* fp;
|
165
|
+
|
166
|
+
cbref = RTEST(rb_ivar_defined(proc, id_cb_ref)) ? rb_ivar_get(proc, id_cb_ref) : Qnil;
|
167
|
+
/* If the first callback reference has the same function function signature, use it */
|
168
|
+
if (cbref != Qnil && CLASS_OF(cbref) == rbffi_FunctionClass) {
|
169
|
+
Data_Get_Struct(cbref, Function, fp);
|
170
|
+
if (fp->rbFunctionInfo == rbFunctionInfo) {
|
171
|
+
return cbref;
|
172
|
+
}
|
173
|
+
}
|
174
|
+
|
175
|
+
cbTable = RTEST(rb_ivar_defined(proc, id_cbtable)) ? rb_ivar_get(proc, id_cbtable) : Qnil;
|
176
|
+
if (cbTable != Qnil && (callback = rb_hash_aref(cbTable, rbFunctionInfo)) != Qnil) {
|
177
|
+
return callback;
|
178
|
+
}
|
179
|
+
|
180
|
+
/* No existing function for the proc with that signature, create a new one and cache it */
|
181
|
+
callback = rbffi_Function_NewInstance(rbFunctionInfo, proc);
|
182
|
+
if (cbref == Qnil) {
|
183
|
+
/* If there is no other cb already cached for this proc, we can use the ivar slot */
|
184
|
+
rb_ivar_set(proc, id_cb_ref, callback);
|
185
|
+
} else {
|
186
|
+
/* The proc instance has been used as more than one type of callback, store extras in a hash */
|
187
|
+
cbTable = rb_hash_new();
|
188
|
+
rb_ivar_set(proc, id_cbtable, cbTable);
|
189
|
+
rb_hash_aset(cbTable, rbFunctionInfo, callback);
|
190
|
+
}
|
191
|
+
|
192
|
+
return callback;
|
193
|
+
}
|
194
|
+
|
195
|
+
static VALUE
|
196
|
+
function_init(VALUE self, VALUE rbFunctionInfo, VALUE rbProc)
|
197
|
+
{
|
198
|
+
Function* fn = NULL;
|
199
|
+
|
200
|
+
Data_Get_Struct(self, Function, fn);
|
201
|
+
|
202
|
+
fn->rbFunctionInfo = rbFunctionInfo;
|
203
|
+
|
204
|
+
Data_Get_Struct(fn->rbFunctionInfo, FunctionType, fn->info);
|
205
|
+
|
206
|
+
if (rb_obj_is_kind_of(rbProc, rbffi_PointerClass)) {
|
207
|
+
AbstractMemory* memory;
|
208
|
+
Data_Get_Struct(rbProc, AbstractMemory, memory);
|
209
|
+
fn->memory = *memory;
|
210
|
+
|
211
|
+
} else if (rb_obj_is_kind_of(rbProc, rb_cProc) || rb_respond_to(rbProc, id_call)) {
|
212
|
+
if (fn->info->closurePool == NULL) {
|
213
|
+
fn->info->closurePool = rbffi_ClosurePool_New(sizeof(ffi_closure), callback_prep, fn->info);
|
214
|
+
if (fn->info->closurePool == NULL) {
|
215
|
+
rb_raise(rb_eNoMemError, "failed to create closure pool");
|
216
|
+
}
|
217
|
+
}
|
218
|
+
|
219
|
+
fn->closure = rbffi_Closure_Alloc(fn->info->closurePool);
|
220
|
+
fn->closure->info = fn;
|
221
|
+
fn->memory.address = fn->closure->code;
|
222
|
+
fn->memory.size = sizeof(*fn->closure);
|
223
|
+
fn->autorelease = true;
|
224
|
+
|
225
|
+
} else {
|
226
|
+
rb_raise(rb_eTypeError, "wrong argument type. Expected pointer or proc");
|
227
|
+
}
|
228
|
+
|
229
|
+
fn->rbProc = rbProc;
|
230
|
+
|
231
|
+
return self;
|
232
|
+
}
|
233
|
+
|
234
|
+
static VALUE
|
235
|
+
function_call(int argc, VALUE* argv, VALUE self)
|
236
|
+
{
|
237
|
+
Function* fn;
|
238
|
+
|
239
|
+
Data_Get_Struct(self, Function, fn);
|
240
|
+
|
241
|
+
return (*fn->info->invoke)(argc, argv, fn->memory.address, fn->info);
|
242
|
+
}
|
243
|
+
|
244
|
+
static VALUE
|
245
|
+
function_attach(VALUE self, VALUE module, VALUE name)
|
246
|
+
{
|
247
|
+
Function* fn;
|
248
|
+
char var[1024];
|
249
|
+
|
250
|
+
Data_Get_Struct(self, Function, fn);
|
251
|
+
|
252
|
+
if (fn->info->parameterCount == -1) {
|
253
|
+
rb_raise(rb_eRuntimeError, "Cannot attach variadic functions");
|
254
|
+
}
|
255
|
+
|
256
|
+
if (fn->methodHandle == NULL) {
|
257
|
+
fn->methodHandle = rbffi_MethodHandle_Alloc(fn->info, fn->memory.address);
|
258
|
+
}
|
259
|
+
|
260
|
+
//
|
261
|
+
// Stash the Function in a module variable so it does not get garbage collected
|
262
|
+
//
|
263
|
+
snprintf(var, sizeof(var), "@@%s", StringValueCStr(name));
|
264
|
+
rb_cv_set(module, var, self);
|
265
|
+
|
266
|
+
rb_define_singleton_method(module, StringValueCStr(name),
|
267
|
+
rbffi_MethodHandle_CodeAddress(fn->methodHandle), -1);
|
268
|
+
|
269
|
+
|
270
|
+
rb_define_method(module, StringValueCStr(name),
|
271
|
+
rbffi_MethodHandle_CodeAddress(fn->methodHandle), -1);
|
272
|
+
|
273
|
+
return self;
|
274
|
+
}
|
275
|
+
|
276
|
+
static VALUE
|
277
|
+
function_set_autorelease(VALUE self, VALUE autorelease)
|
278
|
+
{
|
279
|
+
Function* fn;
|
280
|
+
|
281
|
+
Data_Get_Struct(self, Function, fn);
|
282
|
+
|
283
|
+
fn->autorelease = RTEST(autorelease);
|
284
|
+
|
285
|
+
return self;
|
286
|
+
}
|
287
|
+
|
288
|
+
static VALUE
|
289
|
+
function_autorelease_p(VALUE self)
|
290
|
+
{
|
291
|
+
Function* fn;
|
292
|
+
|
293
|
+
Data_Get_Struct(self, Function, fn);
|
294
|
+
|
295
|
+
return fn->autorelease ? Qtrue : Qfalse;
|
296
|
+
}
|
297
|
+
|
298
|
+
static VALUE
|
299
|
+
function_release(VALUE self)
|
300
|
+
{
|
301
|
+
Function* fn;
|
302
|
+
|
303
|
+
Data_Get_Struct(self, Function, fn);
|
304
|
+
|
305
|
+
if (fn->closure == NULL) {
|
306
|
+
rb_raise(rb_eRuntimeError, "cannot free function which was not allocated");
|
307
|
+
}
|
308
|
+
|
309
|
+
rbffi_Closure_Free(fn->closure);
|
310
|
+
fn->closure = NULL;
|
311
|
+
|
312
|
+
return self;
|
313
|
+
}
|
314
|
+
|
315
|
+
static void
|
316
|
+
callback_invoke(ffi_cif* cif, void* retval, void** parameters, void* user_data)
|
317
|
+
{
|
318
|
+
Closure* closure = (Closure *) user_data;
|
319
|
+
Function* fn = (Function *) closure->info;
|
320
|
+
FunctionType *cbInfo = fn->info;
|
321
|
+
VALUE* rbParams;
|
322
|
+
VALUE rbReturnValue;
|
323
|
+
int i;
|
324
|
+
|
325
|
+
rbParams = ALLOCA_N(VALUE, cbInfo->parameterCount);
|
326
|
+
for (i = 0; i < cbInfo->parameterCount; ++i) {
|
327
|
+
VALUE param;
|
328
|
+
switch (cbInfo->parameterTypes[i]->nativeType) {
|
329
|
+
case NATIVE_INT8:
|
330
|
+
param = INT2NUM(*(int8_t *) parameters[i]);
|
331
|
+
break;
|
332
|
+
case NATIVE_UINT8:
|
333
|
+
param = UINT2NUM(*(uint8_t *) parameters[i]);
|
334
|
+
break;
|
335
|
+
case NATIVE_INT16:
|
336
|
+
param = INT2NUM(*(int16_t *) parameters[i]);
|
337
|
+
break;
|
338
|
+
case NATIVE_UINT16:
|
339
|
+
param = UINT2NUM(*(uint16_t *) parameters[i]);
|
340
|
+
break;
|
341
|
+
case NATIVE_INT32:
|
342
|
+
param = INT2NUM(*(int32_t *) parameters[i]);
|
343
|
+
break;
|
344
|
+
case NATIVE_UINT32:
|
345
|
+
param = UINT2NUM(*(uint32_t *) parameters[i]);
|
346
|
+
break;
|
347
|
+
case NATIVE_INT64:
|
348
|
+
param = LL2NUM(*(int64_t *) parameters[i]);
|
349
|
+
break;
|
350
|
+
case NATIVE_UINT64:
|
351
|
+
param = ULL2NUM(*(uint64_t *) parameters[i]);
|
352
|
+
break;
|
353
|
+
case NATIVE_FLOAT32:
|
354
|
+
param = rb_float_new(*(float *) parameters[i]);
|
355
|
+
break;
|
356
|
+
case NATIVE_FLOAT64:
|
357
|
+
param = rb_float_new(*(double *) parameters[i]);
|
358
|
+
break;
|
359
|
+
case NATIVE_STRING:
|
360
|
+
param = (*(void **) parameters[i] != NULL) ? rb_tainted_str_new2(*(char **) parameters[i]) : Qnil;
|
361
|
+
break;
|
362
|
+
case NATIVE_POINTER:
|
363
|
+
param = rbffi_Pointer_NewInstance(*(void **) parameters[i]);
|
364
|
+
break;
|
365
|
+
case NATIVE_BOOL:
|
366
|
+
param = (*(void **) parameters[i]) ? Qtrue : Qfalse;
|
367
|
+
break;
|
368
|
+
|
369
|
+
case NATIVE_FUNCTION:
|
370
|
+
case NATIVE_CALLBACK:
|
371
|
+
param = rbffi_NativeValue_ToRuby(cbInfo->parameterTypes[i],
|
372
|
+
rb_ary_entry(cbInfo->rbParameterTypes, i), parameters[i], Qnil);
|
373
|
+
break;
|
374
|
+
default:
|
375
|
+
param = Qnil;
|
376
|
+
break;
|
377
|
+
}
|
378
|
+
rbParams[i] = param;
|
379
|
+
}
|
380
|
+
rbReturnValue = rb_funcall2(fn->rbProc, id_call, cbInfo->parameterCount, rbParams);
|
381
|
+
if (rbReturnValue == Qnil || TYPE(rbReturnValue) == T_NIL) {
|
382
|
+
memset(retval, 0, cbInfo->ffiReturnType->size);
|
383
|
+
} else switch (cbInfo->returnType->nativeType) {
|
384
|
+
case NATIVE_INT8:
|
385
|
+
case NATIVE_INT16:
|
386
|
+
case NATIVE_INT32:
|
387
|
+
*((ffi_sarg *) retval) = NUM2INT(rbReturnValue);
|
388
|
+
break;
|
389
|
+
case NATIVE_UINT8:
|
390
|
+
case NATIVE_UINT16:
|
391
|
+
case NATIVE_UINT32:
|
392
|
+
*((ffi_arg *) retval) = NUM2UINT(rbReturnValue);
|
393
|
+
break;
|
394
|
+
case NATIVE_INT64:
|
395
|
+
*((int64_t *) retval) = NUM2LL(rbReturnValue);
|
396
|
+
break;
|
397
|
+
case NATIVE_UINT64:
|
398
|
+
*((uint64_t *) retval) = NUM2ULL(rbReturnValue);
|
399
|
+
break;
|
400
|
+
case NATIVE_FLOAT32:
|
401
|
+
*((float *) retval) = (float) NUM2DBL(rbReturnValue);
|
402
|
+
break;
|
403
|
+
case NATIVE_FLOAT64:
|
404
|
+
*((double *) retval) = NUM2DBL(rbReturnValue);
|
405
|
+
break;
|
406
|
+
case NATIVE_POINTER:
|
407
|
+
if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_PointerClass)) {
|
408
|
+
*((void **) retval) = ((AbstractMemory *) DATA_PTR(rbReturnValue))->address;
|
409
|
+
} else {
|
410
|
+
// Default to returning NULL if not a value pointer object. handles nil case as well
|
411
|
+
*((void **) retval) = NULL;
|
412
|
+
}
|
413
|
+
break;
|
414
|
+
case NATIVE_BOOL:
|
415
|
+
*((ffi_sarg *) retval) = TYPE(rbReturnValue) == T_TRUE ? 1 : 0;
|
416
|
+
break;
|
417
|
+
|
418
|
+
case NATIVE_FUNCTION:
|
419
|
+
case NATIVE_CALLBACK:
|
420
|
+
if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_PointerClass)) {
|
421
|
+
|
422
|
+
*((void **) retval) = ((AbstractMemory *) DATA_PTR(rbReturnValue))->address;
|
423
|
+
|
424
|
+
} else if (rb_obj_is_kind_of(rbReturnValue, rb_cProc) || rb_respond_to(rbReturnValue, id_call)) {
|
425
|
+
VALUE function;
|
426
|
+
|
427
|
+
function = rbffi_Function_ForProc(cbInfo->rbReturnType, rbReturnValue);
|
428
|
+
|
429
|
+
*((void **) retval) = ((AbstractMemory *) DATA_PTR(function))->address;
|
430
|
+
} else {
|
431
|
+
*((void **) retval) = NULL;
|
432
|
+
}
|
433
|
+
break;
|
434
|
+
|
435
|
+
default:
|
436
|
+
*((ffi_arg *) retval) = 0;
|
437
|
+
break;
|
438
|
+
}
|
439
|
+
}
|
440
|
+
|
441
|
+
|
442
|
+
static bool
|
443
|
+
callback_prep(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize)
|
444
|
+
{
|
445
|
+
FunctionType* fnInfo = (FunctionType *) ctx;
|
446
|
+
ffi_status ffiStatus;
|
447
|
+
|
448
|
+
ffiStatus = ffi_prep_closure(code, &fnInfo->ffi_cif, callback_invoke, closure);
|
449
|
+
if (ffiStatus != FFI_OK) {
|
450
|
+
snprintf(errmsg, errmsgsize, "ffi_prep_closure failed. status=%#x", ffiStatus);
|
451
|
+
return false;
|
452
|
+
}
|
453
|
+
|
454
|
+
return true;
|
455
|
+
}
|
456
|
+
|
457
|
+
void
|
458
|
+
rbffi_Function_Init(VALUE moduleFFI)
|
459
|
+
{
|
460
|
+
rbffi_FunctionInfo_Init(moduleFFI);
|
461
|
+
rbffi_FunctionClass = rb_define_class_under(moduleFFI, "Function", rbffi_PointerClass);
|
462
|
+
|
463
|
+
rb_global_variable(&rbffi_FunctionClass);
|
464
|
+
rb_define_alloc_func(rbffi_FunctionClass, function_allocate);
|
465
|
+
|
466
|
+
rb_define_method(rbffi_FunctionClass, "initialize", function_initialize, -1);
|
467
|
+
rb_define_method(rbffi_FunctionClass, "call", function_call, -1);
|
468
|
+
rb_define_method(rbffi_FunctionClass, "attach", function_attach, 2);
|
469
|
+
rb_define_method(rbffi_FunctionClass, "free", function_release, 0);
|
470
|
+
rb_define_method(rbffi_FunctionClass, "autorelease=", function_set_autorelease, 1);
|
471
|
+
rb_define_method(rbffi_FunctionClass, "autorelease", function_autorelease_p, 0);
|
472
|
+
rb_define_method(rbffi_FunctionClass, "autorelease?", function_autorelease_p, 0);
|
473
|
+
|
474
|
+
id_call = rb_intern("call");
|
475
|
+
id_cbtable = rb_intern("@__ffi_callback_table__");
|
476
|
+
id_cb_ref = rb_intern("@__ffi_callback__");
|
477
|
+
}
|
478
|
+
|