ffi 1.1.2 → 1.17.0
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 +0 -0
- data/CHANGELOG.md +456 -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 +166 -156
- data/ext/ffi_c/AbstractMemory.c +240 -140
- data/ext/ffi_c/AbstractMemory.h +25 -15
- data/ext/ffi_c/ArrayType.c +78 -29
- data/ext/ffi_c/ArrayType.h +22 -12
- data/ext/ffi_c/Buffer.c +121 -60
- data/ext/ffi_c/Call.c +184 -137
- data/ext/ffi_c/Call.h +46 -22
- data/ext/ffi_c/ClosurePool.c +101 -43
- data/ext/ffi_c/ClosurePool.h +24 -13
- data/ext/ffi_c/DynamicLibrary.c +139 -57
- data/ext/ffi_c/DynamicLibrary.h +70 -12
- data/ext/ffi_c/Function.c +372 -273
- data/ext/ffi_c/Function.h +25 -20
- data/ext/ffi_c/FunctionInfo.c +135 -49
- data/ext/ffi_c/LastError.c +97 -30
- data/ext/ffi_c/LastError.h +21 -12
- data/ext/ffi_c/LongDouble.c +15 -9
- data/ext/ffi_c/LongDouble.h +21 -16
- data/ext/ffi_c/MappedType.c +88 -38
- data/ext/ffi_c/MappedType.h +21 -14
- data/ext/ffi_c/MemoryPointer.c +91 -38
- data/ext/ffi_c/MemoryPointer.h +22 -19
- data/ext/ffi_c/MethodHandle.c +52 -51
- data/ext/ffi_c/MethodHandle.h +24 -14
- data/ext/ffi_c/Platform.c +28 -62
- data/ext/ffi_c/Platform.h +21 -12
- data/ext/ffi_c/Pointer.c +145 -86
- data/ext/ffi_c/Pointer.h +23 -19
- data/ext/ffi_c/Struct.c +363 -163
- data/ext/ffi_c/Struct.h +39 -21
- data/ext/ffi_c/StructByValue.c +72 -37
- data/ext/ffi_c/StructByValue.h +21 -12
- data/ext/ffi_c/StructLayout.c +308 -94
- data/ext/ffi_c/Thread.c +73 -270
- data/ext/ffi_c/Thread.h +32 -35
- data/ext/ffi_c/Type.c +147 -84
- data/ext/ffi_c/Type.h +27 -11
- data/ext/ffi_c/Types.c +40 -24
- data/ext/ffi_c/Types.h +24 -21
- data/ext/ffi_c/Variadic.c +148 -64
- data/ext/ffi_c/compat.h +45 -37
- data/ext/ffi_c/extconf.rb +86 -32
- data/ext/ffi_c/ffi.c +32 -21
- 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} +6366 -3559
- data/ext/ffi_c/libffi/LICENSE +1 -1
- data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +353 -0
- data/ext/ffi_c/libffi/Makefile.am +131 -170
- data/ext/ffi_c/libffi/Makefile.in +1317 -1010
- 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 +222 -17
- data/ext/ffi_c/libffi/config.guess +1033 -780
- data/ext/ffi_c/libffi/config.sub +1393 -1206
- data/ext/ffi_c/libffi/configure +16340 -10740
- data/ext/ffi_c/libffi/configure.ac +226 -271
- 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 +525 -79
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +41 -52
- 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 +201 -79
- data/ext/ffi_c/libffi/include/ffi.h.in +190 -99
- data/ext/ffi_c/libffi/include/ffi_cfi.h +76 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +72 -14
- data/ext/ffi_c/libffi/include/tramp.h +45 -0
- data/ext/ffi_c/libffi/install-sh +231 -210
- 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 +3868 -2068
- 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 +47 -25
- data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +110 -147
- data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +53 -0
- data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +75 -19
- data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +8 -29
- data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +11 -9
- data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +104 -52
- data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +18 -8
- 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 +156 -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 +153 -314
- 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/{include/ffi.h.vc64 → msvc_build/aarch64/aarch64_include/ffi.h} +151 -67
- data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/fficonfig.h +219 -0
- data/ext/ffi_c/libffi/msvcc.sh +176 -20
- 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 +161 -266
- 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 +706 -513
- data/ext/ffi_c/libffi/src/arm/ffitarget.h +32 -8
- data/ext/ffi_c/libffi/src/arm/internal.h +17 -0
- data/ext/ffi_c/libffi/src/arm/sysv.S +372 -413
- data/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S +311 -0
- data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
- 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 +565 -73
- data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
- data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
- 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 +23 -13
- data/ext/ffi_c/libffi/src/frv/ffi.c +2 -2
- data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/ia64/ffi.c +47 -13
- data/ext/ffi_c/libffi/src/ia64/ffitarget.h +8 -2
- data/ext/ffi_c/libffi/src/ia64/unix.S +28 -3
- data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
- 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 +6 -1
- data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
- data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
- 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/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
- 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 +382 -101
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +23 -14
- data/ext/ffi_c/libffi/src/mips/n32.S +321 -89
- data/ext/ffi_c/libffi/src/mips/o32.S +211 -31
- data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
- data/ext/ffi_c/libffi/src/moxie/ffi.c +100 -66
- 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 +62 -108
- data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +28 -12
- 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 +245 -7
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +253 -4
- data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
- data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
- data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +105 -1378
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +157 -52
- 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 +110 -45
- 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 +131 -25
- 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 +9 -1
- 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 +6 -1
- data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
- data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
- data/ext/ffi_c/libffi/src/sparc/ffi64.c +630 -0
- data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
- 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 +686 -498
- data/ext/ffi_c/libffi/src/x86/ffi64.c +444 -129
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +79 -36
- 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 +1198 -394
- data/ext/ffi_c/libffi/src/x86/sysv_intel.S +998 -0
- data/ext/ffi_c/libffi/src/x86/unix64.S +585 -300
- data/ext/ffi_c/libffi/src/x86/win64.S +244 -458
- 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 +233 -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 +360 -28
- 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 -6
- 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 +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +52 -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 +5 -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 +22 -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 +23 -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 +19 -10
- 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 +14 -4
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +32 -12
- 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 +6 -1
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +21 -9
- 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 +7 -5
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +3 -0
- 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 +41 -40
- 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 +6 -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 -8
- 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 +13 -7
- data/ext/ffi_c/libffi.darwin.mk +25 -13
- data/ext/ffi_c/libffi.gnu.mk +4 -3
- data/ext/ffi_c/libffi.mk +11 -6
- data/ext/ffi_c/libffi.vc.mk +1 -1
- data/ext/ffi_c/libffi.vc64.mk +1 -1
- data/ext/ffi_c/rbffi.h +23 -15
- data/ext/ffi_c/rbffi_endian.h +11 -2
- data/ffi.gemspec +42 -0
- data/lib/ffi/abstract_memory.rb +44 -0
- data/lib/ffi/autopointer.rb +65 -68
- 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 +166 -25
- data/lib/ffi/errno.rb +21 -11
- data/lib/ffi/ffi.rb +28 -11
- data/lib/ffi/function.rb +71 -0
- data/lib/ffi/io.rb +25 -15
- data/lib/ffi/library.rb +227 -136
- data/lib/ffi/library_path.rb +109 -0
- data/lib/ffi/managedstruct.rb +64 -35
- 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 +110 -82
- 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 +63 -63
- data/lib/ffi/platform/i386-freebsd/types.conf +89 -89
- data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
- data/lib/ffi/platform/i386-linux/types.conf +77 -77
- data/lib/ffi/platform/i386-netbsd/types.conf +87 -87
- data/lib/ffi/platform/i386-openbsd/types.conf +89 -87
- data/lib/ffi/platform/i386-solaris/types.conf +96 -96
- data/lib/ffi/platform/i386-windows/types.conf +43 -96
- data/lib/ffi/platform/ia64-linux/types.conf +79 -79
- data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
- data/lib/ffi/platform/mips-linux/types.conf +79 -79
- 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 +79 -79
- 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 +155 -155
- data/lib/ffi/platform/powerpc-darwin/types.conf +63 -63
- data/lib/ffi/platform/powerpc-linux/types.conf +108 -78
- 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 +79 -79
- data/lib/ffi/platform/s390x-linux/types.conf +79 -79
- data/lib/ffi/platform/sparc-linux/types.conf +79 -79
- data/lib/ffi/platform/sparc-solaris/types.conf +103 -103
- 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 +103 -103
- 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 +93 -63
- data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
- data/lib/ffi/platform/x86_64-freebsd/types.conf +90 -88
- 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 +107 -77
- data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
- data/lib/ffi/platform/x86_64-netbsd/types.conf +89 -87
- data/lib/ffi/platform/x86_64-openbsd/types.conf +100 -92
- data/lib/ffi/platform/x86_64-solaris/types.conf +96 -96
- data/lib/ffi/platform/x86_64-windows/types.conf +52 -0
- data/lib/ffi/platform.rb +91 -34
- data/lib/ffi/pointer.rb +78 -33
- data/lib/ffi/struct.rb +100 -66
- data/lib/ffi/struct_by_reference.rb +72 -0
- data/lib/ffi/struct_layout.rb +96 -0
- data/lib/ffi/struct_layout_builder.rb +84 -19
- data/lib/ffi/tools/const_generator.rb +11 -8
- data/lib/ffi/tools/generator.rb +48 -1
- 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 +14 -10
- data/lib/ffi/types.rb +96 -51
- 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 +20 -8
- 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 +27 -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 +508 -268
- metadata.gz.sig +1 -0
- data/History.txt +0 -1
- data/README.rdoc +0 -102
- data/ext/ffi_c/DataConverter.c +0 -91
- data/ext/ffi_c/Ffi_c.iml +0 -12
- data/ext/ffi_c/StructByReference.c +0 -158
- data/ext/ffi_c/StructByReference.h +0 -50
- data/ext/ffi_c/libffi/ChangeLog.libffi +0 -584
- data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
- data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
- data/ext/ffi_c/libffi/Makefile.vc +0 -141
- data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
- data/ext/ffi_c/libffi/README +0 -342
- data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
- data/ext/ffi_c/libffi/build-ios.sh +0 -67
- data/ext/ffi_c/libffi/depcomp +0 -630
- data/ext/ffi_c/libffi/doc/libffi.info +0 -593
- data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
- data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
- data/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 +0 -76
- data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7831
- data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
- 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 -98
- data/ext/ffi_c/libffi/mdate-sh +0 -201
- data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
- data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
- 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 -1065
- 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/ext/ffi_c/win32/stdint.h +0 -199
- data/gen/Rakefile +0 -30
- data/lib/Lib.iml +0 -13
- data/spec/ffi/Ffi.iml +0 -12
- data/spec/ffi/async_callback_spec.rb +0 -46
- data/spec/ffi/bool_spec.rb +0 -40
- data/spec/ffi/buffer_spec.rb +0 -215
- data/spec/ffi/callback_spec.rb +0 -668
- data/spec/ffi/custom_param_type.rb +0 -47
- data/spec/ffi/custom_type_spec.rb +0 -85
- data/spec/ffi/dup_spec.rb +0 -65
- data/spec/ffi/enum_spec.rb +0 -227
- data/spec/ffi/errno_spec.rb +0 -29
- data/spec/ffi/ffi_spec.rb +0 -40
- data/spec/ffi/function_spec.rb +0 -87
- data/spec/ffi/library_spec.rb +0 -208
- data/spec/ffi/long_double.rb +0 -41
- data/spec/ffi/managed_struct_spec.rb +0 -72
- data/spec/ffi/number_spec.rb +0 -247
- data/spec/ffi/pointer_spec.rb +0 -214
- data/spec/ffi/rbx/attach_function_spec.rb +0 -28
- data/spec/ffi/rbx/memory_pointer_spec.rb +0 -111
- 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 -35
- data/spec/ffi/string_spec.rb +0 -119
- data/spec/ffi/strptr_spec.rb +0 -61
- data/spec/ffi/struct_callback_spec.rb +0 -80
- data/spec/ffi/struct_initialize_spec.rb +0 -46
- data/spec/ffi/struct_packed_spec.rb +0 -62
- data/spec/ffi/struct_spec.rb +0 -719
- data/spec/ffi/typedef_spec.rb +0 -89
- data/spec/ffi/union_spec.rb +0 -76
- data/spec/ffi/variadic_spec.rb +0 -103
- data/spec/spec.opts +0 -4
- data/tasks/ann.rake +0 -80
- data/tasks/extension.rake +0 -32
- data/tasks/gem.rake +0 -199
- 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/tasks/yard.rake +0 -11
- 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}/err_bad_abi.c +0 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
- data/lib/ffi/platform/{i486-gnu → i386-gnu}/types.conf +84 -84
data/ext/ffi_c/StructLayout.c
CHANGED
@@ -2,35 +2,39 @@
|
|
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
|
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.
|
8
18
|
*
|
9
|
-
*
|
10
|
-
*
|
11
|
-
*
|
12
|
-
*
|
13
|
-
*
|
14
|
-
*
|
15
|
-
*
|
16
|
-
*
|
17
|
-
*
|
18
|
-
*
|
19
|
-
* version 3 along with this work. If not, see <http://www.gnu.org/licenses/>.
|
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.
|
20
29
|
*/
|
21
30
|
|
22
31
|
#include <sys/types.h>
|
23
32
|
|
24
|
-
#include "Function.h"
|
25
33
|
#ifndef _MSC_VER
|
26
|
-
#include <sys/param.h>
|
34
|
+
# include <sys/param.h>
|
35
|
+
#endif
|
27
36
|
#include <stdint.h>
|
28
37
|
#include <stdbool.h>
|
29
|
-
#else
|
30
|
-
typedef int bool;
|
31
|
-
#define true 1
|
32
|
-
#define false 0
|
33
|
-
#endif
|
34
38
|
#include <ruby.h>
|
35
39
|
#include "rbffi.h"
|
36
40
|
#include "compat.h"
|
@@ -39,16 +43,21 @@ typedef int bool;
|
|
39
43
|
#include "MemoryPointer.h"
|
40
44
|
#include "Function.h"
|
41
45
|
#include "Types.h"
|
42
|
-
#include "Struct.h"
|
43
46
|
#include "StructByValue.h"
|
44
47
|
#include "ArrayType.h"
|
48
|
+
#include "Function.h"
|
45
49
|
#include "MappedType.h"
|
50
|
+
#include "Struct.h"
|
46
51
|
|
47
52
|
#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1)
|
48
53
|
|
49
|
-
static void struct_layout_mark(
|
50
|
-
static void
|
51
|
-
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 *);
|
52
61
|
|
53
62
|
VALUE rbffi_StructLayoutFieldClass = Qnil;
|
54
63
|
VALUE rbffi_StructLayoutNumberFieldClass = Qnil, rbffi_StructLayoutPointerFieldClass = Qnil;
|
@@ -57,6 +66,33 @@ VALUE rbffi_StructLayoutFunctionFieldClass = Qnil, rbffi_StructLayoutArrayFieldC
|
|
57
66
|
|
58
67
|
VALUE rbffi_StructLayoutClass = Qnil;
|
59
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
|
+
};
|
60
96
|
|
61
97
|
static VALUE
|
62
98
|
struct_field_allocate(VALUE klass)
|
@@ -64,20 +100,43 @@ struct_field_allocate(VALUE klass)
|
|
64
100
|
StructField* field;
|
65
101
|
VALUE obj;
|
66
102
|
|
67
|
-
obj =
|
68
|
-
field->rbType
|
69
|
-
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);
|
70
106
|
|
71
107
|
return obj;
|
72
108
|
}
|
73
109
|
|
74
110
|
static void
|
75
|
-
struct_field_mark(
|
111
|
+
struct_field_mark(void *data)
|
76
112
|
{
|
77
|
-
|
78
|
-
|
113
|
+
StructField *f = (StructField *)data;
|
114
|
+
rb_gc_mark_movable(f->rbType);
|
115
|
+
rb_gc_mark_movable(f->rbName);
|
79
116
|
}
|
80
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)
|
128
|
+
{
|
129
|
+
return sizeof(StructField);
|
130
|
+
}
|
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
|
+
*/
|
81
140
|
static VALUE
|
82
141
|
struct_field_initialize(int argc, VALUE* argv, VALUE self)
|
83
142
|
{
|
@@ -85,7 +144,7 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
|
|
85
144
|
StructField* field;
|
86
145
|
int nargs;
|
87
146
|
|
88
|
-
|
147
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
89
148
|
|
90
149
|
nargs = rb_scan_args(argc, argv, "3", &rbName, &rbOffset, &rbType);
|
91
150
|
|
@@ -102,15 +161,14 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
|
|
102
161
|
}
|
103
162
|
|
104
163
|
field->offset = NUM2UINT(rbOffset);
|
105
|
-
field->rbName
|
106
|
-
field->rbType
|
107
|
-
|
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);
|
108
167
|
field->memoryOp = get_memory_op(field->type);
|
109
168
|
field->referenceIndex = -1;
|
110
169
|
|
111
170
|
switch (field->type->nativeType == NATIVE_MAPPED ? ((MappedType *) field->type)->type->nativeType : field->type->nativeType) {
|
112
171
|
case NATIVE_FUNCTION:
|
113
|
-
case NATIVE_CALLBACK:
|
114
172
|
case NATIVE_POINTER:
|
115
173
|
field->referenceRequired = true;
|
116
174
|
break;
|
@@ -122,57 +180,90 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
|
|
122
180
|
&& RTEST(rb_funcall2(rbType, rb_intern("reference_required?"), 0, NULL)));
|
123
181
|
break;
|
124
182
|
}
|
125
|
-
|
183
|
+
|
184
|
+
rb_obj_freeze(self);
|
185
|
+
|
126
186
|
return self;
|
127
187
|
}
|
128
188
|
|
189
|
+
/*
|
190
|
+
* call-seq: offset
|
191
|
+
* @return [Integer]
|
192
|
+
* Get the field offset.
|
193
|
+
*/
|
129
194
|
static VALUE
|
130
195
|
struct_field_offset(VALUE self)
|
131
196
|
{
|
132
197
|
StructField* field;
|
133
|
-
|
198
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
134
199
|
return UINT2NUM(field->offset);
|
135
200
|
}
|
136
201
|
|
202
|
+
/*
|
203
|
+
* call-seq: size
|
204
|
+
* @return [Integer]
|
205
|
+
* Get the field size.
|
206
|
+
*/
|
137
207
|
static VALUE
|
138
208
|
struct_field_size(VALUE self)
|
139
209
|
{
|
140
210
|
StructField* field;
|
141
|
-
|
211
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
142
212
|
return UINT2NUM(field->type->ffiType->size);
|
143
213
|
}
|
144
214
|
|
215
|
+
/*
|
216
|
+
* call-seq: alignment
|
217
|
+
* @return [Integer]
|
218
|
+
* Get the field alignment.
|
219
|
+
*/
|
145
220
|
static VALUE
|
146
221
|
struct_field_alignment(VALUE self)
|
147
222
|
{
|
148
223
|
StructField* field;
|
149
|
-
|
224
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
150
225
|
return UINT2NUM(field->type->ffiType->alignment);
|
151
226
|
}
|
152
227
|
|
228
|
+
/*
|
229
|
+
* call-seq: type
|
230
|
+
* @return [Type]
|
231
|
+
* Get the field type.
|
232
|
+
*/
|
153
233
|
static VALUE
|
154
234
|
struct_field_type(VALUE self)
|
155
235
|
{
|
156
236
|
StructField* field;
|
157
|
-
|
237
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
158
238
|
|
159
239
|
return field->rbType;
|
160
240
|
}
|
161
241
|
|
242
|
+
/*
|
243
|
+
* call-seq: name
|
244
|
+
* @return [Symbol]
|
245
|
+
* Get the field name.
|
246
|
+
*/
|
162
247
|
static VALUE
|
163
248
|
struct_field_name(VALUE self)
|
164
249
|
{
|
165
250
|
StructField* field;
|
166
|
-
|
251
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
167
252
|
return field->rbName;
|
168
253
|
}
|
169
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
|
+
*/
|
170
261
|
static VALUE
|
171
262
|
struct_field_get(VALUE self, VALUE pointer)
|
172
263
|
{
|
173
264
|
StructField* f;
|
174
265
|
|
175
|
-
|
266
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
176
267
|
if (f->memoryOp == NULL) {
|
177
268
|
rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(f->rbType));
|
178
269
|
return Qnil;
|
@@ -181,12 +272,19 @@ struct_field_get(VALUE self, VALUE pointer)
|
|
181
272
|
return (*f->memoryOp->get)(MEMORY(pointer), f->offset);
|
182
273
|
}
|
183
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
|
+
*/
|
184
282
|
static VALUE
|
185
283
|
struct_field_put(VALUE self, VALUE pointer, VALUE value)
|
186
284
|
{
|
187
285
|
StructField* f;
|
188
|
-
|
189
|
-
|
286
|
+
|
287
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
190
288
|
if (f->memoryOp == NULL) {
|
191
289
|
rb_raise(rb_eArgError, "put not supported for %s", rb_obj_classname(f->rbType));
|
192
290
|
return self;
|
@@ -197,23 +295,38 @@ struct_field_put(VALUE self, VALUE pointer, VALUE value)
|
|
197
295
|
return self;
|
198
296
|
}
|
199
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
|
+
*/
|
200
304
|
static VALUE
|
201
305
|
function_field_get(VALUE self, VALUE pointer)
|
202
306
|
{
|
203
307
|
StructField* f;
|
204
|
-
|
205
|
-
|
308
|
+
|
309
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
206
310
|
|
207
311
|
return rbffi_Function_NewInstance(f->rbType, (*rbffi_AbstractMemoryOps.pointer->get)(MEMORY(pointer), f->offset));
|
208
312
|
}
|
209
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
|
+
*/
|
210
323
|
static VALUE
|
211
324
|
function_field_put(VALUE self, VALUE pointer, VALUE proc)
|
212
325
|
{
|
213
326
|
StructField* f;
|
214
327
|
VALUE value = Qnil;
|
215
328
|
|
216
|
-
|
329
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
217
330
|
|
218
331
|
if (NIL_P(proc) || rb_obj_is_kind_of(proc, rbffi_FunctionClass)) {
|
219
332
|
value = proc;
|
@@ -235,6 +348,12 @@ isCharArray(ArrayType* arrayType)
|
|
235
348
|
|| arrayType->componentType->nativeType == NATIVE_UINT8;
|
236
349
|
}
|
237
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
|
+
*/
|
238
357
|
static VALUE
|
239
358
|
array_field_get(VALUE self, VALUE pointer)
|
240
359
|
{
|
@@ -242,8 +361,8 @@ array_field_get(VALUE self, VALUE pointer)
|
|
242
361
|
ArrayType* array;
|
243
362
|
VALUE argv[2];
|
244
363
|
|
245
|
-
|
246
|
-
|
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);
|
247
366
|
|
248
367
|
argv[0] = pointer;
|
249
368
|
argv[1] = self;
|
@@ -252,24 +371,35 @@ array_field_get(VALUE self, VALUE pointer)
|
|
252
371
|
? rbffi_StructLayoutCharArrayClass : rbffi_StructInlineArrayClass);
|
253
372
|
}
|
254
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
|
+
*/
|
255
381
|
static VALUE
|
256
382
|
array_field_put(VALUE self, VALUE pointer, VALUE value)
|
257
383
|
{
|
258
384
|
StructField* f;
|
259
385
|
ArrayType* array;
|
260
|
-
|
261
386
|
|
262
|
-
|
263
|
-
|
264
|
-
|
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
|
+
|
265
390
|
if (isCharArray(array) && rb_obj_is_instance_of(value, rb_cString)) {
|
266
391
|
VALUE argv[2];
|
267
392
|
|
268
393
|
argv[0] = INT2FIX(f->offset);
|
269
394
|
argv[1] = value;
|
270
395
|
|
271
|
-
|
272
|
-
|
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
|
+
}
|
273
403
|
} else {
|
274
404
|
#ifdef notyet
|
275
405
|
MemoryOp* op;
|
@@ -281,7 +411,7 @@ array_field_put(VALUE self, VALUE pointer, VALUE value)
|
|
281
411
|
rb_raise(rb_eIndexError, "array too large");
|
282
412
|
}
|
283
413
|
|
284
|
-
|
414
|
+
/* clear the contents in case of a short write */
|
285
415
|
checkWrite(memory);
|
286
416
|
checkBounds(memory, f->offset, f->type->ffiType->size);
|
287
417
|
if (count < array->length) {
|
@@ -289,7 +419,7 @@ array_field_put(VALUE self, VALUE pointer, VALUE value)
|
|
289
419
|
0, (array->length - count) * array->componentType->ffiType->size);
|
290
420
|
}
|
291
421
|
|
292
|
-
|
422
|
+
/* now copy each element in */
|
293
423
|
if ((op = get_memory_op(array->componentType)) != NULL) {
|
294
424
|
|
295
425
|
for (i = 0; i < count; ++i) {
|
@@ -302,12 +432,8 @@ array_field_put(VALUE self, VALUE pointer, VALUE value)
|
|
302
432
|
VALUE entry = rb_ary_entry(value, i);
|
303
433
|
Struct* s;
|
304
434
|
|
305
|
-
|
306
|
-
rb_raise(rb_eTypeError, "array element not an instance of FFI::Struct");
|
307
|
-
break;
|
308
|
-
}
|
435
|
+
TypedData_Get_Struct(entry, Struct, &rbffi_struct_data_type, s);
|
309
436
|
|
310
|
-
Data_Get_Struct(entry, Struct, s);
|
311
437
|
checkRead(s->pointer);
|
312
438
|
checkBounds(s->pointer, 0, array->componentType->ffiType->size);
|
313
439
|
|
@@ -333,11 +459,10 @@ struct_layout_allocate(VALUE klass)
|
|
333
459
|
StructLayout* layout;
|
334
460
|
VALUE obj;
|
335
461
|
|
336
|
-
obj =
|
337
|
-
layout->rbFieldMap
|
338
|
-
layout->rbFieldNames
|
339
|
-
layout->rbFields
|
340
|
-
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);
|
341
466
|
layout->base.ffiType = xcalloc(1, sizeof(*layout->base.ffiType));
|
342
467
|
layout->base.ffiType->size = 0;
|
343
468
|
layout->base.ffiType->alignment = 0;
|
@@ -346,6 +471,14 @@ struct_layout_allocate(VALUE klass)
|
|
346
471
|
return obj;
|
347
472
|
}
|
348
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
|
+
*/
|
349
482
|
static VALUE
|
350
483
|
struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
351
484
|
{
|
@@ -353,15 +486,15 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
|
353
486
|
ffi_type* ltype;
|
354
487
|
int i;
|
355
488
|
|
356
|
-
|
357
|
-
layout->fieldCount = (
|
358
|
-
layout->rbFieldMap
|
359
|
-
layout->rbFieldNames
|
360
|
-
layout->size = FFI_ALIGN(NUM2INT(size), NUM2INT(align));
|
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));
|
361
494
|
layout->align = NUM2INT(align);
|
362
495
|
layout->fields = xcalloc(layout->fieldCount, sizeof(StructField *));
|
363
496
|
layout->ffiTypes = xcalloc(layout->fieldCount + 1, sizeof(ffi_type *));
|
364
|
-
layout->rbFields
|
497
|
+
RB_OBJ_WRITE(self, &layout->rbFields, rb_ary_new2(layout->fieldCount));
|
365
498
|
layout->referenceFieldCount = 0;
|
366
499
|
layout->base.ffiType->elements = layout->ffiTypes;
|
367
500
|
layout->base.ffiType->size = layout->size;
|
@@ -380,7 +513,7 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
|
380
513
|
}
|
381
514
|
rbName = rb_funcall2(rbField, rb_intern("name"), 0, NULL);
|
382
515
|
|
383
|
-
|
516
|
+
TypedData_Get_Struct(rbField, StructField, &rbffi_struct_field_data_type, field);
|
384
517
|
layout->fields[i] = field;
|
385
518
|
|
386
519
|
if (field->type == NULL || field->type->ffiType == NULL) {
|
@@ -388,7 +521,7 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
|
388
521
|
}
|
389
522
|
|
390
523
|
ftype = field->type->ffiType;
|
391
|
-
if (ftype->size == 0) {
|
524
|
+
if (ftype->size == 0 && i < ((int) layout->fieldCount - 1)) {
|
392
525
|
rb_raise(rb_eTypeError, "type of field %d has zero size", i);
|
393
526
|
}
|
394
527
|
|
@@ -396,8 +529,8 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
|
396
529
|
field->referenceIndex = layout->referenceFieldCount++;
|
397
530
|
}
|
398
531
|
|
399
|
-
|
400
|
-
|
532
|
+
|
533
|
+
layout->ffiTypes[i] = ftype->size > 0 ? ftype : NULL;
|
401
534
|
rb_hash_aset(layout->rbFieldMap, rbName, rbField);
|
402
535
|
rb_ary_push(layout->rbFields, rbField);
|
403
536
|
rb_ary_push(layout->rbFieldNames, rbName);
|
@@ -407,23 +540,34 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
|
407
540
|
rb_raise(rb_eRuntimeError, "Struct size is zero");
|
408
541
|
}
|
409
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
|
+
|
410
548
|
return self;
|
411
549
|
}
|
412
550
|
|
551
|
+
/*
|
552
|
+
* call-seq: [](field)
|
553
|
+
* @param [Symbol] field
|
554
|
+
* @return [StructLayout::Field]
|
555
|
+
* Get a field from the layout.
|
556
|
+
*/
|
413
557
|
static VALUE
|
414
|
-
struct_layout_union_bang(VALUE self)
|
558
|
+
struct_layout_union_bang(VALUE self)
|
415
559
|
{
|
416
|
-
|
417
|
-
|
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 };
|
418
562
|
StructLayout* layout;
|
419
563
|
ffi_type *t = NULL;
|
420
564
|
int count, i;
|
421
565
|
|
422
|
-
|
566
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
423
567
|
|
424
568
|
for (i = 0; alignment_types[i] != NULL; ++i) {
|
425
569
|
if (alignment_types[i]->alignment == layout->align) {
|
426
|
-
t = alignment_types[i];
|
570
|
+
t = (ffi_type *) alignment_types[i];
|
427
571
|
break;
|
428
572
|
}
|
429
573
|
}
|
@@ -432,7 +576,7 @@ struct_layout_union_bang(VALUE self)
|
|
432
576
|
return Qnil;
|
433
577
|
}
|
434
578
|
|
435
|
-
count = layout->size / t->size;
|
579
|
+
count = (int) layout->size / (int) t->size;
|
436
580
|
xfree(layout->ffiTypes);
|
437
581
|
layout->ffiTypes = xcalloc(count + 1, sizeof(ffi_type *));
|
438
582
|
layout->base.ffiType->elements = layout->ffiTypes;
|
@@ -449,81 +593,151 @@ struct_layout_aref(VALUE self, VALUE field)
|
|
449
593
|
{
|
450
594
|
StructLayout* layout;
|
451
595
|
|
452
|
-
|
596
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
453
597
|
|
454
598
|
return rb_hash_aref(layout->rbFieldMap, field);
|
455
599
|
}
|
456
600
|
|
601
|
+
/*
|
602
|
+
* call-seq: fields
|
603
|
+
* @return [Array<StructLayout::Field>]
|
604
|
+
* Get fields list.
|
605
|
+
*/
|
457
606
|
static VALUE
|
458
607
|
struct_layout_fields(VALUE self)
|
459
608
|
{
|
460
609
|
StructLayout* layout;
|
461
610
|
|
462
|
-
|
611
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
463
612
|
|
464
613
|
return rb_ary_dup(layout->rbFields);
|
465
614
|
}
|
466
615
|
|
616
|
+
/*
|
617
|
+
* call-seq: members
|
618
|
+
* @return [Array<Symbol>]
|
619
|
+
* Get list of field names.
|
620
|
+
*/
|
467
621
|
static VALUE
|
468
622
|
struct_layout_members(VALUE self)
|
469
623
|
{
|
470
624
|
StructLayout* layout;
|
471
625
|
|
472
|
-
|
626
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
473
627
|
|
474
628
|
return rb_ary_dup(layout->rbFieldNames);
|
475
629
|
}
|
476
630
|
|
631
|
+
/*
|
632
|
+
* call-seq: to_a
|
633
|
+
* @return [Array<StructLayout::Field>]
|
634
|
+
* Get an array of fields.
|
635
|
+
*/
|
477
636
|
static VALUE
|
478
637
|
struct_layout_to_a(VALUE self)
|
479
638
|
{
|
480
639
|
StructLayout* layout;
|
481
640
|
|
482
|
-
|
641
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
483
642
|
|
484
643
|
return rb_ary_dup(layout->rbFields);
|
485
644
|
}
|
486
645
|
|
487
646
|
static void
|
488
|
-
struct_layout_mark(
|
647
|
+
struct_layout_mark(void *data)
|
489
648
|
{
|
490
|
-
|
491
|
-
|
492
|
-
|
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 */
|
493
654
|
}
|
494
655
|
|
495
656
|
static void
|
496
|
-
|
657
|
+
struct_layout_compact(void *data)
|
497
658
|
{
|
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));
|
666
|
+
}
|
667
|
+
|
668
|
+
static void
|
669
|
+
struct_layout_free(void *data)
|
670
|
+
{
|
671
|
+
StructLayout *layout = (StructLayout *)data;
|
498
672
|
xfree(layout->ffiTypes);
|
499
673
|
xfree(layout->base.ffiType);
|
500
674
|
xfree(layout->fields);
|
501
|
-
st_free_table(layout->fieldSymbolTable);
|
502
675
|
xfree(layout);
|
503
676
|
}
|
504
677
|
|
505
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
|
+
|
506
689
|
void
|
507
690
|
rbffi_StructLayout_Init(VALUE moduleFFI)
|
508
691
|
{
|
509
|
-
|
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);
|
510
700
|
rb_global_variable(&rbffi_StructLayoutClass);
|
511
|
-
|
701
|
+
|
702
|
+
/*
|
703
|
+
* Document-class: FFI::StructLayout::Field
|
704
|
+
* A field in a {StructLayout}.
|
705
|
+
*/
|
512
706
|
rbffi_StructLayoutFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Field", rb_cObject);
|
513
707
|
rb_global_variable(&rbffi_StructLayoutFieldClass);
|
514
708
|
|
709
|
+
/*
|
710
|
+
* Document-class: FFI::StructLayout::Number
|
711
|
+
* A numeric {Field} in a {StructLayout}.
|
712
|
+
*/
|
515
713
|
rbffi_StructLayoutNumberFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Number", rbffi_StructLayoutFieldClass);
|
516
714
|
rb_global_variable(&rbffi_StructLayoutNumberFieldClass);
|
517
715
|
|
716
|
+
/*
|
717
|
+
* Document-class: FFI::StructLayout::String
|
718
|
+
* A string {Field} in a {StructLayout}.
|
719
|
+
*/
|
518
720
|
rbffi_StructLayoutStringFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "String", rbffi_StructLayoutFieldClass);
|
519
721
|
rb_global_variable(&rbffi_StructLayoutStringFieldClass);
|
520
722
|
|
723
|
+
/*
|
724
|
+
* Document-class: FFI::StructLayout::Pointer
|
725
|
+
* A pointer {Field} in a {StructLayout}.
|
726
|
+
*/
|
521
727
|
rbffi_StructLayoutPointerFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Pointer", rbffi_StructLayoutFieldClass);
|
522
728
|
rb_global_variable(&rbffi_StructLayoutPointerFieldClass);
|
523
729
|
|
730
|
+
/*
|
731
|
+
* Document-class: FFI::StructLayout::Function
|
732
|
+
* A function pointer {Field} in a {StructLayout}.
|
733
|
+
*/
|
524
734
|
rbffi_StructLayoutFunctionFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Function", rbffi_StructLayoutFieldClass);
|
525
735
|
rb_global_variable(&rbffi_StructLayoutFunctionFieldClass);
|
526
736
|
|
737
|
+
/*
|
738
|
+
* Document-class: FFI::StructLayout::Array
|
739
|
+
* An array {Field} in a {StructLayout}.
|
740
|
+
*/
|
527
741
|
rbffi_StructLayoutArrayFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Array", rbffi_StructLayoutFieldClass);
|
528
742
|
rb_global_variable(&rbffi_StructLayoutArrayFieldClass);
|
529
743
|
|