ffi 1.0.0 → 1.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +4 -0
- data/CHANGELOG.md +465 -0
- data/COPYING +49 -0
- data/Gemfile +21 -0
- data/LICENSE +21 -11
- data/LICENSE.SPECS +22 -0
- data/README.md +137 -0
- data/Rakefile +165 -148
- data/ext/ffi_c/AbstractMemory.c +716 -97
- data/ext/ffi_c/AbstractMemory.h +38 -17
- data/ext/ffi_c/ArrayType.c +102 -33
- data/ext/ffi_c/ArrayType.h +20 -18
- data/ext/ffi_c/Buffer.c +229 -54
- data/ext/ffi_c/Call.c +211 -100
- data/ext/ffi_c/Call.h +46 -28
- data/ext/ffi_c/ClosurePool.c +110 -81
- data/ext/ffi_c/ClosurePool.h +31 -1
- data/ext/ffi_c/DynamicLibrary.c +216 -54
- data/ext/ffi_c/DynamicLibrary.h +76 -0
- data/ext/ffi_c/Function.c +527 -164
- data/ext/ffi_c/Function.h +24 -20
- data/ext/ffi_c/FunctionInfo.c +151 -50
- data/ext/ffi_c/LastError.c +112 -28
- data/ext/ffi_c/LastError.h +29 -0
- data/ext/ffi_c/LongDouble.c +65 -0
- data/ext/ffi_c/LongDouble.h +47 -0
- data/ext/ffi_c/MappedType.c +107 -42
- data/ext/ffi_c/MappedType.h +20 -20
- data/ext/ffi_c/MemoryPointer.c +108 -46
- data/ext/ffi_c/MemoryPointer.h +33 -4
- data/ext/ffi_c/MethodHandle.c +71 -67
- data/ext/ffi_c/MethodHandle.h +26 -23
- data/ext/ffi_c/Platform.c +42 -25
- data/ext/ffi_c/Platform.h +32 -3
- data/ext/ffi_c/Pointer.c +324 -51
- data/ext/ffi_c/Pointer.h +29 -18
- data/ext/ffi_c/Struct.c +434 -161
- data/ext/ffi_c/Struct.h +47 -27
- data/ext/ffi_c/StructByValue.c +74 -37
- data/ext/ffi_c/StructByValue.h +20 -18
- data/ext/ffi_c/StructLayout.c +358 -87
- data/ext/ffi_c/Thread.c +129 -0
- data/ext/ffi_c/Thread.h +76 -0
- data/ext/ffi_c/Type.c +241 -76
- data/ext/ffi_c/Type.h +27 -11
- data/ext/ffi_c/Types.c +54 -34
- data/ext/ffi_c/Types.h +24 -24
- data/ext/ffi_c/Variadic.c +151 -55
- data/ext/ffi_c/compat.h +48 -38
- data/ext/ffi_c/extconf.rb +106 -34
- data/ext/ffi_c/ffi.c +35 -26
- data/ext/ffi_c/libffi/.allow-ai-service +0 -0
- data/ext/ffi_c/libffi/.appveyor/site.exp +16 -0
- data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +7 -0
- data/ext/ffi_c/libffi/.appveyor.yml +84 -0
- data/ext/ffi_c/libffi/.ci/ar-lib +270 -0
- data/ext/ffi_c/libffi/.ci/bfin-sim.exp +58 -0
- data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
- data/ext/ffi_c/libffi/.ci/build-in-container.sh +10 -0
- data/ext/ffi_c/libffi/.ci/build.sh +124 -0
- data/ext/ffi_c/libffi/.ci/compile +351 -0
- data/ext/ffi_c/libffi/.ci/install.sh +78 -0
- data/ext/ffi_c/libffi/.ci/m32r-sim.exp +58 -0
- data/ext/ffi_c/libffi/.ci/moxie-sim.exp +60 -0
- data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
- data/ext/ffi_c/libffi/.ci/or1k-sim.exp +58 -0
- data/ext/ffi_c/libffi/.ci/powerpc-eabisim.exp +58 -0
- data/ext/ffi_c/libffi/.ci/site.exp +29 -0
- data/ext/ffi_c/libffi/.ci/wine-sim.exp +55 -0
- data/ext/ffi_c/libffi/.circleci/config.yml +156 -0
- data/ext/ffi_c/libffi/.gitattributes +4 -0
- data/ext/ffi_c/libffi/.github/issue_template.md +10 -0
- data/ext/ffi_c/libffi/.github/workflows/build.yml +479 -0
- data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +172 -0
- data/ext/ffi_c/libffi/.gitignore +46 -0
- data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.old} +6528 -3180
- data/ext/ffi_c/libffi/LICENSE +3 -3
- data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +353 -0
- data/ext/ffi_c/libffi/Makefile.am +132 -162
- data/ext/ffi_c/libffi/Makefile.in +1339 -1003
- data/ext/ffi_c/libffi/README.md +531 -0
- data/ext/ffi_c/libffi/acinclude.m4 +289 -4
- data/ext/ffi_c/libffi/autogen.sh +2 -0
- data/ext/ffi_c/libffi/compile +227 -21
- data/ext/ffi_c/libffi/config.guess +1034 -778
- data/ext/ffi_c/libffi/config.sub +1394 -1204
- data/ext/ffi_c/libffi/configure +14327 -8503
- data/ext/ffi_c/libffi/configure.ac +294 -247
- data/ext/ffi_c/libffi/configure.host +330 -4
- data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
- data/ext/ffi_c/libffi/doc/Makefile.in +818 -0
- data/ext/ffi_c/libffi/doc/libffi.texi +572 -67
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +53 -46
- data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +312 -0
- data/ext/ffi_c/libffi/include/Makefile.am +3 -3
- data/ext/ffi_c/libffi/include/Makefile.in +219 -79
- data/ext/ffi_c/libffi/include/ffi.h.in +230 -111
- data/ext/ffi_c/libffi/include/ffi_cfi.h +76 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +78 -16
- data/ext/ffi_c/libffi/include/tramp.h +45 -0
- data/ext/ffi_c/libffi/install-sh +402 -184
- data/ext/ffi_c/libffi/libffi.map.in +81 -0
- data/ext/ffi_c/libffi/libffi.pc.in +3 -2
- data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +997 -0
- data/ext/ffi_c/libffi/libtool-ldflags +106 -0
- data/ext/ffi_c/libffi/libtool-version +2 -2
- data/ext/ffi_c/libffi/ltmain.sh +5752 -2722
- data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
- data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +50 -0
- data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +198 -0
- data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +158 -0
- data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +53 -0
- data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +119 -0
- data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +49 -0
- data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +302 -0
- data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +267 -0
- data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +89 -0
- data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
- data/ext/ffi_c/libffi/m4/ax_require_defined.m4 +37 -0
- data/ext/ffi_c/libffi/make_sunver.pl +333 -0
- data/ext/ffi_c/libffi/man/Makefile.am +2 -2
- data/ext/ffi_c/libffi/man/Makefile.in +174 -57
- data/ext/ffi_c/libffi/man/ffi.3 +10 -0
- data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
- data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
- data/ext/ffi_c/libffi/missing +155 -300
- data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln +33 -0
- data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj +130 -0
- data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +57 -0
- data/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +4 -0
- data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +511 -0
- data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/fficonfig.h +219 -0
- data/ext/ffi_c/libffi/msvcc.sh +353 -0
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +1142 -0
- data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +97 -0
- data/ext/ffi_c/libffi/src/aarch64/internal.h +100 -0
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +695 -0
- data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +506 -0
- data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
- data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
- data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
- data/ext/ffi_c/libffi/src/alpha/osf.S +162 -246
- data/ext/ffi_c/libffi/src/arc/arcompact.S +210 -0
- data/ext/ffi_c/libffi/src/arc/ffi.c +443 -0
- data/ext/ffi_c/libffi/src/arc/ffitarget.h +67 -0
- data/ext/ffi_c/libffi/src/arm/ffi.c +806 -194
- data/ext/ffi_c/libffi/src/arm/ffitarget.h +43 -3
- data/ext/ffi_c/libffi/src/arm/internal.h +17 -0
- data/ext/ffi_c/libffi/src/arm/sysv.S +381 -231
- data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
- data/ext/ffi_c/libffi/src/avr32/ffi.c +4 -2
- data/ext/ffi_c/libffi/src/avr32/ffitarget.h +8 -3
- data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
- data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
- data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
- data/ext/ffi_c/libffi/src/closures.c +574 -100
- data/ext/ffi_c/libffi/src/cris/ffi.c +11 -8
- data/ext/ffi_c/libffi/src/cris/ffitarget.h +8 -3
- data/ext/ffi_c/libffi/src/csky/ffi.c +395 -0
- data/ext/ffi_c/libffi/src/csky/ffitarget.h +63 -0
- data/ext/ffi_c/libffi/src/csky/sysv.S +371 -0
- data/ext/ffi_c/libffi/src/debug.c +8 -3
- data/ext/ffi_c/libffi/src/dlmalloc.c +89 -17
- data/ext/ffi_c/libffi/src/frv/ffi.c +2 -2
- data/ext/ffi_c/libffi/src/frv/ffitarget.h +8 -7
- data/ext/ffi_c/libffi/src/ia64/ffi.c +48 -12
- data/ext/ffi_c/libffi/src/ia64/ffitarget.h +10 -4
- data/ext/ffi_c/libffi/src/ia64/unix.S +28 -3
- data/ext/ffi_c/libffi/src/java_raw_api.c +24 -6
- data/ext/ffi_c/libffi/src/kvx/asm.h +5 -0
- data/ext/ffi_c/libffi/src/kvx/ffi.c +273 -0
- data/ext/ffi_c/libffi/src/kvx/ffitarget.h +75 -0
- data/ext/ffi_c/libffi/src/kvx/sysv.S +127 -0
- data/ext/ffi_c/libffi/src/loongarch64/ffi.c +624 -0
- data/ext/ffi_c/libffi/src/loongarch64/ffitarget.h +82 -0
- data/ext/ffi_c/libffi/src/loongarch64/sysv.S +327 -0
- data/ext/ffi_c/libffi/src/m32r/ffi.c +32 -15
- data/ext/ffi_c/libffi/src/m32r/ffitarget.h +8 -3
- data/ext/ffi_c/libffi/src/m68k/ffi.c +97 -13
- data/ext/ffi_c/libffi/src/m68k/ffitarget.h +8 -3
- data/ext/ffi_c/libffi/src/m68k/sysv.S +148 -25
- data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
- data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
- data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
- data/ext/ffi_c/libffi/src/metag/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
- data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
- data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
- data/ext/ffi_c/libffi/src/mips/ffi.c +392 -104
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +40 -24
- data/ext/ffi_c/libffi/src/mips/n32.S +325 -93
- data/ext/ffi_c/libffi/src/mips/o32.S +211 -31
- data/ext/ffi_c/libffi/src/moxie/eabi.S +101 -0
- data/ext/ffi_c/libffi/src/moxie/ffi.c +310 -0
- data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
- data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
- data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
- data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
- data/ext/ffi_c/libffi/src/or1k/ffi.c +341 -0
- data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
- data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
- data/ext/ffi_c/libffi/src/pa/ffi.c +68 -111
- data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +34 -17
- data/ext/ffi_c/libffi/src/pa/hpux32.S +87 -38
- data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
- data/ext/ffi_c/libffi/src/pa/linux.S +109 -39
- data/ext/ffi_c/libffi/src/powerpc/aix.S +250 -8
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +255 -4
- data/ext/ffi_c/libffi/src/powerpc/asm.h +3 -3
- data/ext/ffi_c/libffi/src/powerpc/darwin.S +211 -78
- data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +356 -102
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +108 -1375
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +746 -210
- data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1153 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +105 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
- data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +126 -48
- data/ext/ffi_c/libffi/src/powerpc/linux64.S +191 -85
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +438 -108
- data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
- data/ext/ffi_c/libffi/src/powerpc/sysv.S +73 -119
- data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
- data/ext/ffi_c/libffi/src/prep_cif.c +141 -32
- data/ext/ffi_c/libffi/src/raw_api.c +18 -5
- data/ext/ffi_c/libffi/src/riscv/ffi.c +514 -0
- data/ext/ffi_c/libffi/src/riscv/ffitarget.h +69 -0
- data/ext/ffi_c/libffi/src/riscv/sysv.S +293 -0
- data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
- data/ext/ffi_c/libffi/src/s390/ffitarget.h +13 -3
- data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
- data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
- data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
- data/ext/ffi_c/libffi/src/sh/ffitarget.h +8 -3
- data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
- data/ext/ffi_c/libffi/src/sh64/ffitarget.h +8 -3
- data/ext/ffi_c/libffi/src/sparc/ffi.c +334 -491
- data/ext/ffi_c/libffi/src/sparc/ffi64.c +630 -0
- data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -5
- data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
- data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
- data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
- data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
- data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
- data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
- data/ext/ffi_c/libffi/src/tramp.c +716 -0
- data/ext/ffi_c/libffi/src/types.c +48 -19
- data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
- data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
- data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/wasm32/ffi.c +947 -0
- data/ext/ffi_c/libffi/src/wasm32/ffitarget.h +62 -0
- data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
- data/ext/ffi_c/libffi/src/x86/ffi.c +690 -540
- data/ext/ffi_c/libffi/src/x86/ffi64.c +450 -126
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +86 -42
- data/ext/ffi_c/libffi/src/x86/ffiw64.c +361 -0
- data/ext/ffi_c/libffi/src/x86/internal.h +43 -0
- data/ext/ffi_c/libffi/src/x86/internal64.h +36 -0
- data/ext/ffi_c/libffi/src/x86/sysv.S +1199 -381
- data/ext/ffi_c/libffi/src/x86/sysv_intel.S +998 -0
- data/ext/ffi_c/libffi/src/x86/unix64.S +587 -298
- data/ext/ffi_c/libffi/src/x86/win64.S +251 -457
- data/ext/ffi_c/libffi/src/x86/win64_intel.S +238 -0
- data/ext/ffi_c/libffi/src/xtensa/ffi.c +306 -0
- data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +57 -0
- data/ext/ffi_c/libffi/src/xtensa/sysv.S +268 -0
- data/ext/ffi_c/libffi/stamp-h.in +1 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.am +80 -73
- data/ext/ffi_c/libffi/testsuite/Makefile.in +251 -117
- data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +54 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +63 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +86 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +48 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/test.html +7 -0
- data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +51 -0
- data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +682 -0
- data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +22 -2
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +28 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +78 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +50 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +63 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1746 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2885 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +747 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +46 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +28 -10
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +4 -3
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +88 -42
- data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +15 -12
- data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +110 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
- data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +6 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +60 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +9 -10
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +57 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +63 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +65 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +65 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +67 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +67 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +93 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +61 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +63 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +90 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +78 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +220 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +154 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +134 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +134 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +140 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +3 -2
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +2 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +2 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +21 -1
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +2 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +2 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +2 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +7 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call/closure_stdcall.c → libffi.closures/closure_simple.c} +13 -16
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +22 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +26 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +28 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +33 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +8 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +23 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +25 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +40 -8
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +17 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +23 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +17 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +17 -4
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +113 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +26 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +17 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +33 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +23 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +29 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +32 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +28 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +43 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +29 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +18 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +18 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +18 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +23 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +23 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +24 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +44 -31
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +44 -9
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +23 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +22 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +22 -7
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +23 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +22 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +23 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +24 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +7 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +21 -9
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +4 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +13 -3
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +34 -11
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c +70 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c +55 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +5 -1
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +6 -1
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +6 -2
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +7 -2
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +22 -10
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +3 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +2 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +125 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +3 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +49 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +49 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +8 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +3 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +2 -3
- data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +57 -56
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +38 -15
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +9 -9
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +19 -6
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +137 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +115 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct2.c +15 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +15 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +14 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +14 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +17 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +14 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +17 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +17 -6
- data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +102 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +101 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large.c +7 -7
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +7 -7
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +6 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +7 -6
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +8 -3
- data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest.cc +4 -10
- data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.closures}/unwindtest_ffi_call.cc +4 -2
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
- data/ext/ffi_c/libffi.bsd.mk +14 -8
- data/ext/ffi_c/libffi.darwin.mk +56 -26
- data/ext/ffi_c/libffi.gnu.mk +9 -6
- data/ext/ffi_c/libffi.mk +13 -8
- data/ext/ffi_c/libffi.vc.mk +26 -0
- data/ext/ffi_c/libffi.vc64.mk +26 -0
- data/ext/ffi_c/rbffi.h +34 -6
- data/ext/ffi_c/{endian.h → rbffi_endian.h} +21 -2
- data/ffi.gemspec +42 -0
- data/lib/ffi/abstract_memory.rb +44 -0
- data/lib/ffi/autopointer.rb +111 -52
- data/lib/ffi/compat.rb +43 -0
- data/lib/ffi/data_converter.rb +67 -0
- data/lib/ffi/dynamic_library.rb +118 -0
- data/lib/ffi/enum.rb +203 -22
- data/lib/ffi/errno.rb +27 -12
- data/lib/ffi/ffi.rb +88 -11
- data/lib/ffi/function.rb +71 -0
- data/lib/ffi/io.rb +35 -14
- data/lib/ffi/library.rb +382 -96
- data/lib/ffi/library_path.rb +109 -0
- data/lib/ffi/managedstruct.rb +64 -35
- data/lib/ffi/memorypointer.rb +1 -33
- data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
- data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
- data/lib/ffi/platform/aarch64-freebsd12/types.conf +181 -0
- data/lib/ffi/platform/aarch64-linux/types.conf +175 -0
- data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
- data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
- data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
- data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
- data/lib/ffi/platform/arm-linux/types.conf +132 -0
- data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
- data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -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-freebsd12/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 +52 -0
- data/lib/ffi/platform/ia64-linux/types.conf +104 -0
- data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
- data/lib/ffi/platform/mips-linux/types.conf +102 -0
- data/lib/ffi/platform/mips64-linux/types.conf +104 -0
- data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
- data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
- data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
- data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
- data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
- data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -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 +130 -0
- data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
- data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
- data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
- data/lib/ffi/platform/riscv64-linux/types.conf +104 -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-linux/types.conf +102 -0
- data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
- data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
- data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
- data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
- data/lib/ffi/platform/x86_64-darwin/types.conf +130 -0
- data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
- data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
- data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
- data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
- data/lib/ffi/platform/x86_64-linux/types.conf +132 -0
- data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
- data/lib/ffi/platform/x86_64-netbsd/types.conf +128 -0
- data/lib/ffi/platform/x86_64-openbsd/types.conf +134 -0
- data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
- data/lib/ffi/platform/x86_64-windows/types.conf +52 -0
- data/lib/ffi/platform.rb +110 -34
- data/lib/ffi/pointer.rb +117 -90
- data/lib/ffi/struct.rb +101 -70
- data/lib/ffi/struct_by_reference.rb +72 -0
- data/lib/ffi/struct_layout.rb +96 -0
- data/lib/ffi/struct_layout_builder.rb +90 -21
- data/lib/ffi/tools/const_generator.rb +86 -31
- data/lib/ffi/tools/generator.rb +49 -2
- data/lib/ffi/tools/generator_task.rb +13 -16
- data/lib/ffi/tools/struct_generator.rb +6 -5
- data/lib/ffi/tools/types_generator.rb +25 -11
- data/lib/ffi/types.rb +105 -36
- data/lib/ffi/union.rb +23 -12
- data/lib/ffi/variadic.rb +44 -29
- data/lib/ffi/version.rb +3 -0
- data/lib/ffi.rb +25 -9
- data/rakelib/ffi_gem_helper.rb +65 -0
- data/samples/getlogin.rb +8 -0
- data/samples/getpid.rb +8 -0
- data/samples/gettimeofday.rb +18 -0
- data/samples/hello.rb +8 -0
- data/samples/hello_ractor.rb +11 -0
- data/samples/inotify.rb +60 -0
- data/samples/pty.rb +75 -0
- data/samples/qsort.rb +20 -0
- data/samples/qsort_ractor.rb +28 -0
- data/sig/ffi/abstract_memory.rbs +165 -0
- data/sig/ffi/auto_pointer.rbs +26 -0
- data/sig/ffi/buffer.rbs +18 -0
- data/sig/ffi/data_converter.rbs +10 -0
- data/sig/ffi/dynamic_library.rbs +9 -0
- data/sig/ffi/enum.rbs +38 -0
- data/sig/ffi/function.rbs +39 -0
- data/sig/ffi/library.rbs +42 -0
- data/sig/ffi/native_type.rbs +86 -0
- data/sig/ffi/pointer.rbs +42 -0
- data/sig/ffi/struct.rbs +76 -0
- data/sig/ffi/struct_by_reference.rbs +11 -0
- data/sig/ffi/struct_by_value.rbs +7 -0
- data/sig/ffi/struct_layout.rbs +9 -0
- data/sig/ffi/struct_layout_builder.rbs +5 -0
- data/sig/ffi/type.rbs +39 -0
- data/sig/ffi.rbs +26 -0
- data.tar.gz.sig +0 -0
- metadata +547 -248
- metadata.gz.sig +0 -0
- data/History.txt +0 -109
- data/README.rdoc +0 -70
- data/ext/ffi_c/DataConverter.c +0 -62
- data/ext/ffi_c/StructByReference.c +0 -150
- data/ext/ffi_c/StructByReference.h +0 -50
- data/ext/ffi_c/libffi/ChangeLog.libffi +0 -658
- data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
- data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
- data/ext/ffi_c/libffi/README +0 -306
- data/ext/ffi_c/libffi/aclocal.m4 +0 -8998
- data/ext/ffi_c/libffi/depcomp +0 -584
- data/ext/ffi_c/libffi/doc/libffi.info +0 -533
- data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
- data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7360
- data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -368
- data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
- data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
- data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -92
- data/ext/ffi_c/libffi/mdate-sh +0 -201
- data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
- data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
- data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
- data/ext/ffi_c/libffi/src/x86/win32.S +0 -877
- data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
- data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
- data/ext/ffi_c/libffi/texinfo.tex +0 -7210
- data/gen/Rakefile +0 -14
- data/spec/ffi/async_callback_spec.rb +0 -23
- data/spec/ffi/bool_spec.rb +0 -24
- data/spec/ffi/buffer_spec.rb +0 -202
- data/spec/ffi/callback_spec.rb +0 -653
- data/spec/ffi/custom_param_type.rb +0 -31
- data/spec/ffi/custom_type_spec.rb +0 -73
- data/spec/ffi/enum_spec.rb +0 -183
- data/spec/ffi/errno_spec.rb +0 -13
- data/spec/ffi/ffi_spec.rb +0 -24
- data/spec/ffi/function_spec.rb +0 -73
- data/spec/ffi/library_spec.rb +0 -174
- data/spec/ffi/managed_struct_spec.rb +0 -56
- data/spec/ffi/number_spec.rb +0 -231
- data/spec/ffi/pointer_spec.rb +0 -210
- data/spec/ffi/rbx/attach_function_spec.rb +0 -28
- data/spec/ffi/rbx/memory_pointer_spec.rb +0 -109
- data/spec/ffi/rbx/spec_helper.rb +0 -1
- data/spec/ffi/rbx/struct_spec.rb +0 -13
- data/spec/ffi/spec_helper.rb +0 -21
- data/spec/ffi/string_spec.rb +0 -103
- data/spec/ffi/strptr_spec.rb +0 -36
- data/spec/ffi/struct_callback_spec.rb +0 -64
- data/spec/ffi/struct_initialize_spec.rb +0 -30
- data/spec/ffi/struct_packed_spec.rb +0 -46
- data/spec/ffi/struct_spec.rb +0 -638
- data/spec/ffi/typedef_spec.rb +0 -62
- data/spec/ffi/union_spec.rb +0 -60
- data/spec/ffi/variadic_spec.rb +0 -84
- data/spec/spec.opts +0 -4
- data/tasks/ann.rake +0 -80
- data/tasks/extension.rake +0 -25
- data/tasks/gem.rake +0 -200
- data/tasks/git.rake +0 -41
- data/tasks/notes.rake +0 -27
- data/tasks/post_load.rake +0 -34
- data/tasks/rdoc.rake +0 -50
- data/tasks/rubyforge.rake +0 -55
- data/tasks/setup.rb +0 -301
- data/tasks/spec.rake +0 -54
- data/tasks/svn.rake +0 -47
- data/tasks/test.rake +0 -40
- /data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
- /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
- /data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
@@ -3,25 +3,41 @@ require 'open3'
|
|
3
3
|
|
4
4
|
module FFI
|
5
5
|
|
6
|
-
##
|
7
6
|
# ConstGenerator turns C constants into ruby values.
|
8
|
-
|
7
|
+
#
|
8
|
+
# @example a simple example for stdio
|
9
|
+
# require 'ffi/tools/const_generator'
|
10
|
+
# cg = FFI::ConstGenerator.new('stdio') do |gen|
|
11
|
+
# gen.const(:SEEK_SET)
|
12
|
+
# gen.const('SEEK_CUR')
|
13
|
+
# gen.const('seek_end') # this constant does not exist
|
14
|
+
# end # #calculate called automatically at the end of the block
|
15
|
+
#
|
16
|
+
# cg['SEEK_SET'] # => 0
|
17
|
+
# cg['SEEK_CUR'] # => 1
|
18
|
+
# cg['seek_end'] # => nil
|
19
|
+
# cg.to_ruby # => "SEEK_SET = 0\nSEEK_CUR = 1\n# seek_end not available"
|
9
20
|
class ConstGenerator
|
10
21
|
@options = {}
|
11
22
|
attr_reader :constants
|
12
23
|
|
13
|
-
##
|
14
24
|
# Creates a new constant generator that uses +prefix+ as a name, and an
|
15
25
|
# options hash.
|
16
26
|
#
|
17
|
-
# The only option is
|
27
|
+
# The only option is +:required+, which if set to +true+ raises an error if a
|
18
28
|
# constant you have requested was not found.
|
19
29
|
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
|
30
|
+
# @param [#to_s] prefix
|
31
|
+
# @param [Hash] options
|
32
|
+
# @return
|
33
|
+
# @option options [Boolean] :required
|
34
|
+
# @overload initialize(prefix, options)
|
35
|
+
# @overload initialize(prefix, options) { |gen| ... }
|
36
|
+
# @yieldparam [ConstGenerator] gen new generator is passed to the block
|
37
|
+
# When passed a block, {#calculate} is automatically called at the end of
|
38
|
+
# the block, otherwise you must call it yourself.
|
23
39
|
def initialize(prefix = nil, options = {})
|
24
|
-
@includes = []
|
40
|
+
@includes = ['stdio.h', 'stddef.h']
|
25
41
|
@constants = {}
|
26
42
|
@prefix = prefix
|
27
43
|
|
@@ -33,23 +49,40 @@ module FFI
|
|
33
49
|
calculate self.class.options.merge(options)
|
34
50
|
end
|
35
51
|
end
|
52
|
+
# Set class options
|
53
|
+
# These options are merged with {#initialize} options when it is called with a block.
|
54
|
+
# @param [Hash] options
|
55
|
+
# @return [Hash] class options
|
36
56
|
def self.options=(options)
|
37
57
|
@options = options
|
38
58
|
end
|
59
|
+
# Get class options.
|
60
|
+
# @return [Hash] class options
|
39
61
|
def self.options
|
40
62
|
@options
|
41
63
|
end
|
64
|
+
# @param [String] name
|
65
|
+
# @return constant value (converted if a +converter+ was defined).
|
66
|
+
# Access a constant by name.
|
42
67
|
def [](name)
|
43
|
-
@constants[name].
|
68
|
+
@constants[name].converted_value
|
44
69
|
end
|
45
70
|
|
46
|
-
|
47
|
-
#
|
48
|
-
#
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
52
|
-
|
71
|
+
# Request the value for C constant +name+.
|
72
|
+
#
|
73
|
+
# @param [#to_s] name C constant name
|
74
|
+
# @param [String] format a printf format string to print the value out
|
75
|
+
# @param [String] cast a C cast for the value
|
76
|
+
# @param ruby_name alternate ruby name for {#to_ruby}
|
77
|
+
#
|
78
|
+
# @overload const(name, format=nil, cast='', ruby_name=nil, converter=nil)
|
79
|
+
# +converter+ is a Method or a Proc.
|
80
|
+
# @param [#call] converter convert the value from a string to the appropriate
|
81
|
+
# type for {#to_ruby}.
|
82
|
+
# @overload const(name, format=nil, cast='', ruby_name=nil) { |value| ... }
|
83
|
+
# Use a converter block. This block convert the value from a string to the
|
84
|
+
# appropriate type for {#to_ruby}.
|
85
|
+
# @yieldparam value constant value
|
53
86
|
def const(name, format = nil, cast = '', ruby_name = nil, converter = nil,
|
54
87
|
&converter_proc)
|
55
88
|
format ||= '%d'
|
@@ -66,18 +99,20 @@ module FFI
|
|
66
99
|
return const
|
67
100
|
end
|
68
101
|
|
102
|
+
# Calculate constants values.
|
103
|
+
# @param [Hash] options
|
104
|
+
# @option options [String] :cppflags flags for C compiler
|
105
|
+
# @return [nil]
|
106
|
+
# @raise if a constant is missing and +:required+ was set to +true+ (see {#initialize})
|
69
107
|
def calculate(options = {})
|
70
|
-
|
108
|
+
binary_path = nil
|
71
109
|
|
72
110
|
Tempfile.open("#{@prefix}.const_generator") do |f|
|
73
|
-
f.
|
74
|
-
|
111
|
+
binary_path = f.path + ".bin"
|
75
112
|
@includes.each do |inc|
|
76
113
|
f.puts "#include <#{inc}>"
|
77
114
|
end
|
78
|
-
|
79
|
-
f.puts "#include <stddef.h>\n\n"
|
80
|
-
f.puts "int main(int argc, char **argv)\n{"
|
115
|
+
f.puts "\nint main(int argc, char **argv)\n{"
|
81
116
|
|
82
117
|
@constants.each_value do |const|
|
83
118
|
f.puts <<-EOF
|
@@ -90,7 +125,8 @@ module FFI
|
|
90
125
|
f.puts "\n\treturn 0;\n}"
|
91
126
|
f.flush
|
92
127
|
|
93
|
-
|
128
|
+
cc = ENV['CC'] || 'gcc'
|
129
|
+
output = `#{cc} #{options[:cppflags]} -D_DARWIN_USE_64_BIT_INODE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -x c -Wall -Werror #{f.path} -o #{binary_path} 2>&1`
|
94
130
|
|
95
131
|
unless $?.success? then
|
96
132
|
output = output.split("\n").map { |l| "\t#{l}" }.join "\n"
|
@@ -98,8 +134,8 @@ module FFI
|
|
98
134
|
end
|
99
135
|
end
|
100
136
|
|
101
|
-
output = `#{
|
102
|
-
File.unlink(
|
137
|
+
output = `#{binary_path}`
|
138
|
+
File.unlink(binary_path + (FFI::Platform.windows? ? ".exe" : ""))
|
103
139
|
output.each_line do |line|
|
104
140
|
line =~ /^(\S+)\s(.*)$/
|
105
141
|
const = @constants[$1]
|
@@ -115,17 +151,19 @@ module FFI
|
|
115
151
|
end
|
116
152
|
end
|
117
153
|
|
154
|
+
# Dump constants to +io+.
|
155
|
+
# @param [#puts] io
|
156
|
+
# @return [nil]
|
118
157
|
def dump_constants(io)
|
119
158
|
@constants.each do |name, constant|
|
120
|
-
name = [@prefix, name].join '.'
|
159
|
+
name = [@prefix, name].join '.' if @prefix
|
121
160
|
io.puts "#{name} = #{constant.converted_value}"
|
122
161
|
end
|
123
162
|
end
|
124
163
|
|
125
|
-
##
|
126
164
|
# Outputs values for discovered constants. If the constant's value was
|
127
165
|
# not discovered it is not omitted.
|
128
|
-
|
166
|
+
# @return [String]
|
129
167
|
def to_ruby
|
130
168
|
@constants.sort_by { |name,| name }.map do |name, constant|
|
131
169
|
if constant.value.nil? then
|
@@ -136,17 +174,28 @@ module FFI
|
|
136
174
|
end.join "\n"
|
137
175
|
end
|
138
176
|
|
139
|
-
|
140
|
-
|
177
|
+
# Add additional C include file(s) to calculate constants from.
|
178
|
+
# @note +stdio.h+ and +stddef.h+ automatically included
|
179
|
+
# @param [List<String>, Array<String>] i include file(s)
|
180
|
+
# @return [Array<String>] array of include files
|
181
|
+
def include(*i)
|
182
|
+
@includes |= i.flatten
|
141
183
|
end
|
142
184
|
|
143
185
|
end
|
144
186
|
|
187
|
+
# This class hold constants for {ConstGenerator}
|
145
188
|
class ConstGenerator::Constant
|
146
189
|
|
147
190
|
attr_reader :name, :format, :cast
|
148
191
|
attr_accessor :value
|
149
192
|
|
193
|
+
# @param [#to_s] name
|
194
|
+
# @param [String] format a printf format string to print the value out
|
195
|
+
# @param [String] cast a C cast for the value
|
196
|
+
# @param ruby_name alternate ruby name for {#to_ruby}
|
197
|
+
# @param [#call] converter convert the value from a string to the appropriate
|
198
|
+
# type for {#to_ruby}.
|
150
199
|
def initialize(name, format, cast, ruby_name = nil, converter=nil)
|
151
200
|
@name = name
|
152
201
|
@format = format
|
@@ -156,6 +205,8 @@ module FFI
|
|
156
205
|
@value = nil
|
157
206
|
end
|
158
207
|
|
208
|
+
# Return constant value (converted if a +converter+ was defined).
|
209
|
+
# @return constant value.
|
159
210
|
def converted_value
|
160
211
|
if @converter
|
161
212
|
@converter.call(@value)
|
@@ -164,14 +215,18 @@ module FFI
|
|
164
215
|
end
|
165
216
|
end
|
166
217
|
|
218
|
+
# get constant ruby name
|
219
|
+
# @return [String]
|
167
220
|
def ruby_name
|
168
221
|
@ruby_name || @name
|
169
222
|
end
|
170
223
|
|
224
|
+
# Get an evaluable string from constant.
|
225
|
+
# @return [String]
|
171
226
|
def to_ruby
|
172
227
|
"#{ruby_name} = #{converted_value}"
|
173
228
|
end
|
174
229
|
|
175
|
-
end
|
230
|
+
end
|
176
231
|
|
177
232
|
end
|
data/lib/ffi/tools/generator.rb
CHANGED
@@ -1,4 +1,51 @@
|
|
1
|
+
require 'ffi/tools/struct_generator'
|
2
|
+
require 'ffi/tools/const_generator'
|
3
|
+
|
1
4
|
module FFI
|
5
|
+
|
6
|
+
##
|
7
|
+
# Generate files with C structs for FFI::Struct and C constants.
|
8
|
+
#
|
9
|
+
# == A simple example
|
10
|
+
#
|
11
|
+
# In file +zlib.rb.ffi+:
|
12
|
+
# module Zlib
|
13
|
+
# @@@
|
14
|
+
# constants do |c|
|
15
|
+
# c.include "zlib.h"
|
16
|
+
# c.const :ZLIB_VERNUM
|
17
|
+
# end
|
18
|
+
# @@@
|
19
|
+
#
|
20
|
+
# class ZStream < FFI::Struct
|
21
|
+
#
|
22
|
+
# struct do |s|
|
23
|
+
# s.name "struct z_stream_s"
|
24
|
+
# s.include "zlib.h"
|
25
|
+
#
|
26
|
+
# s.field :next_in, :pointer
|
27
|
+
# s.field :avail_in, :uint
|
28
|
+
# s.field :total_in, :ulong
|
29
|
+
# end
|
30
|
+
# @@@
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# Translate the file:
|
35
|
+
# require "ffi/tools/generator"
|
36
|
+
# FFI::Generator.new "zlib.rb.ffi", "zlib.rb"
|
37
|
+
#
|
38
|
+
# Generates the file +zlib.rb+ with constant values and offsets:
|
39
|
+
# module Zlib
|
40
|
+
# ZLIB_VERNUM = 4784
|
41
|
+
#
|
42
|
+
# class ZStream < FFI::Struct
|
43
|
+
# layout :next_in, :pointer, 0,
|
44
|
+
# :avail_in, :uint, 8,
|
45
|
+
# :total_in, :ulong, 16
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# @see FFI::Generator::Task for easy integration in a Rakefile
|
2
49
|
class Generator
|
3
50
|
|
4
51
|
def initialize(ffi_name, rb_name, options = {})
|
@@ -16,7 +63,7 @@ module FFI
|
|
16
63
|
indent = $1
|
17
64
|
original_lines = $2.count "\n"
|
18
65
|
|
19
|
-
instance_eval $2
|
66
|
+
instance_eval $2, @ffi_name, $`.count("\n")
|
20
67
|
|
21
68
|
new_lines = []
|
22
69
|
@constants.each { |c| new_lines << c.to_ruby }
|
@@ -32,7 +79,7 @@ module FFI
|
|
32
79
|
end
|
33
80
|
|
34
81
|
open @rb_name, 'w' do |f|
|
35
|
-
f.puts "# This file is generated
|
82
|
+
f.puts "# This file is generated from `#{@ffi_name}'. Do not edit."
|
36
83
|
f.puts
|
37
84
|
f.puts new_file
|
38
85
|
end
|
@@ -1,24 +1,21 @@
|
|
1
|
-
|
2
|
-
require 'ffi/struct_generator'
|
3
|
-
require 'ffi/const_generator'
|
4
|
-
require 'ffi/generator'
|
5
|
-
rescue LoadError
|
6
|
-
# from Rakefile
|
7
|
-
require 'lib/ffi/struct_generator'
|
8
|
-
require 'lib/ffi/const_generator'
|
9
|
-
require 'lib/ffi/generator'
|
10
|
-
end
|
11
|
-
|
1
|
+
require 'ffi/tools/generator'
|
12
2
|
require 'rake'
|
13
3
|
require 'rake/tasklib'
|
14
|
-
require 'tempfile'
|
15
4
|
|
16
5
|
##
|
17
|
-
# Rake
|
18
|
-
|
6
|
+
# Add Rake tasks that generate files with C structs for FFI::Struct and C constants.
|
7
|
+
#
|
8
|
+
# @example a simple example for your Rakefile
|
9
|
+
# require "ffi/tools/generator_task"
|
10
|
+
# # Add a task to generate my_object.rb out of my_object.rb.ffi
|
11
|
+
# FFI::Generator::Task.new ["my_object.rb"], cflags: "-I/usr/local/mylibrary"
|
12
|
+
#
|
13
|
+
# The generated files are also added to the 'clear' task.
|
14
|
+
#
|
15
|
+
# @see FFI::Generator for a description of the file content
|
19
16
|
class FFI::Generator::Task < Rake::TaskLib
|
20
17
|
|
21
|
-
def initialize(rb_names)
|
18
|
+
def initialize(rb_names, options={})
|
22
19
|
task :clean do rm_f rb_names end
|
23
20
|
|
24
21
|
rb_names.each do |rb_name|
|
@@ -27,7 +24,7 @@ class FFI::Generator::Task < Rake::TaskLib
|
|
27
24
|
file rb_name => ffi_name do |t|
|
28
25
|
puts "Generating #{rb_name}..." if Rake.application.options.trace
|
29
26
|
|
30
|
-
FFI::Generator.new ffi_name, rb_name
|
27
|
+
FFI::Generator.new ffi_name, rb_name, options
|
31
28
|
end
|
32
29
|
end
|
33
30
|
end
|
@@ -7,15 +7,15 @@ module FFI
|
|
7
7
|
#
|
8
8
|
# Given the @@@ portion in:
|
9
9
|
#
|
10
|
-
#
|
10
|
+
# class Zlib::ZStream < FFI::Struct
|
11
11
|
# @@@
|
12
12
|
# name "struct z_stream_s"
|
13
13
|
# include "zlib.h"
|
14
|
-
#
|
14
|
+
#
|
15
15
|
# field :next_in, :pointer
|
16
16
|
# field :avail_in, :uint
|
17
17
|
# field :total_in, :ulong
|
18
|
-
#
|
18
|
+
#
|
19
19
|
# # ...
|
20
20
|
# @@@
|
21
21
|
# end
|
@@ -82,7 +82,8 @@ module FFI
|
|
82
82
|
f.puts "\n return 0;\n}"
|
83
83
|
f.flush
|
84
84
|
|
85
|
-
|
85
|
+
cc = ENV['CC'] || 'gcc'
|
86
|
+
output = `#{cc} #{options[:cppflags]} #{options[:cflags]} -D_DARWIN_USE_64_BIT_INODE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -x c -Wall -Werror #{f.path} -o #{binary} 2>&1`
|
86
87
|
|
87
88
|
unless $?.success? then
|
88
89
|
@found = false
|
@@ -90,7 +91,7 @@ module FFI
|
|
90
91
|
raise "Compilation error generating struct #{@name} (#{@struct_name}):\n#{output}"
|
91
92
|
end
|
92
93
|
end
|
93
|
-
|
94
|
+
|
94
95
|
output = `#{binary}`.split "\n"
|
95
96
|
File.unlink(binary + (FFI::Platform.windows? ? ".exe" : ""))
|
96
97
|
sizeof = output.shift
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'tempfile'
|
2
2
|
|
3
3
|
module FFI
|
4
|
+
|
5
|
+
# @private
|
4
6
|
class TypesGenerator
|
5
7
|
|
6
8
|
##
|
@@ -45,27 +47,40 @@ module FFI
|
|
45
47
|
typedefs = nil
|
46
48
|
Tempfile.open 'ffi_types_generator' do |io|
|
47
49
|
io.puts <<-C
|
50
|
+
#include <stdint.h>
|
51
|
+
#include <stddef.h>
|
48
52
|
#include <sys/types.h>
|
53
|
+
#if !(defined(WIN32))
|
49
54
|
#include <sys/socket.h>
|
55
|
+
#include <netinet/in.h>
|
50
56
|
#include <sys/resource.h>
|
57
|
+
#endif
|
51
58
|
C
|
52
59
|
|
53
60
|
io.close
|
54
|
-
|
61
|
+
cc = ENV['CC'] || 'gcc'
|
62
|
+
cmd = "#{cc} -E -x c #{options[:cppflags]} -D_DARWIN_USE_64_BIT_INODE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -c"
|
63
|
+
if options[:input]
|
64
|
+
typedefs = File.read(options[:input])
|
65
|
+
elsif options[:remote]
|
66
|
+
typedefs = `ssh #{options[:remote]} #{cmd} - < #{io.path}`
|
67
|
+
else
|
68
|
+
typedefs = `#{cmd} #{io.path}`
|
69
|
+
end
|
55
70
|
end
|
56
|
-
|
57
|
-
code =
|
71
|
+
|
72
|
+
code = []
|
58
73
|
|
59
74
|
typedefs.each_line do |type|
|
60
75
|
# We only care about single line typedef
|
61
76
|
next unless type =~ /typedef/
|
62
77
|
# Ignore unions or structs
|
63
78
|
next if type =~ /union|struct/
|
64
|
-
|
79
|
+
|
65
80
|
# strip off the starting typedef and ending ;
|
66
81
|
type.gsub!(/^(.*typedef\s*)/, "")
|
67
82
|
type.gsub!(/\s*;\s*$/, "")
|
68
|
-
|
83
|
+
|
69
84
|
parts = type.split(/\s+/)
|
70
85
|
def_type = parts.join(" ")
|
71
86
|
|
@@ -87,7 +102,7 @@ module FFI
|
|
87
102
|
else
|
88
103
|
final_type = parts.pop
|
89
104
|
end
|
90
|
-
|
105
|
+
|
91
106
|
def_type = case type
|
92
107
|
when /__QI__/ then "char"
|
93
108
|
when /__HI__/ then "short"
|
@@ -102,22 +117,21 @@ module FFI
|
|
102
117
|
final_type = parts.pop
|
103
118
|
def_type = parts.join(" ")
|
104
119
|
end
|
105
|
-
|
120
|
+
|
106
121
|
if type = TYPE_MAP[def_type]
|
107
|
-
code << "rbx.platform.typedef.#{final_type} = #{type}
|
122
|
+
code << "rbx.platform.typedef.#{final_type} = #{type}"
|
108
123
|
TYPE_MAP[final_type] = TYPE_MAP[def_type]
|
109
124
|
else
|
110
125
|
# Fallback to an ordinary pointer if we don't know the type
|
111
126
|
if def_type =~ /\*/
|
112
|
-
code << "rbx.platform.typedef.#{final_type} = pointer
|
127
|
+
code << "rbx.platform.typedef.#{final_type} = pointer"
|
113
128
|
TYPE_MAP[final_type] = :pointer
|
114
129
|
end
|
115
130
|
end
|
116
131
|
end
|
117
132
|
|
118
|
-
code
|
133
|
+
code.sort.join("\n")
|
119
134
|
end
|
120
|
-
|
121
135
|
end
|
122
136
|
end
|
123
137
|
|
data/lib/ffi/types.rb
CHANGED
@@ -1,51 +1,109 @@
|
|
1
1
|
#
|
2
2
|
# Copyright (C) 2008-2010 Wayne Meissner
|
3
|
-
#
|
3
|
+
# Copyright (c) 2007, 2008 Evan Phoenix
|
4
4
|
#
|
5
5
|
# This file is part of ruby-ffi.
|
6
6
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
7
|
+
# All rights reserved.
|
8
|
+
#
|
9
|
+
# Redistribution and use in source and binary forms, with or without
|
10
|
+
# modification, are permitted provided that the following conditions are met:
|
10
11
|
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
12
|
+
# * Redistributions of source code must retain the above copyright notice, this
|
13
|
+
# list of conditions and the following disclaimer.
|
14
|
+
# * Redistributions in binary form must reproduce the above copyright notice
|
15
|
+
# this list of conditions and the following disclaimer in the documentation
|
16
|
+
# and/or other materials provided with the distribution.
|
17
|
+
# * Neither the name of the Ruby FFI project nor the names of its contributors
|
18
|
+
# may be used to endorse or promote products derived from this software
|
19
|
+
# without specific prior written permission.
|
15
20
|
#
|
16
|
-
#
|
17
|
-
#
|
21
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
22
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
23
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
24
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
25
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
26
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
27
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
28
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
29
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
18
31
|
#
|
19
32
|
|
33
|
+
# see {file:README}
|
20
34
|
module FFI
|
21
35
|
|
22
|
-
|
23
|
-
|
36
|
+
# Unless custom_typedefs already defined in the C-ext?
|
37
|
+
unless defined?(custom_typedefs)
|
38
|
+
# Truffleruby and JRuby don't support Ractor so far.
|
39
|
+
# So they don't need separation between builtin and custom types.
|
40
|
+
def self.custom_typedefs
|
41
|
+
TypeDefs
|
42
|
+
end
|
43
|
+
writable_typemap = true
|
24
44
|
end
|
25
45
|
|
26
|
-
|
27
|
-
typedef old, add
|
28
|
-
end
|
46
|
+
class << self
|
29
47
|
|
48
|
+
private :custom_typedefs
|
30
49
|
|
31
|
-
|
32
|
-
|
33
|
-
|
50
|
+
# @param [Type, DataConverter, Symbol] old type definition used by {FFI.find_type}
|
51
|
+
# @param [Symbol] add new type definition's name to add
|
52
|
+
# @return [Type]
|
53
|
+
# Add a definition type to type definitions.
|
54
|
+
#
|
55
|
+
# The type definition is local per Ractor.
|
56
|
+
def typedef(old, add)
|
57
|
+
tm = custom_typedefs
|
58
|
+
tm[add] = find_type(old)
|
59
|
+
end
|
34
60
|
|
35
|
-
|
36
|
-
|
61
|
+
# (see FFI.typedef)
|
62
|
+
def add_typedef(old, add)
|
63
|
+
typedef old, add
|
64
|
+
end
|
37
65
|
|
38
|
-
|
39
|
-
TypeDefs[
|
66
|
+
private def __typedef(old, add)
|
67
|
+
TypeDefs[add] = find_type(old, TypeDefs)
|
68
|
+
end
|
40
69
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
70
|
+
# @param [Type, DataConverter, Symbol] name
|
71
|
+
# @param [Hash] type_map if nil, {FFI::TypeDefs} is used
|
72
|
+
# @return [Type]
|
73
|
+
# Find a type in +type_map+ ({FFI::TypeDefs}, by default) from
|
74
|
+
# a type objet, a type name (symbol). If +name+ is a {DataConverter},
|
75
|
+
# a new {Type::Mapped} is created.
|
76
|
+
def find_type(name, type_map = nil)
|
77
|
+
if name.is_a?(Type)
|
78
|
+
name
|
79
|
+
|
80
|
+
elsif type_map&.has_key?(name)
|
81
|
+
type_map[name]
|
82
|
+
|
83
|
+
elsif (tm=custom_typedefs).has_key?(name)
|
84
|
+
tm[name]
|
85
|
+
|
86
|
+
elsif TypeDefs.has_key?(name)
|
87
|
+
TypeDefs[name]
|
88
|
+
|
89
|
+
elsif name.is_a?(DataConverter)
|
90
|
+
# Add a typedef so next time the converter is used, it hits the cache
|
91
|
+
tm = (type_map || custom_typedefs)
|
92
|
+
tm[name] = Type::Mapped.new(name)
|
93
|
+
else
|
94
|
+
raise TypeError, "unable to resolve type '#{name}'"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# @param type +type+ is an instance of class accepted by {FFI.find_type}
|
99
|
+
# @return [Integer]
|
100
|
+
# Get +type+ size, in bytes.
|
101
|
+
def type_size(type)
|
102
|
+
find_type(type).size
|
46
103
|
end
|
47
104
|
end
|
48
105
|
|
106
|
+
# List of type definitions
|
49
107
|
TypeDefs.merge!({
|
50
108
|
# The C void type; only useful for function return types
|
51
109
|
:void => Type::VOID,
|
@@ -89,6 +147,9 @@ module FFI
|
|
89
147
|
# C double precision float
|
90
148
|
:double => Type::DOUBLE,
|
91
149
|
|
150
|
+
# C long double
|
151
|
+
:long_double => Type::LONGDOUBLE,
|
152
|
+
|
92
153
|
# Native memory address
|
93
154
|
:pointer => Type::POINTER,
|
94
155
|
|
@@ -120,22 +181,27 @@ module FFI
|
|
120
181
|
:varargs => Type::VARARGS,
|
121
182
|
})
|
122
183
|
|
123
|
-
#
|
184
|
+
# This will convert a pointer to a Ruby string (just like `:string`), but
|
185
|
+
# also allow to work with the pointer itself. This is useful when you want
|
186
|
+
# a Ruby string already containing a copy of the data, but also the pointer
|
187
|
+
# to the data for you to do something with it, like freeing it, in case the
|
188
|
+
# library handed the memory off to the caller (Ruby-FFI).
|
189
|
+
#
|
190
|
+
# It's {typedef}'d as +:strptr+.
|
124
191
|
class StrPtrConverter
|
125
192
|
extend DataConverter
|
126
193
|
native_type Type::POINTER
|
127
194
|
|
195
|
+
# @param [Pointer] val
|
196
|
+
# @param ctx not used
|
197
|
+
# @return [Array(String, Pointer)]
|
198
|
+
# Returns a [ String, Pointer ] tuple so the C memory for the string can be freed
|
128
199
|
def self.from_native(val, ctx)
|
129
|
-
[ val.null? ?
|
200
|
+
[ val.null? ? nil : val.get_string(0), val ]
|
130
201
|
end
|
131
|
-
|
132
202
|
end
|
133
203
|
|
134
|
-
|
135
|
-
|
136
|
-
def self.type_size(type)
|
137
|
-
find_type(type).size
|
138
|
-
end
|
204
|
+
__typedef(StrPtrConverter, :strptr)
|
139
205
|
|
140
206
|
# Load all the platform dependent types
|
141
207
|
begin
|
@@ -144,10 +210,13 @@ module FFI
|
|
144
210
|
f.each_line { |line|
|
145
211
|
if line.index(prefix) == 0
|
146
212
|
new_type, orig_type = line.chomp.slice(prefix.length..-1).split(/\s*=\s*/)
|
147
|
-
|
213
|
+
__typedef(orig_type.to_sym, new_type.to_sym)
|
148
214
|
end
|
149
215
|
}
|
150
216
|
end
|
217
|
+
__typedef :pointer, :caddr_t
|
151
218
|
rescue Errno::ENOENT
|
152
219
|
end
|
220
|
+
|
221
|
+
FFI.make_shareable(TypeDefs) unless writable_typemap
|
153
222
|
end
|