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/FunctionInfo.c
CHANGED
@@ -51,8 +51,24 @@
|
|
51
51
|
|
52
52
|
static VALUE fntype_allocate(VALUE klass);
|
53
53
|
static VALUE fntype_initialize(int argc, VALUE* argv, VALUE self);
|
54
|
-
static void fntype_mark(
|
55
|
-
static void
|
54
|
+
static void fntype_mark(void *);
|
55
|
+
static void fntype_compact(void *);
|
56
|
+
static void fntype_free(void *);
|
57
|
+
static size_t fntype_memsize(const void *);
|
58
|
+
|
59
|
+
const rb_data_type_t rbffi_fntype_data_type = { /* extern */
|
60
|
+
.wrap_struct_name = "FFI::FunctionType",
|
61
|
+
.function = {
|
62
|
+
.dmark = fntype_mark,
|
63
|
+
.dfree = fntype_free,
|
64
|
+
.dsize = fntype_memsize,
|
65
|
+
ffi_compact_callback( fntype_compact )
|
66
|
+
},
|
67
|
+
.parent = &rbffi_type_data_type,
|
68
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
69
|
+
// macro to update VALUE references, as to trigger write barriers.
|
70
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
|
71
|
+
};
|
56
72
|
|
57
73
|
VALUE rbffi_FunctionTypeClass = Qnil;
|
58
74
|
|
@@ -60,13 +76,13 @@ static VALUE
|
|
60
76
|
fntype_allocate(VALUE klass)
|
61
77
|
{
|
62
78
|
FunctionType* fnInfo;
|
63
|
-
VALUE obj =
|
79
|
+
VALUE obj = TypedData_Make_Struct(klass, FunctionType, &rbffi_fntype_data_type, fnInfo);
|
64
80
|
|
65
81
|
fnInfo->type.ffiType = &ffi_type_pointer;
|
66
82
|
fnInfo->type.nativeType = NATIVE_FUNCTION;
|
67
|
-
fnInfo->rbReturnType
|
68
|
-
fnInfo->rbParameterTypes
|
69
|
-
fnInfo->rbEnums
|
83
|
+
RB_OBJ_WRITE(obj, &fnInfo->rbReturnType, Qnil);
|
84
|
+
RB_OBJ_WRITE(obj, &fnInfo->rbParameterTypes, Qnil);
|
85
|
+
RB_OBJ_WRITE(obj, &fnInfo->rbEnums, Qnil);
|
70
86
|
fnInfo->invoke = rbffi_CallFunction;
|
71
87
|
fnInfo->closurePool = NULL;
|
72
88
|
|
@@ -74,19 +90,39 @@ fntype_allocate(VALUE klass)
|
|
74
90
|
}
|
75
91
|
|
76
92
|
static void
|
77
|
-
fntype_mark(
|
93
|
+
fntype_mark(void *data)
|
78
94
|
{
|
79
|
-
|
80
|
-
|
81
|
-
|
95
|
+
FunctionType *fnInfo = (FunctionType *)data;
|
96
|
+
rb_gc_mark_movable(fnInfo->rbReturnType);
|
97
|
+
rb_gc_mark_movable(fnInfo->rbParameterTypes);
|
98
|
+
rb_gc_mark_movable(fnInfo->rbEnums);
|
82
99
|
if (fnInfo->callbackCount > 0 && fnInfo->callbackParameters != NULL) {
|
83
|
-
|
100
|
+
size_t index;
|
101
|
+
for (index = 0; index < fnInfo->callbackCount; index++) {
|
102
|
+
rb_gc_mark_movable(fnInfo->callbackParameters[index]);
|
103
|
+
}
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
107
|
+
static void
|
108
|
+
fntype_compact(void *data)
|
109
|
+
{
|
110
|
+
FunctionType *fnInfo = (FunctionType *)data;
|
111
|
+
ffi_gc_location(fnInfo->rbReturnType);
|
112
|
+
ffi_gc_location(fnInfo->rbParameterTypes);
|
113
|
+
ffi_gc_location(fnInfo->rbEnums);
|
114
|
+
if (fnInfo->callbackCount > 0 && fnInfo->callbackParameters != NULL) {
|
115
|
+
size_t index;
|
116
|
+
for (index = 0; index < fnInfo->callbackCount; index++) {
|
117
|
+
ffi_gc_location(fnInfo->callbackParameters[index]);
|
118
|
+
}
|
84
119
|
}
|
85
120
|
}
|
86
121
|
|
87
122
|
static void
|
88
|
-
fntype_free(
|
123
|
+
fntype_free(void *data)
|
89
124
|
{
|
125
|
+
FunctionType *fnInfo = (FunctionType *)data;
|
90
126
|
xfree(fnInfo->parameterTypes);
|
91
127
|
xfree(fnInfo->ffiParameterTypes);
|
92
128
|
xfree(fnInfo->nativeParameterTypes);
|
@@ -97,6 +133,23 @@ fntype_free(FunctionType* fnInfo)
|
|
97
133
|
xfree(fnInfo);
|
98
134
|
}
|
99
135
|
|
136
|
+
static size_t
|
137
|
+
fntype_memsize(const void *data)
|
138
|
+
{
|
139
|
+
const FunctionType *fnInfo = (const FunctionType *)data;
|
140
|
+
|
141
|
+
size_t memsize = sizeof(FunctionType);
|
142
|
+
memsize += fnInfo->callbackCount * sizeof(VALUE);
|
143
|
+
|
144
|
+
memsize += fnInfo->parameterCount * (
|
145
|
+
sizeof(*fnInfo->parameterTypes)
|
146
|
+
+ sizeof(ffi_type *)
|
147
|
+
+ sizeof(*fnInfo->nativeParameterTypes)
|
148
|
+
);
|
149
|
+
|
150
|
+
return memsize;
|
151
|
+
}
|
152
|
+
|
100
153
|
/*
|
101
154
|
* call-seq: initialize(return_type, param_types, options={})
|
102
155
|
* @param [Type, Symbol] return_type return type for the function
|
@@ -129,13 +182,13 @@ fntype_initialize(int argc, VALUE* argv, VALUE self)
|
|
129
182
|
|
130
183
|
Check_Type(rbParamTypes, T_ARRAY);
|
131
184
|
|
132
|
-
|
133
|
-
fnInfo->parameterCount = (
|
185
|
+
TypedData_Get_Struct(self, FunctionType, &rbffi_fntype_data_type, fnInfo);
|
186
|
+
fnInfo->parameterCount = RARRAY_LENINT(rbParamTypes);
|
134
187
|
fnInfo->parameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->parameterTypes));
|
135
188
|
fnInfo->ffiParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(ffi_type *));
|
136
189
|
fnInfo->nativeParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->nativeParameterTypes));
|
137
|
-
fnInfo->rbParameterTypes
|
138
|
-
fnInfo->rbEnums
|
190
|
+
RB_OBJ_WRITE(self, &fnInfo->rbParameterTypes, rb_ary_new2(fnInfo->parameterCount));
|
191
|
+
RB_OBJ_WRITE(self, &fnInfo->rbEnums, rbEnums);
|
139
192
|
fnInfo->blocking = RTEST(rbBlocking);
|
140
193
|
fnInfo->hasStruct = false;
|
141
194
|
|
@@ -150,7 +203,8 @@ fntype_initialize(int argc, VALUE* argv, VALUE self)
|
|
150
203
|
|
151
204
|
if (rb_obj_is_kind_of(type, rbffi_FunctionTypeClass)) {
|
152
205
|
REALLOC_N(fnInfo->callbackParameters, VALUE, fnInfo->callbackCount + 1);
|
153
|
-
fnInfo->callbackParameters[fnInfo->callbackCount
|
206
|
+
RB_OBJ_WRITE(self, &fnInfo->callbackParameters[fnInfo->callbackCount], type);
|
207
|
+
fnInfo->callbackCount++;
|
154
208
|
}
|
155
209
|
|
156
210
|
if (rb_obj_is_kind_of(type, rbffi_StructByValueClass)) {
|
@@ -158,12 +212,12 @@ fntype_initialize(int argc, VALUE* argv, VALUE self)
|
|
158
212
|
}
|
159
213
|
|
160
214
|
rb_ary_push(fnInfo->rbParameterTypes, type);
|
161
|
-
|
215
|
+
TypedData_Get_Struct(type, Type, &rbffi_type_data_type, fnInfo->parameterTypes[i]);
|
162
216
|
fnInfo->ffiParameterTypes[i] = fnInfo->parameterTypes[i]->ffiType;
|
163
217
|
fnInfo->nativeParameterTypes[i] = fnInfo->parameterTypes[i]->nativeType;
|
164
218
|
}
|
165
219
|
|
166
|
-
fnInfo->rbReturnType
|
220
|
+
RB_OBJ_WRITE(self, &fnInfo->rbReturnType, rbffi_Type_Lookup(rbReturnType));
|
167
221
|
if (!RTEST(fnInfo->rbReturnType)) {
|
168
222
|
VALUE typeName = rb_funcall2(rbReturnType, rb_intern("inspect"), 0, NULL);
|
169
223
|
rb_raise(rb_eTypeError, "Invalid return type (%s)", RSTRING_PTR(typeName));
|
@@ -173,7 +227,7 @@ fntype_initialize(int argc, VALUE* argv, VALUE self)
|
|
173
227
|
fnInfo->hasStruct = true;
|
174
228
|
}
|
175
229
|
|
176
|
-
|
230
|
+
TypedData_Get_Struct(fnInfo->rbReturnType, Type, &rbffi_type_data_type, fnInfo->returnType);
|
177
231
|
fnInfo->ffiReturnType = fnInfo->returnType->ffiType;
|
178
232
|
|
179
233
|
#if defined(X86_WIN32)
|
@@ -199,20 +253,22 @@ fntype_initialize(int argc, VALUE* argv, VALUE self)
|
|
199
253
|
|
200
254
|
fnInfo->invoke = rbffi_GetInvoker(fnInfo);
|
201
255
|
|
256
|
+
rb_obj_freeze(fnInfo->rbParameterTypes);
|
257
|
+
rb_obj_freeze(self);
|
202
258
|
return self;
|
203
259
|
}
|
204
260
|
|
205
261
|
/*
|
206
|
-
* call-seq:
|
262
|
+
* call-seq: return_type
|
207
263
|
* @return [Type]
|
208
264
|
* Get the return type of the function type
|
209
265
|
*/
|
210
266
|
static VALUE
|
211
|
-
|
267
|
+
fntype_return_type(VALUE self)
|
212
268
|
{
|
213
269
|
FunctionType* ft;
|
214
270
|
|
215
|
-
|
271
|
+
TypedData_Get_Struct(self, FunctionType, &rbffi_fntype_data_type, ft);
|
216
272
|
|
217
273
|
return ft->rbReturnType;
|
218
274
|
}
|
@@ -227,7 +283,7 @@ fntype_param_types(VALUE self)
|
|
227
283
|
{
|
228
284
|
FunctionType* ft;
|
229
285
|
|
230
|
-
|
286
|
+
TypedData_Get_Struct(self, FunctionType, &rbffi_fntype_data_type, ft);
|
231
287
|
|
232
288
|
return rb_ary_dup(ft->rbParameterTypes);
|
233
289
|
}
|
@@ -259,7 +315,7 @@ rbffi_FunctionInfo_Init(VALUE moduleFFI)
|
|
259
315
|
|
260
316
|
rb_define_alloc_func(rbffi_FunctionTypeClass, fntype_allocate);
|
261
317
|
rb_define_method(rbffi_FunctionTypeClass, "initialize", fntype_initialize, -1);
|
262
|
-
rb_define_method(rbffi_FunctionTypeClass, "
|
318
|
+
rb_define_method(rbffi_FunctionTypeClass, "return_type", fntype_return_type, 0);
|
263
319
|
rb_define_method(rbffi_FunctionTypeClass, "param_types", fntype_param_types, 0);
|
264
320
|
|
265
321
|
}
|
data/ext/ffi_c/LastError.c
CHANGED
@@ -91,30 +91,49 @@ thread_data_free(void *ptr)
|
|
91
91
|
}
|
92
92
|
|
93
93
|
#else
|
94
|
+
static size_t
|
95
|
+
thread_data_memsize(const void *data) {
|
96
|
+
return sizeof(ThreadData);
|
97
|
+
}
|
98
|
+
|
99
|
+
static const rb_data_type_t thread_data_data_type = {
|
100
|
+
.wrap_struct_name = "FFI::ThreadData",
|
101
|
+
.function = {
|
102
|
+
.dmark = NULL,
|
103
|
+
.dfree = RUBY_TYPED_DEFAULT_FREE,
|
104
|
+
.dsize = thread_data_memsize,
|
105
|
+
},
|
106
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
107
|
+
// macro to update VALUE references, as to trigger write barriers.
|
108
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED
|
109
|
+
};
|
110
|
+
|
94
111
|
static ID id_thread_data;
|
95
112
|
|
96
113
|
static ThreadData*
|
97
114
|
thread_data_init(void)
|
98
115
|
{
|
99
|
-
ThreadData*
|
116
|
+
ThreadData *td;
|
100
117
|
VALUE obj;
|
101
118
|
|
102
|
-
obj =
|
119
|
+
obj = TypedData_Make_Struct(rb_cObject, ThreadData, &thread_data_data_type, td);
|
103
120
|
rb_thread_local_aset(rb_thread_current(), id_thread_data, obj);
|
104
121
|
|
105
122
|
return td;
|
106
123
|
}
|
107
124
|
|
108
125
|
static inline ThreadData*
|
109
|
-
thread_data_get()
|
126
|
+
thread_data_get(void)
|
110
127
|
{
|
111
128
|
VALUE obj = rb_thread_local_aref(rb_thread_current(), id_thread_data);
|
112
129
|
|
113
|
-
if (
|
114
|
-
return (
|
130
|
+
if (NIL_P(obj)) {
|
131
|
+
return thread_data_init();
|
115
132
|
}
|
116
133
|
|
117
|
-
|
134
|
+
ThreadData *td;
|
135
|
+
TypedData_Get_Struct(obj, ThreadData, &thread_data_data_type, td);
|
136
|
+
return td;
|
118
137
|
}
|
119
138
|
|
120
139
|
#endif
|
@@ -122,7 +141,7 @@ thread_data_get()
|
|
122
141
|
|
123
142
|
/*
|
124
143
|
* call-seq: error
|
125
|
-
* @return [
|
144
|
+
* @return [Integer]
|
126
145
|
* Get +errno+ value.
|
127
146
|
*/
|
128
147
|
static VALUE
|
@@ -134,7 +153,7 @@ get_last_error(VALUE self)
|
|
134
153
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
135
154
|
/*
|
136
155
|
* call-seq: winapi_error
|
137
|
-
* @return [
|
156
|
+
* @return [Integer]
|
138
157
|
* Get +GetLastError()+ value. Only Windows or Cygwin.
|
139
158
|
*/
|
140
159
|
static VALUE
|
@@ -147,14 +166,13 @@ get_last_winapi_error(VALUE self)
|
|
147
166
|
|
148
167
|
/*
|
149
168
|
* call-seq: error(error)
|
150
|
-
* @param [
|
169
|
+
* @param [Integer] error
|
151
170
|
* @return [nil]
|
152
171
|
* Set +errno+ value.
|
153
172
|
*/
|
154
173
|
static VALUE
|
155
174
|
set_last_error(VALUE self, VALUE error)
|
156
175
|
{
|
157
|
-
|
158
176
|
#ifdef _WIN32
|
159
177
|
SetLastError(NUM2INT(error));
|
160
178
|
#else
|
@@ -167,7 +185,7 @@ set_last_error(VALUE self, VALUE error)
|
|
167
185
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
168
186
|
/*
|
169
187
|
* call-seq: error(error)
|
170
|
-
* @param [
|
188
|
+
* @param [Integer] error
|
171
189
|
* @return [nil]
|
172
190
|
* Set +GetLastError()+ value. Only on Windows and Cygwin.
|
173
191
|
*/
|
data/ext/ffi_c/MappedType.c
CHANGED
@@ -31,6 +31,7 @@
|
|
31
31
|
|
32
32
|
#include <ffi.h>
|
33
33
|
#include "rbffi.h"
|
34
|
+
#include "compat.h"
|
34
35
|
|
35
36
|
#include "Type.h"
|
36
37
|
#include "MappedType.h"
|
@@ -38,24 +39,41 @@
|
|
38
39
|
|
39
40
|
static VALUE mapped_allocate(VALUE);
|
40
41
|
static VALUE mapped_initialize(VALUE, VALUE);
|
41
|
-
static void mapped_mark(
|
42
|
+
static void mapped_mark(void *);
|
43
|
+
static void mapped_compact(void *);
|
44
|
+
static size_t mapped_memsize(const void *);
|
42
45
|
static ID id_native_type, id_to_native, id_from_native;
|
43
46
|
|
44
47
|
VALUE rbffi_MappedTypeClass = Qnil;
|
45
48
|
|
49
|
+
static const rb_data_type_t mapped_type_data_type = {
|
50
|
+
.wrap_struct_name = "FFI::Type::Mapped",
|
51
|
+
.function = {
|
52
|
+
.dmark = mapped_mark,
|
53
|
+
.dfree = RUBY_TYPED_DEFAULT_FREE,
|
54
|
+
.dsize = mapped_memsize,
|
55
|
+
ffi_compact_callback( mapped_compact )
|
56
|
+
},
|
57
|
+
.parent = &rbffi_type_data_type,
|
58
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
59
|
+
// macro to update VALUE references, as to trigger write barriers.
|
60
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
|
61
|
+
};
|
62
|
+
|
63
|
+
|
46
64
|
static VALUE
|
47
65
|
mapped_allocate(VALUE klass)
|
48
66
|
{
|
49
67
|
MappedType* m;
|
50
68
|
|
51
|
-
VALUE obj =
|
69
|
+
VALUE obj = TypedData_Make_Struct(klass, MappedType, &mapped_type_data_type, m);
|
52
70
|
|
53
|
-
m->rbConverter
|
54
|
-
m->rbType
|
71
|
+
RB_OBJ_WRITE(obj, &m->rbConverter, Qnil);
|
72
|
+
RB_OBJ_WRITE(obj, &m->rbType, Qnil);
|
55
73
|
m->type = NULL;
|
56
74
|
m->base.nativeType = NATIVE_MAPPED;
|
57
75
|
m->base.ffiType = &ffi_type_void;
|
58
|
-
|
76
|
+
|
59
77
|
return obj;
|
60
78
|
}
|
61
79
|
|
@@ -69,7 +87,7 @@ static VALUE
|
|
69
87
|
mapped_initialize(VALUE self, VALUE rbConverter)
|
70
88
|
{
|
71
89
|
MappedType* m = NULL;
|
72
|
-
|
90
|
+
|
73
91
|
if (!rb_respond_to(rbConverter, id_native_type)) {
|
74
92
|
rb_raise(rb_eNoMethodError, "native_type method not implemented");
|
75
93
|
}
|
@@ -81,25 +99,42 @@ mapped_initialize(VALUE self, VALUE rbConverter)
|
|
81
99
|
if (!rb_respond_to(rbConverter, id_from_native)) {
|
82
100
|
rb_raise(rb_eNoMethodError, "from_native method not implemented");
|
83
101
|
}
|
84
|
-
|
85
|
-
|
86
|
-
m->rbType
|
102
|
+
|
103
|
+
TypedData_Get_Struct(self, MappedType, &mapped_type_data_type, m);
|
104
|
+
RB_OBJ_WRITE(self, &m->rbType, rb_funcall2(rbConverter, id_native_type, 0, NULL));
|
87
105
|
if (!(rb_obj_is_kind_of(m->rbType, rbffi_TypeClass))) {
|
88
106
|
rb_raise(rb_eTypeError, "native_type did not return instance of FFI::Type");
|
89
107
|
}
|
90
108
|
|
91
|
-
m->rbConverter
|
92
|
-
|
109
|
+
RB_OBJ_WRITE(self, &m->rbConverter, rbConverter);
|
110
|
+
TypedData_Get_Struct(m->rbType, Type, &rbffi_type_data_type, m->type);
|
93
111
|
m->base.ffiType = m->type->ffiType;
|
94
|
-
|
112
|
+
|
113
|
+
rb_obj_freeze(self);
|
114
|
+
|
95
115
|
return self;
|
96
116
|
}
|
97
117
|
|
98
118
|
static void
|
99
|
-
mapped_mark(
|
119
|
+
mapped_mark(void* data)
|
120
|
+
{
|
121
|
+
MappedType* m = (MappedType*)data;
|
122
|
+
rb_gc_mark_movable(m->rbType);
|
123
|
+
rb_gc_mark_movable(m->rbConverter);
|
124
|
+
}
|
125
|
+
|
126
|
+
static void
|
127
|
+
mapped_compact(void* data)
|
100
128
|
{
|
101
|
-
|
102
|
-
|
129
|
+
MappedType* m = (MappedType*)data;
|
130
|
+
ffi_gc_location(m->rbType);
|
131
|
+
ffi_gc_location(m->rbConverter);
|
132
|
+
}
|
133
|
+
|
134
|
+
static size_t
|
135
|
+
mapped_memsize(const void *data)
|
136
|
+
{
|
137
|
+
return sizeof(MappedType);
|
103
138
|
}
|
104
139
|
|
105
140
|
/*
|
@@ -111,7 +146,7 @@ static VALUE
|
|
111
146
|
mapped_native_type(VALUE self)
|
112
147
|
{
|
113
148
|
MappedType*m = NULL;
|
114
|
-
|
149
|
+
TypedData_Get_Struct(self, MappedType, &mapped_type_data_type, m);
|
115
150
|
|
116
151
|
return m->rbType;
|
117
152
|
}
|
@@ -124,9 +159,8 @@ static VALUE
|
|
124
159
|
mapped_to_native(int argc, VALUE* argv, VALUE self)
|
125
160
|
{
|
126
161
|
MappedType*m = NULL;
|
127
|
-
|
128
|
-
|
129
|
-
|
162
|
+
TypedData_Get_Struct(self, MappedType, &mapped_type_data_type, m);
|
163
|
+
|
130
164
|
return rb_funcall2(m->rbConverter, id_to_native, argc, argv);
|
131
165
|
}
|
132
166
|
|
@@ -138,20 +172,28 @@ static VALUE
|
|
138
172
|
mapped_from_native(int argc, VALUE* argv, VALUE self)
|
139
173
|
{
|
140
174
|
MappedType*m = NULL;
|
141
|
-
|
142
|
-
Data_Get_Struct(self, MappedType, m);
|
175
|
+
TypedData_Get_Struct(self, MappedType, &mapped_type_data_type, m);
|
143
176
|
|
144
177
|
return rb_funcall2(m->rbConverter, id_from_native, argc, argv);
|
145
178
|
}
|
146
179
|
|
180
|
+
static VALUE
|
181
|
+
mapped_converter(VALUE self)
|
182
|
+
{
|
183
|
+
MappedType*m = NULL;
|
184
|
+
TypedData_Get_Struct(self, MappedType, &mapped_type_data_type, m);
|
185
|
+
|
186
|
+
return m->rbConverter;
|
187
|
+
}
|
188
|
+
|
147
189
|
void
|
148
190
|
rbffi_MappedType_Init(VALUE moduleFFI)
|
149
191
|
{
|
150
|
-
/*
|
192
|
+
/*
|
151
193
|
* Document-class: FFI::Type::Mapped < FFI::Type
|
152
194
|
*/
|
153
195
|
rbffi_MappedTypeClass = rb_define_class_under(rbffi_TypeClass, "Mapped", rbffi_TypeClass);
|
154
|
-
|
196
|
+
|
155
197
|
rb_global_variable(&rbffi_MappedTypeClass);
|
156
198
|
|
157
199
|
id_native_type = rb_intern("native_type");
|
@@ -164,5 +206,6 @@ rbffi_MappedType_Init(VALUE moduleFFI)
|
|
164
206
|
rb_define_method(rbffi_MappedTypeClass, "native_type", mapped_native_type, 0);
|
165
207
|
rb_define_method(rbffi_MappedTypeClass, "to_native", mapped_to_native, -1);
|
166
208
|
rb_define_method(rbffi_MappedTypeClass, "from_native", mapped_from_native, -1);
|
209
|
+
rb_define_method(rbffi_MappedTypeClass, "converter", mapped_converter, 0);
|
167
210
|
}
|
168
211
|
|
data/ext/ffi_c/MappedType.h
CHANGED
data/ext/ffi_c/MemoryPointer.c
CHANGED
@@ -39,13 +39,14 @@
|
|
39
39
|
|
40
40
|
|
41
41
|
static VALUE memptr_allocate(VALUE klass);
|
42
|
-
static void memptr_release(
|
42
|
+
static void memptr_release(void *data);
|
43
|
+
static size_t memptr_memsize(const void *data);
|
43
44
|
static VALUE memptr_malloc(VALUE self, long size, long count, bool clear);
|
44
45
|
static VALUE memptr_free(VALUE self);
|
45
46
|
|
46
47
|
VALUE rbffi_MemoryPointerClass;
|
47
48
|
|
48
|
-
#define MEMPTR(obj) ((MemoryPointer *) rbffi_AbstractMemory_Cast(obj,
|
49
|
+
#define MEMPTR(obj) ((MemoryPointer *) rbffi_AbstractMemory_Cast(obj, &memory_pointer_data_type))
|
49
50
|
|
50
51
|
VALUE
|
51
52
|
rbffi_MemoryPointer_NewInstance(long size, long count, bool clear)
|
@@ -53,12 +54,25 @@ rbffi_MemoryPointer_NewInstance(long size, long count, bool clear)
|
|
53
54
|
return memptr_malloc(memptr_allocate(rbffi_MemoryPointerClass), size, count, clear);
|
54
55
|
}
|
55
56
|
|
57
|
+
static const rb_data_type_t memory_pointer_data_type = {
|
58
|
+
.wrap_struct_name = "FFI::MemoryPointer",
|
59
|
+
.function = {
|
60
|
+
.dmark = NULL,
|
61
|
+
.dfree = memptr_release,
|
62
|
+
.dsize = memptr_memsize,
|
63
|
+
},
|
64
|
+
.parent = &rbffi_pointer_data_type,
|
65
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
66
|
+
// macro to update VALUE references, as to trigger write barriers.
|
67
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
|
68
|
+
};
|
69
|
+
|
56
70
|
static VALUE
|
57
71
|
memptr_allocate(VALUE klass)
|
58
72
|
{
|
59
73
|
Pointer* p;
|
60
|
-
VALUE obj =
|
61
|
-
p->rbParent
|
74
|
+
VALUE obj = TypedData_Make_Struct(klass, Pointer, &memory_pointer_data_type, p);
|
75
|
+
RB_OBJ_WRITE(obj, &p->rbParent, Qnil);
|
62
76
|
p->memory.flags = MEM_RD | MEM_WR;
|
63
77
|
|
64
78
|
return obj;
|
@@ -66,8 +80,8 @@ memptr_allocate(VALUE klass)
|
|
66
80
|
|
67
81
|
/*
|
68
82
|
* call-seq: initialize(size, count=1, clear=true)
|
69
|
-
* @param [
|
70
|
-
* @param [
|
83
|
+
* @param [Integer, Symbol, FFI::Type] size size of a memory cell (in bytes, or type whom size will be used)
|
84
|
+
* @param [Integer] count number of cells in memory
|
71
85
|
* @param [Boolean] clear set memory to all-zero if +true+
|
72
86
|
* @return [self]
|
73
87
|
* A new instance of FFI::MemoryPointer.
|
@@ -94,7 +108,7 @@ memptr_malloc(VALUE self, long size, long count, bool clear)
|
|
94
108
|
Pointer* p;
|
95
109
|
unsigned long msize;
|
96
110
|
|
97
|
-
|
111
|
+
TypedData_Get_Struct(self, Pointer, &memory_pointer_data_type, p);
|
98
112
|
|
99
113
|
msize = size * count;
|
100
114
|
|
@@ -122,7 +136,8 @@ memptr_free(VALUE self)
|
|
122
136
|
{
|
123
137
|
Pointer* ptr;
|
124
138
|
|
125
|
-
|
139
|
+
rb_check_frozen(self);
|
140
|
+
TypedData_Get_Struct(self, Pointer, &memory_pointer_data_type, ptr);
|
126
141
|
|
127
142
|
if (ptr->allocated) {
|
128
143
|
if (ptr->storage != NULL) {
|
@@ -136,8 +151,9 @@ memptr_free(VALUE self)
|
|
136
151
|
}
|
137
152
|
|
138
153
|
static void
|
139
|
-
memptr_release(
|
154
|
+
memptr_release(void *data)
|
140
155
|
{
|
156
|
+
Pointer *ptr = (Pointer *)data;
|
141
157
|
if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) {
|
142
158
|
xfree(ptr->storage);
|
143
159
|
ptr->storage = NULL;
|
@@ -145,6 +161,17 @@ memptr_release(Pointer* ptr)
|
|
145
161
|
xfree(ptr);
|
146
162
|
}
|
147
163
|
|
164
|
+
static size_t
|
165
|
+
memptr_memsize(const void *data)
|
166
|
+
{
|
167
|
+
const Pointer *ptr = (const Pointer *)data;
|
168
|
+
size_t memsize = sizeof(Pointer);
|
169
|
+
if (ptr->allocated) {
|
170
|
+
memsize += ptr->memory.size;
|
171
|
+
}
|
172
|
+
return memsize;
|
173
|
+
}
|
174
|
+
|
148
175
|
/*
|
149
176
|
* call-seq: from_string(s)
|
150
177
|
* @param [String] s string
|
data/ext/ffi_c/MethodHandle.c
CHANGED
@@ -77,7 +77,9 @@
|
|
77
77
|
static bool prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize);
|
78
78
|
static long trampoline_size(void);
|
79
79
|
|
80
|
-
#if defined(__x86_64__) &&
|
80
|
+
#if defined(__x86_64__) && \
|
81
|
+
(defined(__linux__) || defined(__APPLE__)) && \
|
82
|
+
!USE_FFI_ALLOC
|
81
83
|
# define CUSTOM_TRAMPOLINE 1
|
82
84
|
#endif
|
83
85
|
|