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
data/ext/ffi_c/Type.c
ADDED
@@ -0,0 +1,329 @@
|
|
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 <sys/param.h>
|
29
|
+
#include <sys/types.h>
|
30
|
+
#include <ruby.h>
|
31
|
+
#include <ffi.h>
|
32
|
+
#include "rbffi.h"
|
33
|
+
#include "compat.h"
|
34
|
+
#include "Types.h"
|
35
|
+
#include "Type.h"
|
36
|
+
|
37
|
+
|
38
|
+
typedef struct BuiltinType_ {
|
39
|
+
Type type;
|
40
|
+
char* name;
|
41
|
+
} BuiltinType;
|
42
|
+
|
43
|
+
static void builtin_type_free(BuiltinType *);
|
44
|
+
|
45
|
+
VALUE rbffi_TypeClass = Qnil;
|
46
|
+
|
47
|
+
static VALUE classBuiltinType = Qnil;
|
48
|
+
static VALUE typeMap = Qnil, sizeMap = Qnil;
|
49
|
+
static ID id_find_type = 0, id_type_size = 0, id_size = 0;
|
50
|
+
|
51
|
+
static VALUE
|
52
|
+
type_allocate(VALUE klass)
|
53
|
+
{
|
54
|
+
Type* type;
|
55
|
+
VALUE obj = Data_Make_Struct(klass, Type, NULL, -1, type);
|
56
|
+
|
57
|
+
type->nativeType = -1;
|
58
|
+
type->ffiType = &ffi_type_void;
|
59
|
+
|
60
|
+
return obj;
|
61
|
+
}
|
62
|
+
|
63
|
+
static VALUE
|
64
|
+
type_initialize(VALUE self, VALUE value)
|
65
|
+
{
|
66
|
+
Type* type;
|
67
|
+
Type* other;
|
68
|
+
|
69
|
+
Data_Get_Struct(self, Type, type);
|
70
|
+
|
71
|
+
if (FIXNUM_P(value)) {
|
72
|
+
type->nativeType = FIX2INT(value);
|
73
|
+
} else if (rb_obj_is_kind_of(value, rbffi_TypeClass)) {
|
74
|
+
Data_Get_Struct(value, Type, other);
|
75
|
+
type->nativeType = other->nativeType;
|
76
|
+
type->ffiType = other->ffiType;
|
77
|
+
} else {
|
78
|
+
rb_raise(rb_eArgError, "wrong type");
|
79
|
+
}
|
80
|
+
|
81
|
+
return self;
|
82
|
+
}
|
83
|
+
|
84
|
+
static VALUE
|
85
|
+
type_size(VALUE self)
|
86
|
+
{
|
87
|
+
Type *type;
|
88
|
+
|
89
|
+
Data_Get_Struct(self, Type, type);
|
90
|
+
|
91
|
+
return INT2FIX(type->ffiType->size);
|
92
|
+
}
|
93
|
+
|
94
|
+
static VALUE
|
95
|
+
type_alignment(VALUE self)
|
96
|
+
{
|
97
|
+
Type *type;
|
98
|
+
|
99
|
+
Data_Get_Struct(self, Type, type);
|
100
|
+
|
101
|
+
return INT2FIX(type->ffiType->alignment);
|
102
|
+
}
|
103
|
+
|
104
|
+
static VALUE
|
105
|
+
type_inspect(VALUE self)
|
106
|
+
{
|
107
|
+
char buf[256];
|
108
|
+
Type *type;
|
109
|
+
|
110
|
+
Data_Get_Struct(self, Type, type);
|
111
|
+
snprintf(buf, sizeof(buf), "#<FFI::Type:%p size=%d alignment=%d>",
|
112
|
+
type, (int) type->ffiType->size, (int) type->ffiType->alignment);
|
113
|
+
|
114
|
+
return rb_str_new2(buf);
|
115
|
+
}
|
116
|
+
|
117
|
+
static VALUE
|
118
|
+
enum_allocate(VALUE klass)
|
119
|
+
{
|
120
|
+
Type* type;
|
121
|
+
VALUE obj;
|
122
|
+
|
123
|
+
obj = Data_Make_Struct(klass, Type, NULL, -1, type);
|
124
|
+
type->nativeType = NATIVE_ENUM;
|
125
|
+
type->ffiType = &ffi_type_sint;
|
126
|
+
|
127
|
+
return obj;
|
128
|
+
}
|
129
|
+
|
130
|
+
int
|
131
|
+
rbffi_Type_GetIntValue(VALUE type)
|
132
|
+
{
|
133
|
+
Type* t;
|
134
|
+
|
135
|
+
if (!rb_obj_is_kind_of(type, rbffi_TypeClass)) {
|
136
|
+
rb_raise(rb_eTypeError, "wrong type. Expected (FFI::Type)");
|
137
|
+
}
|
138
|
+
|
139
|
+
Data_Get_Struct(type, Type, t);
|
140
|
+
|
141
|
+
return t->nativeType;
|
142
|
+
}
|
143
|
+
|
144
|
+
static VALUE
|
145
|
+
builtin_type_new(VALUE klass, int nativeType, ffi_type* ffiType, const char* name)
|
146
|
+
{
|
147
|
+
BuiltinType* type;
|
148
|
+
VALUE obj = Qnil;
|
149
|
+
|
150
|
+
obj = Data_Make_Struct(klass, BuiltinType, NULL, builtin_type_free, type);
|
151
|
+
|
152
|
+
type->name = strdup(name);
|
153
|
+
type->type.nativeType = nativeType;
|
154
|
+
type->type.ffiType = ffiType;
|
155
|
+
|
156
|
+
return obj;
|
157
|
+
}
|
158
|
+
|
159
|
+
static void
|
160
|
+
builtin_type_free(BuiltinType *type)
|
161
|
+
{
|
162
|
+
free(type->name);
|
163
|
+
xfree(type);
|
164
|
+
}
|
165
|
+
|
166
|
+
static VALUE
|
167
|
+
builtin_type_inspect(VALUE self)
|
168
|
+
{
|
169
|
+
char buf[256];
|
170
|
+
BuiltinType *type;
|
171
|
+
|
172
|
+
Data_Get_Struct(self, BuiltinType, type);
|
173
|
+
snprintf(buf, sizeof(buf), "#<FFI::Type::Builtin:%s size=%d alignment=%d>",
|
174
|
+
type->name, (int) type->type.ffiType->size, type->type.ffiType->alignment);
|
175
|
+
|
176
|
+
return rb_str_new2(buf);
|
177
|
+
}
|
178
|
+
|
179
|
+
int
|
180
|
+
rbffi_type_size(VALUE type)
|
181
|
+
{
|
182
|
+
int t = TYPE(type);
|
183
|
+
if (t == T_FIXNUM || t == T_BIGNUM) {
|
184
|
+
return NUM2INT(type);
|
185
|
+
} else if (t == T_SYMBOL) {
|
186
|
+
/*
|
187
|
+
* Try looking up directly in the type and size maps
|
188
|
+
*/
|
189
|
+
VALUE nType;
|
190
|
+
if ((nType = rb_hash_aref(typeMap, type)) != Qnil) {
|
191
|
+
VALUE nSize = rb_hash_aref(sizeMap, nType);
|
192
|
+
if (TYPE(nSize) == T_FIXNUM) {
|
193
|
+
return FIX2INT(nSize);
|
194
|
+
}
|
195
|
+
}
|
196
|
+
// Not found - call up to the ruby version to resolve
|
197
|
+
return NUM2INT(rb_funcall2(rbffi_FFIModule, id_type_size, 1, &type));
|
198
|
+
} else {
|
199
|
+
return NUM2INT(rb_funcall2(type, id_size, 0, NULL));
|
200
|
+
}
|
201
|
+
}
|
202
|
+
|
203
|
+
VALUE
|
204
|
+
rbffi_Type_Lookup(VALUE name)
|
205
|
+
{
|
206
|
+
int t = TYPE(name);
|
207
|
+
if (t == T_SYMBOL || t == T_STRING) {
|
208
|
+
/*
|
209
|
+
* Try looking up directly in the type Map
|
210
|
+
*/
|
211
|
+
VALUE nType;
|
212
|
+
if ((nType = rb_hash_aref(typeMap, name)) != Qnil && rb_obj_is_kind_of(nType, rbffi_TypeClass)) {
|
213
|
+
return nType;
|
214
|
+
}
|
215
|
+
} else if (rb_obj_is_kind_of(name, rbffi_TypeClass)) {
|
216
|
+
|
217
|
+
return name;
|
218
|
+
}
|
219
|
+
|
220
|
+
/* Nothing found - let caller handle raising exceptions */
|
221
|
+
return Qnil;
|
222
|
+
}
|
223
|
+
|
224
|
+
/**
|
225
|
+
* rbffi_Type_Find() is like rbffi_Type_Lookup, but an error is raised if the
|
226
|
+
* type is not found.
|
227
|
+
*/
|
228
|
+
VALUE
|
229
|
+
rbffi_Type_Find(VALUE name)
|
230
|
+
{
|
231
|
+
VALUE rbType = rbffi_Type_Lookup(name);
|
232
|
+
|
233
|
+
if (!RTEST(rbType)) {
|
234
|
+
VALUE typeName = rb_funcall2(name, rb_intern("inspect"), 0, NULL);
|
235
|
+
rb_raise(rb_eTypeError, "Invalid type (%s)", RSTRING_PTR(typeName));
|
236
|
+
}
|
237
|
+
|
238
|
+
return rbType;
|
239
|
+
}
|
240
|
+
|
241
|
+
void
|
242
|
+
rbffi_Type_Init(VALUE moduleFFI)
|
243
|
+
{
|
244
|
+
VALUE moduleNativeType;
|
245
|
+
VALUE classType = rbffi_TypeClass = rb_define_class_under(moduleFFI, "Type", rb_cObject);
|
246
|
+
VALUE classEnum = rb_define_class_under(moduleFFI, "Enum", classType);
|
247
|
+
|
248
|
+
rb_define_const(moduleFFI, "TypeDefs", typeMap = rb_hash_new());
|
249
|
+
rb_define_const(moduleFFI, "SizeTypes", sizeMap = rb_hash_new());
|
250
|
+
rb_global_variable(&typeMap);
|
251
|
+
rb_global_variable(&sizeMap);
|
252
|
+
id_find_type = rb_intern("find_type");
|
253
|
+
id_type_size = rb_intern("type_size");
|
254
|
+
id_size = rb_intern("size");
|
255
|
+
|
256
|
+
|
257
|
+
classBuiltinType = rb_define_class_under(rbffi_TypeClass, "Builtin", rbffi_TypeClass);
|
258
|
+
moduleNativeType = rb_define_module_under(moduleFFI, "NativeType");
|
259
|
+
|
260
|
+
rb_global_variable(&rbffi_TypeClass);
|
261
|
+
rb_global_variable(&classBuiltinType);
|
262
|
+
rb_global_variable(&moduleNativeType);
|
263
|
+
|
264
|
+
rb_define_alloc_func(classType, type_allocate);
|
265
|
+
rb_define_method(classType, "initialize", type_initialize, 1);
|
266
|
+
rb_define_method(classType, "size", type_size, 0);
|
267
|
+
rb_define_method(classType, "alignment", type_alignment, 0);
|
268
|
+
rb_define_method(classType, "inspect", type_inspect, 0);
|
269
|
+
|
270
|
+
// Make Type::Builtin non-allocatable
|
271
|
+
rb_undef_method(CLASS_OF(classBuiltinType), "new");
|
272
|
+
rb_define_method(classBuiltinType, "inspect", builtin_type_inspect, 0);
|
273
|
+
|
274
|
+
rb_define_alloc_func(classEnum, enum_allocate);
|
275
|
+
|
276
|
+
rb_global_variable(&rbffi_TypeClass);
|
277
|
+
rb_global_variable(&classBuiltinType);
|
278
|
+
|
279
|
+
// Define all the builtin types
|
280
|
+
#define T(x, ffiType) do { \
|
281
|
+
VALUE t = Qnil; \
|
282
|
+
rb_define_const(classType, #x, t = builtin_type_new(classBuiltinType, NATIVE_##x, ffiType, #x)); \
|
283
|
+
rb_define_const(moduleNativeType, #x, t); \
|
284
|
+
rb_define_const(moduleFFI, "TYPE_" #x, t); \
|
285
|
+
} while(0)
|
286
|
+
|
287
|
+
T(VOID, &ffi_type_void);
|
288
|
+
T(INT8, &ffi_type_sint8);
|
289
|
+
T(UINT8, &ffi_type_uint8);
|
290
|
+
T(INT16, &ffi_type_sint16);
|
291
|
+
T(UINT16, &ffi_type_uint16);
|
292
|
+
T(INT32, &ffi_type_sint32);
|
293
|
+
T(UINT32, &ffi_type_uint32);
|
294
|
+
T(INT64, &ffi_type_sint64);
|
295
|
+
T(UINT64, &ffi_type_uint64);
|
296
|
+
T(FLOAT32, &ffi_type_float);
|
297
|
+
T(FLOAT64, &ffi_type_double);
|
298
|
+
T(POINTER, &ffi_type_pointer);
|
299
|
+
T(STRING, &ffi_type_pointer);
|
300
|
+
T(RBXSTRING, &ffi_type_pointer);
|
301
|
+
T(BUFFER_IN, &ffi_type_pointer);
|
302
|
+
T(BUFFER_OUT, &ffi_type_pointer);
|
303
|
+
T(BUFFER_INOUT, &ffi_type_pointer);
|
304
|
+
T(ENUM, &ffi_type_sint);
|
305
|
+
T(BOOL, &ffi_type_sint);
|
306
|
+
|
307
|
+
|
308
|
+
T(CHAR_ARRAY, &ffi_type_void);
|
309
|
+
T(VARARGS, &ffi_type_void);
|
310
|
+
|
311
|
+
|
312
|
+
if (sizeof(long) == 4) {
|
313
|
+
VALUE t = Qnil;
|
314
|
+
rb_define_const(classType, "LONG", t = builtin_type_new(classBuiltinType, NATIVE_INT32, &ffi_type_slong, "LONG"));
|
315
|
+
rb_define_const(moduleNativeType, "LONG", t);
|
316
|
+
rb_define_const(moduleFFI, "TYPE_LONG", t);
|
317
|
+
rb_define_const(classType, "ULONG", t = builtin_type_new(classBuiltinType, NATIVE_UINT32, &ffi_type_slong, "ULONG"));
|
318
|
+
rb_define_const(moduleNativeType, "ULONG", t);
|
319
|
+
rb_define_const(moduleFFI, "TYPE_ULONG", t);
|
320
|
+
} else {
|
321
|
+
VALUE t = Qnil;
|
322
|
+
rb_define_const(classType, "LONG", t = builtin_type_new(classBuiltinType, NATIVE_INT64, &ffi_type_slong, "LONG"));
|
323
|
+
rb_define_const(moduleNativeType, "LONG", t);
|
324
|
+
rb_define_const(moduleFFI, "TYPE_LONG", t);
|
325
|
+
rb_define_const(classType, "ULONG", t = builtin_type_new(classBuiltinType, NATIVE_UINT64, &ffi_type_slong, "ULONG"));
|
326
|
+
rb_define_const(moduleNativeType, "ULONG", t);
|
327
|
+
rb_define_const(moduleFFI, "TYPE_ULONG", t);
|
328
|
+
}
|
329
|
+
}
|
data/ext/ffi_c/Type.h
ADDED
@@ -0,0 +1,57 @@
|
|
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
|
+
#ifndef RBFFI_TYPE_H
|
29
|
+
#define RBFFI_TYPE_H
|
30
|
+
|
31
|
+
#include <ruby.h>
|
32
|
+
#include <ffi.h>
|
33
|
+
|
34
|
+
#ifdef __cplusplus
|
35
|
+
extern "C" {
|
36
|
+
#endif
|
37
|
+
|
38
|
+
typedef struct Type_ Type;
|
39
|
+
|
40
|
+
#include "Types.h"
|
41
|
+
|
42
|
+
struct Type_ {
|
43
|
+
NativeType nativeType;
|
44
|
+
ffi_type* ffiType;
|
45
|
+
};
|
46
|
+
|
47
|
+
extern VALUE rbffi_TypeClass;
|
48
|
+
extern int rbffi_Type_GetIntValue(VALUE type);
|
49
|
+
extern VALUE rbffi_Type_Lookup(VALUE type);
|
50
|
+
extern VALUE rbffi_Type_Find(VALUE type);
|
51
|
+
|
52
|
+
#ifdef __cplusplus
|
53
|
+
}
|
54
|
+
#endif
|
55
|
+
|
56
|
+
#endif /* RBFFI_TYPE_H */
|
57
|
+
|
data/ext/ffi_c/Types.c
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2009, Wayne Meissner
|
3
|
+
* Copyright (c) 2009, Luc Heinrich
|
4
|
+
* Copyright (c) 2009, Aman Gupta.
|
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
|
+
*
|
10
|
+
* * Redistributions of source code must retain the above copyright notice, this
|
11
|
+
* list of conditions and the following disclaimer.
|
12
|
+
* * Redistributions in binary form must reproduce the above copyright notice
|
13
|
+
* this list of conditions and the following disclaimer in the documentation
|
14
|
+
* and/or other materials provided with the distribution.
|
15
|
+
* * The name of the author or authors may not be used to endorse or promote
|
16
|
+
* products derived from this software without specific prior written permission.
|
17
|
+
*
|
18
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
22
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
24
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
25
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
26
|
+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
27
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
*/
|
29
|
+
|
30
|
+
#include <ruby.h>
|
31
|
+
#include "Pointer.h"
|
32
|
+
#include "rbffi.h"
|
33
|
+
#include "Function.h"
|
34
|
+
#include "StructByValue.h"
|
35
|
+
#include "Types.h"
|
36
|
+
#include "Struct.h"
|
37
|
+
#include "MemoryPointer.h"
|
38
|
+
|
39
|
+
static ID id_find = 0;
|
40
|
+
|
41
|
+
|
42
|
+
VALUE
|
43
|
+
rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr, VALUE enums)
|
44
|
+
{
|
45
|
+
switch (type->nativeType) {
|
46
|
+
case NATIVE_VOID:
|
47
|
+
return Qnil;
|
48
|
+
case NATIVE_INT8:
|
49
|
+
return INT2NUM((signed char) *(ffi_sarg *) ptr);
|
50
|
+
case NATIVE_INT16:
|
51
|
+
return INT2NUM((signed short) *(ffi_sarg *) ptr);
|
52
|
+
case NATIVE_INT32:
|
53
|
+
return INT2NUM((signed int) *(ffi_sarg *) ptr);
|
54
|
+
case NATIVE_UINT8:
|
55
|
+
return UINT2NUM((unsigned char) *(ffi_arg *) ptr);
|
56
|
+
case NATIVE_UINT16:
|
57
|
+
return UINT2NUM((unsigned short) *(ffi_arg *) ptr);
|
58
|
+
case NATIVE_UINT32:
|
59
|
+
return UINT2NUM((unsigned int) *(ffi_arg *) ptr);
|
60
|
+
case NATIVE_INT64:
|
61
|
+
return LL2NUM(*(signed long long *) ptr);
|
62
|
+
case NATIVE_UINT64:
|
63
|
+
return ULL2NUM(*(unsigned long long *) ptr);
|
64
|
+
case NATIVE_FLOAT32:
|
65
|
+
return rb_float_new(*(float *) ptr);
|
66
|
+
case NATIVE_FLOAT64:
|
67
|
+
return rb_float_new(*(double *) ptr);
|
68
|
+
case NATIVE_STRING:
|
69
|
+
return (*(void **) ptr != NULL) ? rb_tainted_str_new2(*(char **) ptr) : Qnil;
|
70
|
+
case NATIVE_POINTER:
|
71
|
+
return rbffi_Pointer_NewInstance(*(void **) ptr);
|
72
|
+
case NATIVE_BOOL:
|
73
|
+
return ((int) *(ffi_arg *) ptr) ? Qtrue : Qfalse;
|
74
|
+
case NATIVE_ENUM:
|
75
|
+
return rb_funcall(rbType, id_find, 1, INT2NUM((unsigned int) *(ffi_arg *) ptr));
|
76
|
+
|
77
|
+
case NATIVE_FUNCTION:
|
78
|
+
case NATIVE_CALLBACK: {
|
79
|
+
return rbffi_Function_NewInstance(rbType, rbffi_Pointer_NewInstance(*(void **) ptr));
|
80
|
+
}
|
81
|
+
case NATIVE_STRUCT: {
|
82
|
+
StructByValue* sbv = (StructByValue *)type;
|
83
|
+
AbstractMemory* mem;
|
84
|
+
VALUE rbMemory = rbffi_MemoryPointer_NewInstance(1, sbv->base.ffiType->size, false);
|
85
|
+
|
86
|
+
Data_Get_Struct(rbMemory, AbstractMemory, mem);
|
87
|
+
memcpy(mem->address, ptr, sbv->base.ffiType->size);
|
88
|
+
|
89
|
+
return rb_class_new_instance(1, &rbMemory, sbv->rbStructClass);
|
90
|
+
}
|
91
|
+
|
92
|
+
default:
|
93
|
+
rb_raise(rb_eRuntimeError, "Unknown type: %d", type->nativeType);
|
94
|
+
return Qnil;
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
void
|
99
|
+
rbffi_Types_Init(VALUE moduleFFI)
|
100
|
+
{
|
101
|
+
id_find = rb_intern("find");
|
102
|
+
}
|
103
|
+
|