ffi 1.15.5 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +118 -0
- data/Gemfile +10 -3
- data/README.md +4 -3
- data/Rakefile +25 -10
- data/ext/ffi_c/AbstractMemory.c +99 -74
- data/ext/ffi_c/AbstractMemory.h +3 -2
- data/ext/ffi_c/ArrayType.c +51 -15
- data/ext/ffi_c/ArrayType.h +1 -0
- data/ext/ffi_c/Buffer.c +90 -33
- data/ext/ffi_c/Call.c +29 -12
- data/ext/ffi_c/Call.h +3 -2
- data/ext/ffi_c/DynamicLibrary.c +90 -27
- data/ext/ffi_c/Function.c +244 -98
- data/ext/ffi_c/Function.h +1 -0
- data/ext/ffi_c/FunctionInfo.c +81 -25
- data/ext/ffi_c/LastError.c +29 -11
- data/ext/ffi_c/MappedType.c +66 -23
- data/ext/ffi_c/MappedType.h +0 -2
- data/ext/ffi_c/MemoryPointer.c +36 -9
- data/ext/ffi_c/MethodHandle.c +3 -1
- data/ext/ffi_c/Pointer.c +82 -40
- data/ext/ffi_c/Pointer.h +1 -0
- data/ext/ffi_c/Struct.c +166 -84
- data/ext/ffi_c/Struct.h +7 -4
- data/ext/ffi_c/StructByValue.c +48 -16
- data/ext/ffi_c/StructLayout.c +130 -61
- data/ext/ffi_c/Type.c +120 -51
- data/ext/ffi_c/Type.h +3 -1
- data/ext/ffi_c/Types.c +8 -2
- data/ext/ffi_c/Types.h +0 -1
- data/ext/ffi_c/Variadic.c +71 -26
- data/ext/ffi_c/compat.h +22 -22
- data/ext/ffi_c/extconf.rb +19 -2
- data/ext/ffi_c/ffi.c +4 -0
- 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 +27 -9
- data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +18 -0
- data/ext/ffi_c/libffi/{.travis → .ci}/build-in-container.sh +4 -6
- data/ext/ffi_c/libffi/.ci/build.sh +124 -0
- data/ext/ffi_c/libffi/{.travis → .ci}/install.sh +14 -7
- data/ext/ffi_c/libffi/.ci/msvs-detect +1103 -0
- data/ext/ffi_c/libffi/{.travis → .ci}/site.exp +5 -3
- data/ext/ffi_c/libffi/.circleci/config.yml +156 -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 +10 -2
- data/ext/ffi_c/libffi/LICENSE +1 -1
- data/ext/ffi_c/libffi/Makefile.am +12 -5
- data/ext/ffi_c/libffi/Makefile.in +118 -51
- data/ext/ffi_c/libffi/README.md +150 -105
- data/ext/ffi_c/libffi/acinclude.m4 +10 -112
- data/ext/ffi_c/libffi/compile +348 -0
- data/ext/ffi_c/libffi/config.guess +623 -556
- data/ext/ffi_c/libffi/config.sub +75 -34
- data/ext/ffi_c/libffi/configure +4571 -3830
- data/ext/ffi_c/libffi/configure.ac +64 -28
- data/ext/ffi_c/libffi/configure.host +26 -7
- data/ext/ffi_c/libffi/doc/Makefile.in +9 -6
- data/ext/ffi_c/libffi/doc/libffi.texi +82 -33
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +12 -47
- data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +163 -52
- data/ext/ffi_c/libffi/include/Makefile.am +1 -1
- data/ext/ffi_c/libffi/include/Makefile.in +10 -9
- data/ext/ffi_c/libffi/include/ffi.h.in +55 -60
- data/ext/ffi_c/libffi/include/ffi_cfi.h +21 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +33 -2
- data/ext/ffi_c/libffi/include/tramp.h +45 -0
- data/ext/ffi_c/libffi/install-sh +92 -69
- data/ext/ffi_c/libffi/libffi.map.in +5 -0
- data/ext/ffi_c/libffi/libtool-version +2 -2
- data/ext/ffi_c/libffi/ltmain.sh +518 -333
- data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +18 -14
- data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +108 -72
- data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +76 -45
- data/ext/ffi_c/libffi/m4/ax_prepend_flag.m4 +51 -0
- data/ext/ffi_c/libffi/man/Makefile.in +9 -6
- data/ext/ffi_c/libffi/missing +1 -1
- data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +2 -2
- data/ext/ffi_c/libffi/msvcc.sh +1 -1
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +172 -55
- data/ext/ffi_c/libffi/src/aarch64/internal.h +32 -0
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +331 -87
- data/ext/ffi_c/libffi/src/arc/arcompact.S +169 -94
- data/ext/ffi_c/libffi/src/arc/ffi.c +325 -148
- data/ext/ffi_c/libffi/src/arc/ffitarget.h +14 -0
- data/ext/ffi_c/libffi/src/arm/ffi.c +62 -17
- data/ext/ffi_c/libffi/src/arm/ffitarget.h +3 -3
- data/ext/ffi_c/libffi/src/arm/internal.h +10 -0
- data/ext/ffi_c/libffi/src/arm/sysv.S +113 -42
- data/ext/ffi_c/libffi/src/closures.c +136 -50
- data/ext/ffi_c/libffi/src/debug.c +2 -2
- data/ext/ffi_c/libffi/src/dlmalloc.c +6 -1
- data/ext/ffi_c/libffi/src/ia64/ffi.c +12 -0
- data/ext/ffi_c/libffi/src/ia64/unix.S +20 -2
- 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 +31 -14
- data/ext/ffi_c/libffi/src/mips/ffi.c +250 -67
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +7 -0
- data/ext/ffi_c/libffi/src/mips/n32.S +193 -33
- data/ext/ffi_c/libffi/src/mips/o32.S +61 -4
- data/ext/ffi_c/libffi/src/moxie/ffi.c +47 -22
- data/ext/ffi_c/libffi/src/or1k/ffi.c +25 -12
- data/ext/ffi_c/libffi/src/pa/ffi.c +32 -33
- data/ext/ffi_c/libffi/src/pa/ffi64.c +614 -0
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +22 -8
- data/ext/ffi_c/libffi/src/pa/hpux32.S +83 -36
- data/ext/ffi_c/libffi/src/pa/hpux64.S +681 -0
- data/ext/ffi_c/libffi/src/pa/linux.S +82 -35
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +36 -24
- data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +1 -1
- data/ext/ffi_c/libffi/src/powerpc/linux64.S +2 -0
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +2 -0
- data/ext/ffi_c/libffi/src/powerpc/t-aix +5 -0
- data/ext/ffi_c/libffi/src/prep_cif.c +22 -2
- data/ext/ffi_c/libffi/src/riscv/ffi.c +37 -4
- data/ext/ffi_c/libffi/src/sparc/ffi64.c +23 -1
- data/ext/ffi_c/libffi/src/tramp.c +716 -0
- data/ext/ffi_c/libffi/src/types.c +4 -6
- 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/ffi.c +99 -37
- data/ext/ffi_c/libffi/src/x86/ffi64.c +67 -12
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +9 -5
- data/ext/ffi_c/libffi/src/x86/ffiw64.c +44 -1
- data/ext/ffi_c/libffi/src/x86/internal.h +14 -0
- data/ext/ffi_c/libffi/src/x86/internal64.h +14 -0
- data/ext/ffi_c/libffi/src/x86/sysv.S +172 -38
- data/ext/ffi_c/libffi/src/x86/sysv_intel.S +91 -88
- data/ext/ffi_c/libffi/src/x86/unix64.S +96 -6
- data/ext/ffi_c/libffi/src/x86/win64.S +20 -7
- data/ext/ffi_c/libffi/src/xtensa/ffi.c +16 -8
- data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +4 -0
- data/ext/ffi_c/libffi/src/xtensa/sysv.S +26 -16
- data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -114
- data/ext/ffi_c/libffi/testsuite/Makefile.in +89 -121
- 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 +43 -21
- data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +5 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +41 -0
- 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/ffitest.h +28 -3
- data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +5 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +4 -0
- 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 +8 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +1 -1
- 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/va_1.c +1 -119
- 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 +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +11 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +15 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c +3 -2
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c +21 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c +7 -6
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c +6 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c +18 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c +22 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c +24 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c +29 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c +21 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c +35 -3
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c +19 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +18 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c +22 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c +13 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c +29 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c +24 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c +28 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c +24 -2
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c +39 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c +25 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c +14 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c +14 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c +14 -2
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c +20 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c +40 -25
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c +40 -3
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c +18 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c +18 -3
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c +18 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c +18 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c +19 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c +3 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c +9 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c +11 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c +22 -3
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c +5 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c +6 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c +6 -2
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c +9 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c +5 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +11 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +4 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c +2 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c +3 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +1 -138
- data/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c +21 -21
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c +32 -9
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c +12 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +21 -5
- 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.closures/nested_struct2.c +10 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c +10 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c +9 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c +9 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c +11 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c +9 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c +11 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c +11 -0
- 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.closures/stret_medium.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c +6 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc +2 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc +1 -0
- data/ext/ffi_c/libffi.bsd.mk +2 -2
- data/ext/ffi_c/libffi.darwin.mk +2 -2
- data/ext/ffi_c/libffi.gnu.mk +2 -2
- data/ext/ffi_c/rbffi.h +1 -1
- data/ffi.gemspec +3 -3
- data/lib/ffi/autopointer.rb +8 -31
- data/lib/ffi/compat.rb +43 -0
- data/lib/ffi/data_converter.rb +2 -2
- data/lib/ffi/dynamic_library.rb +118 -0
- data/lib/ffi/enum.rb +18 -12
- data/lib/ffi/ffi.rb +3 -0
- data/lib/ffi/function.rb +71 -0
- data/lib/ffi/io.rb +2 -2
- data/lib/ffi/library.rb +72 -88
- data/lib/ffi/library_path.rb +109 -0
- data/lib/ffi/managedstruct.rb +1 -1
- data/lib/ffi/platform/aarch64-linux/types.conf +74 -3
- data/lib/ffi/platform/aarch64-windows/types.conf +52 -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/loongarch64-linux/types.conf +141 -0
- data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
- data/lib/ffi/platform.rb +15 -13
- data/lib/ffi/pointer.rb +6 -6
- data/lib/ffi/struct.rb +6 -5
- data/lib/ffi/struct_layout.rb +3 -3
- data/lib/ffi/struct_layout_builder.rb +9 -9
- data/lib/ffi/types.rb +65 -37
- data/lib/ffi/variadic.rb +19 -8
- data/lib/ffi/version.rb +1 -1
- data/samples/hello_ractor.rb +11 -0
- data/samples/qsort_ractor.rb +28 -0
- data/sig/ffi/abstract_memory.rbs +165 -0
- data/sig/ffi/auto_pointer.rbs +27 -0
- data/sig/ffi/buffer.rbs +18 -0
- data/sig/ffi/data_converter.rbs +10 -0
- data/sig/ffi/dynamic_library.rbs +9 -0
- data/sig/ffi/enum.rbs +38 -0
- data/sig/ffi/function.rbs +39 -0
- data/sig/ffi/library.rbs +42 -0
- data/sig/ffi/native_type.rbs +86 -0
- data/sig/ffi/pointer.rbs +42 -0
- data/sig/ffi/struct.rbs +76 -0
- data/sig/ffi/struct_by_reference.rbs +11 -0
- data/sig/ffi/struct_by_value.rbs +7 -0
- data/sig/ffi/struct_layout.rbs +9 -0
- data/sig/ffi/struct_layout_builder.rbs +5 -0
- data/sig/ffi/type.rbs +39 -0
- data/sig/ffi.rbs +26 -0
- data.tar.gz.sig +0 -0
- metadata +122 -28
- metadata.gz.sig +1 -0
- data/ext/ffi_c/libffi/.travis/build-cross-in-container.sh +0 -14
- data/ext/ffi_c/libffi/.travis/build.sh +0 -142
- data/ext/ffi_c/libffi/.travis.yml +0 -83
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c +0 -44
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c +0 -44
- /data/ext/ffi_c/libffi/{.travis → .ci}/ar-lib +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/bfin-sim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/compile +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/m32r-sim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/moxie-sim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/or1k-sim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/powerpc-eabisim.exp +0 -0
- /data/ext/ffi_c/libffi/{.travis → .ci}/wine-sim.exp +0 -0
- /data/ext/ffi_c/libffi/testsuite/libffi.call/{pyobjc-tc.c → pyobjc_tc.c} +0 -0
- /data/lib/ffi/platform/{sparc64-linux → sparcv9-linux}/types.conf +0 -0
data/ext/ffi_c/Pointer.c
CHANGED
@@ -33,16 +33,33 @@
|
|
33
33
|
#include <ruby.h>
|
34
34
|
#include "rbffi.h"
|
35
35
|
#include "rbffi_endian.h"
|
36
|
+
#include "compat.h"
|
36
37
|
#include "AbstractMemory.h"
|
37
38
|
#include "Pointer.h"
|
38
39
|
|
39
|
-
#define POINTER(obj) rbffi_AbstractMemory_Cast((obj),
|
40
|
+
#define POINTER(obj) rbffi_AbstractMemory_Cast((obj), &rbffi_pointer_data_type)
|
40
41
|
|
41
42
|
VALUE rbffi_PointerClass = Qnil;
|
42
43
|
VALUE rbffi_NullPointerSingleton = Qnil;
|
43
44
|
|
44
|
-
static void ptr_release(
|
45
|
-
static void ptr_mark(
|
45
|
+
static void ptr_release(void *data);
|
46
|
+
static void ptr_mark(void *data);
|
47
|
+
static void ptr_compact(void *data);
|
48
|
+
static size_t ptr_memsize(const void *data);
|
49
|
+
|
50
|
+
const rb_data_type_t rbffi_pointer_data_type = { /* extern */
|
51
|
+
.wrap_struct_name = "FFI::Pointer",
|
52
|
+
.function = {
|
53
|
+
.dmark = ptr_mark,
|
54
|
+
.dfree = ptr_release,
|
55
|
+
.dsize = ptr_memsize,
|
56
|
+
ffi_compact_callback( ptr_compact )
|
57
|
+
},
|
58
|
+
.parent = &rbffi_abstract_memory_data_type,
|
59
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
60
|
+
// macro to update VALUE references, as to trigger write barriers.
|
61
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
|
62
|
+
};
|
46
63
|
|
47
64
|
VALUE
|
48
65
|
rbffi_Pointer_NewInstance(void* addr)
|
@@ -54,12 +71,12 @@ rbffi_Pointer_NewInstance(void* addr)
|
|
54
71
|
return rbffi_NullPointerSingleton;
|
55
72
|
}
|
56
73
|
|
57
|
-
obj =
|
74
|
+
obj = TypedData_Make_Struct(rbffi_PointerClass, Pointer, &rbffi_pointer_data_type, p);
|
58
75
|
p->memory.address = addr;
|
59
76
|
p->memory.size = LONG_MAX;
|
60
77
|
p->memory.flags = (addr == NULL) ? 0 : (MEM_RD | MEM_WR);
|
61
78
|
p->memory.typeSize = 1;
|
62
|
-
p->rbParent
|
79
|
+
RB_OBJ_WRITE(obj, &p->rbParent, Qnil);
|
63
80
|
|
64
81
|
return obj;
|
65
82
|
}
|
@@ -70,20 +87,18 @@ ptr_allocate(VALUE klass)
|
|
70
87
|
Pointer* p;
|
71
88
|
VALUE obj;
|
72
89
|
|
73
|
-
obj =
|
74
|
-
p->rbParent
|
90
|
+
obj = TypedData_Make_Struct(klass, Pointer, &rbffi_pointer_data_type, p);
|
91
|
+
RB_OBJ_WRITE(obj, &p->rbParent, Qnil);
|
75
92
|
p->memory.flags = MEM_RD | MEM_WR;
|
76
93
|
|
77
94
|
return obj;
|
78
95
|
}
|
79
96
|
|
80
97
|
/*
|
81
|
-
* @overload initialize(
|
82
|
-
* @param [Pointer] pointer another pointer to initialize from
|
83
|
-
* Create a new pointer from another {Pointer}.
|
98
|
+
* @overload initialize(address)
|
84
99
|
* @overload initialize(type, address)
|
85
|
-
* @param [Type] type type for pointer
|
86
|
-
* @param [Integer] address base address for pointer
|
100
|
+
* @param [Type] type Optional type for pointer (defaults to byte)
|
101
|
+
* @param [Pointer, Integer] address base address for pointer
|
87
102
|
* Create a new pointer from a {Type} and a base address
|
88
103
|
* @return [self]
|
89
104
|
* A new instance of Pointer.
|
@@ -95,7 +110,7 @@ ptr_initialize(int argc, VALUE* argv, VALUE self)
|
|
95
110
|
VALUE rbType = Qnil, rbAddress = Qnil;
|
96
111
|
int typeSize = 1;
|
97
112
|
|
98
|
-
|
113
|
+
TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, p);
|
99
114
|
|
100
115
|
switch (rb_scan_args(argc, argv, "11", &rbType, &rbAddress)) {
|
101
116
|
case 1:
|
@@ -112,7 +127,7 @@ ptr_initialize(int argc, VALUE* argv, VALUE self)
|
|
112
127
|
switch (TYPE(rbAddress)) {
|
113
128
|
case T_FIXNUM:
|
114
129
|
case T_BIGNUM:
|
115
|
-
p->memory.address = (void*) (uintptr_t)
|
130
|
+
p->memory.address = (void*) (uintptr_t) NUM2ULL(rbAddress);
|
116
131
|
p->memory.size = LONG_MAX;
|
117
132
|
if (p->memory.address == NULL) {
|
118
133
|
p->memory.flags = 0;
|
@@ -123,8 +138,8 @@ ptr_initialize(int argc, VALUE* argv, VALUE self)
|
|
123
138
|
if (rb_obj_is_kind_of(rbAddress, rbffi_PointerClass)) {
|
124
139
|
Pointer* orig;
|
125
140
|
|
126
|
-
p->rbParent
|
127
|
-
|
141
|
+
RB_OBJ_WRITE(self, &p->rbParent, rbAddress);
|
142
|
+
TypedData_Get_Struct(rbAddress, Pointer, &rbffi_pointer_data_type, orig);
|
128
143
|
p->memory = orig->memory;
|
129
144
|
} else {
|
130
145
|
rb_raise(rb_eTypeError, "wrong argument type, expected Integer or FFI::Pointer");
|
@@ -153,7 +168,7 @@ ptr_initialize_copy(VALUE self, VALUE other)
|
|
153
168
|
AbstractMemory* src;
|
154
169
|
Pointer* dst;
|
155
170
|
|
156
|
-
|
171
|
+
TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, dst);
|
157
172
|
src = POINTER(other);
|
158
173
|
if (src->size == LONG_MAX) {
|
159
174
|
rb_raise(rb_eRuntimeError, "cannot duplicate unbounded memory area");
|
@@ -195,16 +210,16 @@ slice(VALUE self, long offset, long size)
|
|
195
210
|
Pointer* p;
|
196
211
|
VALUE retval;
|
197
212
|
|
198
|
-
|
213
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
199
214
|
checkBounds(ptr, offset, size == LONG_MAX ? 1 : size);
|
200
215
|
|
201
|
-
retval =
|
216
|
+
retval = TypedData_Make_Struct(rbffi_PointerClass, Pointer, &rbffi_pointer_data_type, p);
|
202
217
|
|
203
218
|
p->memory.address = ptr->address + offset;
|
204
219
|
p->memory.size = size;
|
205
220
|
p->memory.flags = ptr->flags;
|
206
221
|
p->memory.typeSize = ptr->typeSize;
|
207
|
-
p->rbParent
|
222
|
+
RB_OBJ_WRITE(retval, &p->rbParent, self);
|
208
223
|
|
209
224
|
return retval;
|
210
225
|
}
|
@@ -212,7 +227,7 @@ slice(VALUE self, long offset, long size)
|
|
212
227
|
/*
|
213
228
|
* Document-method: +
|
214
229
|
* call-seq: ptr + offset
|
215
|
-
* @param [
|
230
|
+
* @param [Integer] offset
|
216
231
|
* @return [Pointer]
|
217
232
|
* Return a new {Pointer} from an existing pointer and an +offset+.
|
218
233
|
*/
|
@@ -222,15 +237,15 @@ ptr_plus(VALUE self, VALUE offset)
|
|
222
237
|
AbstractMemory* ptr;
|
223
238
|
long off = NUM2LONG(offset);
|
224
239
|
|
225
|
-
|
240
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
226
241
|
|
227
242
|
return slice(self, off, ptr->size == LONG_MAX ? LONG_MAX : ptr->size - off);
|
228
243
|
}
|
229
244
|
|
230
245
|
/*
|
231
246
|
* call-seq: ptr.slice(offset, length)
|
232
|
-
* @param [
|
233
|
-
* @param [
|
247
|
+
* @param [Integer] offset
|
248
|
+
* @param [Integer] length
|
234
249
|
* @return [Pointer]
|
235
250
|
* Return a new {Pointer} from an existing one. This pointer points on same contents
|
236
251
|
* from +offset+ for a length +length+.
|
@@ -252,7 +267,7 @@ ptr_inspect(VALUE self)
|
|
252
267
|
char buf[100];
|
253
268
|
Pointer* ptr;
|
254
269
|
|
255
|
-
|
270
|
+
TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
|
256
271
|
|
257
272
|
if (ptr->memory.size != LONG_MAX) {
|
258
273
|
snprintf(buf, sizeof(buf), "#<%s address=%p size=%lu>",
|
@@ -275,7 +290,7 @@ ptr_null_p(VALUE self)
|
|
275
290
|
{
|
276
291
|
Pointer* ptr;
|
277
292
|
|
278
|
-
|
293
|
+
TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
|
279
294
|
|
280
295
|
return ptr->memory.address == NULL ? Qtrue : Qfalse;
|
281
296
|
}
|
@@ -291,18 +306,23 @@ ptr_equals(VALUE self, VALUE other)
|
|
291
306
|
{
|
292
307
|
Pointer* ptr;
|
293
308
|
|
294
|
-
|
309
|
+
TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
|
295
310
|
|
296
311
|
if (NIL_P(other)) {
|
297
312
|
return ptr->memory.address == NULL ? Qtrue : Qfalse;
|
298
313
|
}
|
299
314
|
|
300
|
-
|
315
|
+
if (!rb_obj_is_kind_of(other, rbffi_PointerClass)) {
|
316
|
+
return Qfalse;
|
317
|
+
}
|
318
|
+
else {
|
319
|
+
return ptr->memory.address == POINTER(other)->address ? Qtrue : Qfalse;
|
320
|
+
}
|
301
321
|
}
|
302
322
|
|
303
323
|
/*
|
304
324
|
* call-seq: ptr.address
|
305
|
-
* @return [
|
325
|
+
* @return [Integer] pointer's base address
|
306
326
|
* Return +self+'s base address (alias: #to_i).
|
307
327
|
*/
|
308
328
|
static VALUE
|
@@ -310,7 +330,7 @@ ptr_address(VALUE self)
|
|
310
330
|
{
|
311
331
|
Pointer* ptr;
|
312
332
|
|
313
|
-
|
333
|
+
TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
|
314
334
|
|
315
335
|
return ULL2NUM((uintptr_t) ptr->memory.address);
|
316
336
|
}
|
@@ -335,7 +355,7 @@ ptr_order(int argc, VALUE* argv, VALUE self)
|
|
335
355
|
{
|
336
356
|
Pointer* ptr;
|
337
357
|
|
338
|
-
|
358
|
+
TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
|
339
359
|
if (argc == 0) {
|
340
360
|
int order = (ptr->memory.flags & MEM_SWAP) == 0 ? BYTE_ORDER : SWAPPED_ORDER;
|
341
361
|
return order == BIG_ENDIAN ? ID2SYM(rb_intern("big")) : ID2SYM(rb_intern("little"));
|
@@ -361,7 +381,7 @@ ptr_order(int argc, VALUE* argv, VALUE self)
|
|
361
381
|
Pointer* p2;
|
362
382
|
VALUE retval = slice(self, 0, ptr->memory.size);
|
363
383
|
|
364
|
-
|
384
|
+
TypedData_Get_Struct(retval, Pointer, &rbffi_pointer_data_type, p2);
|
365
385
|
p2->memory.flags |= MEM_SWAP;
|
366
386
|
return retval;
|
367
387
|
}
|
@@ -381,7 +401,8 @@ ptr_free(VALUE self)
|
|
381
401
|
{
|
382
402
|
Pointer* ptr;
|
383
403
|
|
384
|
-
|
404
|
+
rb_check_frozen(self);
|
405
|
+
TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
|
385
406
|
|
386
407
|
if (ptr->allocated) {
|
387
408
|
if (ptr->storage != NULL) {
|
@@ -404,7 +425,7 @@ ptr_type_size(VALUE self)
|
|
404
425
|
{
|
405
426
|
Pointer* ptr;
|
406
427
|
|
407
|
-
|
428
|
+
TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
|
408
429
|
|
409
430
|
return INT2NUM(ptr->memory.typeSize);
|
410
431
|
}
|
@@ -420,8 +441,9 @@ ptr_autorelease(VALUE self, VALUE autorelease)
|
|
420
441
|
{
|
421
442
|
Pointer* ptr;
|
422
443
|
|
423
|
-
|
424
|
-
|
444
|
+
rb_check_frozen(self);
|
445
|
+
TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
|
446
|
+
ptr->autorelease = RB_TEST(autorelease);
|
425
447
|
|
426
448
|
return autorelease;
|
427
449
|
}
|
@@ -436,15 +458,16 @@ ptr_autorelease_p(VALUE self)
|
|
436
458
|
{
|
437
459
|
Pointer* ptr;
|
438
460
|
|
439
|
-
|
461
|
+
TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
|
440
462
|
|
441
463
|
return ptr->autorelease ? Qtrue : Qfalse;
|
442
464
|
}
|
443
465
|
|
444
466
|
|
445
467
|
static void
|
446
|
-
ptr_release(
|
468
|
+
ptr_release(void *data)
|
447
469
|
{
|
470
|
+
Pointer *ptr = (Pointer *)data;
|
448
471
|
if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) {
|
449
472
|
xfree(ptr->storage);
|
450
473
|
ptr->storage = NULL;
|
@@ -453,9 +476,28 @@ ptr_release(Pointer* ptr)
|
|
453
476
|
}
|
454
477
|
|
455
478
|
static void
|
456
|
-
ptr_mark(
|
479
|
+
ptr_mark(void *data)
|
480
|
+
{
|
481
|
+
Pointer *ptr = (Pointer *)data;
|
482
|
+
rb_gc_mark_movable(ptr->rbParent);
|
483
|
+
}
|
484
|
+
|
485
|
+
static void
|
486
|
+
ptr_compact(void *data)
|
457
487
|
{
|
458
|
-
|
488
|
+
Pointer *ptr = (Pointer *)data;
|
489
|
+
ffi_gc_location(ptr->rbParent);
|
490
|
+
}
|
491
|
+
|
492
|
+
static size_t
|
493
|
+
ptr_memsize(const void *data)
|
494
|
+
{
|
495
|
+
const Pointer *ptr = (const Pointer *)data;
|
496
|
+
size_t memsize = sizeof(Pointer);
|
497
|
+
if (ptr->allocated) {
|
498
|
+
memsize += ptr->memory.size;
|
499
|
+
}
|
500
|
+
return memsize;
|
459
501
|
}
|
460
502
|
|
461
503
|
void
|
data/ext/ffi_c/Pointer.h
CHANGED