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/Struct.c
CHANGED
@@ -1,36 +1,37 @@
|
|
1
1
|
/*
|
2
2
|
* Copyright (c) 2008, 2009, Wayne Meissner
|
3
|
-
* Copyright (
|
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
|
-
#include
|
33
|
-
#
|
32
|
+
#ifndef _MSC_VER
|
33
|
+
# include <sys/param.h>
|
34
|
+
#endif
|
34
35
|
#include <stdint.h>
|
35
36
|
#include <stdbool.h>
|
36
37
|
#include <ruby.h>
|
@@ -41,9 +42,11 @@
|
|
41
42
|
#include "MemoryPointer.h"
|
42
43
|
#include "Function.h"
|
43
44
|
#include "Types.h"
|
44
|
-
#include "
|
45
|
+
#include "Function.h"
|
45
46
|
#include "StructByValue.h"
|
46
47
|
#include "ArrayType.h"
|
48
|
+
#include "MappedType.h"
|
49
|
+
#include "Struct.h"
|
47
50
|
|
48
51
|
typedef struct InlineArray_ {
|
49
52
|
VALUE rbMemory;
|
@@ -54,15 +57,33 @@ typedef struct InlineArray_ {
|
|
54
57
|
MemoryOp *op;
|
55
58
|
Type* componentType;
|
56
59
|
ArrayType* arrayType;
|
57
|
-
|
60
|
+
int length;
|
58
61
|
} InlineArray;
|
59
62
|
|
60
63
|
|
61
|
-
static void struct_mark(
|
64
|
+
static void struct_mark(void *data);
|
65
|
+
static void struct_compact(void *data);
|
66
|
+
static void struct_free(void *data);
|
67
|
+
static size_t struct_memsize(const void *);
|
62
68
|
static VALUE struct_class_layout(VALUE klass);
|
63
|
-
static void struct_malloc(Struct* s);
|
64
|
-
static void inline_array_mark(
|
65
|
-
|
69
|
+
static void struct_malloc(VALUE self, Struct* s);
|
70
|
+
static void inline_array_mark(void *);
|
71
|
+
static void inline_array_compact(void *);
|
72
|
+
static size_t inline_array_memsize(const void *);
|
73
|
+
static void store_reference_value(VALUE self, StructField* f, Struct* s, VALUE value);
|
74
|
+
|
75
|
+
const rb_data_type_t rbffi_struct_data_type = { /* extern */
|
76
|
+
.wrap_struct_name = "FFI::Struct",
|
77
|
+
.function = {
|
78
|
+
.dmark = struct_mark,
|
79
|
+
.dfree = struct_free,
|
80
|
+
.dsize = struct_memsize,
|
81
|
+
ffi_compact_callback( struct_compact )
|
82
|
+
},
|
83
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
84
|
+
// macro to update VALUE references, as to trigger write barriers.
|
85
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
|
86
|
+
};
|
66
87
|
VALUE rbffi_StructClass = Qnil;
|
67
88
|
|
68
89
|
VALUE rbffi_StructInlineArrayClass = Qnil;
|
@@ -70,25 +91,36 @@ VALUE rbffi_StructLayoutCharArrayClass = Qnil;
|
|
70
91
|
|
71
92
|
static ID id_pointer_ivar = 0, id_layout_ivar = 0;
|
72
93
|
static ID id_get = 0, id_put = 0, id_to_ptr = 0, id_to_s = 0, id_layout = 0;
|
94
|
+
static ID id_initialize = 0;
|
73
95
|
|
74
96
|
static inline char*
|
75
97
|
memory_address(VALUE self)
|
76
98
|
{
|
77
|
-
|
99
|
+
AbstractMemory *mem;
|
100
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, mem);
|
101
|
+
return mem->address;
|
78
102
|
}
|
79
103
|
|
80
104
|
static VALUE
|
81
105
|
struct_allocate(VALUE klass)
|
82
106
|
{
|
83
107
|
Struct* s;
|
84
|
-
VALUE obj =
|
85
|
-
|
86
|
-
s->rbPointer
|
87
|
-
s->rbLayout
|
108
|
+
VALUE obj = TypedData_Make_Struct(klass, Struct, &rbffi_struct_data_type, s);
|
109
|
+
|
110
|
+
RB_OBJ_WRITE(obj, &s->rbPointer, Qnil);
|
111
|
+
RB_OBJ_WRITE(obj, &s->rbLayout, Qnil);
|
88
112
|
|
89
113
|
return obj;
|
90
114
|
}
|
91
115
|
|
116
|
+
/*
|
117
|
+
* call-seq: initialize
|
118
|
+
* @overload initialize
|
119
|
+
* @overload initialize(pointer, *args)
|
120
|
+
* @param [AbstractMemory] pointer
|
121
|
+
* @param [Array] args
|
122
|
+
* @return [self]
|
123
|
+
*/
|
92
124
|
static VALUE
|
93
125
|
struct_initialize(int argc, VALUE* argv, VALUE self)
|
94
126
|
{
|
@@ -96,28 +128,76 @@ struct_initialize(int argc, VALUE* argv, VALUE self)
|
|
96
128
|
VALUE rbPointer = Qnil, rest = Qnil, klass = CLASS_OF(self);
|
97
129
|
int nargs;
|
98
130
|
|
99
|
-
|
100
|
-
|
131
|
+
TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
|
132
|
+
|
101
133
|
nargs = rb_scan_args(argc, argv, "01*", &rbPointer, &rest);
|
102
134
|
|
103
135
|
/* Call up into ruby code to adjust the layout */
|
104
136
|
if (nargs > 1) {
|
105
|
-
|
137
|
+
VALUE rbLayout = rb_apply(CLASS_OF(self), id_layout, rest);
|
138
|
+
RB_OBJ_WRITE(self, &s->rbLayout, rbLayout);
|
106
139
|
} else {
|
107
|
-
s->rbLayout
|
140
|
+
RB_OBJ_WRITE(self, &s->rbLayout, struct_class_layout(klass));
|
108
141
|
}
|
109
142
|
|
110
143
|
if (!rb_obj_is_kind_of(s->rbLayout, rbffi_StructLayoutClass)) {
|
111
144
|
rb_raise(rb_eRuntimeError, "Invalid Struct layout");
|
112
145
|
}
|
113
146
|
|
114
|
-
|
115
|
-
|
147
|
+
TypedData_Get_Struct(s->rbLayout, StructLayout, &rbffi_struct_layout_data_type, s->layout);
|
148
|
+
|
116
149
|
if (rbPointer != Qnil) {
|
117
150
|
s->pointer = MEMORY(rbPointer);
|
118
|
-
s->rbPointer
|
151
|
+
RB_OBJ_WRITE(self, &s->rbPointer, rbPointer);
|
152
|
+
} else {
|
153
|
+
struct_malloc(self, s);
|
154
|
+
}
|
155
|
+
|
156
|
+
return self;
|
157
|
+
}
|
158
|
+
|
159
|
+
/*
|
160
|
+
* call-seq: initialize_copy(other)
|
161
|
+
* @return [nil]
|
162
|
+
* DO NOT CALL THIS METHOD
|
163
|
+
*/
|
164
|
+
static VALUE
|
165
|
+
struct_initialize_copy(VALUE self, VALUE other)
|
166
|
+
{
|
167
|
+
Struct* src;
|
168
|
+
Struct* dst;
|
169
|
+
|
170
|
+
TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, dst);
|
171
|
+
TypedData_Get_Struct(other, Struct, &rbffi_struct_data_type, src);
|
172
|
+
if (dst == src) {
|
173
|
+
return self;
|
174
|
+
}
|
175
|
+
|
176
|
+
RB_OBJ_WRITE(self, &dst->rbLayout, src->rbLayout);
|
177
|
+
dst->layout = src->layout;
|
178
|
+
|
179
|
+
/*
|
180
|
+
* A new MemoryPointer instance is allocated here instead of just calling
|
181
|
+
* #dup on rbPointer, since the Pointer may not know its length, or may
|
182
|
+
* be longer than just this struct.
|
183
|
+
*/
|
184
|
+
if (src->pointer->address != NULL) {
|
185
|
+
RB_OBJ_WRITE(self, &dst->rbPointer, rbffi_MemoryPointer_NewInstance(1, src->layout->size, false));
|
186
|
+
dst->pointer = MEMORY(dst->rbPointer);
|
187
|
+
memcpy(dst->pointer->address, src->pointer->address, src->layout->size);
|
119
188
|
} else {
|
120
|
-
|
189
|
+
RB_OBJ_WRITE(self, &dst->rbPointer, src->rbPointer);
|
190
|
+
dst->pointer = src->pointer;
|
191
|
+
}
|
192
|
+
|
193
|
+
if (src->layout->referenceFieldCount > 0) {
|
194
|
+
size_t index;
|
195
|
+
|
196
|
+
dst->rbReferences = ALLOC_N(VALUE, dst->layout->referenceFieldCount);
|
197
|
+
memcpy(dst->rbReferences, src->rbReferences, dst->layout->referenceFieldCount * sizeof(VALUE));
|
198
|
+
for ( index = 0; index < dst->layout->referenceFieldCount; index++) {
|
199
|
+
RB_OBJ_WRITTEN(self, Qundef, &dst->rbReferences[index]);
|
200
|
+
}
|
121
201
|
}
|
122
202
|
|
123
203
|
return self;
|
@@ -127,11 +207,11 @@ static VALUE
|
|
127
207
|
struct_class_layout(VALUE klass)
|
128
208
|
{
|
129
209
|
VALUE layout;
|
130
|
-
if (!
|
210
|
+
if (!rb_ivar_defined(klass, id_layout_ivar)) {
|
131
211
|
rb_raise(rb_eRuntimeError, "no Struct layout configured for %s", rb_class2name(klass));
|
132
212
|
}
|
133
213
|
|
134
|
-
layout =
|
214
|
+
layout = rb_ivar_get(klass, id_layout_ivar);
|
135
215
|
if (!rb_obj_is_kind_of(layout, rbffi_StructLayoutClass)) {
|
136
216
|
rb_raise(rb_eRuntimeError, "invalid Struct layout for %s", rb_class2name(klass));
|
137
217
|
}
|
@@ -142,14 +222,15 @@ struct_class_layout(VALUE klass)
|
|
142
222
|
static StructLayout*
|
143
223
|
struct_layout(VALUE self)
|
144
224
|
{
|
145
|
-
Struct* s
|
225
|
+
Struct* s;
|
226
|
+
TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
|
146
227
|
if (s->layout != NULL) {
|
147
228
|
return s->layout;
|
148
229
|
}
|
149
230
|
|
150
231
|
if (s->layout == NULL) {
|
151
|
-
s->rbLayout
|
152
|
-
|
232
|
+
RB_OBJ_WRITE(self, &s->rbLayout, struct_class_layout(CLASS_OF(self)));
|
233
|
+
TypedData_Get_Struct(s->rbLayout, StructLayout, &rbffi_struct_layout_data_type, s->layout);
|
153
234
|
}
|
154
235
|
|
155
236
|
return s->layout;
|
@@ -159,113 +240,181 @@ static Struct*
|
|
159
240
|
struct_validate(VALUE self)
|
160
241
|
{
|
161
242
|
Struct* s;
|
162
|
-
|
243
|
+
TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
|
163
244
|
|
164
245
|
if (struct_layout(self) == NULL) {
|
165
246
|
rb_raise(rb_eRuntimeError, "struct layout == null");
|
166
247
|
}
|
167
248
|
|
168
249
|
if (s->pointer == NULL) {
|
169
|
-
struct_malloc(s);
|
250
|
+
struct_malloc(self, s);
|
170
251
|
}
|
171
252
|
|
172
253
|
return s;
|
173
254
|
}
|
174
255
|
|
175
256
|
static void
|
176
|
-
struct_malloc(Struct* s)
|
257
|
+
struct_malloc(VALUE self, Struct* s)
|
177
258
|
{
|
178
259
|
if (s->rbPointer == Qnil) {
|
179
|
-
s->rbPointer
|
180
|
-
|
260
|
+
RB_OBJ_WRITE(self, &s->rbPointer, rbffi_MemoryPointer_NewInstance(s->layout->size, 1, true));
|
181
261
|
} else if (!rb_obj_is_kind_of(s->rbPointer, rbffi_AbstractMemoryClass)) {
|
182
262
|
rb_raise(rb_eRuntimeError, "invalid pointer in struct");
|
183
263
|
}
|
184
264
|
|
185
|
-
s->
|
265
|
+
TypedData_Get_Struct(s->rbPointer, AbstractMemory, &rbffi_abstract_memory_data_type, s->pointer);
|
186
266
|
}
|
187
267
|
|
188
268
|
static void
|
189
|
-
struct_mark(
|
269
|
+
struct_mark(void *data)
|
190
270
|
{
|
191
|
-
|
192
|
-
|
271
|
+
Struct *s = (Struct *)data;
|
272
|
+
rb_gc_mark_movable(s->rbPointer);
|
273
|
+
rb_gc_mark_movable(s->rbLayout);
|
274
|
+
if (s->rbReferences != NULL) {
|
275
|
+
size_t index;
|
276
|
+
for (index = 0; index < s->layout->referenceFieldCount; index++) {
|
277
|
+
rb_gc_mark_movable(s->rbReferences[index]);
|
278
|
+
}
|
279
|
+
}
|
193
280
|
}
|
194
281
|
|
195
|
-
static
|
196
|
-
|
282
|
+
static void
|
283
|
+
struct_compact(void *data)
|
197
284
|
{
|
198
|
-
|
199
|
-
|
285
|
+
Struct *s = (Struct *)data;
|
286
|
+
ffi_gc_location(s->rbPointer);
|
287
|
+
ffi_gc_location(s->rbLayout);
|
288
|
+
if (s->rbReferences != NULL) {
|
289
|
+
size_t index;
|
290
|
+
for (index = 0; index < s->layout->referenceFieldCount; index++) {
|
291
|
+
ffi_gc_location(s->rbReferences[index]);
|
292
|
+
}
|
293
|
+
}
|
294
|
+
}
|
200
295
|
|
201
|
-
|
202
|
-
|
296
|
+
static void
|
297
|
+
struct_free(void *data)
|
298
|
+
{
|
299
|
+
Struct *s = (Struct *)data;
|
300
|
+
xfree(s->rbReferences);
|
301
|
+
xfree(s);
|
302
|
+
}
|
303
|
+
|
304
|
+
static size_t
|
305
|
+
struct_memsize(const void *data)
|
306
|
+
{
|
307
|
+
const Struct *s = (const Struct *)data;
|
308
|
+
return sizeof(Struct) + (s->layout->referenceFieldCount * sizeof(VALUE));
|
309
|
+
}
|
310
|
+
|
311
|
+
static void
|
312
|
+
store_reference_value(VALUE self, StructField* f, Struct* s, VALUE value)
|
313
|
+
{
|
314
|
+
if (unlikely(f->referenceIndex == -1)) {
|
315
|
+
rb_raise(rb_eRuntimeError, "put_reference_value called for non-reference type");
|
316
|
+
return;
|
317
|
+
}
|
318
|
+
if (s->rbReferences == NULL) {
|
319
|
+
int i;
|
320
|
+
s->rbReferences = ALLOC_N(VALUE, s->layout->referenceFieldCount);
|
321
|
+
for (i = 0; i < s->layout->referenceFieldCount; ++i) {
|
322
|
+
RB_OBJ_WRITE(self, &s->rbReferences[i], Qnil);
|
323
|
+
}
|
203
324
|
}
|
204
325
|
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
326
|
+
RB_OBJ_WRITE(self, &s->rbReferences[f->referenceIndex], value);
|
327
|
+
}
|
328
|
+
|
329
|
+
|
330
|
+
static StructField *
|
331
|
+
struct_field(Struct* s, VALUE fieldName)
|
332
|
+
{
|
333
|
+
StructLayout* layout = s->layout;
|
334
|
+
struct field_cache_entry *p_ce = FIELD_CACHE_LOOKUP(layout, fieldName);
|
335
|
+
|
336
|
+
/* Do a hash lookup only if cache entry is empty or fieldName is unexpected? */
|
337
|
+
if (unlikely(!SYMBOL_P(fieldName) || !p_ce->fieldName || p_ce->fieldName != fieldName)) {
|
338
|
+
VALUE rbField = rb_hash_aref(layout->rbFieldMap, fieldName);
|
339
|
+
if (unlikely(NIL_P(rbField))) {
|
340
|
+
VALUE str = rb_funcall2(fieldName, id_to_s, 0, NULL);
|
341
|
+
rb_raise(rb_eArgError, "No such field '%s'", StringValueCStr(str));
|
342
|
+
}
|
343
|
+
/* Write the retrieved coder to the cache */
|
344
|
+
RB_OBJ_WRITE(s->rbLayout, &p_ce->fieldName, fieldName);
|
345
|
+
TypedData_Get_Struct(rbField, StructField, &rbffi_struct_field_data_type, p_ce->field);
|
209
346
|
}
|
210
347
|
|
211
|
-
return
|
348
|
+
return p_ce->field;
|
212
349
|
}
|
213
350
|
|
351
|
+
/*
|
352
|
+
* call-seq: struct[field_name]
|
353
|
+
* @param field_name field to access
|
354
|
+
* Acces to a Struct field.
|
355
|
+
*/
|
214
356
|
static VALUE
|
215
357
|
struct_aref(VALUE self, VALUE fieldName)
|
216
358
|
{
|
217
359
|
Struct* s;
|
218
|
-
VALUE rbField;
|
219
360
|
StructField* f;
|
220
361
|
|
221
362
|
s = struct_validate(self);
|
222
363
|
|
223
|
-
|
224
|
-
f
|
225
|
-
|
226
|
-
if (f->get != NULL) {
|
227
|
-
return (*f->get)(f, s);
|
228
|
-
|
229
|
-
} else if (f->memoryOp != NULL) {
|
364
|
+
f = struct_field(s, fieldName);
|
365
|
+
if (f->memoryOp != NULL) {
|
230
366
|
return (*f->memoryOp->get)(s->pointer, f->offset);
|
231
367
|
|
232
368
|
} else {
|
233
|
-
|
369
|
+
VALUE rbField = rb_hash_aref(s->layout->rbFieldMap, fieldName);
|
234
370
|
/* call up to the ruby code to fetch the value */
|
235
371
|
return rb_funcall2(rbField, id_get, 1, &s->rbPointer);
|
236
372
|
}
|
237
373
|
}
|
238
374
|
|
375
|
+
/*
|
376
|
+
* call-seq: []=(field_name, value)
|
377
|
+
* @param field_name field to access
|
378
|
+
* @param value value to set to +field_name+
|
379
|
+
* @return [value]
|
380
|
+
* Set a field in Struct.
|
381
|
+
*/
|
239
382
|
static VALUE
|
240
383
|
struct_aset(VALUE self, VALUE fieldName, VALUE value)
|
241
384
|
{
|
242
385
|
Struct* s;
|
243
|
-
VALUE rbField;
|
244
386
|
StructField* f;
|
245
387
|
|
246
|
-
|
388
|
+
rb_check_frozen(self);
|
247
389
|
s = struct_validate(self);
|
248
390
|
|
249
|
-
|
250
|
-
f
|
251
|
-
if (f->put != NULL) {
|
252
|
-
(*f->put)(f, s, value);
|
253
|
-
|
254
|
-
} else if (f->memoryOp != NULL) {
|
391
|
+
f = struct_field(s, fieldName);
|
392
|
+
if (f->memoryOp != NULL) {
|
255
393
|
|
256
394
|
(*f->memoryOp->put)(s->pointer, f->offset, value);
|
257
|
-
|
395
|
+
|
258
396
|
} else {
|
397
|
+
VALUE rbField = rb_hash_aref(s->layout->rbFieldMap, fieldName);
|
259
398
|
/* call up to the ruby code to set the value */
|
260
399
|
VALUE argv[2];
|
261
400
|
argv[0] = s->rbPointer;
|
262
401
|
argv[1] = value;
|
263
402
|
rb_funcall2(rbField, id_put, 2, argv);
|
264
403
|
}
|
265
|
-
|
404
|
+
|
405
|
+
if (f->referenceRequired) {
|
406
|
+
store_reference_value(self, f, s, value);
|
407
|
+
}
|
408
|
+
|
266
409
|
return value;
|
267
410
|
}
|
268
411
|
|
412
|
+
/*
|
413
|
+
* call-seq: pointer= pointer
|
414
|
+
* @param [AbstractMemory] pointer
|
415
|
+
* @return [self]
|
416
|
+
* Make Struct point to +pointer+.
|
417
|
+
*/
|
269
418
|
static VALUE
|
270
419
|
struct_set_pointer(VALUE self, VALUE pointer)
|
271
420
|
{
|
@@ -273,84 +422,109 @@ struct_set_pointer(VALUE self, VALUE pointer)
|
|
273
422
|
StructLayout* layout;
|
274
423
|
AbstractMemory* memory;
|
275
424
|
|
425
|
+
rb_check_frozen(self);
|
276
426
|
if (!rb_obj_is_kind_of(pointer, rbffi_AbstractMemoryClass)) {
|
277
427
|
rb_raise(rb_eTypeError, "wrong argument type %s (expected Pointer or Buffer)",
|
278
428
|
rb_obj_classname(pointer));
|
279
429
|
return Qnil;
|
280
430
|
}
|
281
431
|
|
282
|
-
|
283
|
-
|
284
|
-
|
432
|
+
|
433
|
+
TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
|
434
|
+
TypedData_Get_Struct(pointer, AbstractMemory, &rbffi_abstract_memory_data_type, memory);
|
285
435
|
layout = struct_layout(self);
|
286
436
|
|
287
|
-
if (layout->base.ffiType->size > memory->size) {
|
288
|
-
rb_raise(rb_eArgError, "memory of %
|
289
|
-
memory->size, rb_obj_classname(self), layout->base.ffiType->size);
|
437
|
+
if ((int) layout->base.ffiType->size > memory->size) {
|
438
|
+
rb_raise(rb_eArgError, "memory of %ld bytes too small for struct %s (expected at least %ld)",
|
439
|
+
memory->size, rb_obj_classname(self), (long) layout->base.ffiType->size);
|
290
440
|
}
|
291
|
-
|
441
|
+
|
292
442
|
s->pointer = MEMORY(pointer);
|
293
|
-
s->rbPointer
|
443
|
+
RB_OBJ_WRITE(self, &s->rbPointer, pointer);
|
294
444
|
rb_ivar_set(self, id_pointer_ivar, pointer);
|
295
445
|
|
296
446
|
return self;
|
297
447
|
}
|
298
448
|
|
449
|
+
/*
|
450
|
+
* call-seq: pointer
|
451
|
+
* @return [AbstractMemory]
|
452
|
+
* Get pointer to Struct contents.
|
453
|
+
*/
|
299
454
|
static VALUE
|
300
455
|
struct_get_pointer(VALUE self)
|
301
456
|
{
|
302
457
|
Struct* s;
|
303
458
|
|
304
|
-
|
459
|
+
TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
|
305
460
|
|
306
461
|
return s->rbPointer;
|
307
462
|
}
|
308
463
|
|
464
|
+
/*
|
465
|
+
* call-seq: layout= layout
|
466
|
+
* @param [StructLayout] layout
|
467
|
+
* @return [self]
|
468
|
+
* Set the Struct's layout.
|
469
|
+
*/
|
309
470
|
static VALUE
|
310
471
|
struct_set_layout(VALUE self, VALUE layout)
|
311
472
|
{
|
312
473
|
Struct* s;
|
313
|
-
|
474
|
+
TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
|
314
475
|
|
476
|
+
rb_check_frozen(self);
|
315
477
|
if (!rb_obj_is_kind_of(layout, rbffi_StructLayoutClass)) {
|
316
478
|
rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)",
|
317
479
|
rb_obj_classname(layout), rb_class2name(rbffi_StructLayoutClass));
|
318
480
|
return Qnil;
|
319
481
|
}
|
320
482
|
|
321
|
-
|
483
|
+
TypedData_Get_Struct(layout, StructLayout, &rbffi_struct_layout_data_type, s->layout);
|
322
484
|
rb_ivar_set(self, id_layout_ivar, layout);
|
323
485
|
|
324
486
|
return self;
|
325
487
|
}
|
326
488
|
|
489
|
+
/*
|
490
|
+
* call-seq: layout
|
491
|
+
* @return [StructLayout]
|
492
|
+
* Get the Struct's layout.
|
493
|
+
*/
|
327
494
|
static VALUE
|
328
495
|
struct_get_layout(VALUE self)
|
329
496
|
{
|
330
497
|
Struct* s;
|
331
498
|
|
332
|
-
|
499
|
+
TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
|
333
500
|
|
334
501
|
return s->rbLayout;
|
335
502
|
}
|
336
503
|
|
337
|
-
|
504
|
+
/*
|
505
|
+
* call-seq: null?
|
506
|
+
* @return [Boolean]
|
507
|
+
* Test if Struct's pointer is NULL
|
508
|
+
*/
|
338
509
|
static VALUE
|
339
510
|
struct_null_p(VALUE self)
|
340
511
|
{
|
341
512
|
Struct* s;
|
342
513
|
|
343
|
-
|
514
|
+
TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
|
344
515
|
|
345
516
|
return s->pointer->address == NULL ? Qtrue : Qfalse;
|
346
517
|
}
|
347
518
|
|
519
|
+
/*
|
520
|
+
* (see Pointer#order)
|
521
|
+
*/
|
348
522
|
static VALUE
|
349
523
|
struct_order(int argc, VALUE* argv, VALUE self)
|
350
524
|
{
|
351
525
|
Struct* s;
|
352
526
|
|
353
|
-
|
527
|
+
TypedData_Get_Struct(self, Struct, &rbffi_struct_data_type, s);
|
354
528
|
if (argc == 0) {
|
355
529
|
return rb_funcall(s->rbPointer, rb_intern("order"), 0);
|
356
530
|
|
@@ -358,11 +532,23 @@ struct_order(int argc, VALUE* argv, VALUE self)
|
|
358
532
|
VALUE retval = rb_obj_dup(self);
|
359
533
|
VALUE rbPointer = rb_funcall2(s->rbPointer, rb_intern("order"), argc, argv);
|
360
534
|
struct_set_pointer(retval, rbPointer);
|
361
|
-
|
535
|
+
|
362
536
|
return retval;
|
363
537
|
}
|
364
538
|
}
|
365
539
|
|
540
|
+
static const rb_data_type_t inline_array_data_type = {
|
541
|
+
.wrap_struct_name = "FFI::Struct::InlineArray",
|
542
|
+
.function = {
|
543
|
+
.dmark = inline_array_mark,
|
544
|
+
.dfree = RUBY_TYPED_DEFAULT_FREE,
|
545
|
+
.dsize = inline_array_memsize,
|
546
|
+
ffi_compact_callback( inline_array_compact )
|
547
|
+
},
|
548
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
549
|
+
// macro to update VALUE references, as to trigger write barriers.
|
550
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
|
551
|
+
};
|
366
552
|
|
367
553
|
static VALUE
|
368
554
|
inline_array_allocate(VALUE klass)
|
@@ -370,75 +556,123 @@ inline_array_allocate(VALUE klass)
|
|
370
556
|
InlineArray* array;
|
371
557
|
VALUE obj;
|
372
558
|
|
373
|
-
obj =
|
374
|
-
array->
|
375
|
-
array->
|
559
|
+
obj = TypedData_Make_Struct(klass, InlineArray, &inline_array_data_type, array);
|
560
|
+
RB_OBJ_WRITE(obj, &array->rbMemory, Qnil);
|
561
|
+
RB_OBJ_WRITE(obj, &array->rbField, Qnil);
|
376
562
|
|
377
563
|
return obj;
|
378
564
|
}
|
379
565
|
|
380
566
|
static void
|
381
|
-
inline_array_mark(
|
567
|
+
inline_array_mark(void *data)
|
382
568
|
{
|
383
|
-
|
384
|
-
|
569
|
+
InlineArray *array = (InlineArray *)data;
|
570
|
+
rb_gc_mark_movable(array->rbField);
|
571
|
+
rb_gc_mark_movable(array->rbMemory);
|
385
572
|
}
|
386
573
|
|
574
|
+
static void
|
575
|
+
inline_array_compact(void *data)
|
576
|
+
{
|
577
|
+
InlineArray *array = (InlineArray *)data;
|
578
|
+
ffi_gc_location(array->rbField);
|
579
|
+
ffi_gc_location(array->rbMemory);
|
580
|
+
}
|
581
|
+
|
582
|
+
static size_t
|
583
|
+
inline_array_memsize(const void *data)
|
584
|
+
{
|
585
|
+
return sizeof(InlineArray);
|
586
|
+
}
|
587
|
+
|
588
|
+
/*
|
589
|
+
* Document-method: FFI::Struct::InlineArray#initialize
|
590
|
+
* call-seq: initialize(memory, field)
|
591
|
+
* @param [AbstractMemory] memory
|
592
|
+
* @param [StructField] field
|
593
|
+
* @return [self]
|
594
|
+
*/
|
387
595
|
static VALUE
|
388
596
|
inline_array_initialize(VALUE self, VALUE rbMemory, VALUE rbField)
|
389
597
|
{
|
390
598
|
InlineArray* array;
|
391
|
-
|
392
|
-
|
393
|
-
array->rbMemory
|
394
|
-
array->rbField
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
599
|
+
|
600
|
+
TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
|
601
|
+
RB_OBJ_WRITE(self, &array->rbMemory, rbMemory);
|
602
|
+
RB_OBJ_WRITE(self, &array->rbField, rbField);
|
603
|
+
|
604
|
+
TypedData_Get_Struct(rbMemory, AbstractMemory, &rbffi_abstract_memory_data_type, array->memory);
|
605
|
+
TypedData_Get_Struct(rbField, StructField, &rbffi_struct_field_data_type, array->field);
|
606
|
+
TypedData_Get_Struct(array->field->rbType, ArrayType, &rbffi_array_type_data_type, array->arrayType);
|
607
|
+
TypedData_Get_Struct(array->arrayType->rbComponentType, Type, &rbffi_type_data_type, array->componentType);
|
608
|
+
|
401
609
|
array->op = get_memory_op(array->componentType);
|
610
|
+
if (array->op == NULL && array->componentType->nativeType == NATIVE_MAPPED) {
|
611
|
+
array->op = get_memory_op(((MappedType *) array->componentType)->type);
|
612
|
+
}
|
613
|
+
|
402
614
|
array->length = array->arrayType->length;
|
403
615
|
|
404
616
|
return self;
|
405
617
|
}
|
406
618
|
|
619
|
+
/*
|
620
|
+
* call-seq: size
|
621
|
+
* @return [Integer]
|
622
|
+
* Get size
|
623
|
+
*/
|
407
624
|
static VALUE
|
408
625
|
inline_array_size(VALUE self)
|
409
626
|
{
|
410
627
|
InlineArray* array;
|
411
628
|
|
412
|
-
|
629
|
+
TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
|
413
630
|
|
414
|
-
return UINT2NUM(array->field->type->
|
631
|
+
return UINT2NUM(((ArrayType *) array->field->type)->length);
|
415
632
|
}
|
416
633
|
|
417
634
|
static int
|
418
635
|
inline_array_offset(InlineArray* array, int index)
|
419
636
|
{
|
420
|
-
if (index < 0 || index >= array->length) {
|
637
|
+
if (index < 0 || (index >= array->length && array->length > 0)) {
|
421
638
|
rb_raise(rb_eIndexError, "index %d out of bounds", index);
|
422
639
|
}
|
423
640
|
|
424
|
-
return array->field->offset + (index * array->componentType->ffiType->size);
|
641
|
+
return (int) array->field->offset + (index * (int) array->componentType->ffiType->size);
|
425
642
|
}
|
426
643
|
|
644
|
+
/*
|
645
|
+
* call-seq: [](index)
|
646
|
+
* @param [Integer] index
|
647
|
+
* @return [Type, Struct]
|
648
|
+
*/
|
427
649
|
static VALUE
|
428
650
|
inline_array_aref(VALUE self, VALUE rbIndex)
|
429
651
|
{
|
430
652
|
InlineArray* array;
|
431
653
|
|
432
|
-
|
654
|
+
TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
|
433
655
|
|
434
656
|
if (array->op != NULL) {
|
435
|
-
|
657
|
+
VALUE rbNativeValue = array->op->get(array->memory,
|
658
|
+
inline_array_offset(array, NUM2INT(rbIndex)));
|
659
|
+
if (unlikely(array->componentType->nativeType == NATIVE_MAPPED)) {
|
660
|
+
return rb_funcall(((MappedType *) array->componentType)->rbConverter,
|
661
|
+
rb_intern("from_native"), 2, rbNativeValue, Qnil);
|
662
|
+
} else {
|
663
|
+
return rbNativeValue;
|
664
|
+
}
|
665
|
+
|
436
666
|
} else if (array->componentType->nativeType == NATIVE_STRUCT) {
|
437
667
|
VALUE rbOffset = INT2NUM(inline_array_offset(array, NUM2INT(rbIndex)));
|
438
668
|
VALUE rbLength = INT2NUM(array->componentType->ffiType->size);
|
439
669
|
VALUE rbPointer = rb_funcall(array->rbMemory, rb_intern("slice"), 2, rbOffset, rbLength);
|
670
|
+
VALUE obj;
|
440
671
|
|
441
|
-
|
672
|
+
/* We avoid rb_class_new_instance here, to avoid passing the method block */
|
673
|
+
obj = rb_obj_alloc(((StructByValue *) array->componentType)->rbStructClass);
|
674
|
+
rb_funcallv(obj, id_initialize, 1, &rbPointer);
|
675
|
+
return obj;
|
442
676
|
} else {
|
443
677
|
|
444
678
|
rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(array->arrayType->rbComponentType));
|
@@ -446,16 +680,28 @@ inline_array_aref(VALUE self, VALUE rbIndex)
|
|
446
680
|
}
|
447
681
|
}
|
448
682
|
|
683
|
+
/*
|
684
|
+
* call-seq: []=(index, value)
|
685
|
+
* @param [Integer] index
|
686
|
+
* @param [Type, Struct]
|
687
|
+
* @return [value]
|
688
|
+
*/
|
449
689
|
static VALUE
|
450
690
|
inline_array_aset(VALUE self, VALUE rbIndex, VALUE rbValue)
|
451
691
|
{
|
452
692
|
InlineArray* array;
|
453
693
|
|
454
|
-
|
694
|
+
rb_check_frozen(self);
|
695
|
+
TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
|
455
696
|
|
456
697
|
if (array->op != NULL) {
|
698
|
+
if (unlikely(array->componentType->nativeType == NATIVE_MAPPED)) {
|
699
|
+
rbValue = rb_funcall(((MappedType *) array->componentType)->rbConverter,
|
700
|
+
rb_intern("to_native"), 2, rbValue, Qnil);
|
701
|
+
}
|
457
702
|
array->op->put(array->memory, inline_array_offset(array, NUM2INT(rbIndex)),
|
458
703
|
rbValue);
|
704
|
+
|
459
705
|
} else if (array->componentType->nativeType == NATIVE_STRUCT) {
|
460
706
|
int offset = inline_array_offset(array, NUM2INT(rbIndex));
|
461
707
|
Struct* s;
|
@@ -468,7 +714,7 @@ inline_array_aset(VALUE self, VALUE rbIndex, VALUE rbValue)
|
|
468
714
|
checkWrite(array->memory);
|
469
715
|
checkBounds(array->memory, offset, array->componentType->ffiType->size);
|
470
716
|
|
471
|
-
|
717
|
+
TypedData_Get_Struct(rbValue, Struct, &rbffi_struct_data_type, s);
|
472
718
|
checkRead(s->pointer);
|
473
719
|
checkBounds(s->pointer, 0, array->componentType->ffiType->size);
|
474
720
|
|
@@ -476,7 +722,7 @@ inline_array_aset(VALUE self, VALUE rbIndex, VALUE rbValue)
|
|
476
722
|
|
477
723
|
} else {
|
478
724
|
ArrayType* arrayType;
|
479
|
-
|
725
|
+
TypedData_Get_Struct(array->field->rbType, ArrayType, &rbffi_array_type_data_type, arrayType);
|
480
726
|
|
481
727
|
rb_raise(rb_eArgError, "set not supported for %s", rb_obj_classname(arrayType->rbComponentType));
|
482
728
|
return Qnil;
|
@@ -485,39 +731,31 @@ inline_array_aset(VALUE self, VALUE rbIndex, VALUE rbValue)
|
|
485
731
|
return rbValue;
|
486
732
|
}
|
487
733
|
|
734
|
+
/*
|
735
|
+
* call-seq: each
|
736
|
+
* Yield block for each element of +self+.
|
737
|
+
*/
|
488
738
|
static VALUE
|
489
739
|
inline_array_each(VALUE self)
|
490
740
|
{
|
491
741
|
InlineArray* array;
|
492
|
-
|
493
|
-
int i;
|
494
742
|
|
495
|
-
|
496
|
-
|
497
|
-
if (array->op != NULL) {
|
498
|
-
for (i = 0; i < array->length; ++i) {
|
499
|
-
int offset = inline_array_offset(array, i);
|
500
|
-
rb_yield(array->op->get(array->memory, offset));
|
501
|
-
}
|
502
|
-
} else if (array->componentType->nativeType == NATIVE_STRUCT) {
|
503
|
-
for (i = 0; i < array->length; ++i) {
|
504
|
-
VALUE rbOffset = UINT2NUM(inline_array_offset(array, i));
|
505
|
-
VALUE rbLength = UINT2NUM(array->componentType->ffiType->size);
|
506
|
-
VALUE rbPointer = rb_funcall(array->rbMemory, rb_intern("slice"), 2, rbOffset, rbLength);
|
743
|
+
int i;
|
507
744
|
|
508
|
-
|
509
|
-
}
|
510
|
-
} else {
|
511
|
-
ArrayType* arrayType;
|
512
|
-
Data_Get_Struct(array->field->rbType, ArrayType, arrayType);
|
745
|
+
TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
|
513
746
|
|
514
|
-
|
515
|
-
|
747
|
+
for (i = 0; i < array->length; ++i) {
|
748
|
+
rb_yield(inline_array_aref(self, INT2FIX(i)));
|
516
749
|
}
|
517
750
|
|
518
751
|
return self;
|
519
752
|
}
|
520
753
|
|
754
|
+
/*
|
755
|
+
* call-seq: to_a
|
756
|
+
* @return [Array]
|
757
|
+
* Convert +self+ to an array.
|
758
|
+
*/
|
521
759
|
static VALUE
|
522
760
|
inline_array_to_a(VALUE self)
|
523
761
|
{
|
@@ -525,26 +763,31 @@ inline_array_to_a(VALUE self)
|
|
525
763
|
VALUE obj;
|
526
764
|
int i;
|
527
765
|
|
528
|
-
|
766
|
+
TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
|
529
767
|
obj = rb_ary_new2(array->length);
|
530
768
|
|
531
|
-
|
769
|
+
|
532
770
|
for (i = 0; i < array->length; ++i) {
|
533
|
-
|
534
|
-
rb_ary_push(obj, array->op->get(array->memory, offset));
|
771
|
+
rb_ary_push(obj, inline_array_aref(self, INT2FIX(i)));
|
535
772
|
}
|
536
773
|
|
537
774
|
return obj;
|
538
775
|
}
|
539
776
|
|
777
|
+
/*
|
778
|
+
* Document-method: FFI::StructLayout::CharArray#to_s
|
779
|
+
* call-seq: to_s
|
780
|
+
* @return [String]
|
781
|
+
* Convert +self+ to a string.
|
782
|
+
*/
|
540
783
|
static VALUE
|
541
784
|
inline_array_to_s(VALUE self)
|
542
785
|
{
|
543
786
|
InlineArray* array;
|
544
787
|
VALUE argv[2];
|
545
788
|
|
546
|
-
|
547
|
-
|
789
|
+
TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
|
790
|
+
|
548
791
|
if (array->componentType->nativeType != NATIVE_INT8 && array->componentType->nativeType != NATIVE_UINT8) {
|
549
792
|
VALUE dummy = Qnil;
|
550
793
|
return rb_call_super(0, &dummy);
|
@@ -556,13 +799,17 @@ inline_array_to_s(VALUE self)
|
|
556
799
|
return rb_funcall2(array->rbMemory, rb_intern("get_string"), 2, argv);
|
557
800
|
}
|
558
801
|
|
559
|
-
|
802
|
+
/*
|
803
|
+
* call-seq: to_ptr
|
804
|
+
* @return [AbstractMemory]
|
805
|
+
* Get pointer to +self+ content.
|
806
|
+
*/
|
560
807
|
static VALUE
|
561
808
|
inline_array_to_ptr(VALUE self)
|
562
809
|
{
|
563
810
|
InlineArray* array;
|
564
|
-
|
565
|
-
|
811
|
+
|
812
|
+
TypedData_Get_Struct(self, InlineArray, &inline_array_data_type, array);
|
566
813
|
|
567
814
|
return rb_funcall(array->rbMemory, rb_intern("slice"), 2,
|
568
815
|
UINT2NUM(array->field->offset), UINT2NUM(array->arrayType->base.ffiType->size));
|
@@ -576,21 +823,45 @@ rbffi_Struct_Init(VALUE moduleFFI)
|
|
576
823
|
|
577
824
|
rbffi_StructLayout_Init(moduleFFI);
|
578
825
|
|
579
|
-
|
826
|
+
/*
|
827
|
+
* Document-class: FFI::Struct
|
828
|
+
*
|
829
|
+
* A FFI::Struct means to mirror a C struct.
|
830
|
+
*
|
831
|
+
* A Struct is defined as:
|
832
|
+
* class MyStruct < FFI::Struct
|
833
|
+
* layout :value1, :int,
|
834
|
+
* :value2, :double
|
835
|
+
* end
|
836
|
+
* and is used as:
|
837
|
+
* my_struct = MyStruct.new
|
838
|
+
* my_struct[:value1] = 12
|
839
|
+
*
|
840
|
+
* For more information, see http://github.com/ffi/ffi/wiki/Structs
|
841
|
+
*/
|
842
|
+
rbffi_StructClass = rb_define_class_under(moduleFFI, "Struct", rb_cObject);
|
843
|
+
StructClass = rbffi_StructClass; // put on a line alone to help RDoc
|
580
844
|
rb_global_variable(&rbffi_StructClass);
|
581
845
|
|
846
|
+
/*
|
847
|
+
* Document-class: FFI::Struct::InlineArray
|
848
|
+
*/
|
582
849
|
rbffi_StructInlineArrayClass = rb_define_class_under(rbffi_StructClass, "InlineArray", rb_cObject);
|
583
850
|
rb_global_variable(&rbffi_StructInlineArrayClass);
|
584
851
|
|
585
|
-
|
586
|
-
|
852
|
+
/*
|
853
|
+
* Document-class: FFI::StructLayout::CharArray < FFI::Struct::InlineArray
|
854
|
+
*/
|
855
|
+
rbffi_StructLayoutCharArrayClass = rb_define_class_under(rbffi_StructLayoutClass, "CharArray",
|
856
|
+
rbffi_StructInlineArrayClass);
|
587
857
|
rb_global_variable(&rbffi_StructLayoutCharArrayClass);
|
588
858
|
|
589
859
|
|
590
860
|
rb_define_alloc_func(StructClass, struct_allocate);
|
591
861
|
rb_define_method(StructClass, "initialize", struct_initialize, -1);
|
862
|
+
rb_define_method(StructClass, "initialize_copy", struct_initialize_copy, 1);
|
592
863
|
rb_define_method(StructClass, "order", struct_order, -1);
|
593
|
-
|
864
|
+
|
594
865
|
rb_define_alias(rb_singleton_class(StructClass), "alloc_in", "new");
|
595
866
|
rb_define_alias(rb_singleton_class(StructClass), "alloc_out", "new");
|
596
867
|
rb_define_alias(rb_singleton_class(StructClass), "alloc_inout", "new");
|
@@ -628,4 +899,6 @@ rbffi_Struct_Init(VALUE moduleFFI)
|
|
628
899
|
id_put = rb_intern("put");
|
629
900
|
id_to_ptr = rb_intern("to_ptr");
|
630
901
|
id_to_s = rb_intern("to_s");
|
902
|
+
id_initialize = rb_intern("initialize");
|
631
903
|
}
|
904
|
+
|