ffi 1.15.5 → 1.17.0
Sign up to get free protection for your applications and to get access to all the features.
- 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/AbstractMemory.c
CHANGED
@@ -55,21 +55,30 @@
|
|
55
55
|
# define RB_OBJ_STRING(obj) StringValueCStr(obj)
|
56
56
|
#endif
|
57
57
|
|
58
|
+
static size_t memsize(const void *data);
|
58
59
|
static inline char* memory_address(VALUE self);
|
59
60
|
VALUE rbffi_AbstractMemoryClass = Qnil;
|
60
61
|
static VALUE NullPointerErrorClass = Qnil;
|
61
62
|
static ID id_to_ptr = 0, id_plus = 0, id_call = 0;
|
62
63
|
|
63
|
-
|
64
|
-
|
65
|
-
{
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
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
|
+
};
|
70
75
|
|
71
|
-
|
76
|
+
static size_t
|
77
|
+
memsize(const void *data)
|
78
|
+
{
|
79
|
+
return sizeof(AbstractMemory);
|
72
80
|
}
|
81
|
+
|
73
82
|
#define VAL(x, swap) (unlikely(((memory->flags & MEM_SWAP) != 0)) ? swap((x)) : (x))
|
74
83
|
|
75
84
|
#define NUM_OP(name, type, toNative, fromNative, swap) \
|
@@ -87,7 +96,7 @@ static VALUE \
|
|
87
96
|
memory_put_##name(VALUE self, VALUE offset, VALUE value) \
|
88
97
|
{ \
|
89
98
|
AbstractMemory* memory; \
|
90
|
-
|
99
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
|
91
100
|
memory_op_put_##name(memory, NUM2LONG(offset), value); \
|
92
101
|
return self; \
|
93
102
|
} \
|
@@ -96,7 +105,7 @@ static VALUE \
|
|
96
105
|
memory_write_##name(VALUE self, VALUE value) \
|
97
106
|
{ \
|
98
107
|
AbstractMemory* memory; \
|
99
|
-
|
108
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
|
100
109
|
memory_op_put_##name(memory, 0, value); \
|
101
110
|
return self; \
|
102
111
|
} \
|
@@ -115,7 +124,7 @@ static VALUE \
|
|
115
124
|
memory_get_##name(VALUE self, VALUE offset) \
|
116
125
|
{ \
|
117
126
|
AbstractMemory* memory; \
|
118
|
-
|
127
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
|
119
128
|
return memory_op_get_##name(memory, NUM2LONG(offset)); \
|
120
129
|
} \
|
121
130
|
static VALUE memory_read_##name(VALUE self); \
|
@@ -123,7 +132,7 @@ static VALUE \
|
|
123
132
|
memory_read_##name(VALUE self) \
|
124
133
|
{ \
|
125
134
|
AbstractMemory* memory; \
|
126
|
-
|
135
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, memory); \
|
127
136
|
return memory_op_get_##name(memory, 0); \
|
128
137
|
} \
|
129
138
|
static MemoryOp memory_op_##name = { memory_op_get_##name, memory_op_put_##name }; \
|
@@ -141,7 +150,7 @@ memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary) \
|
|
141
150
|
if (likely(count > 0)) checkWrite(memory); \
|
142
151
|
checkBounds(memory, off, count * sizeof(type)); \
|
143
152
|
for (i = 0; i < count; i++) { \
|
144
|
-
type tmp = (type) VAL(toNative(
|
153
|
+
type tmp = (type) VAL(toNative(RARRAY_AREF(ary, i)), swap); \
|
145
154
|
memcpy(memory->address + off + (i * sizeof(type)), &tmp, sizeof(tmp)); \
|
146
155
|
} \
|
147
156
|
return self; \
|
@@ -307,6 +316,7 @@ static VALUE
|
|
307
316
|
memory_clear(VALUE self)
|
308
317
|
{
|
309
318
|
AbstractMemory* ptr = MEMORY(self);
|
319
|
+
checkWrite(ptr);
|
310
320
|
memset(ptr->address, 0, ptr->size);
|
311
321
|
return self;
|
312
322
|
}
|
@@ -314,14 +324,14 @@ memory_clear(VALUE self)
|
|
314
324
|
/*
|
315
325
|
* call-seq: memory.size
|
316
326
|
* Return memory size in bytes (alias: #total)
|
317
|
-
* @return [
|
327
|
+
* @return [Integer]
|
318
328
|
*/
|
319
329
|
static VALUE
|
320
330
|
memory_size(VALUE self)
|
321
331
|
{
|
322
332
|
AbstractMemory* ptr;
|
323
333
|
|
324
|
-
|
334
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
325
335
|
|
326
336
|
return LONG2NUM(ptr->size);
|
327
337
|
}
|
@@ -330,7 +340,7 @@ memory_size(VALUE self)
|
|
330
340
|
* call-seq: memory.get(type, offset)
|
331
341
|
* Return data of given type contained in memory.
|
332
342
|
* @param [Symbol, Type] type_name type of data to get
|
333
|
-
* @param [
|
343
|
+
* @param [Integer] offset point in buffer to start from
|
334
344
|
* @return [Object]
|
335
345
|
* @raise {ArgumentError} if type is not supported
|
336
346
|
*/
|
@@ -340,14 +350,15 @@ memory_get(VALUE self, VALUE type_name, VALUE offset)
|
|
340
350
|
AbstractMemory* ptr;
|
341
351
|
VALUE nType;
|
342
352
|
Type *type;
|
353
|
+
MemoryOp *op;
|
343
354
|
|
344
355
|
nType = rbffi_Type_Lookup(type_name);
|
345
356
|
if(NIL_P(nType)) goto undefined_type;
|
346
357
|
|
347
|
-
|
348
|
-
|
358
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
359
|
+
TypedData_Get_Struct(nType, Type, &rbffi_type_data_type, type);
|
349
360
|
|
350
|
-
|
361
|
+
op = get_memory_op(type);
|
351
362
|
if(op == NULL) goto undefined_type;
|
352
363
|
|
353
364
|
return op->get(ptr, NUM2LONG(offset));
|
@@ -362,7 +373,7 @@ undefined_type: {
|
|
362
373
|
/*
|
363
374
|
* call-seq: memory.put(type, offset, value)
|
364
375
|
* @param [Symbol, Type] type_name type of data to put
|
365
|
-
* @param [
|
376
|
+
* @param [Integer] offset point in buffer to start from
|
366
377
|
* @return [nil]
|
367
378
|
* @raise {ArgumentError} if type is not supported
|
368
379
|
*/
|
@@ -372,14 +383,15 @@ memory_put(VALUE self, VALUE type_name, VALUE offset, VALUE value)
|
|
372
383
|
AbstractMemory* ptr;
|
373
384
|
VALUE nType;
|
374
385
|
Type *type;
|
386
|
+
MemoryOp *op;
|
375
387
|
|
376
388
|
nType = rbffi_Type_Lookup(type_name);
|
377
389
|
if(NIL_P(nType)) goto undefined_type;
|
378
390
|
|
379
|
-
|
380
|
-
|
391
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
392
|
+
TypedData_Get_Struct(nType, Type, &rbffi_type_data_type, type);
|
381
393
|
|
382
|
-
|
394
|
+
op = get_memory_op(type);
|
383
395
|
if(op == NULL) goto undefined_type;
|
384
396
|
|
385
397
|
op->put(ptr, NUM2LONG(offset), value);
|
@@ -395,8 +407,8 @@ undefined_type: {
|
|
395
407
|
/*
|
396
408
|
* call-seq: memory.get_string(offset, length=nil)
|
397
409
|
* Return string contained in memory.
|
398
|
-
* @param [
|
399
|
-
* @param [
|
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).
|
400
412
|
* @return [String]
|
401
413
|
* @raise {IndexError} if +length+ is too great
|
402
414
|
* @raise {NullPointerError} if memory not initialized
|
@@ -423,8 +435,8 @@ memory_get_string(int argc, VALUE* argv, VALUE self)
|
|
423
435
|
/*
|
424
436
|
* call-seq: memory.get_array_of_string(offset, count=nil)
|
425
437
|
* Return an array of strings contained in memory.
|
426
|
-
* @param [
|
427
|
-
* @param [
|
438
|
+
* @param [Integer] offset point in memory to start from
|
439
|
+
* @param [Integer] count number of strings to get. If nil, return all strings
|
428
440
|
* @return [Array<String>]
|
429
441
|
* @raise {IndexError} if +offset+ is too great
|
430
442
|
* @raise {NullPointerError} if memory not initialized
|
@@ -442,7 +454,7 @@ memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
|
|
442
454
|
count = (countnum == Qnil ? 0 : NUM2INT(countnum));
|
443
455
|
retVal = rb_ary_new2(count);
|
444
456
|
|
445
|
-
|
457
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
446
458
|
checkRead(ptr);
|
447
459
|
|
448
460
|
if (countnum != Qnil) {
|
@@ -473,7 +485,7 @@ memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
|
|
473
485
|
* call-seq: memory.read_array_of_string(count=nil)
|
474
486
|
* Return an array of strings contained in memory. Same as:
|
475
487
|
* memory.get_array_of_string(0, count)
|
476
|
-
* @param [
|
488
|
+
* @param [Integer] count number of strings to get. If nil, return all strings
|
477
489
|
* @return [Array<String>]
|
478
490
|
*/
|
479
491
|
static VALUE
|
@@ -493,7 +505,7 @@ memory_read_array_of_string(int argc, VALUE* argv, VALUE self)
|
|
493
505
|
|
494
506
|
/*
|
495
507
|
* call-seq: memory.put_string(offset, str)
|
496
|
-
* @param [
|
508
|
+
* @param [Integer] offset
|
497
509
|
* @param [String] str
|
498
510
|
* @return [self]
|
499
511
|
* @raise {SecurityError} when writing unsafe string to memory
|
@@ -523,8 +535,8 @@ memory_put_string(VALUE self, VALUE offset, VALUE str)
|
|
523
535
|
/*
|
524
536
|
* call-seq: memory.get_bytes(offset, length)
|
525
537
|
* Return string contained in memory.
|
526
|
-
* @param [
|
527
|
-
* @param [
|
538
|
+
* @param [Integer] offset point in buffer to start from
|
539
|
+
* @param [Integer] length string's length in bytes.
|
528
540
|
* @return [String]
|
529
541
|
* @raise {IndexError} if +length+ is too great
|
530
542
|
* @raise {NullPointerError} if memory not initialized
|
@@ -547,10 +559,10 @@ memory_get_bytes(VALUE self, VALUE offset, VALUE length)
|
|
547
559
|
/*
|
548
560
|
* call-seq: memory.put_bytes(offset, str, index=0, length=nil)
|
549
561
|
* Put a string in memory.
|
550
|
-
* @param [
|
562
|
+
* @param [Integer] offset point in buffer to start from
|
551
563
|
* @param [String] str string to put to memory
|
552
|
-
* @param [
|
553
|
-
* @param [
|
564
|
+
* @param [Integer] index
|
565
|
+
* @param [Integer] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
|
554
566
|
* @return [self]
|
555
567
|
* @raise {IndexError} if +length+ is too great
|
556
568
|
* @raise {NullPointerError} if memory not initialized
|
@@ -589,7 +601,7 @@ memory_put_bytes(int argc, VALUE* argv, VALUE self)
|
|
589
601
|
|
590
602
|
/*
|
591
603
|
* call-seq: memory.read_bytes(length)
|
592
|
-
* @param [
|
604
|
+
* @param [Integer] length of string to return
|
593
605
|
* @return [String]
|
594
606
|
* equivalent to :
|
595
607
|
* memory.get_bytes(0, length)
|
@@ -603,8 +615,8 @@ memory_read_bytes(VALUE self, VALUE length)
|
|
603
615
|
/*
|
604
616
|
* call-seq: memory.write_bytes(str, index=0, length=nil)
|
605
617
|
* @param [String] str string to put to memory
|
606
|
-
* @param [
|
607
|
-
* @param [
|
618
|
+
* @param [Integer] index
|
619
|
+
* @param [Integer] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
|
608
620
|
* @return [self]
|
609
621
|
* equivalent to :
|
610
622
|
* memory.put_bytes(0, str, index, length)
|
@@ -625,7 +637,7 @@ memory_write_bytes(int argc, VALUE* argv, VALUE self)
|
|
625
637
|
|
626
638
|
/*
|
627
639
|
* call-seq: memory.type_size
|
628
|
-
* @return [
|
640
|
+
* @return [Integer] type size in bytes
|
629
641
|
* Get the memory's type size.
|
630
642
|
*/
|
631
643
|
static VALUE
|
@@ -633,7 +645,7 @@ memory_type_size(VALUE self)
|
|
633
645
|
{
|
634
646
|
AbstractMemory* ptr;
|
635
647
|
|
636
|
-
|
648
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
637
649
|
|
638
650
|
return INT2NUM(ptr->typeSize);
|
639
651
|
}
|
@@ -641,7 +653,7 @@ memory_type_size(VALUE self)
|
|
641
653
|
/*
|
642
654
|
* Document-method: []
|
643
655
|
* call-seq: memory[idx]
|
644
|
-
* @param [
|
656
|
+
* @param [Integer] idx index to access in memory
|
645
657
|
* @return
|
646
658
|
* Memory read accessor.
|
647
659
|
*/
|
@@ -651,7 +663,7 @@ memory_aref(VALUE self, VALUE idx)
|
|
651
663
|
AbstractMemory* ptr;
|
652
664
|
VALUE rbOffset = Qnil;
|
653
665
|
|
654
|
-
|
666
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
|
655
667
|
|
656
668
|
rbOffset = ULONG2NUM(NUM2ULONG(idx) * ptr->typeSize);
|
657
669
|
|
@@ -661,7 +673,9 @@ memory_aref(VALUE self, VALUE idx)
|
|
661
673
|
static inline char*
|
662
674
|
memory_address(VALUE obj)
|
663
675
|
{
|
664
|
-
|
676
|
+
AbstractMemory *mem;
|
677
|
+
TypedData_Get_Struct(obj, AbstractMemory, &rbffi_abstract_memory_data_type, mem);
|
678
|
+
return mem->address;
|
665
679
|
}
|
666
680
|
|
667
681
|
static VALUE
|
@@ -669,24 +683,33 @@ memory_copy_from(VALUE self, VALUE rbsrc, VALUE rblen)
|
|
669
683
|
{
|
670
684
|
AbstractMemory* dst;
|
671
685
|
|
672
|
-
|
686
|
+
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, dst);
|
673
687
|
|
674
|
-
memcpy(dst->address, rbffi_AbstractMemory_Cast(rbsrc,
|
688
|
+
memcpy(dst->address, rbffi_AbstractMemory_Cast(rbsrc, &rbffi_abstract_memory_data_type)->address, NUM2INT(rblen));
|
675
689
|
|
676
690
|
return self;
|
677
691
|
}
|
678
692
|
|
679
|
-
|
680
|
-
|
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)
|
681
701
|
{
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
}
|
702
|
+
AbstractMemory* ptr = MEMORY(self);
|
703
|
+
ptr->flags &= ~MEM_WR;
|
704
|
+
return rb_call_super(0, NULL);
|
705
|
+
}
|
687
706
|
|
688
|
-
|
689
|
-
|
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;
|
690
713
|
}
|
691
714
|
|
692
715
|
void
|
@@ -781,7 +804,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
781
804
|
* Document-variable: FFI::AbstractMemory
|
782
805
|
*/
|
783
806
|
rb_global_variable(&rbffi_AbstractMemoryClass);
|
784
|
-
|
807
|
+
rb_undef_alloc_func(classMemory);
|
785
808
|
|
786
809
|
NullPointerErrorClass = rb_define_class_under(moduleFFI, "NullPointerError", rb_eRuntimeError);
|
787
810
|
/* Document-variable: NullPointerError */
|
@@ -838,8 +861,8 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
838
861
|
|
839
862
|
/*
|
840
863
|
* Document-method: put_float32
|
841
|
-
* call-seq: memory.
|
842
|
-
* @param [
|
864
|
+
* call-seq: memory.put_float32(offset, value)
|
865
|
+
* @param [Integer] offset
|
843
866
|
* @param [Numeric] value
|
844
867
|
* @return [self]
|
845
868
|
* Put +value+ as a 32-bit float in memory at offset +offset+ (alias: #put_float).
|
@@ -848,7 +871,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
848
871
|
/*
|
849
872
|
* Document-method: get_float32
|
850
873
|
* call-seq: memory.get_float32(offset)
|
851
|
-
* @param [
|
874
|
+
* @param [Integer] offset
|
852
875
|
* @return [Float]
|
853
876
|
* Get a 32-bit float from memory at offset +offset+ (alias: #get_float).
|
854
877
|
*/
|
@@ -879,7 +902,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
879
902
|
/*
|
880
903
|
* Document-method: put_array_of_float32
|
881
904
|
* call-seq: memory.put_array_of_float32(offset, ary)
|
882
|
-
* @param [
|
905
|
+
* @param [Integer] offset
|
883
906
|
* @param [Array<Numeric>] ary
|
884
907
|
* @return [self]
|
885
908
|
* Put values from +ary+ as 32-bit floats in memory from offset +offset+ (alias: #put_array_of_float).
|
@@ -888,8 +911,8 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
888
911
|
/*
|
889
912
|
* Document-method: get_array_of_float32
|
890
913
|
* call-seq: memory.get_array_of_float32(offset, length)
|
891
|
-
* @param [
|
892
|
-
* @param [
|
914
|
+
* @param [Integer] offset
|
915
|
+
* @param [Integer] length number of Float to get
|
893
916
|
* @return [Array<Float>]
|
894
917
|
* Get 32-bit floats in memory from offset +offset+ (alias: #get_array_of_float).
|
895
918
|
*/
|
@@ -908,7 +931,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
908
931
|
/*
|
909
932
|
* Document-method: read_array_of_float
|
910
933
|
* call-seq: memory.read_array_of_float(length)
|
911
|
-
* @param [
|
934
|
+
* @param [Integer] length number of Float to read
|
912
935
|
* @return [Array<Float>]
|
913
936
|
* Read 32-bit floats from memory.
|
914
937
|
*
|
@@ -921,7 +944,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
921
944
|
/*
|
922
945
|
* Document-method: put_float64
|
923
946
|
* call-seq: memory.put_float64(offset, value)
|
924
|
-
* @param [
|
947
|
+
* @param [Integer] offset
|
925
948
|
* @param [Numeric] value
|
926
949
|
* @return [self]
|
927
950
|
* Put +value+ as a 64-bit float (double) in memory at offset +offset+ (alias: #put_double).
|
@@ -930,7 +953,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
930
953
|
/*
|
931
954
|
* Document-method: get_float64
|
932
955
|
* call-seq: memory.get_float64(offset)
|
933
|
-
* @param [
|
956
|
+
* @param [Integer] offset
|
934
957
|
* @return [Float]
|
935
958
|
* Get a 64-bit float (double) from memory at offset +offset+ (alias: #get_double).
|
936
959
|
*/
|
@@ -961,7 +984,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
961
984
|
/*
|
962
985
|
* Document-method: put_array_of_float64
|
963
986
|
* call-seq: memory.put_array_of_float64(offset, ary)
|
964
|
-
* @param [
|
987
|
+
* @param [Integer] offset
|
965
988
|
* @param [Array<Numeric>] ary
|
966
989
|
* @return [self]
|
967
990
|
* Put values from +ary+ as 64-bit floats (doubles) in memory from offset +offset+ (alias: #put_array_of_double).
|
@@ -970,8 +993,8 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
970
993
|
/*
|
971
994
|
* Document-method: get_array_of_float64
|
972
995
|
* call-seq: memory.get_array_of_float64(offset, length)
|
973
|
-
* @param [
|
974
|
-
* @param [
|
996
|
+
* @param [Integer] offset
|
997
|
+
* @param [Integer] length number of Float to get
|
975
998
|
* @return [Array<Float>]
|
976
999
|
* Get 64-bit floats (doubles) in memory from offset +offset+ (alias: #get_array_of_double).
|
977
1000
|
*/
|
@@ -990,7 +1013,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
990
1013
|
/*
|
991
1014
|
* Document-method: read_array_of_double
|
992
1015
|
* call-seq: memory.read_array_of_double(length)
|
993
|
-
* @param [
|
1016
|
+
* @param [Integer] length number of Float to read
|
994
1017
|
* @return [Array<Float>]
|
995
1018
|
* Read 64-bit floats (doubles) from memory.
|
996
1019
|
*
|
@@ -1003,7 +1026,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
1003
1026
|
/*
|
1004
1027
|
* Document-method: put_pointer
|
1005
1028
|
* call-seq: memory.put_pointer(offset, value)
|
1006
|
-
* @param [
|
1029
|
+
* @param [Integer] offset
|
1007
1030
|
* @param [nil,Pointer, Integer, #to_ptr] value
|
1008
1031
|
* @return [self]
|
1009
1032
|
* Put +value+ in memory from +offset+..
|
@@ -1012,7 +1035,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
1012
1035
|
/*
|
1013
1036
|
* Document-method: get_pointer
|
1014
1037
|
* call-seq: memory.get_pointer(offset)
|
1015
|
-
* @param [
|
1038
|
+
* @param [Integer] offset
|
1016
1039
|
* @return [Pointer]
|
1017
1040
|
* Get a {Pointer} to the memory from +offset+.
|
1018
1041
|
*/
|
@@ -1041,7 +1064,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
1041
1064
|
/*
|
1042
1065
|
* Document-method: put_array_of_pointer
|
1043
1066
|
* call-seq: memory.put_array_of_pointer(offset, ary)
|
1044
|
-
* @param [
|
1067
|
+
* @param [Integer] offset
|
1045
1068
|
* @param [Array<#to_ptr>] ary
|
1046
1069
|
* @return [self]
|
1047
1070
|
* Put an array of {Pointer} into memory from +offset+.
|
@@ -1050,8 +1073,8 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
1050
1073
|
/*
|
1051
1074
|
* Document-method: get_array_of_pointer
|
1052
1075
|
* call-seq: memory.get_array_of_pointer(offset, length)
|
1053
|
-
* @param [
|
1054
|
-
* @param [
|
1076
|
+
* @param [Integer] offset
|
1077
|
+
* @param [Integer] length
|
1055
1078
|
* @return [Array<Pointer>]
|
1056
1079
|
* Get an array of {Pointer} of length +length+ from +offset+.
|
1057
1080
|
*/
|
@@ -1070,7 +1093,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
1070
1093
|
/*
|
1071
1094
|
* Document-method: read_array_of_pointer
|
1072
1095
|
* call-seq: memory.read_array_of_pointer(length)
|
1073
|
-
* @param [
|
1096
|
+
* @param [Integer] length
|
1074
1097
|
* @return [Array<Pointer>]
|
1075
1098
|
* Read an array of {Pointer} of length +length+.
|
1076
1099
|
*
|
@@ -1086,6 +1109,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
1086
1109
|
rb_define_method(classMemory, "read_bytes", memory_read_bytes, 1);
|
1087
1110
|
rb_define_method(classMemory, "write_bytes", memory_write_bytes, -1);
|
1088
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);
|
1089
1113
|
|
1090
1114
|
rb_define_method(classMemory, "get", memory_get, 2);
|
1091
1115
|
rb_define_method(classMemory, "put", memory_put, 3);
|
@@ -1096,6 +1120,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
|
|
1096
1120
|
rb_define_method(classMemory, "type_size", memory_type_size, 0);
|
1097
1121
|
rb_define_method(classMemory, "[]", memory_aref, 1);
|
1098
1122
|
rb_define_method(classMemory, "__copy_from__", memory_copy_from, 2);
|
1123
|
+
rb_define_method(classMemory, "freeze", memory_freeze, 0 );
|
1099
1124
|
|
1100
1125
|
id_to_ptr = rb_intern("to_ptr");
|
1101
1126
|
id_call = rb_intern("call");
|
data/ext/ffi_c/AbstractMemory.h
CHANGED
@@ -86,12 +86,13 @@ struct AbstractMemory_ {
|
|
86
86
|
};
|
87
87
|
|
88
88
|
|
89
|
+
extern const rb_data_type_t rbffi_abstract_memory_data_type;
|
89
90
|
extern VALUE rbffi_AbstractMemoryClass;
|
90
91
|
extern MemoryOps rbffi_AbstractMemoryOps;
|
91
92
|
|
92
93
|
extern void rbffi_AbstractMemory_Init(VALUE ffiModule);
|
93
94
|
|
94
|
-
extern AbstractMemory* rbffi_AbstractMemory_Cast(VALUE obj,
|
95
|
+
extern AbstractMemory* rbffi_AbstractMemory_Cast(VALUE obj, const rb_data_type_t *data_type);
|
95
96
|
|
96
97
|
extern void rbffi_AbstractMemory_Error(AbstractMemory *, int op);
|
97
98
|
|
@@ -161,7 +162,7 @@ get_memory_op(Type* type)
|
|
161
162
|
}
|
162
163
|
}
|
163
164
|
|
164
|
-
#define MEMORY(obj) rbffi_AbstractMemory_Cast((obj),
|
165
|
+
#define MEMORY(obj) rbffi_AbstractMemory_Cast((obj), &rbffi_abstract_memory_data_type)
|
165
166
|
#define MEMORY_PTR(obj) MEMORY((obj))->address
|
166
167
|
#define MEMORY_LEN(obj) MEMORY((obj))->size
|
167
168
|
|
data/ext/ffi_c/ArrayType.c
CHANGED
@@ -29,12 +29,30 @@
|
|
29
29
|
|
30
30
|
#include <ruby.h>
|
31
31
|
#include <ffi.h>
|
32
|
+
#include "compat.h"
|
32
33
|
#include "ArrayType.h"
|
33
34
|
|
34
35
|
static VALUE array_type_s_allocate(VALUE klass);
|
35
36
|
static VALUE array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength);
|
36
|
-
static void array_type_mark(
|
37
|
-
static void
|
37
|
+
static void array_type_mark(void *);
|
38
|
+
static void array_type_compact(void *);
|
39
|
+
static void array_type_free(void *);
|
40
|
+
static size_t array_type_memsize(const void *);
|
41
|
+
|
42
|
+
const rb_data_type_t rbffi_array_type_data_type = { /* extern */
|
43
|
+
.wrap_struct_name = "FFI::ArrayType",
|
44
|
+
.function = {
|
45
|
+
.dmark = array_type_mark,
|
46
|
+
.dfree = array_type_free,
|
47
|
+
.dsize = array_type_memsize,
|
48
|
+
ffi_compact_callback( array_type_compact )
|
49
|
+
},
|
50
|
+
.parent = &rbffi_type_data_type,
|
51
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
52
|
+
// macro to update VALUE references, as to trigger write barriers.
|
53
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
|
54
|
+
};
|
55
|
+
|
38
56
|
|
39
57
|
VALUE rbffi_ArrayTypeClass = Qnil;
|
40
58
|
|
@@ -44,37 +62,55 @@ array_type_s_allocate(VALUE klass)
|
|
44
62
|
ArrayType* array;
|
45
63
|
VALUE obj;
|
46
64
|
|
47
|
-
obj =
|
65
|
+
obj = TypedData_Make_Struct(klass, ArrayType, &rbffi_array_type_data_type, array);
|
48
66
|
|
49
67
|
array->base.nativeType = NATIVE_ARRAY;
|
50
68
|
array->base.ffiType = xcalloc(1, sizeof(*array->base.ffiType));
|
51
69
|
array->base.ffiType->type = FFI_TYPE_STRUCT;
|
52
70
|
array->base.ffiType->size = 0;
|
53
71
|
array->base.ffiType->alignment = 0;
|
54
|
-
array->rbComponentType
|
72
|
+
RB_OBJ_WRITE(obj, &array->rbComponentType, Qnil);
|
55
73
|
|
56
74
|
return obj;
|
57
75
|
}
|
58
76
|
|
59
77
|
static void
|
60
|
-
array_type_mark(
|
78
|
+
array_type_mark(void *data)
|
79
|
+
{
|
80
|
+
ArrayType *array = (ArrayType *)data;
|
81
|
+
rb_gc_mark_movable(array->rbComponentType);
|
82
|
+
}
|
83
|
+
|
84
|
+
static void
|
85
|
+
array_type_compact(void *data)
|
61
86
|
{
|
62
|
-
|
87
|
+
ArrayType *array = (ArrayType *)data;
|
88
|
+
ffi_gc_location(array->rbComponentType);
|
63
89
|
}
|
64
90
|
|
65
91
|
static void
|
66
|
-
array_type_free(
|
92
|
+
array_type_free(void *data)
|
67
93
|
{
|
94
|
+
ArrayType *array = (ArrayType *)data;
|
68
95
|
xfree(array->base.ffiType);
|
69
96
|
xfree(array->ffiTypes);
|
70
97
|
xfree(array);
|
71
98
|
}
|
72
99
|
|
100
|
+
static size_t
|
101
|
+
array_type_memsize(const void *data)
|
102
|
+
{
|
103
|
+
const ArrayType *array = (const ArrayType *)data;
|
104
|
+
size_t memsize = sizeof(ArrayType);
|
105
|
+
memsize += array->length * sizeof(*array->ffiTypes);
|
106
|
+
memsize += sizeof(*array->base.ffiType);
|
107
|
+
return memsize;
|
108
|
+
}
|
73
109
|
|
74
110
|
/*
|
75
111
|
* call-seq: initialize(component_type, length)
|
76
112
|
* @param [Type] component_type
|
77
|
-
* @param [
|
113
|
+
* @param [Integer] length
|
78
114
|
* @return [self]
|
79
115
|
* A new instance of ArrayType.
|
80
116
|
*/
|
@@ -84,12 +120,12 @@ array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength)
|
|
84
120
|
ArrayType* array;
|
85
121
|
int i;
|
86
122
|
|
87
|
-
|
123
|
+
TypedData_Get_Struct(self, ArrayType, &rbffi_array_type_data_type, array);
|
88
124
|
|
89
125
|
array->length = NUM2UINT(rbLength);
|
90
|
-
array->rbComponentType
|
91
|
-
|
92
|
-
|
126
|
+
RB_OBJ_WRITE(self, &array->rbComponentType, rbComponentType);
|
127
|
+
TypedData_Get_Struct(rbComponentType, Type, &rbffi_type_data_type, array->componentType);
|
128
|
+
|
93
129
|
array->ffiTypes = xcalloc(array->length + 1, sizeof(*array->ffiTypes));
|
94
130
|
array->base.ffiType->elements = array->ffiTypes;
|
95
131
|
array->base.ffiType->size = array->componentType->ffiType->size * array->length;
|
@@ -104,7 +140,7 @@ array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength)
|
|
104
140
|
|
105
141
|
/*
|
106
142
|
* call-seq: length
|
107
|
-
* @return [
|
143
|
+
* @return [Integer]
|
108
144
|
* Get array's length
|
109
145
|
*/
|
110
146
|
static VALUE
|
@@ -112,7 +148,7 @@ array_type_length(VALUE self)
|
|
112
148
|
{
|
113
149
|
ArrayType* array;
|
114
150
|
|
115
|
-
|
151
|
+
TypedData_Get_Struct(self, ArrayType, &rbffi_array_type_data_type, array);
|
116
152
|
|
117
153
|
return UINT2NUM(array->length);
|
118
154
|
}
|
@@ -127,7 +163,7 @@ array_type_element_type(VALUE self)
|
|
127
163
|
{
|
128
164
|
ArrayType* array;
|
129
165
|
|
130
|
-
|
166
|
+
TypedData_Get_Struct(self, ArrayType, &rbffi_array_type_data_type, array);
|
131
167
|
|
132
168
|
return array->rbComponentType;
|
133
169
|
}
|