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
data/ext/ffi_c/StructLayout.c
CHANGED
@@ -2,35 +2,37 @@
|
|
2
2
|
* Copyright (c) 2008, 2009, Wayne Meissner
|
3
3
|
* Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com>
|
4
4
|
*
|
5
|
+
* Copyright (c) 2008-2013, Ruby FFI project contributors
|
5
6
|
* All rights reserved.
|
6
7
|
*
|
7
8
|
* Redistribution and use in source and binary forms, with or without
|
8
9
|
* modification, are permitted provided that the following conditions are met:
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
12
|
+
* * Redistributions in binary form must reproduce the above copyright
|
13
|
+
* notice, this list of conditions and the following disclaimer in the
|
14
|
+
* documentation and/or other materials provided with the distribution.
|
15
|
+
* * Neither the name of the Ruby FFI project nor the
|
16
|
+
* names of its contributors may be used to endorse or promote products
|
17
|
+
* derived from this software without specific prior written permission.
|
9
18
|
*
|
10
|
-
*
|
11
|
-
*
|
12
|
-
*
|
13
|
-
*
|
14
|
-
*
|
15
|
-
*
|
16
|
-
*
|
17
|
-
*
|
18
|
-
*
|
19
|
-
*
|
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.
|
19
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
22
|
+
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
23
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
24
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
25
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
26
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
28
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
29
|
*/
|
29
30
|
|
30
31
|
#include <sys/types.h>
|
31
32
|
|
32
|
-
#
|
33
|
-
#include <sys/param.h>
|
33
|
+
#ifndef _MSC_VER
|
34
|
+
# include <sys/param.h>
|
35
|
+
#endif
|
34
36
|
#include <stdint.h>
|
35
37
|
#include <stdbool.h>
|
36
38
|
#include <ruby.h>
|
@@ -41,15 +43,21 @@
|
|
41
43
|
#include "MemoryPointer.h"
|
42
44
|
#include "Function.h"
|
43
45
|
#include "Types.h"
|
44
|
-
#include "Struct.h"
|
45
46
|
#include "StructByValue.h"
|
46
47
|
#include "ArrayType.h"
|
48
|
+
#include "Function.h"
|
49
|
+
#include "MappedType.h"
|
50
|
+
#include "Struct.h"
|
47
51
|
|
48
52
|
#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1)
|
49
53
|
|
50
|
-
static void struct_layout_mark(
|
51
|
-
static void
|
52
|
-
static void
|
54
|
+
static void struct_layout_mark(void *);
|
55
|
+
static void struct_layout_compact(void *);
|
56
|
+
static void struct_layout_free(void *);
|
57
|
+
static size_t struct_layout_memsize(const void *);
|
58
|
+
static void struct_field_mark(void *);
|
59
|
+
static void struct_field_compact(void *);
|
60
|
+
static size_t struct_field_memsize(const void *);
|
53
61
|
|
54
62
|
VALUE rbffi_StructLayoutFieldClass = Qnil;
|
55
63
|
VALUE rbffi_StructLayoutNumberFieldClass = Qnil, rbffi_StructLayoutPointerFieldClass = Qnil;
|
@@ -58,6 +66,33 @@ VALUE rbffi_StructLayoutFunctionFieldClass = Qnil, rbffi_StructLayoutArrayFieldC
|
|
58
66
|
|
59
67
|
VALUE rbffi_StructLayoutClass = Qnil;
|
60
68
|
|
69
|
+
const rb_data_type_t rbffi_struct_layout_data_type = { /* extern */
|
70
|
+
.wrap_struct_name = "FFI::StructLayout",
|
71
|
+
.function = {
|
72
|
+
.dmark = struct_layout_mark,
|
73
|
+
.dfree = struct_layout_free,
|
74
|
+
.dsize = struct_layout_memsize,
|
75
|
+
ffi_compact_callback( struct_layout_compact )
|
76
|
+
},
|
77
|
+
.parent = &rbffi_type_data_type,
|
78
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
79
|
+
// macro to update VALUE references, as to trigger write barriers.
|
80
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
|
81
|
+
};
|
82
|
+
|
83
|
+
const rb_data_type_t rbffi_struct_field_data_type = { /* extern */
|
84
|
+
.wrap_struct_name = "FFI::StructField",
|
85
|
+
.function = {
|
86
|
+
.dmark = struct_field_mark,
|
87
|
+
.dfree = RUBY_TYPED_DEFAULT_FREE,
|
88
|
+
.dsize = struct_field_memsize,
|
89
|
+
ffi_compact_callback( struct_field_compact )
|
90
|
+
},
|
91
|
+
.parent = &rbffi_type_data_type,
|
92
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
93
|
+
// macro to update VALUE references, as to trigger write barriers.
|
94
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
|
95
|
+
};
|
61
96
|
|
62
97
|
static VALUE
|
63
98
|
struct_field_allocate(VALUE klass)
|
@@ -65,20 +100,43 @@ struct_field_allocate(VALUE klass)
|
|
65
100
|
StructField* field;
|
66
101
|
VALUE obj;
|
67
102
|
|
68
|
-
obj =
|
69
|
-
field->rbType
|
70
|
-
field->rbName
|
103
|
+
obj = TypedData_Make_Struct(klass, StructField, &rbffi_struct_field_data_type, field);
|
104
|
+
RB_OBJ_WRITE(obj, &field->rbType, Qnil);
|
105
|
+
RB_OBJ_WRITE(obj, &field->rbName, Qnil);
|
71
106
|
|
72
107
|
return obj;
|
73
108
|
}
|
74
109
|
|
75
110
|
static void
|
76
|
-
struct_field_mark(
|
111
|
+
struct_field_mark(void *data)
|
112
|
+
{
|
113
|
+
StructField *f = (StructField *)data;
|
114
|
+
rb_gc_mark_movable(f->rbType);
|
115
|
+
rb_gc_mark_movable(f->rbName);
|
116
|
+
}
|
117
|
+
|
118
|
+
static void
|
119
|
+
struct_field_compact(void *data)
|
120
|
+
{
|
121
|
+
StructField *f = (StructField *)data;
|
122
|
+
ffi_gc_location(f->rbType);
|
123
|
+
ffi_gc_location(f->rbName);
|
124
|
+
}
|
125
|
+
|
126
|
+
static size_t
|
127
|
+
struct_field_memsize(const void *data)
|
77
128
|
{
|
78
|
-
|
79
|
-
rb_gc_mark(f->rbName);
|
129
|
+
return sizeof(StructField);
|
80
130
|
}
|
81
131
|
|
132
|
+
/*
|
133
|
+
* call-seq: initialize(name, offset, type)
|
134
|
+
* @param [String,Symbol] name
|
135
|
+
* @param [Integer] offset
|
136
|
+
* @param [FFI::Type] type
|
137
|
+
* @return [self]
|
138
|
+
* A new FFI::StructLayout::Field instance.
|
139
|
+
*/
|
82
140
|
static VALUE
|
83
141
|
struct_field_initialize(int argc, VALUE* argv, VALUE self)
|
84
142
|
{
|
@@ -86,7 +144,7 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
|
|
86
144
|
StructField* field;
|
87
145
|
int nargs;
|
88
146
|
|
89
|
-
|
147
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
90
148
|
|
91
149
|
nargs = rb_scan_args(argc, argv, "3", &rbName, &rbOffset, &rbType);
|
92
150
|
|
@@ -103,61 +161,109 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
|
|
103
161
|
}
|
104
162
|
|
105
163
|
field->offset = NUM2UINT(rbOffset);
|
106
|
-
field->rbName
|
107
|
-
field->rbType
|
108
|
-
|
164
|
+
RB_OBJ_WRITE(self, &field->rbName, (TYPE(rbName) == T_SYMBOL) ? rbName : rb_str_intern(rbName));
|
165
|
+
RB_OBJ_WRITE(self, &field->rbType, rbType);
|
166
|
+
TypedData_Get_Struct(field->rbType, Type, &rbffi_type_data_type, field->type);
|
109
167
|
field->memoryOp = get_memory_op(field->type);
|
168
|
+
field->referenceIndex = -1;
|
169
|
+
|
170
|
+
switch (field->type->nativeType == NATIVE_MAPPED ? ((MappedType *) field->type)->type->nativeType : field->type->nativeType) {
|
171
|
+
case NATIVE_FUNCTION:
|
172
|
+
case NATIVE_POINTER:
|
173
|
+
field->referenceRequired = true;
|
174
|
+
break;
|
175
|
+
|
176
|
+
default:
|
177
|
+
field->referenceRequired = (rb_respond_to(self, rb_intern("reference_required?"))
|
178
|
+
&& RTEST(rb_funcall2(self, rb_intern("reference_required?"), 0, NULL)))
|
179
|
+
|| (rb_respond_to(rbType, rb_intern("reference_required?"))
|
180
|
+
&& RTEST(rb_funcall2(rbType, rb_intern("reference_required?"), 0, NULL)));
|
181
|
+
break;
|
182
|
+
}
|
183
|
+
|
184
|
+
rb_obj_freeze(self);
|
110
185
|
|
111
186
|
return self;
|
112
187
|
}
|
113
188
|
|
189
|
+
/*
|
190
|
+
* call-seq: offset
|
191
|
+
* @return [Integer]
|
192
|
+
* Get the field offset.
|
193
|
+
*/
|
114
194
|
static VALUE
|
115
195
|
struct_field_offset(VALUE self)
|
116
196
|
{
|
117
197
|
StructField* field;
|
118
|
-
|
198
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
119
199
|
return UINT2NUM(field->offset);
|
120
200
|
}
|
121
201
|
|
202
|
+
/*
|
203
|
+
* call-seq: size
|
204
|
+
* @return [Integer]
|
205
|
+
* Get the field size.
|
206
|
+
*/
|
122
207
|
static VALUE
|
123
208
|
struct_field_size(VALUE self)
|
124
209
|
{
|
125
210
|
StructField* field;
|
126
|
-
|
211
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
127
212
|
return UINT2NUM(field->type->ffiType->size);
|
128
213
|
}
|
129
214
|
|
215
|
+
/*
|
216
|
+
* call-seq: alignment
|
217
|
+
* @return [Integer]
|
218
|
+
* Get the field alignment.
|
219
|
+
*/
|
130
220
|
static VALUE
|
131
221
|
struct_field_alignment(VALUE self)
|
132
222
|
{
|
133
223
|
StructField* field;
|
134
|
-
|
224
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
135
225
|
return UINT2NUM(field->type->ffiType->alignment);
|
136
226
|
}
|
137
227
|
|
228
|
+
/*
|
229
|
+
* call-seq: type
|
230
|
+
* @return [Type]
|
231
|
+
* Get the field type.
|
232
|
+
*/
|
138
233
|
static VALUE
|
139
234
|
struct_field_type(VALUE self)
|
140
235
|
{
|
141
236
|
StructField* field;
|
142
|
-
|
237
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
143
238
|
|
144
239
|
return field->rbType;
|
145
240
|
}
|
146
241
|
|
242
|
+
/*
|
243
|
+
* call-seq: name
|
244
|
+
* @return [Symbol]
|
245
|
+
* Get the field name.
|
246
|
+
*/
|
147
247
|
static VALUE
|
148
248
|
struct_field_name(VALUE self)
|
149
249
|
{
|
150
250
|
StructField* field;
|
151
|
-
|
251
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
152
252
|
return field->rbName;
|
153
253
|
}
|
154
254
|
|
255
|
+
/*
|
256
|
+
* call-seq: get(pointer)
|
257
|
+
* @param [AbstractMemory] pointer pointer on a {Struct}
|
258
|
+
* @return [Object]
|
259
|
+
* Get an object of type {#type} from memory pointed by +pointer+.
|
260
|
+
*/
|
155
261
|
static VALUE
|
156
262
|
struct_field_get(VALUE self, VALUE pointer)
|
157
263
|
{
|
158
264
|
StructField* f;
|
159
265
|
|
160
|
-
|
266
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
161
267
|
if (f->memoryOp == NULL) {
|
162
268
|
rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(f->rbType));
|
163
269
|
return Qnil;
|
@@ -166,12 +272,19 @@ struct_field_get(VALUE self, VALUE pointer)
|
|
166
272
|
return (*f->memoryOp->get)(MEMORY(pointer), f->offset);
|
167
273
|
}
|
168
274
|
|
275
|
+
/*
|
276
|
+
* call-seq: put(pointer, value)
|
277
|
+
* @param [AbstractMemory] pointer pointer on a {Struct}
|
278
|
+
* @param [Object] value this object must be a kind of {#type}
|
279
|
+
* @return [self]
|
280
|
+
* Put an object to memory pointed by +pointer+.
|
281
|
+
*/
|
169
282
|
static VALUE
|
170
283
|
struct_field_put(VALUE self, VALUE pointer, VALUE value)
|
171
284
|
{
|
172
285
|
StructField* f;
|
173
|
-
|
174
|
-
|
286
|
+
|
287
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
175
288
|
if (f->memoryOp == NULL) {
|
176
289
|
rb_raise(rb_eArgError, "put not supported for %s", rb_obj_classname(f->rbType));
|
177
290
|
return self;
|
@@ -182,23 +295,38 @@ struct_field_put(VALUE self, VALUE pointer, VALUE value)
|
|
182
295
|
return self;
|
183
296
|
}
|
184
297
|
|
298
|
+
/*
|
299
|
+
* call-seq: get(pointer)
|
300
|
+
* @param [AbstractMemory] pointer pointer on a {Struct}
|
301
|
+
* @return [Function]
|
302
|
+
* Get a {Function} from memory pointed by +pointer+.
|
303
|
+
*/
|
185
304
|
static VALUE
|
186
305
|
function_field_get(VALUE self, VALUE pointer)
|
187
306
|
{
|
188
307
|
StructField* f;
|
189
|
-
|
190
|
-
|
308
|
+
|
309
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
191
310
|
|
192
311
|
return rbffi_Function_NewInstance(f->rbType, (*rbffi_AbstractMemoryOps.pointer->get)(MEMORY(pointer), f->offset));
|
193
312
|
}
|
194
313
|
|
314
|
+
/*
|
315
|
+
* call-seq: put(pointer, proc)
|
316
|
+
* @param [AbstractMemory] pointer pointer to a {Struct}
|
317
|
+
* @param [Function, Proc] proc
|
318
|
+
* @return [Function]
|
319
|
+
* Set a {Function} to memory pointed by +pointer+ as a function.
|
320
|
+
*
|
321
|
+
* If a Proc is submitted as +proc+, it is automatically transformed to a {Function}.
|
322
|
+
*/
|
195
323
|
static VALUE
|
196
324
|
function_field_put(VALUE self, VALUE pointer, VALUE proc)
|
197
325
|
{
|
198
326
|
StructField* f;
|
199
327
|
VALUE value = Qnil;
|
200
328
|
|
201
|
-
|
329
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
202
330
|
|
203
331
|
if (NIL_P(proc) || rb_obj_is_kind_of(proc, rbffi_FunctionClass)) {
|
204
332
|
value = proc;
|
@@ -220,6 +348,12 @@ isCharArray(ArrayType* arrayType)
|
|
220
348
|
|| arrayType->componentType->nativeType == NATIVE_UINT8;
|
221
349
|
}
|
222
350
|
|
351
|
+
/*
|
352
|
+
* call-seq: get(pointer)
|
353
|
+
* @param [AbstractMemory] pointer pointer on a {Struct}
|
354
|
+
* @return [FFI::StructLayout::CharArray, FFI::Struct::InlineArray]
|
355
|
+
* Get an array from a {Struct}.
|
356
|
+
*/
|
223
357
|
static VALUE
|
224
358
|
array_field_get(VALUE self, VALUE pointer)
|
225
359
|
{
|
@@ -227,8 +361,8 @@ array_field_get(VALUE self, VALUE pointer)
|
|
227
361
|
ArrayType* array;
|
228
362
|
VALUE argv[2];
|
229
363
|
|
230
|
-
|
231
|
-
|
364
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
365
|
+
TypedData_Get_Struct(f->rbType, ArrayType, &rbffi_array_type_data_type, array);
|
232
366
|
|
233
367
|
argv[0] = pointer;
|
234
368
|
argv[1] = self;
|
@@ -237,24 +371,35 @@ array_field_get(VALUE self, VALUE pointer)
|
|
237
371
|
? rbffi_StructLayoutCharArrayClass : rbffi_StructInlineArrayClass);
|
238
372
|
}
|
239
373
|
|
374
|
+
/*
|
375
|
+
* call-seq: put(pointer, value)
|
376
|
+
* @param [AbstractMemory] pointer pointer on a {Struct}
|
377
|
+
* @param [String, Array] value +value+ may be a String only if array's type is a kind of +int8+
|
378
|
+
* @return [value]
|
379
|
+
* Set an array in a {Struct}.
|
380
|
+
*/
|
240
381
|
static VALUE
|
241
382
|
array_field_put(VALUE self, VALUE pointer, VALUE value)
|
242
383
|
{
|
243
384
|
StructField* f;
|
244
385
|
ArrayType* array;
|
245
|
-
|
246
386
|
|
247
|
-
|
248
|
-
|
249
|
-
|
387
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
388
|
+
TypedData_Get_Struct(f->rbType, ArrayType, &rbffi_array_type_data_type, array);
|
389
|
+
|
250
390
|
if (isCharArray(array) && rb_obj_is_instance_of(value, rb_cString)) {
|
251
391
|
VALUE argv[2];
|
252
392
|
|
253
393
|
argv[0] = INT2FIX(f->offset);
|
254
394
|
argv[1] = value;
|
255
395
|
|
256
|
-
|
257
|
-
|
396
|
+
if (RSTRING_LEN(value) < array->length) {
|
397
|
+
rb_funcall2(pointer, rb_intern("put_string"), 2, argv);
|
398
|
+
} else if (RSTRING_LEN(value) == array->length) {
|
399
|
+
rb_funcall2(pointer, rb_intern("put_bytes"), 2, argv);
|
400
|
+
} else {
|
401
|
+
rb_raise(rb_eIndexError, "String is longer (%ld bytes) than the char array (%d bytes)", RSTRING_LEN(value), array->length);
|
402
|
+
}
|
258
403
|
} else {
|
259
404
|
#ifdef notyet
|
260
405
|
MemoryOp* op;
|
@@ -266,7 +411,7 @@ array_field_put(VALUE self, VALUE pointer, VALUE value)
|
|
266
411
|
rb_raise(rb_eIndexError, "array too large");
|
267
412
|
}
|
268
413
|
|
269
|
-
|
414
|
+
/* clear the contents in case of a short write */
|
270
415
|
checkWrite(memory);
|
271
416
|
checkBounds(memory, f->offset, f->type->ffiType->size);
|
272
417
|
if (count < array->length) {
|
@@ -274,7 +419,7 @@ array_field_put(VALUE self, VALUE pointer, VALUE value)
|
|
274
419
|
0, (array->length - count) * array->componentType->ffiType->size);
|
275
420
|
}
|
276
421
|
|
277
|
-
|
422
|
+
/* now copy each element in */
|
278
423
|
if ((op = get_memory_op(array->componentType)) != NULL) {
|
279
424
|
|
280
425
|
for (i = 0; i < count; ++i) {
|
@@ -287,12 +432,8 @@ array_field_put(VALUE self, VALUE pointer, VALUE value)
|
|
287
432
|
VALUE entry = rb_ary_entry(value, i);
|
288
433
|
Struct* s;
|
289
434
|
|
290
|
-
|
291
|
-
rb_raise(rb_eTypeError, "array element not an instance of FFI::Struct");
|
292
|
-
break;
|
293
|
-
}
|
435
|
+
TypedData_Get_Struct(entry, Struct, &rbffi_struct_data_type, s);
|
294
436
|
|
295
|
-
Data_Get_Struct(entry, Struct, s);
|
296
437
|
checkRead(s->pointer);
|
297
438
|
checkBounds(s->pointer, 0, array->componentType->ffiType->size);
|
298
439
|
|
@@ -318,11 +459,10 @@ struct_layout_allocate(VALUE klass)
|
|
318
459
|
StructLayout* layout;
|
319
460
|
VALUE obj;
|
320
461
|
|
321
|
-
obj =
|
322
|
-
layout->rbFieldMap
|
323
|
-
layout->rbFieldNames
|
324
|
-
layout->rbFields
|
325
|
-
layout->fieldSymbolTable = st_init_numtable();
|
462
|
+
obj = TypedData_Make_Struct(klass, StructLayout, &rbffi_struct_layout_data_type, layout);
|
463
|
+
RB_OBJ_WRITE(obj, &layout->rbFieldMap, Qnil);
|
464
|
+
RB_OBJ_WRITE(obj, &layout->rbFieldNames, Qnil);
|
465
|
+
RB_OBJ_WRITE(obj, &layout->rbFields, Qnil);
|
326
466
|
layout->base.ffiType = xcalloc(1, sizeof(*layout->base.ffiType));
|
327
467
|
layout->base.ffiType->size = 0;
|
328
468
|
layout->base.ffiType->alignment = 0;
|
@@ -331,6 +471,14 @@ struct_layout_allocate(VALUE klass)
|
|
331
471
|
return obj;
|
332
472
|
}
|
333
473
|
|
474
|
+
/*
|
475
|
+
* call-seq: initialize(fields, size, align)
|
476
|
+
* @param [Array<StructLayout::Field>] fields
|
477
|
+
* @param [Integer] size
|
478
|
+
* @param [Integer] align
|
479
|
+
* @return [self]
|
480
|
+
* A new StructLayout instance.
|
481
|
+
*/
|
334
482
|
static VALUE
|
335
483
|
struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
336
484
|
{
|
@@ -338,15 +486,16 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
|
338
486
|
ffi_type* ltype;
|
339
487
|
int i;
|
340
488
|
|
341
|
-
|
342
|
-
layout->fieldCount =
|
343
|
-
layout->rbFieldMap
|
344
|
-
layout->rbFieldNames
|
345
|
-
layout->size = NUM2INT(size);
|
489
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
490
|
+
layout->fieldCount = RARRAY_LENINT(fields);
|
491
|
+
RB_OBJ_WRITE(self, &layout->rbFieldMap, rb_hash_new());
|
492
|
+
RB_OBJ_WRITE(self, &layout->rbFieldNames, rb_ary_new2(layout->fieldCount));
|
493
|
+
layout->size = (int) FFI_ALIGN(NUM2INT(size), NUM2INT(align));
|
346
494
|
layout->align = NUM2INT(align);
|
347
495
|
layout->fields = xcalloc(layout->fieldCount, sizeof(StructField *));
|
348
496
|
layout->ffiTypes = xcalloc(layout->fieldCount + 1, sizeof(ffi_type *));
|
349
|
-
layout->rbFields
|
497
|
+
RB_OBJ_WRITE(self, &layout->rbFields, rb_ary_new2(layout->fieldCount));
|
498
|
+
layout->referenceFieldCount = 0;
|
350
499
|
layout->base.ffiType->elements = layout->ffiTypes;
|
351
500
|
layout->base.ffiType->size = layout->size;
|
352
501
|
layout->base.ffiType->alignment = layout->align;
|
@@ -364,19 +513,24 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
|
364
513
|
}
|
365
514
|
rbName = rb_funcall2(rbField, rb_intern("name"), 0, NULL);
|
366
515
|
|
367
|
-
|
516
|
+
TypedData_Get_Struct(rbField, StructField, &rbffi_struct_field_data_type, field);
|
517
|
+
layout->fields[i] = field;
|
368
518
|
|
369
519
|
if (field->type == NULL || field->type->ffiType == NULL) {
|
370
520
|
rb_raise(rb_eRuntimeError, "type of field %d not supported", i);
|
371
521
|
}
|
372
522
|
|
373
523
|
ftype = field->type->ffiType;
|
374
|
-
if (ftype->size == 0) {
|
524
|
+
if (ftype->size == 0 && i < ((int) layout->fieldCount - 1)) {
|
375
525
|
rb_raise(rb_eTypeError, "type of field %d has zero size", i);
|
376
526
|
}
|
377
527
|
|
378
|
-
|
379
|
-
|
528
|
+
if (field->referenceRequired) {
|
529
|
+
field->referenceIndex = layout->referenceFieldCount++;
|
530
|
+
}
|
531
|
+
|
532
|
+
|
533
|
+
layout->ffiTypes[i] = ftype->size > 0 ? ftype : NULL;
|
380
534
|
rb_hash_aset(layout->rbFieldMap, rbName, rbField);
|
381
535
|
rb_ary_push(layout->rbFields, rbField);
|
382
536
|
rb_ary_push(layout->rbFieldNames, rbName);
|
@@ -386,6 +540,51 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
|
386
540
|
rb_raise(rb_eRuntimeError, "Struct size is zero");
|
387
541
|
}
|
388
542
|
|
543
|
+
rb_obj_freeze(layout->rbFieldMap);
|
544
|
+
rb_obj_freeze(layout->rbFields);
|
545
|
+
rb_obj_freeze(layout->rbFieldNames);
|
546
|
+
rb_obj_freeze(self);
|
547
|
+
|
548
|
+
return self;
|
549
|
+
}
|
550
|
+
|
551
|
+
/*
|
552
|
+
* call-seq: [](field)
|
553
|
+
* @param [Symbol] field
|
554
|
+
* @return [StructLayout::Field]
|
555
|
+
* Get a field from the layout.
|
556
|
+
*/
|
557
|
+
static VALUE
|
558
|
+
struct_layout_union_bang(VALUE self)
|
559
|
+
{
|
560
|
+
const ffi_type *alignment_types[] = { &ffi_type_sint8, &ffi_type_sint16, &ffi_type_sint32, &ffi_type_sint64,
|
561
|
+
&ffi_type_float, &ffi_type_double, &ffi_type_longdouble, NULL };
|
562
|
+
StructLayout* layout;
|
563
|
+
ffi_type *t = NULL;
|
564
|
+
int count, i;
|
565
|
+
|
566
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
567
|
+
|
568
|
+
for (i = 0; alignment_types[i] != NULL; ++i) {
|
569
|
+
if (alignment_types[i]->alignment == layout->align) {
|
570
|
+
t = (ffi_type *) alignment_types[i];
|
571
|
+
break;
|
572
|
+
}
|
573
|
+
}
|
574
|
+
if (t == NULL) {
|
575
|
+
rb_raise(rb_eRuntimeError, "cannot create libffi union representation for alignment %d", layout->align);
|
576
|
+
return Qnil;
|
577
|
+
}
|
578
|
+
|
579
|
+
count = (int) layout->size / (int) t->size;
|
580
|
+
xfree(layout->ffiTypes);
|
581
|
+
layout->ffiTypes = xcalloc(count + 1, sizeof(ffi_type *));
|
582
|
+
layout->base.ffiType->elements = layout->ffiTypes;
|
583
|
+
|
584
|
+
for (i = 0; i < count; ++i) {
|
585
|
+
layout->ffiTypes[i] = t;
|
586
|
+
}
|
587
|
+
|
389
588
|
return self;
|
390
589
|
}
|
391
590
|
|
@@ -394,81 +593,151 @@ struct_layout_aref(VALUE self, VALUE field)
|
|
394
593
|
{
|
395
594
|
StructLayout* layout;
|
396
595
|
|
397
|
-
|
596
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
398
597
|
|
399
598
|
return rb_hash_aref(layout->rbFieldMap, field);
|
400
599
|
}
|
401
600
|
|
601
|
+
/*
|
602
|
+
* call-seq: fields
|
603
|
+
* @return [Array<StructLayout::Field>]
|
604
|
+
* Get fields list.
|
605
|
+
*/
|
402
606
|
static VALUE
|
403
607
|
struct_layout_fields(VALUE self)
|
404
608
|
{
|
405
609
|
StructLayout* layout;
|
406
610
|
|
407
|
-
|
611
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
408
612
|
|
409
613
|
return rb_ary_dup(layout->rbFields);
|
410
614
|
}
|
411
615
|
|
616
|
+
/*
|
617
|
+
* call-seq: members
|
618
|
+
* @return [Array<Symbol>]
|
619
|
+
* Get list of field names.
|
620
|
+
*/
|
412
621
|
static VALUE
|
413
622
|
struct_layout_members(VALUE self)
|
414
623
|
{
|
415
624
|
StructLayout* layout;
|
416
625
|
|
417
|
-
|
626
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
418
627
|
|
419
628
|
return rb_ary_dup(layout->rbFieldNames);
|
420
629
|
}
|
421
630
|
|
631
|
+
/*
|
632
|
+
* call-seq: to_a
|
633
|
+
* @return [Array<StructLayout::Field>]
|
634
|
+
* Get an array of fields.
|
635
|
+
*/
|
422
636
|
static VALUE
|
423
637
|
struct_layout_to_a(VALUE self)
|
424
638
|
{
|
425
639
|
StructLayout* layout;
|
426
640
|
|
427
|
-
|
641
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
428
642
|
|
429
643
|
return rb_ary_dup(layout->rbFields);
|
430
644
|
}
|
431
645
|
|
432
646
|
static void
|
433
|
-
struct_layout_mark(
|
647
|
+
struct_layout_mark(void *data)
|
648
|
+
{
|
649
|
+
StructLayout *layout = (StructLayout *)data;
|
650
|
+
rb_gc_mark_movable(layout->rbFieldMap);
|
651
|
+
rb_gc_mark_movable(layout->rbFieldNames);
|
652
|
+
rb_gc_mark_movable(layout->rbFields);
|
653
|
+
/* The values stored in layout->cache_row.fieldName are primary stored in layout->rbFieldMap and are marked there */
|
654
|
+
}
|
655
|
+
|
656
|
+
static void
|
657
|
+
struct_layout_compact(void *data)
|
434
658
|
{
|
435
|
-
|
436
|
-
|
437
|
-
|
659
|
+
StructLayout *layout = (StructLayout *)data;
|
660
|
+
ffi_gc_location(layout->rbFieldMap);
|
661
|
+
ffi_gc_location(layout->rbFieldNames);
|
662
|
+
ffi_gc_location(layout->rbFields);
|
663
|
+
|
664
|
+
/* Clear the cache, to be safe from changes of fieldName VALUE by GC.compact */
|
665
|
+
memset(&layout->cache_row, 0, sizeof(layout->cache_row));
|
438
666
|
}
|
439
667
|
|
440
668
|
static void
|
441
|
-
struct_layout_free(
|
669
|
+
struct_layout_free(void *data)
|
442
670
|
{
|
671
|
+
StructLayout *layout = (StructLayout *)data;
|
443
672
|
xfree(layout->ffiTypes);
|
444
673
|
xfree(layout->base.ffiType);
|
445
674
|
xfree(layout->fields);
|
446
|
-
st_free_table(layout->fieldSymbolTable);
|
447
675
|
xfree(layout);
|
448
676
|
}
|
449
677
|
|
450
678
|
|
679
|
+
static size_t
|
680
|
+
struct_layout_memsize(const void * data)
|
681
|
+
{
|
682
|
+
const StructLayout *layout = (const StructLayout *)data;
|
683
|
+
size_t memsize = sizeof(StructLayout);
|
684
|
+
memsize += layout->fieldCount * (sizeof(StructField *) + sizeof(ffi_type *));
|
685
|
+
memsize += sizeof(*layout->base.ffiType);
|
686
|
+
return memsize;
|
687
|
+
}
|
688
|
+
|
451
689
|
void
|
452
690
|
rbffi_StructLayout_Init(VALUE moduleFFI)
|
453
691
|
{
|
454
|
-
|
692
|
+
VALUE ffi_Type = rbffi_TypeClass;
|
693
|
+
|
694
|
+
/*
|
695
|
+
* Document-class: FFI::StructLayout < FFI::Type
|
696
|
+
*
|
697
|
+
* This class aims at defining a struct layout.
|
698
|
+
*/
|
699
|
+
rbffi_StructLayoutClass = rb_define_class_under(moduleFFI, "StructLayout", ffi_Type);
|
455
700
|
rb_global_variable(&rbffi_StructLayoutClass);
|
456
|
-
|
701
|
+
|
702
|
+
/*
|
703
|
+
* Document-class: FFI::StructLayout::Field
|
704
|
+
* A field in a {StructLayout}.
|
705
|
+
*/
|
457
706
|
rbffi_StructLayoutFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Field", rb_cObject);
|
458
707
|
rb_global_variable(&rbffi_StructLayoutFieldClass);
|
459
708
|
|
709
|
+
/*
|
710
|
+
* Document-class: FFI::StructLayout::Number
|
711
|
+
* A numeric {Field} in a {StructLayout}.
|
712
|
+
*/
|
460
713
|
rbffi_StructLayoutNumberFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Number", rbffi_StructLayoutFieldClass);
|
461
714
|
rb_global_variable(&rbffi_StructLayoutNumberFieldClass);
|
462
715
|
|
716
|
+
/*
|
717
|
+
* Document-class: FFI::StructLayout::String
|
718
|
+
* A string {Field} in a {StructLayout}.
|
719
|
+
*/
|
463
720
|
rbffi_StructLayoutStringFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "String", rbffi_StructLayoutFieldClass);
|
464
721
|
rb_global_variable(&rbffi_StructLayoutStringFieldClass);
|
465
722
|
|
723
|
+
/*
|
724
|
+
* Document-class: FFI::StructLayout::Pointer
|
725
|
+
* A pointer {Field} in a {StructLayout}.
|
726
|
+
*/
|
466
727
|
rbffi_StructLayoutPointerFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Pointer", rbffi_StructLayoutFieldClass);
|
467
728
|
rb_global_variable(&rbffi_StructLayoutPointerFieldClass);
|
468
729
|
|
730
|
+
/*
|
731
|
+
* Document-class: FFI::StructLayout::Function
|
732
|
+
* A function pointer {Field} in a {StructLayout}.
|
733
|
+
*/
|
469
734
|
rbffi_StructLayoutFunctionFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Function", rbffi_StructLayoutFieldClass);
|
470
735
|
rb_global_variable(&rbffi_StructLayoutFunctionFieldClass);
|
471
736
|
|
737
|
+
/*
|
738
|
+
* Document-class: FFI::StructLayout::Array
|
739
|
+
* An array {Field} in a {StructLayout}.
|
740
|
+
*/
|
472
741
|
rbffi_StructLayoutArrayFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Array", rbffi_StructLayoutFieldClass);
|
473
742
|
rb_global_variable(&rbffi_StructLayoutArrayFieldClass);
|
474
743
|
|
@@ -494,5 +763,7 @@ rbffi_StructLayout_Init(VALUE moduleFFI)
|
|
494
763
|
rb_define_method(rbffi_StructLayoutClass, "fields", struct_layout_fields, 0);
|
495
764
|
rb_define_method(rbffi_StructLayoutClass, "members", struct_layout_members, 0);
|
496
765
|
rb_define_method(rbffi_StructLayoutClass, "to_a", struct_layout_to_a, 0);
|
766
|
+
rb_define_method(rbffi_StructLayoutClass, "__union!", struct_layout_union_bang, 0);
|
497
767
|
|
498
768
|
}
|
769
|
+
|