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/AbstractMemory.c
CHANGED
@@ -1,51 +1,84 @@
|
|
1
1
|
/*
|
2
2
|
* Copyright (c) 2008, 2009, Wayne Meissner
|
3
|
+
* Copyright (C) 2009 Jake Douglas <jake@shiftedlabs.com>
|
4
|
+
* Copyright (C) 2008 Luc Heinrich <luc@honk-honk.com>
|
3
5
|
*
|
6
|
+
* Copyright (c) 2008-2013, Ruby FFI project contributors
|
4
7
|
* All rights reserved.
|
5
8
|
*
|
6
|
-
*
|
9
|
+
* Redistribution and use in source and binary forms, with or without
|
10
|
+
* modification, are permitted provided that the following conditions are met:
|
11
|
+
* * Redistributions of source code must retain the above copyright
|
12
|
+
* notice, this list of conditions and the following disclaimer.
|
13
|
+
* * Redistributions in binary form must reproduce the above copyright
|
14
|
+
* notice, this list of conditions and the following disclaimer in the
|
15
|
+
* documentation and/or other materials provided with the distribution.
|
16
|
+
* * Neither the name of the Ruby FFI project nor the
|
17
|
+
* names of its contributors may be used to endorse or promote products
|
18
|
+
* derived from this software without specific prior written permission.
|
7
19
|
*
|
8
|
-
*
|
9
|
-
*
|
10
|
-
*
|
11
|
-
*
|
12
|
-
*
|
13
|
-
*
|
14
|
-
*
|
15
|
-
*
|
16
|
-
*
|
17
|
-
*
|
18
|
-
* version 3 along with this work. If not, see <http://www.gnu.org/licenses/>.
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
21
|
+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
22
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
23
|
+
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
24
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
25
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
26
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
27
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
28
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
29
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
19
30
|
*/
|
20
31
|
|
21
32
|
#include <sys/types.h>
|
22
|
-
#
|
33
|
+
#ifndef _MSC_VER
|
34
|
+
# include <sys/param.h>
|
35
|
+
#endif
|
23
36
|
#include <stdint.h>
|
24
37
|
#include <stdbool.h>
|
38
|
+
|
25
39
|
#include <limits.h>
|
26
40
|
#include <ruby.h>
|
41
|
+
|
27
42
|
#include "rbffi.h"
|
28
43
|
#include "compat.h"
|
29
44
|
#include "AbstractMemory.h"
|
30
45
|
#include "Pointer.h"
|
31
46
|
#include "Function.h"
|
47
|
+
#include "LongDouble.h"
|
32
48
|
|
49
|
+
#ifdef PRIsVALUE
|
50
|
+
# define RB_OBJ_CLASSNAME(obj) rb_obj_class(obj)
|
51
|
+
# define RB_OBJ_STRING(obj) (obj)
|
52
|
+
#else
|
53
|
+
# define PRIsVALUE "s"
|
54
|
+
# define RB_OBJ_CLASSNAME(obj) rb_obj_classname(obj)
|
55
|
+
# define RB_OBJ_STRING(obj) StringValueCStr(obj)
|
56
|
+
#endif
|
33
57
|
|
58
|
+
static size_t memsize(const void *data);
|
34
59
|
static inline char* memory_address(VALUE self);
|
35
60
|
VALUE rbffi_AbstractMemoryClass = Qnil;
|
36
61
|
static VALUE NullPointerErrorClass = Qnil;
|
37
62
|
static ID id_to_ptr = 0, id_plus = 0, id_call = 0;
|
38
63
|
|
39
|
-
|
40
|
-
|
41
|
-
{
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
64
|
+
const rb_data_type_t rbffi_abstract_memory_data_type = { /* extern */
|
65
|
+
.wrap_struct_name = "FFI::AbstractMemory",
|
66
|
+
.function = {
|
67
|
+
.dmark = NULL,
|
68
|
+
.dfree = RUBY_TYPED_DEFAULT_FREE,
|
69
|
+
.dsize = memsize,
|
70
|
+
},
|
71
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
72
|
+
// macro to update VALUE references, as to trigger write barriers.
|
73
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
|
74
|
+
};
|
46
75
|
|
47
|
-
|
76
|
+
static size_t
|
77
|
+
memsize(const void *data)
|
78
|
+
{
|
79
|
+
return sizeof(AbstractMemory);
|
48
80
|
}
|
81
|
+
|
49
82
|
#define VAL(x, swap) (unlikely(((memory->flags & MEM_SWAP) != 0)) ? swap((x)) : (x))
|
50
83
|
|
51
84
|
#define NUM_OP(name, type, toNative, fromNative, swap) \
|
@@ -63,10 +96,19 @@ static VALUE \
|
|
63
96
|
memory_put_##name(VALUE self, VALUE offset, VALUE value) \
|
64
97
|
{ \
|
65
98
|
AbstractMemory* memory; \
|
66
|
-
|
99
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
|
67
100
|
memory_op_put_##name(memory, NUM2LONG(offset), value); \
|
68
101
|
return self; \
|
69
102
|
} \
|
103
|
+
static VALUE memory_write_##name(VALUE self, VALUE value); \
|
104
|
+
static VALUE \
|
105
|
+
memory_write_##name(VALUE self, VALUE value) \
|
106
|
+
{ \
|
107
|
+
AbstractMemory* memory; \
|
108
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
|
109
|
+
memory_op_put_##name(memory, 0, value); \
|
110
|
+
return self; \
|
111
|
+
} \
|
70
112
|
static VALUE memory_op_get_##name(AbstractMemory* memory, long off); \
|
71
113
|
static VALUE \
|
72
114
|
memory_op_get_##name(AbstractMemory* memory, long off) \
|
@@ -82,27 +124,43 @@ static VALUE \
|
|
82
124
|
memory_get_##name(VALUE self, VALUE offset) \
|
83
125
|
{ \
|
84
126
|
AbstractMemory* memory; \
|
85
|
-
|
127
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
|
86
128
|
return memory_op_get_##name(memory, NUM2LONG(offset)); \
|
87
129
|
} \
|
130
|
+
static VALUE memory_read_##name(VALUE self); \
|
131
|
+
static VALUE \
|
132
|
+
memory_read_##name(VALUE self) \
|
133
|
+
{ \
|
134
|
+
AbstractMemory* memory; \
|
135
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
|
136
|
+
return memory_op_get_##name(memory, 0); \
|
137
|
+
} \
|
88
138
|
static MemoryOp memory_op_##name = { memory_op_get_##name, memory_op_put_##name }; \
|
89
139
|
\
|
90
140
|
static VALUE memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary); \
|
91
141
|
static VALUE \
|
92
142
|
memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary) \
|
93
143
|
{ \
|
94
|
-
long count
|
144
|
+
long count; \
|
95
145
|
long off = NUM2LONG(offset); \
|
96
146
|
AbstractMemory* memory = MEMORY(self); \
|
97
147
|
long i; \
|
98
|
-
|
148
|
+
Check_Type(ary, T_ARRAY); \
|
149
|
+
count = RARRAY_LEN(ary); \
|
150
|
+
if (likely(count > 0)) checkWrite(memory); \
|
99
151
|
checkBounds(memory, off, count * sizeof(type)); \
|
100
152
|
for (i = 0; i < count; i++) { \
|
101
|
-
type tmp = (type) VAL(toNative(
|
153
|
+
type tmp = (type) VAL(toNative(RARRAY_AREF(ary, i)), swap); \
|
102
154
|
memcpy(memory->address + off + (i * sizeof(type)), &tmp, sizeof(tmp)); \
|
103
155
|
} \
|
104
156
|
return self; \
|
105
157
|
} \
|
158
|
+
static VALUE memory_write_array_of_##name(VALUE self, VALUE ary); \
|
159
|
+
static VALUE \
|
160
|
+
memory_write_array_of_##name(VALUE self, VALUE ary) \
|
161
|
+
{ \
|
162
|
+
return memory_put_array_of_##name(self, INT2FIX(0), ary); \
|
163
|
+
} \
|
106
164
|
static VALUE memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length); \
|
107
165
|
static VALUE \
|
108
166
|
memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length) \
|
@@ -110,16 +168,22 @@ memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length) \
|
|
110
168
|
long count = NUM2LONG(length); \
|
111
169
|
long off = NUM2LONG(offset); \
|
112
170
|
AbstractMemory* memory = MEMORY(self); \
|
171
|
+
VALUE retVal = rb_ary_new2(count); \
|
113
172
|
long i; \
|
114
|
-
checkRead(memory); \
|
173
|
+
if (likely(count > 0)) checkRead(memory); \
|
115
174
|
checkBounds(memory, off, count * sizeof(type)); \
|
116
|
-
VALUE retVal = rb_ary_new2(count); \
|
117
175
|
for (i = 0; i < count; ++i) { \
|
118
176
|
type tmp; \
|
119
177
|
memcpy(&tmp, memory->address + off + (i * sizeof(type)), sizeof(tmp)); \
|
120
178
|
rb_ary_push(retVal, fromNative(VAL(tmp, swap))); \
|
121
179
|
} \
|
122
180
|
return retVal; \
|
181
|
+
} \
|
182
|
+
static VALUE memory_read_array_of_##name(VALUE self, VALUE length); \
|
183
|
+
static VALUE \
|
184
|
+
memory_read_array_of_##name(VALUE self, VALUE length) \
|
185
|
+
{ \
|
186
|
+
return memory_get_array_of_##name(self, INT2FIX(0), length); \
|
123
187
|
}
|
124
188
|
|
125
189
|
#define NOSWAP(x) (x)
|
@@ -136,28 +200,75 @@ SWAPU16(uint16_t x)
|
|
136
200
|
return bswap16(x);
|
137
201
|
}
|
138
202
|
|
139
|
-
#
|
140
|
-
#define
|
141
|
-
|
203
|
+
#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
|
204
|
+
#define bswap32(x) \
|
205
|
+
(((x << 24) & 0xff000000) | \
|
206
|
+
((x << 8) & 0x00ff0000) | \
|
207
|
+
((x >> 8) & 0x0000ff00) | \
|
208
|
+
((x >> 24) & 0x000000ff))
|
209
|
+
|
210
|
+
#define bswap64(x) \
|
211
|
+
(((x << 56) & 0xff00000000000000ULL) | \
|
212
|
+
((x << 40) & 0x00ff000000000000ULL) | \
|
213
|
+
((x << 24) & 0x0000ff0000000000ULL) | \
|
214
|
+
((x << 8) & 0x000000ff00000000ULL) | \
|
215
|
+
((x >> 8) & 0x00000000ff000000ULL) | \
|
216
|
+
((x >> 24) & 0x0000000000ff0000ULL) | \
|
217
|
+
((x >> 40) & 0x000000000000ff00ULL) | \
|
218
|
+
((x >> 56) & 0x00000000000000ffULL))
|
219
|
+
|
220
|
+
static inline int32_t
|
221
|
+
SWAPS32(int32_t x)
|
222
|
+
{
|
223
|
+
return bswap32(x);
|
224
|
+
}
|
225
|
+
|
226
|
+
static inline uint32_t
|
227
|
+
SWAPU32(uint32_t x)
|
228
|
+
{
|
229
|
+
return bswap32(x);
|
230
|
+
}
|
231
|
+
|
232
|
+
static inline int64_t
|
233
|
+
SWAPS64(int64_t x)
|
234
|
+
{
|
235
|
+
return bswap64(x);
|
236
|
+
}
|
237
|
+
|
238
|
+
static inline uint64_t
|
239
|
+
SWAPU64(uint64_t x)
|
240
|
+
{
|
241
|
+
return bswap64(x);
|
242
|
+
}
|
243
|
+
|
244
|
+
#else
|
245
|
+
# define SWAPS32(x) ((int32_t) __builtin_bswap32(x))
|
246
|
+
# define SWAPU32(x) ((uint32_t) __builtin_bswap32(x))
|
247
|
+
# define SWAPS64(x) ((int64_t) __builtin_bswap64(x))
|
248
|
+
# define SWAPU64(x) ((uint64_t) __builtin_bswap64(x))
|
249
|
+
#endif
|
142
250
|
|
143
251
|
#if LONG_MAX > INT_MAX
|
144
|
-
# define
|
252
|
+
# define SWAPSLONG SWAPS64
|
253
|
+
# define SWAPULONG SWAPU64
|
145
254
|
#else
|
146
|
-
# define
|
255
|
+
# define SWAPSLONG SWAPS32
|
256
|
+
# define SWAPULONG SWAPU32
|
147
257
|
#endif
|
148
258
|
|
149
259
|
NUM_OP(int8, int8_t, NUM2INT, INT2NUM, NOSWAP);
|
150
260
|
NUM_OP(uint8, uint8_t, NUM2UINT, UINT2NUM, NOSWAP);
|
151
|
-
NUM_OP(int16, int16_t, NUM2INT, INT2NUM,
|
152
|
-
NUM_OP(uint16, uint16_t, NUM2UINT, UINT2NUM,
|
153
|
-
NUM_OP(int32, int32_t, NUM2INT, INT2NUM,
|
154
|
-
NUM_OP(uint32, uint32_t, NUM2UINT, UINT2NUM,
|
155
|
-
NUM_OP(int64, int64_t, NUM2LL, LL2NUM,
|
156
|
-
NUM_OP(uint64, uint64_t, NUM2ULL, ULL2NUM,
|
157
|
-
NUM_OP(long, long, NUM2LONG, LONG2NUM,
|
158
|
-
NUM_OP(ulong, unsigned long, NUM2ULONG, ULONG2NUM,
|
261
|
+
NUM_OP(int16, int16_t, NUM2INT, INT2NUM, SWAPS16);
|
262
|
+
NUM_OP(uint16, uint16_t, NUM2UINT, UINT2NUM, SWAPU16);
|
263
|
+
NUM_OP(int32, int32_t, NUM2INT, INT2NUM, SWAPS32);
|
264
|
+
NUM_OP(uint32, uint32_t, NUM2UINT, UINT2NUM, SWAPU32);
|
265
|
+
NUM_OP(int64, int64_t, NUM2LL, LL2NUM, SWAPS64);
|
266
|
+
NUM_OP(uint64, uint64_t, NUM2ULL, ULL2NUM, SWAPU64);
|
267
|
+
NUM_OP(long, long, NUM2LONG, LONG2NUM, SWAPSLONG);
|
268
|
+
NUM_OP(ulong, unsigned long, NUM2ULONG, ULONG2NUM, SWAPULONG);
|
159
269
|
NUM_OP(float32, float, NUM2DBL, rb_float_new, NOSWAP);
|
160
270
|
NUM_OP(float64, double, NUM2DBL, rb_float_new, NOSWAP);
|
271
|
+
NUM_OP(longdouble, long double, rbffi_num2longdouble, rbffi_longdouble_new, NOSWAP);
|
161
272
|
|
162
273
|
static inline void*
|
163
274
|
get_pointer_value(VALUE value)
|
@@ -168,7 +279,7 @@ get_pointer_value(VALUE value)
|
|
168
279
|
} else if (type == T_NIL) {
|
169
280
|
return NULL;
|
170
281
|
} else if (type == T_FIXNUM) {
|
171
|
-
return (void *) (uintptr_t)
|
282
|
+
return (void *) (uintptr_t) FIX2ULONG(value);
|
172
283
|
} else if (type == T_BIGNUM) {
|
173
284
|
return (void *) (uintptr_t) NUM2ULL(value);
|
174
285
|
} else if (rb_respond_to(value, id_to_ptr)) {
|
@@ -181,24 +292,127 @@ get_pointer_value(VALUE value)
|
|
181
292
|
|
182
293
|
NUM_OP(pointer, void *, get_pointer_value, rbffi_Pointer_NewInstance, NOSWAP);
|
183
294
|
|
295
|
+
static inline uint8_t
|
296
|
+
rbffi_bool_value(VALUE value)
|
297
|
+
{
|
298
|
+
return RTEST(value);
|
299
|
+
}
|
300
|
+
|
301
|
+
static inline VALUE
|
302
|
+
rbffi_bool_new(uint8_t value)
|
303
|
+
{
|
304
|
+
return (value & 1) != 0 ? Qtrue : Qfalse;
|
305
|
+
}
|
306
|
+
|
307
|
+
NUM_OP(bool, unsigned char, rbffi_bool_value, rbffi_bool_new, NOSWAP);
|
308
|
+
|
309
|
+
|
310
|
+
/*
|
311
|
+
* call-seq: memory.clear
|
312
|
+
* Set the memory to all-zero.
|
313
|
+
* @return [self]
|
314
|
+
*/
|
184
315
|
static VALUE
|
185
316
|
memory_clear(VALUE self)
|
186
317
|
{
|
187
318
|
AbstractMemory* ptr = MEMORY(self);
|
319
|
+
checkWrite(ptr);
|
188
320
|
memset(ptr->address, 0, ptr->size);
|
189
321
|
return self;
|
190
322
|
}
|
191
323
|
|
324
|
+
/*
|
325
|
+
* call-seq: memory.size
|
326
|
+
* Return memory size in bytes (alias: #total)
|
327
|
+
* @return [Integer]
|
328
|
+
*/
|
192
329
|
static VALUE
|
193
|
-
memory_size(VALUE self)
|
330
|
+
memory_size(VALUE self)
|
194
331
|
{
|
195
332
|
AbstractMemory* ptr;
|
196
333
|
|
197
|
-
|
334
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
198
335
|
|
199
336
|
return LONG2NUM(ptr->size);
|
200
337
|
}
|
201
338
|
|
339
|
+
/*
|
340
|
+
* call-seq: memory.get(type, offset)
|
341
|
+
* Return data of given type contained in memory.
|
342
|
+
* @param [Symbol, Type] type_name type of data to get
|
343
|
+
* @param [Integer] offset point in buffer to start from
|
344
|
+
* @return [Object]
|
345
|
+
* @raise {ArgumentError} if type is not supported
|
346
|
+
*/
|
347
|
+
static VALUE
|
348
|
+
memory_get(VALUE self, VALUE type_name, VALUE offset)
|
349
|
+
{
|
350
|
+
AbstractMemory* ptr;
|
351
|
+
VALUE nType;
|
352
|
+
Type *type;
|
353
|
+
MemoryOp *op;
|
354
|
+
|
355
|
+
nType = rbffi_Type_Lookup(type_name);
|
356
|
+
if(NIL_P(nType)) goto undefined_type;
|
357
|
+
|
358
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
359
|
+
TypedData_Get_Struct(nType, Type, &rbffi_type_data_type, type);
|
360
|
+
|
361
|
+
op = get_memory_op(type);
|
362
|
+
if(op == NULL) goto undefined_type;
|
363
|
+
|
364
|
+
return op->get(ptr, NUM2LONG(offset));
|
365
|
+
|
366
|
+
undefined_type: {
|
367
|
+
VALUE msg = rb_sprintf("undefined type '%" PRIsVALUE "'", type_name);
|
368
|
+
rb_exc_raise(rb_exc_new3(rb_eArgError, msg));
|
369
|
+
return Qnil;
|
370
|
+
}
|
371
|
+
}
|
372
|
+
|
373
|
+
/*
|
374
|
+
* call-seq: memory.put(type, offset, value)
|
375
|
+
* @param [Symbol, Type] type_name type of data to put
|
376
|
+
* @param [Integer] offset point in buffer to start from
|
377
|
+
* @return [nil]
|
378
|
+
* @raise {ArgumentError} if type is not supported
|
379
|
+
*/
|
380
|
+
static VALUE
|
381
|
+
memory_put(VALUE self, VALUE type_name, VALUE offset, VALUE value)
|
382
|
+
{
|
383
|
+
AbstractMemory* ptr;
|
384
|
+
VALUE nType;
|
385
|
+
Type *type;
|
386
|
+
MemoryOp *op;
|
387
|
+
|
388
|
+
nType = rbffi_Type_Lookup(type_name);
|
389
|
+
if(NIL_P(nType)) goto undefined_type;
|
390
|
+
|
391
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
392
|
+
TypedData_Get_Struct(nType, Type, &rbffi_type_data_type, type);
|
393
|
+
|
394
|
+
op = get_memory_op(type);
|
395
|
+
if(op == NULL) goto undefined_type;
|
396
|
+
|
397
|
+
op->put(ptr, NUM2LONG(offset), value);
|
398
|
+
return Qnil;
|
399
|
+
|
400
|
+
undefined_type: {
|
401
|
+
VALUE msg = rb_sprintf("unsupported type '%" PRIsVALUE "'", type_name);
|
402
|
+
rb_exc_raise(rb_exc_new3(rb_eArgError, msg));
|
403
|
+
return Qnil;
|
404
|
+
}
|
405
|
+
}
|
406
|
+
|
407
|
+
/*
|
408
|
+
* call-seq: memory.get_string(offset, length=nil)
|
409
|
+
* Return string contained in memory.
|
410
|
+
* @param [Integer] offset point in buffer to start from
|
411
|
+
* @param [Integer] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
|
412
|
+
* @return [String]
|
413
|
+
* @raise {IndexError} if +length+ is too great
|
414
|
+
* @raise {NullPointerError} if memory not initialized
|
415
|
+
*/
|
202
416
|
static VALUE
|
203
417
|
memory_get_string(int argc, VALUE* argv, VALUE self)
|
204
418
|
{
|
@@ -214,10 +428,19 @@ memory_get_string(int argc, VALUE* argv, VALUE self)
|
|
214
428
|
checkBounds(ptr, off, len);
|
215
429
|
|
216
430
|
end = memchr(ptr->address + off, 0, len);
|
217
|
-
return
|
431
|
+
return rb_str_new((char *) ptr->address + off,
|
218
432
|
(end != NULL ? end - ptr->address - off : len));
|
219
433
|
}
|
220
434
|
|
435
|
+
/*
|
436
|
+
* call-seq: memory.get_array_of_string(offset, count=nil)
|
437
|
+
* Return an array of strings contained in memory.
|
438
|
+
* @param [Integer] offset point in memory to start from
|
439
|
+
* @param [Integer] count number of strings to get. If nil, return all strings
|
440
|
+
* @return [Array<String>]
|
441
|
+
* @raise {IndexError} if +offset+ is too great
|
442
|
+
* @raise {NullPointerError} if memory not initialized
|
443
|
+
*/
|
221
444
|
static VALUE
|
222
445
|
memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
|
223
446
|
{
|
@@ -231,17 +454,17 @@ memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
|
|
231
454
|
count = (countnum == Qnil ? 0 : NUM2INT(countnum));
|
232
455
|
retVal = rb_ary_new2(count);
|
233
456
|
|
234
|
-
|
457
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
235
458
|
checkRead(ptr);
|
236
459
|
|
237
460
|
if (countnum != Qnil) {
|
238
461
|
int i;
|
239
462
|
|
240
463
|
checkBounds(ptr, off, count * sizeof (char*));
|
241
|
-
|
464
|
+
|
242
465
|
for (i = 0; i < count; ++i) {
|
243
466
|
const char* strptr = *((const char**) (ptr->address + off) + i);
|
244
|
-
rb_ary_push(retVal, (strptr == NULL ? Qnil :
|
467
|
+
rb_ary_push(retVal, (strptr == NULL ? Qnil : rb_str_new2(strptr)));
|
245
468
|
}
|
246
469
|
|
247
470
|
} else {
|
@@ -251,13 +474,45 @@ memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
|
|
251
474
|
if (strptr == NULL) {
|
252
475
|
break;
|
253
476
|
}
|
254
|
-
rb_ary_push(retVal,
|
477
|
+
rb_ary_push(retVal, rb_str_new2(strptr));
|
255
478
|
}
|
256
479
|
}
|
257
480
|
|
258
481
|
return retVal;
|
259
482
|
}
|
260
483
|
|
484
|
+
/*
|
485
|
+
* call-seq: memory.read_array_of_string(count=nil)
|
486
|
+
* Return an array of strings contained in memory. Same as:
|
487
|
+
* memory.get_array_of_string(0, count)
|
488
|
+
* @param [Integer] count number of strings to get. If nil, return all strings
|
489
|
+
* @return [Array<String>]
|
490
|
+
*/
|
491
|
+
static VALUE
|
492
|
+
memory_read_array_of_string(int argc, VALUE* argv, VALUE self)
|
493
|
+
{
|
494
|
+
VALUE* rargv = ALLOCA_N(VALUE, argc + 1);
|
495
|
+
int i;
|
496
|
+
|
497
|
+
rargv[0] = INT2FIX(0);
|
498
|
+
for (i = 0; i < argc; i++) {
|
499
|
+
rargv[i + 1] = argv[i];
|
500
|
+
}
|
501
|
+
|
502
|
+
return memory_get_array_of_string(argc + 1, rargv, self);
|
503
|
+
}
|
504
|
+
|
505
|
+
|
506
|
+
/*
|
507
|
+
* call-seq: memory.put_string(offset, str)
|
508
|
+
* @param [Integer] offset
|
509
|
+
* @param [String] str
|
510
|
+
* @return [self]
|
511
|
+
* @raise {SecurityError} when writing unsafe string to memory
|
512
|
+
* @raise {IndexError} if +offset+ is too great
|
513
|
+
* @raise {NullPointerError} if memory not initialized
|
514
|
+
* Put a string in memory.
|
515
|
+
*/
|
261
516
|
static VALUE
|
262
517
|
memory_put_string(VALUE self, VALUE offset, VALUE str)
|
263
518
|
{
|
@@ -270,11 +525,6 @@ memory_put_string(VALUE self, VALUE offset, VALUE str)
|
|
270
525
|
|
271
526
|
checkWrite(ptr);
|
272
527
|
checkBounds(ptr, off, len + 1);
|
273
|
-
|
274
|
-
if (rb_safe_level() >= 1 && OBJ_TAINTED(str)) {
|
275
|
-
rb_raise(rb_eSecurityError, "Writing unsafe string to memory");
|
276
|
-
return Qnil;
|
277
|
-
}
|
278
528
|
|
279
529
|
memcpy(ptr->address + off, RSTRING_PTR(str), len);
|
280
530
|
*((char *) ptr->address + off + len) = '\0';
|
@@ -282,21 +532,43 @@ memory_put_string(VALUE self, VALUE offset, VALUE str)
|
|
282
532
|
return self;
|
283
533
|
}
|
284
534
|
|
535
|
+
/*
|
536
|
+
* call-seq: memory.get_bytes(offset, length)
|
537
|
+
* Return string contained in memory.
|
538
|
+
* @param [Integer] offset point in buffer to start from
|
539
|
+
* @param [Integer] length string's length in bytes.
|
540
|
+
* @return [String]
|
541
|
+
* @raise {IndexError} if +length+ is too great
|
542
|
+
* @raise {NullPointerError} if memory not initialized
|
543
|
+
*/
|
285
544
|
static VALUE
|
286
545
|
memory_get_bytes(VALUE self, VALUE offset, VALUE length)
|
287
546
|
{
|
288
547
|
AbstractMemory* ptr = MEMORY(self);
|
289
548
|
long off, len;
|
290
|
-
|
549
|
+
|
291
550
|
off = NUM2LONG(offset);
|
292
551
|
len = NUM2LONG(length);
|
293
552
|
|
294
553
|
checkRead(ptr);
|
295
554
|
checkBounds(ptr, off, len);
|
296
|
-
|
297
|
-
return
|
555
|
+
|
556
|
+
return rb_str_new((char *) ptr->address + off, len);
|
298
557
|
}
|
299
558
|
|
559
|
+
/*
|
560
|
+
* call-seq: memory.put_bytes(offset, str, index=0, length=nil)
|
561
|
+
* Put a string in memory.
|
562
|
+
* @param [Integer] offset point in buffer to start from
|
563
|
+
* @param [String] str string to put to memory
|
564
|
+
* @param [Integer] index
|
565
|
+
* @param [Integer] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
|
566
|
+
* @return [self]
|
567
|
+
* @raise {IndexError} if +length+ is too great
|
568
|
+
* @raise {NullPointerError} if memory not initialized
|
569
|
+
* @raise {RangeError} if +index+ is negative, or if index+length is greater than size of string
|
570
|
+
* @raise {SecurityError} when writing unsafe string to memory
|
571
|
+
*/
|
300
572
|
static VALUE
|
301
573
|
memory_put_bytes(int argc, VALUE* argv, VALUE self)
|
302
574
|
{
|
@@ -310,7 +582,7 @@ memory_put_bytes(int argc, VALUE* argv, VALUE self)
|
|
310
582
|
off = NUM2LONG(offset);
|
311
583
|
idx = nargs > 2 ? NUM2LONG(rbIndex) : 0;
|
312
584
|
if (idx < 0) {
|
313
|
-
rb_raise(rb_eRangeError, "index
|
585
|
+
rb_raise(rb_eRangeError, "index cannot be less than zero");
|
314
586
|
return Qnil;
|
315
587
|
}
|
316
588
|
len = nargs > 3 ? NUM2LONG(rbLength) : (RSTRING_LEN(str) - idx);
|
@@ -322,32 +594,76 @@ memory_put_bytes(int argc, VALUE* argv, VALUE self)
|
|
322
594
|
checkWrite(ptr);
|
323
595
|
checkBounds(ptr, off, len);
|
324
596
|
|
325
|
-
if (rb_safe_level() >= 1 && OBJ_TAINTED(str)) {
|
326
|
-
rb_raise(rb_eSecurityError, "Writing unsafe string to memory");
|
327
|
-
return Qnil;
|
328
|
-
}
|
329
597
|
memcpy(ptr->address + off, RSTRING_PTR(str) + idx, len);
|
330
598
|
|
331
599
|
return self;
|
332
600
|
}
|
333
601
|
|
602
|
+
/*
|
603
|
+
* call-seq: memory.read_bytes(length)
|
604
|
+
* @param [Integer] length of string to return
|
605
|
+
* @return [String]
|
606
|
+
* equivalent to :
|
607
|
+
* memory.get_bytes(0, length)
|
608
|
+
*/
|
609
|
+
static VALUE
|
610
|
+
memory_read_bytes(VALUE self, VALUE length)
|
611
|
+
{
|
612
|
+
return memory_get_bytes(self, INT2FIX(0), length);
|
613
|
+
}
|
614
|
+
|
615
|
+
/*
|
616
|
+
* call-seq: memory.write_bytes(str, index=0, length=nil)
|
617
|
+
* @param [String] str string to put to memory
|
618
|
+
* @param [Integer] index
|
619
|
+
* @param [Integer] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
|
620
|
+
* @return [self]
|
621
|
+
* equivalent to :
|
622
|
+
* memory.put_bytes(0, str, index, length)
|
623
|
+
*/
|
624
|
+
static VALUE
|
625
|
+
memory_write_bytes(int argc, VALUE* argv, VALUE self)
|
626
|
+
{
|
627
|
+
VALUE* wargv = ALLOCA_N(VALUE, argc + 1);
|
628
|
+
int i;
|
629
|
+
|
630
|
+
wargv[0] = INT2FIX(0);
|
631
|
+
for (i = 0; i < argc; i++) {
|
632
|
+
wargv[i + 1] = argv[i];
|
633
|
+
}
|
634
|
+
|
635
|
+
return memory_put_bytes(argc + 1, wargv, self);
|
636
|
+
}
|
637
|
+
|
638
|
+
/*
|
639
|
+
* call-seq: memory.type_size
|
640
|
+
* @return [Integer] type size in bytes
|
641
|
+
* Get the memory's type size.
|
642
|
+
*/
|
334
643
|
static VALUE
|
335
644
|
memory_type_size(VALUE self)
|
336
645
|
{
|
337
646
|
AbstractMemory* ptr;
|
338
647
|
|
339
|
-
|
648
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
340
649
|
|
341
650
|
return INT2NUM(ptr->typeSize);
|
342
651
|
}
|
343
652
|
|
653
|
+
/*
|
654
|
+
* Document-method: []
|
655
|
+
* call-seq: memory[idx]
|
656
|
+
* @param [Integer] idx index to access in memory
|
657
|
+
* @return
|
658
|
+
* Memory read accessor.
|
659
|
+
*/
|
344
660
|
static VALUE
|
345
661
|
memory_aref(VALUE self, VALUE idx)
|
346
662
|
{
|
347
663
|
AbstractMemory* ptr;
|
348
664
|
VALUE rbOffset = Qnil;
|
349
665
|
|
350
|
-
|
666
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
351
667
|
|
352
668
|
rbOffset = ULONG2NUM(NUM2ULONG(idx) * ptr->typeSize);
|
353
669
|
|
@@ -357,20 +673,43 @@ memory_aref(VALUE self, VALUE idx)
|
|
357
673
|
static inline char*
|
358
674
|
memory_address(VALUE obj)
|
359
675
|
{
|
360
|
-
|
676
|
+
AbstractMemory *mem;
|
677
|
+
TypedData_Get_Struct(obj, AbstractMemory, &rbffi_abstract_memory_data_type, mem);
|
678
|
+
return mem->address;
|
361
679
|
}
|
362
680
|
|
363
|
-
|
364
|
-
|
681
|
+
static VALUE
|
682
|
+
memory_copy_from(VALUE self, VALUE rbsrc, VALUE rblen)
|
365
683
|
{
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
684
|
+
AbstractMemory* dst;
|
685
|
+
|
686
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, dst);
|
687
|
+
|
688
|
+
memcpy(dst->address, rbffi_AbstractMemory_Cast(rbsrc, &rbffi_abstract_memory_data_type)->address, NUM2INT(rblen));
|
689
|
+
|
690
|
+
return self;
|
691
|
+
}
|
371
692
|
|
372
|
-
|
373
|
-
|
693
|
+
/*
|
694
|
+
* call-seq:
|
695
|
+
* res.freeze
|
696
|
+
*
|
697
|
+
* Freeze the AbstractMemory object and unset the writable flag.
|
698
|
+
*/
|
699
|
+
static VALUE
|
700
|
+
memory_freeze(VALUE self)
|
701
|
+
{
|
702
|
+
AbstractMemory* ptr = MEMORY(self);
|
703
|
+
ptr->flags &= ~MEM_WR;
|
704
|
+
return rb_call_super(0, NULL);
|
705
|
+
}
|
706
|
+
|
707
|
+
AbstractMemory*
|
708
|
+
rbffi_AbstractMemory_Cast(VALUE obj, const rb_data_type_t *data_type)
|
709
|
+
{
|
710
|
+
AbstractMemory* memory;
|
711
|
+
TypedData_Get_Struct(obj, AbstractMemory, data_type, memory);
|
712
|
+
return memory;
|
374
713
|
}
|
375
714
|
|
376
715
|
void
|
@@ -397,7 +736,7 @@ memory_op_get_strptr(AbstractMemory* ptr, long offset)
|
|
397
736
|
memcpy(&tmp, ptr->address + offset, sizeof(tmp));
|
398
737
|
}
|
399
738
|
|
400
|
-
return tmp != NULL ?
|
739
|
+
return tmp != NULL ? rb_str_new2(tmp) : Qnil;
|
401
740
|
}
|
402
741
|
|
403
742
|
static void
|
@@ -408,34 +747,67 @@ memory_op_put_strptr(AbstractMemory* ptr, long offset, VALUE value)
|
|
408
747
|
|
409
748
|
static MemoryOp memory_op_strptr = { memory_op_get_strptr, memory_op_put_strptr };
|
410
749
|
|
411
|
-
//static MemoryOp memory_op_pointer = { memory_op_get_pointer, memory_op_put_pointer };
|
412
750
|
|
413
751
|
MemoryOps rbffi_AbstractMemoryOps = {
|
414
|
-
|
415
|
-
.uint8
|
416
|
-
.int16
|
417
|
-
.uint16
|
418
|
-
.int32
|
419
|
-
.uint32
|
420
|
-
.int64
|
421
|
-
.uint64
|
422
|
-
.slong
|
423
|
-
|
424
|
-
.float32
|
425
|
-
.float64
|
426
|
-
.
|
427
|
-
.
|
752
|
+
&memory_op_int8, /*.int8 */
|
753
|
+
&memory_op_uint8, /* .uint8 */
|
754
|
+
&memory_op_int16, /* .int16 */
|
755
|
+
&memory_op_uint16, /* .uint16 */
|
756
|
+
&memory_op_int32, /* .int32 */
|
757
|
+
&memory_op_uint32, /* .uint32 */
|
758
|
+
&memory_op_int64, /* .int64 */
|
759
|
+
&memory_op_uint64, /* .uint64 */
|
760
|
+
&memory_op_long, /* .slong */
|
761
|
+
&memory_op_ulong, /* .uslong */
|
762
|
+
&memory_op_float32, /* .float32 */
|
763
|
+
&memory_op_float64, /* .float64 */
|
764
|
+
&memory_op_longdouble, /* .longdouble */
|
765
|
+
&memory_op_pointer, /* .pointer */
|
766
|
+
&memory_op_strptr, /* .strptr */
|
767
|
+
&memory_op_bool /* .boolOp */
|
428
768
|
};
|
429
769
|
|
430
770
|
void
|
431
771
|
rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
432
772
|
{
|
773
|
+
/*
|
774
|
+
* Document-class: FFI::AbstractMemory
|
775
|
+
*
|
776
|
+
* {AbstractMemory} is the base class for many memory management classes such as {Buffer}.
|
777
|
+
*
|
778
|
+
* This class has a lot of methods to work with integers :
|
779
|
+
* * put_int<i>size</i>(offset, value)
|
780
|
+
* * get_int<i>size</i>(offset)
|
781
|
+
* * put_uint<i>size</i>(offset, value)
|
782
|
+
* * get_uint<i>size</i>(offset)
|
783
|
+
* * writeuint<i>size</i>(value)
|
784
|
+
* * read_int<i>size</i>
|
785
|
+
* * write_uint<i>size</i>(value)
|
786
|
+
* * read_uint<i>size</i>
|
787
|
+
* * put_array_of_int<i>size</i>(offset, ary)
|
788
|
+
* * get_array_of_int<i>size</i>(offset, length)
|
789
|
+
* * put_array_of_uint<i>size</i>(offset, ary)
|
790
|
+
* * get_array_of_uint<i>size</i>(offset, length)
|
791
|
+
* * write_array_of_int<i>size</i>(ary)
|
792
|
+
* * read_array_of_int<i>size</i>(length)
|
793
|
+
* * write_array_of_uint<i>size</i>(ary)
|
794
|
+
* * read_array_of_uint<i>size</i>(length)
|
795
|
+
* where _size_ is 8, 16, 32 or 64. Same methods exist for long type.
|
796
|
+
*
|
797
|
+
* Aliases exist : _char_ for _int8_, _short_ for _int16_, _int_ for _int32_ and <i>long_long</i> for _int64_.
|
798
|
+
*
|
799
|
+
* Others methods are listed below.
|
800
|
+
*/
|
433
801
|
VALUE classMemory = rb_define_class_under(moduleFFI, "AbstractMemory", rb_cObject);
|
434
802
|
rbffi_AbstractMemoryClass = classMemory;
|
803
|
+
/*
|
804
|
+
* Document-variable: FFI::AbstractMemory
|
805
|
+
*/
|
435
806
|
rb_global_variable(&rbffi_AbstractMemoryClass);
|
436
|
-
|
807
|
+
rb_undef_alloc_func(classMemory);
|
437
808
|
|
438
809
|
NullPointerErrorClass = rb_define_class_under(moduleFFI, "NullPointerError", rb_eRuntimeError);
|
810
|
+
/* Document-variable: NullPointerError */
|
439
811
|
rb_global_variable(&NullPointerErrorClass);
|
440
812
|
|
441
813
|
|
@@ -445,63 +817,310 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
445
817
|
rb_define_method(classMemory, "get_" #type, memory_get_##type, 1); \
|
446
818
|
rb_define_method(classMemory, "put_u" #type, memory_put_u##type, 2); \
|
447
819
|
rb_define_method(classMemory, "get_u" #type, memory_get_u##type, 1); \
|
820
|
+
rb_define_method(classMemory, "write_" #type, memory_write_##type, 1); \
|
821
|
+
rb_define_method(classMemory, "read_" #type, memory_read_##type, 0); \
|
822
|
+
rb_define_method(classMemory, "write_u" #type, memory_write_u##type, 1); \
|
823
|
+
rb_define_method(classMemory, "read_u" #type, memory_read_u##type, 0); \
|
448
824
|
rb_define_method(classMemory, "put_array_of_" #type, memory_put_array_of_##type, 2); \
|
449
825
|
rb_define_method(classMemory, "get_array_of_" #type, memory_get_array_of_##type, 2); \
|
450
826
|
rb_define_method(classMemory, "put_array_of_u" #type, memory_put_array_of_u##type, 2); \
|
451
|
-
rb_define_method(classMemory, "get_array_of_u" #type, memory_get_array_of_u##type, 2);
|
452
|
-
|
827
|
+
rb_define_method(classMemory, "get_array_of_u" #type, memory_get_array_of_u##type, 2); \
|
828
|
+
rb_define_method(classMemory, "write_array_of_" #type, memory_write_array_of_##type, 1); \
|
829
|
+
rb_define_method(classMemory, "read_array_of_" #type, memory_read_array_of_##type, 1); \
|
830
|
+
rb_define_method(classMemory, "write_array_of_u" #type, memory_write_array_of_u##type, 1); \
|
831
|
+
rb_define_method(classMemory, "read_array_of_u" #type, memory_read_array_of_u##type, 1);
|
832
|
+
|
453
833
|
INT(int8);
|
454
834
|
INT(int16);
|
455
835
|
INT(int32);
|
456
836
|
INT(int64);
|
457
837
|
INT(long);
|
458
|
-
|
838
|
+
|
459
839
|
#define ALIAS(name, old) \
|
460
840
|
rb_define_alias(classMemory, "put_" #name, "put_" #old); \
|
461
841
|
rb_define_alias(classMemory, "get_" #name, "get_" #old); \
|
462
842
|
rb_define_alias(classMemory, "put_u" #name, "put_u" #old); \
|
463
843
|
rb_define_alias(classMemory, "get_u" #name, "get_u" #old); \
|
844
|
+
rb_define_alias(classMemory, "write_" #name, "write_" #old); \
|
845
|
+
rb_define_alias(classMemory, "read_" #name, "read_" #old); \
|
846
|
+
rb_define_alias(classMemory, "write_u" #name, "write_u" #old); \
|
847
|
+
rb_define_alias(classMemory, "read_u" #name, "read_u" #old); \
|
464
848
|
rb_define_alias(classMemory, "put_array_of_" #name, "put_array_of_" #old); \
|
465
849
|
rb_define_alias(classMemory, "get_array_of_" #name, "get_array_of_" #old); \
|
466
850
|
rb_define_alias(classMemory, "put_array_of_u" #name, "put_array_of_u" #old); \
|
467
|
-
rb_define_alias(classMemory, "get_array_of_u" #name, "get_array_of_u" #old);
|
468
|
-
|
851
|
+
rb_define_alias(classMemory, "get_array_of_u" #name, "get_array_of_u" #old); \
|
852
|
+
rb_define_alias(classMemory, "write_array_of_" #name, "write_array_of_" #old); \
|
853
|
+
rb_define_alias(classMemory, "read_array_of_" #name, "read_array_of_" #old); \
|
854
|
+
rb_define_alias(classMemory, "write_array_of_u" #name, "write_array_of_u" #old); \
|
855
|
+
rb_define_alias(classMemory, "read_array_of_u" #name, "read_array_of_u" #old);
|
856
|
+
|
469
857
|
ALIAS(char, int8);
|
470
858
|
ALIAS(short, int16);
|
471
859
|
ALIAS(int, int32);
|
472
860
|
ALIAS(long_long, int64);
|
473
|
-
|
861
|
+
|
862
|
+
/*
|
863
|
+
* Document-method: put_float32
|
864
|
+
* call-seq: memory.put_float32(offset, value)
|
865
|
+
* @param [Integer] offset
|
866
|
+
* @param [Numeric] value
|
867
|
+
* @return [self]
|
868
|
+
* Put +value+ as a 32-bit float in memory at offset +offset+ (alias: #put_float).
|
869
|
+
*/
|
474
870
|
rb_define_method(classMemory, "put_float32", memory_put_float32, 2);
|
871
|
+
/*
|
872
|
+
* Document-method: get_float32
|
873
|
+
* call-seq: memory.get_float32(offset)
|
874
|
+
* @param [Integer] offset
|
875
|
+
* @return [Float]
|
876
|
+
* Get a 32-bit float from memory at offset +offset+ (alias: #get_float).
|
877
|
+
*/
|
475
878
|
rb_define_method(classMemory, "get_float32", memory_get_float32, 1);
|
476
879
|
rb_define_alias(classMemory, "put_float", "put_float32");
|
477
880
|
rb_define_alias(classMemory, "get_float", "get_float32");
|
881
|
+
/*
|
882
|
+
* Document-method: write_float
|
883
|
+
* call-seq: memory.write_float(value)
|
884
|
+
* @param [Numeric] value
|
885
|
+
* @return [self]
|
886
|
+
* Write +value+ as a 32-bit float in memory.
|
887
|
+
*
|
888
|
+
* Same as:
|
889
|
+
* memory.put_float(0, value)
|
890
|
+
*/
|
891
|
+
rb_define_method(classMemory, "write_float", memory_write_float32, 1);
|
892
|
+
/*
|
893
|
+
* Document-method: read_float
|
894
|
+
* call-seq: memory.read_float
|
895
|
+
* @return [Float]
|
896
|
+
* Read a 32-bit float from memory.
|
897
|
+
*
|
898
|
+
* Same as:
|
899
|
+
* memory.get_float(0)
|
900
|
+
*/
|
901
|
+
rb_define_method(classMemory, "read_float", memory_read_float32, 0);
|
902
|
+
/*
|
903
|
+
* Document-method: put_array_of_float32
|
904
|
+
* call-seq: memory.put_array_of_float32(offset, ary)
|
905
|
+
* @param [Integer] offset
|
906
|
+
* @param [Array<Numeric>] ary
|
907
|
+
* @return [self]
|
908
|
+
* Put values from +ary+ as 32-bit floats in memory from offset +offset+ (alias: #put_array_of_float).
|
909
|
+
*/
|
478
910
|
rb_define_method(classMemory, "put_array_of_float32", memory_put_array_of_float32, 2);
|
911
|
+
/*
|
912
|
+
* Document-method: get_array_of_float32
|
913
|
+
* call-seq: memory.get_array_of_float32(offset, length)
|
914
|
+
* @param [Integer] offset
|
915
|
+
* @param [Integer] length number of Float to get
|
916
|
+
* @return [Array<Float>]
|
917
|
+
* Get 32-bit floats in memory from offset +offset+ (alias: #get_array_of_float).
|
918
|
+
*/
|
479
919
|
rb_define_method(classMemory, "get_array_of_float32", memory_get_array_of_float32, 2);
|
920
|
+
/*
|
921
|
+
* Document-method: write_array_of_float
|
922
|
+
* call-seq: memory.write_array_of_float(ary)
|
923
|
+
* @param [Array<Numeric>] ary
|
924
|
+
* @return [self]
|
925
|
+
* Write values from +ary+ as 32-bit floats in memory.
|
926
|
+
*
|
927
|
+
* Same as:
|
928
|
+
* memory.put_array_of_float(0, ary)
|
929
|
+
*/
|
930
|
+
rb_define_method(classMemory, "write_array_of_float", memory_write_array_of_float32, 1);
|
931
|
+
/*
|
932
|
+
* Document-method: read_array_of_float
|
933
|
+
* call-seq: memory.read_array_of_float(length)
|
934
|
+
* @param [Integer] length number of Float to read
|
935
|
+
* @return [Array<Float>]
|
936
|
+
* Read 32-bit floats from memory.
|
937
|
+
*
|
938
|
+
* Same as:
|
939
|
+
* memory.get_array_of_float(0, ary)
|
940
|
+
*/
|
941
|
+
rb_define_method(classMemory, "read_array_of_float", memory_read_array_of_float32, 1);
|
480
942
|
rb_define_alias(classMemory, "put_array_of_float", "put_array_of_float32");
|
481
943
|
rb_define_alias(classMemory, "get_array_of_float", "get_array_of_float32");
|
944
|
+
/*
|
945
|
+
* Document-method: put_float64
|
946
|
+
* call-seq: memory.put_float64(offset, value)
|
947
|
+
* @param [Integer] offset
|
948
|
+
* @param [Numeric] value
|
949
|
+
* @return [self]
|
950
|
+
* Put +value+ as a 64-bit float (double) in memory at offset +offset+ (alias: #put_double).
|
951
|
+
*/
|
482
952
|
rb_define_method(classMemory, "put_float64", memory_put_float64, 2);
|
953
|
+
/*
|
954
|
+
* Document-method: get_float64
|
955
|
+
* call-seq: memory.get_float64(offset)
|
956
|
+
* @param [Integer] offset
|
957
|
+
* @return [Float]
|
958
|
+
* Get a 64-bit float (double) from memory at offset +offset+ (alias: #get_double).
|
959
|
+
*/
|
483
960
|
rb_define_method(classMemory, "get_float64", memory_get_float64, 1);
|
484
961
|
rb_define_alias(classMemory, "put_double", "put_float64");
|
485
962
|
rb_define_alias(classMemory, "get_double", "get_float64");
|
963
|
+
/*
|
964
|
+
* Document-method: write_double
|
965
|
+
* call-seq: memory.write_double(value)
|
966
|
+
* @param [Numeric] value
|
967
|
+
* @return [self]
|
968
|
+
* Write +value+ as a 64-bit float (double) in memory.
|
969
|
+
*
|
970
|
+
* Same as:
|
971
|
+
* memory.put_double(0, value)
|
972
|
+
*/
|
973
|
+
rb_define_method(classMemory, "write_double", memory_write_float64, 1);
|
974
|
+
/*
|
975
|
+
* Document-method: read_double
|
976
|
+
* call-seq: memory.read_double
|
977
|
+
* @return [Float]
|
978
|
+
* Read a 64-bit float (double) from memory.
|
979
|
+
*
|
980
|
+
* Same as:
|
981
|
+
* memory.get_double(0)
|
982
|
+
*/
|
983
|
+
rb_define_method(classMemory, "read_double", memory_read_float64, 0);
|
984
|
+
/*
|
985
|
+
* Document-method: put_array_of_float64
|
986
|
+
* call-seq: memory.put_array_of_float64(offset, ary)
|
987
|
+
* @param [Integer] offset
|
988
|
+
* @param [Array<Numeric>] ary
|
989
|
+
* @return [self]
|
990
|
+
* Put values from +ary+ as 64-bit floats (doubles) in memory from offset +offset+ (alias: #put_array_of_double).
|
991
|
+
*/
|
486
992
|
rb_define_method(classMemory, "put_array_of_float64", memory_put_array_of_float64, 2);
|
993
|
+
/*
|
994
|
+
* Document-method: get_array_of_float64
|
995
|
+
* call-seq: memory.get_array_of_float64(offset, length)
|
996
|
+
* @param [Integer] offset
|
997
|
+
* @param [Integer] length number of Float to get
|
998
|
+
* @return [Array<Float>]
|
999
|
+
* Get 64-bit floats (doubles) in memory from offset +offset+ (alias: #get_array_of_double).
|
1000
|
+
*/
|
487
1001
|
rb_define_method(classMemory, "get_array_of_float64", memory_get_array_of_float64, 2);
|
1002
|
+
/*
|
1003
|
+
* Document-method: write_array_of_double
|
1004
|
+
* call-seq: memory.write_array_of_double(ary)
|
1005
|
+
* @param [Array<Numeric>] ary
|
1006
|
+
* @return [self]
|
1007
|
+
* Write values from +ary+ as 64-bit floats (doubles) in memory.
|
1008
|
+
*
|
1009
|
+
* Same as:
|
1010
|
+
* memory.put_array_of_double(0, ary)
|
1011
|
+
*/
|
1012
|
+
rb_define_method(classMemory, "write_array_of_double", memory_write_array_of_float64, 1);
|
1013
|
+
/*
|
1014
|
+
* Document-method: read_array_of_double
|
1015
|
+
* call-seq: memory.read_array_of_double(length)
|
1016
|
+
* @param [Integer] length number of Float to read
|
1017
|
+
* @return [Array<Float>]
|
1018
|
+
* Read 64-bit floats (doubles) from memory.
|
1019
|
+
*
|
1020
|
+
* Same as:
|
1021
|
+
* memory.get_array_of_double(0, ary)
|
1022
|
+
*/
|
1023
|
+
rb_define_method(classMemory, "read_array_of_double", memory_read_array_of_float64, 1);
|
488
1024
|
rb_define_alias(classMemory, "put_array_of_double", "put_array_of_float64");
|
489
1025
|
rb_define_alias(classMemory, "get_array_of_double", "get_array_of_float64");
|
1026
|
+
/*
|
1027
|
+
* Document-method: put_pointer
|
1028
|
+
* call-seq: memory.put_pointer(offset, value)
|
1029
|
+
* @param [Integer] offset
|
1030
|
+
* @param [nil,Pointer, Integer, #to_ptr] value
|
1031
|
+
* @return [self]
|
1032
|
+
* Put +value+ in memory from +offset+..
|
1033
|
+
*/
|
490
1034
|
rb_define_method(classMemory, "put_pointer", memory_put_pointer, 2);
|
1035
|
+
/*
|
1036
|
+
* Document-method: get_pointer
|
1037
|
+
* call-seq: memory.get_pointer(offset)
|
1038
|
+
* @param [Integer] offset
|
1039
|
+
* @return [Pointer]
|
1040
|
+
* Get a {Pointer} to the memory from +offset+.
|
1041
|
+
*/
|
491
1042
|
rb_define_method(classMemory, "get_pointer", memory_get_pointer, 1);
|
1043
|
+
/*
|
1044
|
+
* Document-method: write_pointer
|
1045
|
+
* call-seq: memory.write_pointer(value)
|
1046
|
+
* @param [nil,Pointer, Integer, #to_ptr] value
|
1047
|
+
* @return [self]
|
1048
|
+
* Write +value+ in memory.
|
1049
|
+
*
|
1050
|
+
* Equivalent to:
|
1051
|
+
* memory.put_pointer(0, value)
|
1052
|
+
*/
|
1053
|
+
rb_define_method(classMemory, "write_pointer", memory_write_pointer, 1);
|
1054
|
+
/*
|
1055
|
+
* Document-method: read_pointer
|
1056
|
+
* call-seq: memory.read_pointer
|
1057
|
+
* @return [Pointer]
|
1058
|
+
* Get a {Pointer} to the memory from base address.
|
1059
|
+
*
|
1060
|
+
* Equivalent to:
|
1061
|
+
* memory.get_pointer(0)
|
1062
|
+
*/
|
1063
|
+
rb_define_method(classMemory, "read_pointer", memory_read_pointer, 0);
|
1064
|
+
/*
|
1065
|
+
* Document-method: put_array_of_pointer
|
1066
|
+
* call-seq: memory.put_array_of_pointer(offset, ary)
|
1067
|
+
* @param [Integer] offset
|
1068
|
+
* @param [Array<#to_ptr>] ary
|
1069
|
+
* @return [self]
|
1070
|
+
* Put an array of {Pointer} into memory from +offset+.
|
1071
|
+
*/
|
492
1072
|
rb_define_method(classMemory, "put_array_of_pointer", memory_put_array_of_pointer, 2);
|
1073
|
+
/*
|
1074
|
+
* Document-method: get_array_of_pointer
|
1075
|
+
* call-seq: memory.get_array_of_pointer(offset, length)
|
1076
|
+
* @param [Integer] offset
|
1077
|
+
* @param [Integer] length
|
1078
|
+
* @return [Array<Pointer>]
|
1079
|
+
* Get an array of {Pointer} of length +length+ from +offset+.
|
1080
|
+
*/
|
493
1081
|
rb_define_method(classMemory, "get_array_of_pointer", memory_get_array_of_pointer, 2);
|
1082
|
+
/*
|
1083
|
+
* Document-method: write_array_of_pointer
|
1084
|
+
* call-seq: memory.write_array_of_pointer(ary)
|
1085
|
+
* @param [Array<#to_ptr>] ary
|
1086
|
+
* @return [self]
|
1087
|
+
* Write an array of {Pointer} into memory from +offset+.
|
1088
|
+
*
|
1089
|
+
* Same as :
|
1090
|
+
* memory.put_array_of_pointer(0, ary)
|
1091
|
+
*/
|
1092
|
+
rb_define_method(classMemory, "write_array_of_pointer", memory_write_array_of_pointer, 1);
|
1093
|
+
/*
|
1094
|
+
* Document-method: read_array_of_pointer
|
1095
|
+
* call-seq: memory.read_array_of_pointer(length)
|
1096
|
+
* @param [Integer] length
|
1097
|
+
* @return [Array<Pointer>]
|
1098
|
+
* Read an array of {Pointer} of length +length+.
|
1099
|
+
*
|
1100
|
+
* Same as:
|
1101
|
+
* memory.get_array_of_pointer(0, length)
|
1102
|
+
*/
|
1103
|
+
rb_define_method(classMemory, "read_array_of_pointer", memory_read_array_of_pointer, 1);
|
1104
|
+
|
494
1105
|
rb_define_method(classMemory, "get_string", memory_get_string, -1);
|
495
1106
|
rb_define_method(classMemory, "put_string", memory_put_string, 2);
|
496
1107
|
rb_define_method(classMemory, "get_bytes", memory_get_bytes, 2);
|
497
1108
|
rb_define_method(classMemory, "put_bytes", memory_put_bytes, -1);
|
1109
|
+
rb_define_method(classMemory, "read_bytes", memory_read_bytes, 1);
|
1110
|
+
rb_define_method(classMemory, "write_bytes", memory_write_bytes, -1);
|
498
1111
|
rb_define_method(classMemory, "get_array_of_string", memory_get_array_of_string, -1);
|
1112
|
+
rb_define_method(classMemory, "read_array_of_string", memory_read_array_of_string, -1);
|
1113
|
+
|
1114
|
+
rb_define_method(classMemory, "get", memory_get, 2);
|
1115
|
+
rb_define_method(classMemory, "put", memory_put, 3);
|
499
1116
|
|
500
1117
|
rb_define_method(classMemory, "clear", memory_clear, 0);
|
501
1118
|
rb_define_method(classMemory, "total", memory_size, 0);
|
502
1119
|
rb_define_alias(classMemory, "size", "total");
|
503
1120
|
rb_define_method(classMemory, "type_size", memory_type_size, 0);
|
504
1121
|
rb_define_method(classMemory, "[]", memory_aref, 1);
|
1122
|
+
rb_define_method(classMemory, "__copy_from__", memory_copy_from, 2);
|
1123
|
+
rb_define_method(classMemory, "freeze", memory_freeze, 0 );
|
505
1124
|
|
506
1125
|
id_to_ptr = rb_intern("to_ptr");
|
507
1126
|
id_call = rb_intern("call");
|