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/StructByValue.c
CHANGED
@@ -49,20 +49,36 @@
|
|
49
49
|
|
50
50
|
static VALUE sbv_allocate(VALUE);
|
51
51
|
static VALUE sbv_initialize(VALUE, VALUE);
|
52
|
-
static void sbv_mark(
|
53
|
-
static void
|
52
|
+
static void sbv_mark(void *);
|
53
|
+
static void sbv_compact(void *);
|
54
|
+
static void sbv_free(void *);
|
55
|
+
static size_t sbv_memsize(const void *);
|
54
56
|
|
55
57
|
VALUE rbffi_StructByValueClass = Qnil;
|
56
58
|
|
59
|
+
static const rb_data_type_t sbv_type_data_type = {
|
60
|
+
.wrap_struct_name = "FFI::StructByValue",
|
61
|
+
.function = {
|
62
|
+
.dmark = sbv_mark,
|
63
|
+
.dfree = sbv_free,
|
64
|
+
.dsize = sbv_memsize,
|
65
|
+
ffi_compact_callback( sbv_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
|
+
};
|
72
|
+
|
57
73
|
static VALUE
|
58
74
|
sbv_allocate(VALUE klass)
|
59
75
|
{
|
60
76
|
StructByValue* sbv;
|
61
77
|
|
62
|
-
VALUE obj =
|
78
|
+
VALUE obj = TypedData_Make_Struct(klass, StructByValue, &sbv_type_data_type, sbv);
|
63
79
|
|
64
|
-
sbv->rbStructClass
|
65
|
-
sbv->rbStructLayout
|
80
|
+
RB_OBJ_WRITE(obj, &sbv->rbStructClass, Qnil);
|
81
|
+
RB_OBJ_WRITE(obj, &sbv->rbStructLayout, Qnil);
|
66
82
|
sbv->base.nativeType = NATIVE_STRUCT;
|
67
83
|
|
68
84
|
sbv->base.ffiType = xcalloc(1, sizeof(*sbv->base.ffiType));
|
@@ -85,38 +101,54 @@ sbv_initialize(VALUE self, VALUE rbStructClass)
|
|
85
101
|
rb_raise(rb_eTypeError, "wrong type in @layout ivar (expected FFI::StructLayout)");
|
86
102
|
}
|
87
103
|
|
88
|
-
|
89
|
-
|
90
|
-
sbv->rbStructClass
|
91
|
-
sbv->rbStructLayout
|
104
|
+
TypedData_Get_Struct(rbLayout, StructLayout, &rbffi_struct_layout_data_type, layout);
|
105
|
+
TypedData_Get_Struct(self, StructByValue, &sbv_type_data_type, sbv);
|
106
|
+
RB_OBJ_WRITE(self, &sbv->rbStructClass, rbStructClass);
|
107
|
+
RB_OBJ_WRITE(self, &sbv->rbStructLayout, rbLayout);
|
92
108
|
|
93
109
|
/* We can just use everything from the ffi_type directly */
|
94
110
|
*sbv->base.ffiType = *layout->base.ffiType;
|
95
|
-
|
111
|
+
|
96
112
|
return self;
|
97
113
|
}
|
98
114
|
|
99
115
|
static void
|
100
|
-
sbv_mark(
|
116
|
+
sbv_mark(void *data)
|
117
|
+
{
|
118
|
+
StructByValue *sbv = (StructByValue *)data;
|
119
|
+
rb_gc_mark_movable(sbv->rbStructClass);
|
120
|
+
rb_gc_mark_movable(sbv->rbStructLayout);
|
121
|
+
}
|
122
|
+
|
123
|
+
static void
|
124
|
+
sbv_compact(void *data)
|
101
125
|
{
|
102
|
-
|
103
|
-
|
126
|
+
StructByValue *sbv = (StructByValue *)data;
|
127
|
+
ffi_gc_location(sbv->rbStructClass);
|
128
|
+
ffi_gc_location(sbv->rbStructLayout);
|
104
129
|
}
|
105
130
|
|
106
131
|
static void
|
107
|
-
sbv_free(
|
132
|
+
sbv_free(void *data)
|
108
133
|
{
|
134
|
+
StructByValue *sbv = (StructByValue *)data;
|
109
135
|
xfree(sbv->base.ffiType);
|
110
136
|
xfree(sbv);
|
111
137
|
}
|
112
138
|
|
139
|
+
static size_t
|
140
|
+
sbv_memsize(const void *data)
|
141
|
+
{
|
142
|
+
const StructByValue *sbv = (const StructByValue *)data;
|
143
|
+
return sizeof(StructByValue) + sizeof(*sbv->base.ffiType);
|
144
|
+
}
|
113
145
|
|
114
146
|
static VALUE
|
115
147
|
sbv_layout(VALUE self)
|
116
148
|
{
|
117
149
|
StructByValue* sbv;
|
118
150
|
|
119
|
-
|
151
|
+
TypedData_Get_Struct(self, StructByValue, &sbv_type_data_type, sbv);
|
120
152
|
return sbv->rbStructLayout;
|
121
153
|
}
|
122
154
|
|
@@ -125,7 +157,7 @@ sbv_struct_class(VALUE self)
|
|
125
157
|
{
|
126
158
|
StructByValue* sbv;
|
127
159
|
|
128
|
-
|
160
|
+
TypedData_Get_Struct(self, StructByValue, &sbv_type_data_type, sbv);
|
129
161
|
|
130
162
|
return sbv->rbStructClass;
|
131
163
|
}
|
data/ext/ffi_c/StructLayout.c
CHANGED
@@ -51,9 +51,13 @@
|
|
51
51
|
|
52
52
|
#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1)
|
53
53
|
|
54
|
-
static void struct_layout_mark(
|
55
|
-
static void
|
56
|
-
static void
|
54
|
+
static void struct_layout_mark(void *);
|
55
|
+
static void struct_layout_compact(void *);
|
56
|
+
static void struct_layout_free(void *);
|
57
|
+
static size_t struct_layout_memsize(const void *);
|
58
|
+
static void struct_field_mark(void *);
|
59
|
+
static void struct_field_compact(void *);
|
60
|
+
static size_t struct_field_memsize(const void *);
|
57
61
|
|
58
62
|
VALUE rbffi_StructLayoutFieldClass = Qnil;
|
59
63
|
VALUE rbffi_StructLayoutNumberFieldClass = Qnil, rbffi_StructLayoutPointerFieldClass = Qnil;
|
@@ -62,6 +66,33 @@ VALUE rbffi_StructLayoutFunctionFieldClass = Qnil, rbffi_StructLayoutArrayFieldC
|
|
62
66
|
|
63
67
|
VALUE rbffi_StructLayoutClass = Qnil;
|
64
68
|
|
69
|
+
const rb_data_type_t rbffi_struct_layout_data_type = { /* extern */
|
70
|
+
.wrap_struct_name = "FFI::StructLayout",
|
71
|
+
.function = {
|
72
|
+
.dmark = struct_layout_mark,
|
73
|
+
.dfree = struct_layout_free,
|
74
|
+
.dsize = struct_layout_memsize,
|
75
|
+
ffi_compact_callback( struct_layout_compact )
|
76
|
+
},
|
77
|
+
.parent = &rbffi_type_data_type,
|
78
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
79
|
+
// macro to update VALUE references, as to trigger write barriers.
|
80
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
|
81
|
+
};
|
82
|
+
|
83
|
+
const rb_data_type_t rbffi_struct_field_data_type = { /* extern */
|
84
|
+
.wrap_struct_name = "FFI::StructField",
|
85
|
+
.function = {
|
86
|
+
.dmark = struct_field_mark,
|
87
|
+
.dfree = RUBY_TYPED_DEFAULT_FREE,
|
88
|
+
.dsize = struct_field_memsize,
|
89
|
+
ffi_compact_callback( struct_field_compact )
|
90
|
+
},
|
91
|
+
.parent = &rbffi_type_data_type,
|
92
|
+
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
|
93
|
+
// macro to update VALUE references, as to trigger write barriers.
|
94
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | FFI_RUBY_TYPED_FROZEN_SHAREABLE
|
95
|
+
};
|
65
96
|
|
66
97
|
static VALUE
|
67
98
|
struct_field_allocate(VALUE klass)
|
@@ -69,24 +100,39 @@ struct_field_allocate(VALUE klass)
|
|
69
100
|
StructField* field;
|
70
101
|
VALUE obj;
|
71
102
|
|
72
|
-
obj =
|
73
|
-
field->rbType
|
74
|
-
field->rbName
|
103
|
+
obj = TypedData_Make_Struct(klass, StructField, &rbffi_struct_field_data_type, field);
|
104
|
+
RB_OBJ_WRITE(obj, &field->rbType, Qnil);
|
105
|
+
RB_OBJ_WRITE(obj, &field->rbName, Qnil);
|
75
106
|
|
76
107
|
return obj;
|
77
108
|
}
|
78
109
|
|
79
110
|
static void
|
80
|
-
struct_field_mark(
|
111
|
+
struct_field_mark(void *data)
|
81
112
|
{
|
82
|
-
|
83
|
-
|
113
|
+
StructField *f = (StructField *)data;
|
114
|
+
rb_gc_mark_movable(f->rbType);
|
115
|
+
rb_gc_mark_movable(f->rbName);
|
116
|
+
}
|
117
|
+
|
118
|
+
static void
|
119
|
+
struct_field_compact(void *data)
|
120
|
+
{
|
121
|
+
StructField *f = (StructField *)data;
|
122
|
+
ffi_gc_location(f->rbType);
|
123
|
+
ffi_gc_location(f->rbName);
|
124
|
+
}
|
125
|
+
|
126
|
+
static size_t
|
127
|
+
struct_field_memsize(const void *data)
|
128
|
+
{
|
129
|
+
return sizeof(StructField);
|
84
130
|
}
|
85
131
|
|
86
132
|
/*
|
87
133
|
* call-seq: initialize(name, offset, type)
|
88
134
|
* @param [String,Symbol] name
|
89
|
-
* @param [
|
135
|
+
* @param [Integer] offset
|
90
136
|
* @param [FFI::Type] type
|
91
137
|
* @return [self]
|
92
138
|
* A new FFI::StructLayout::Field instance.
|
@@ -98,7 +144,7 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
|
|
98
144
|
StructField* field;
|
99
145
|
int nargs;
|
100
146
|
|
101
|
-
|
147
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
102
148
|
|
103
149
|
nargs = rb_scan_args(argc, argv, "3", &rbName, &rbOffset, &rbType);
|
104
150
|
|
@@ -115,9 +161,9 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
|
|
115
161
|
}
|
116
162
|
|
117
163
|
field->offset = NUM2UINT(rbOffset);
|
118
|
-
field->rbName
|
119
|
-
field->rbType
|
120
|
-
|
164
|
+
RB_OBJ_WRITE(self, &field->rbName, (TYPE(rbName) == T_SYMBOL) ? rbName : rb_str_intern(rbName));
|
165
|
+
RB_OBJ_WRITE(self, &field->rbType, rbType);
|
166
|
+
TypedData_Get_Struct(field->rbType, Type, &rbffi_type_data_type, field->type);
|
121
167
|
field->memoryOp = get_memory_op(field->type);
|
122
168
|
field->referenceIndex = -1;
|
123
169
|
|
@@ -135,45 +181,47 @@ struct_field_initialize(int argc, VALUE* argv, VALUE self)
|
|
135
181
|
break;
|
136
182
|
}
|
137
183
|
|
184
|
+
rb_obj_freeze(self);
|
185
|
+
|
138
186
|
return self;
|
139
187
|
}
|
140
188
|
|
141
189
|
/*
|
142
190
|
* call-seq: offset
|
143
|
-
* @return [
|
191
|
+
* @return [Integer]
|
144
192
|
* Get the field offset.
|
145
193
|
*/
|
146
194
|
static VALUE
|
147
195
|
struct_field_offset(VALUE self)
|
148
196
|
{
|
149
197
|
StructField* field;
|
150
|
-
|
198
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
151
199
|
return UINT2NUM(field->offset);
|
152
200
|
}
|
153
201
|
|
154
202
|
/*
|
155
203
|
* call-seq: size
|
156
|
-
* @return [
|
204
|
+
* @return [Integer]
|
157
205
|
* Get the field size.
|
158
206
|
*/
|
159
207
|
static VALUE
|
160
208
|
struct_field_size(VALUE self)
|
161
209
|
{
|
162
210
|
StructField* field;
|
163
|
-
|
211
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
164
212
|
return UINT2NUM(field->type->ffiType->size);
|
165
213
|
}
|
166
214
|
|
167
215
|
/*
|
168
216
|
* call-seq: alignment
|
169
|
-
* @return [
|
217
|
+
* @return [Integer]
|
170
218
|
* Get the field alignment.
|
171
219
|
*/
|
172
220
|
static VALUE
|
173
221
|
struct_field_alignment(VALUE self)
|
174
222
|
{
|
175
223
|
StructField* field;
|
176
|
-
|
224
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
177
225
|
return UINT2NUM(field->type->ffiType->alignment);
|
178
226
|
}
|
179
227
|
|
@@ -186,7 +234,7 @@ static VALUE
|
|
186
234
|
struct_field_type(VALUE self)
|
187
235
|
{
|
188
236
|
StructField* field;
|
189
|
-
|
237
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
190
238
|
|
191
239
|
return field->rbType;
|
192
240
|
}
|
@@ -200,7 +248,7 @@ static VALUE
|
|
200
248
|
struct_field_name(VALUE self)
|
201
249
|
{
|
202
250
|
StructField* field;
|
203
|
-
|
251
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, field);
|
204
252
|
return field->rbName;
|
205
253
|
}
|
206
254
|
|
@@ -215,7 +263,7 @@ struct_field_get(VALUE self, VALUE pointer)
|
|
215
263
|
{
|
216
264
|
StructField* f;
|
217
265
|
|
218
|
-
|
266
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
219
267
|
if (f->memoryOp == NULL) {
|
220
268
|
rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(f->rbType));
|
221
269
|
return Qnil;
|
@@ -236,7 +284,7 @@ struct_field_put(VALUE self, VALUE pointer, VALUE value)
|
|
236
284
|
{
|
237
285
|
StructField* f;
|
238
286
|
|
239
|
-
|
287
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
240
288
|
if (f->memoryOp == NULL) {
|
241
289
|
rb_raise(rb_eArgError, "put not supported for %s", rb_obj_classname(f->rbType));
|
242
290
|
return self;
|
@@ -258,7 +306,7 @@ function_field_get(VALUE self, VALUE pointer)
|
|
258
306
|
{
|
259
307
|
StructField* f;
|
260
308
|
|
261
|
-
|
309
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
262
310
|
|
263
311
|
return rbffi_Function_NewInstance(f->rbType, (*rbffi_AbstractMemoryOps.pointer->get)(MEMORY(pointer), f->offset));
|
264
312
|
}
|
@@ -278,7 +326,7 @@ function_field_put(VALUE self, VALUE pointer, VALUE proc)
|
|
278
326
|
StructField* f;
|
279
327
|
VALUE value = Qnil;
|
280
328
|
|
281
|
-
|
329
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
282
330
|
|
283
331
|
if (NIL_P(proc) || rb_obj_is_kind_of(proc, rbffi_FunctionClass)) {
|
284
332
|
value = proc;
|
@@ -313,8 +361,8 @@ array_field_get(VALUE self, VALUE pointer)
|
|
313
361
|
ArrayType* array;
|
314
362
|
VALUE argv[2];
|
315
363
|
|
316
|
-
|
317
|
-
|
364
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
365
|
+
TypedData_Get_Struct(f->rbType, ArrayType, &rbffi_array_type_data_type, array);
|
318
366
|
|
319
367
|
argv[0] = pointer;
|
320
368
|
argv[1] = self;
|
@@ -336,9 +384,8 @@ array_field_put(VALUE self, VALUE pointer, VALUE value)
|
|
336
384
|
StructField* f;
|
337
385
|
ArrayType* array;
|
338
386
|
|
339
|
-
|
340
|
-
|
341
|
-
Data_Get_Struct(f->rbType, ArrayType, array);
|
387
|
+
TypedData_Get_Struct(self, StructField, &rbffi_struct_field_data_type, f);
|
388
|
+
TypedData_Get_Struct(f->rbType, ArrayType, &rbffi_array_type_data_type, array);
|
342
389
|
|
343
390
|
if (isCharArray(array) && rb_obj_is_instance_of(value, rb_cString)) {
|
344
391
|
VALUE argv[2];
|
@@ -385,12 +432,8 @@ array_field_put(VALUE self, VALUE pointer, VALUE value)
|
|
385
432
|
VALUE entry = rb_ary_entry(value, i);
|
386
433
|
Struct* s;
|
387
434
|
|
388
|
-
|
389
|
-
rb_raise(rb_eTypeError, "array element not an instance of FFI::Struct");
|
390
|
-
break;
|
391
|
-
}
|
435
|
+
TypedData_Get_Struct(entry, Struct, &rbffi_struct_data_type, s);
|
392
436
|
|
393
|
-
Data_Get_Struct(entry, Struct, s);
|
394
437
|
checkRead(s->pointer);
|
395
438
|
checkBounds(s->pointer, 0, array->componentType->ffiType->size);
|
396
439
|
|
@@ -416,10 +459,10 @@ struct_layout_allocate(VALUE klass)
|
|
416
459
|
StructLayout* layout;
|
417
460
|
VALUE obj;
|
418
461
|
|
419
|
-
obj =
|
420
|
-
layout->rbFieldMap
|
421
|
-
layout->rbFieldNames
|
422
|
-
layout->rbFields
|
462
|
+
obj = TypedData_Make_Struct(klass, StructLayout, &rbffi_struct_layout_data_type, layout);
|
463
|
+
RB_OBJ_WRITE(obj, &layout->rbFieldMap, Qnil);
|
464
|
+
RB_OBJ_WRITE(obj, &layout->rbFieldNames, Qnil);
|
465
|
+
RB_OBJ_WRITE(obj, &layout->rbFields, Qnil);
|
423
466
|
layout->base.ffiType = xcalloc(1, sizeof(*layout->base.ffiType));
|
424
467
|
layout->base.ffiType->size = 0;
|
425
468
|
layout->base.ffiType->alignment = 0;
|
@@ -431,8 +474,8 @@ struct_layout_allocate(VALUE klass)
|
|
431
474
|
/*
|
432
475
|
* call-seq: initialize(fields, size, align)
|
433
476
|
* @param [Array<StructLayout::Field>] fields
|
434
|
-
* @param [
|
435
|
-
* @param [
|
477
|
+
* @param [Integer] size
|
478
|
+
* @param [Integer] align
|
436
479
|
* @return [self]
|
437
480
|
* A new StructLayout instance.
|
438
481
|
*/
|
@@ -443,15 +486,15 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
|
443
486
|
ffi_type* ltype;
|
444
487
|
int i;
|
445
488
|
|
446
|
-
|
447
|
-
layout->fieldCount = (
|
448
|
-
layout->rbFieldMap
|
449
|
-
layout->rbFieldNames
|
489
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
490
|
+
layout->fieldCount = RARRAY_LENINT(fields);
|
491
|
+
RB_OBJ_WRITE(self, &layout->rbFieldMap, rb_hash_new());
|
492
|
+
RB_OBJ_WRITE(self, &layout->rbFieldNames, rb_ary_new2(layout->fieldCount));
|
450
493
|
layout->size = (int) FFI_ALIGN(NUM2INT(size), NUM2INT(align));
|
451
494
|
layout->align = NUM2INT(align);
|
452
495
|
layout->fields = xcalloc(layout->fieldCount, sizeof(StructField *));
|
453
496
|
layout->ffiTypes = xcalloc(layout->fieldCount + 1, sizeof(ffi_type *));
|
454
|
-
layout->rbFields
|
497
|
+
RB_OBJ_WRITE(self, &layout->rbFields, rb_ary_new2(layout->fieldCount));
|
455
498
|
layout->referenceFieldCount = 0;
|
456
499
|
layout->base.ffiType->elements = layout->ffiTypes;
|
457
500
|
layout->base.ffiType->size = layout->size;
|
@@ -470,7 +513,7 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
|
470
513
|
}
|
471
514
|
rbName = rb_funcall2(rbField, rb_intern("name"), 0, NULL);
|
472
515
|
|
473
|
-
|
516
|
+
TypedData_Get_Struct(rbField, StructField, &rbffi_struct_field_data_type, field);
|
474
517
|
layout->fields[i] = field;
|
475
518
|
|
476
519
|
if (field->type == NULL || field->type->ffiType == NULL) {
|
@@ -497,6 +540,11 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
|
497
540
|
rb_raise(rb_eRuntimeError, "Struct size is zero");
|
498
541
|
}
|
499
542
|
|
543
|
+
rb_obj_freeze(layout->rbFieldMap);
|
544
|
+
rb_obj_freeze(layout->rbFields);
|
545
|
+
rb_obj_freeze(layout->rbFieldNames);
|
546
|
+
rb_obj_freeze(self);
|
547
|
+
|
500
548
|
return self;
|
501
549
|
}
|
502
550
|
|
@@ -515,7 +563,7 @@ struct_layout_union_bang(VALUE self)
|
|
515
563
|
ffi_type *t = NULL;
|
516
564
|
int count, i;
|
517
565
|
|
518
|
-
|
566
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
519
567
|
|
520
568
|
for (i = 0; alignment_types[i] != NULL; ++i) {
|
521
569
|
if (alignment_types[i]->alignment == layout->align) {
|
@@ -545,7 +593,7 @@ struct_layout_aref(VALUE self, VALUE field)
|
|
545
593
|
{
|
546
594
|
StructLayout* layout;
|
547
595
|
|
548
|
-
|
596
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
549
597
|
|
550
598
|
return rb_hash_aref(layout->rbFieldMap, field);
|
551
599
|
}
|
@@ -560,7 +608,7 @@ struct_layout_fields(VALUE self)
|
|
560
608
|
{
|
561
609
|
StructLayout* layout;
|
562
610
|
|
563
|
-
|
611
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
564
612
|
|
565
613
|
return rb_ary_dup(layout->rbFields);
|
566
614
|
}
|
@@ -575,7 +623,7 @@ struct_layout_members(VALUE self)
|
|
575
623
|
{
|
576
624
|
StructLayout* layout;
|
577
625
|
|
578
|
-
|
626
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
579
627
|
|
580
628
|
return rb_ary_dup(layout->rbFieldNames);
|
581
629
|
}
|
@@ -590,26 +638,37 @@ struct_layout_to_a(VALUE self)
|
|
590
638
|
{
|
591
639
|
StructLayout* layout;
|
592
640
|
|
593
|
-
|
641
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
594
642
|
|
595
643
|
return rb_ary_dup(layout->rbFields);
|
596
644
|
}
|
597
645
|
|
598
646
|
static void
|
599
|
-
struct_layout_mark(
|
647
|
+
struct_layout_mark(void *data)
|
600
648
|
{
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
649
|
+
StructLayout *layout = (StructLayout *)data;
|
650
|
+
rb_gc_mark_movable(layout->rbFieldMap);
|
651
|
+
rb_gc_mark_movable(layout->rbFieldNames);
|
652
|
+
rb_gc_mark_movable(layout->rbFields);
|
653
|
+
/* The values stored in layout->cache_row.fieldName are primary stored in layout->rbFieldMap and are marked there */
|
654
|
+
}
|
655
|
+
|
656
|
+
static void
|
657
|
+
struct_layout_compact(void *data)
|
658
|
+
{
|
659
|
+
StructLayout *layout = (StructLayout *)data;
|
660
|
+
ffi_gc_location(layout->rbFieldMap);
|
661
|
+
ffi_gc_location(layout->rbFieldNames);
|
662
|
+
ffi_gc_location(layout->rbFields);
|
663
|
+
|
664
|
+
/* Clear the cache, to be safe from changes of fieldName VALUE by GC.compact */
|
607
665
|
memset(&layout->cache_row, 0, sizeof(layout->cache_row));
|
608
666
|
}
|
609
667
|
|
610
668
|
static void
|
611
|
-
struct_layout_free(
|
669
|
+
struct_layout_free(void *data)
|
612
670
|
{
|
671
|
+
StructLayout *layout = (StructLayout *)data;
|
613
672
|
xfree(layout->ffiTypes);
|
614
673
|
xfree(layout->base.ffiType);
|
615
674
|
xfree(layout->fields);
|
@@ -617,6 +676,16 @@ struct_layout_free(StructLayout *layout)
|
|
617
676
|
}
|
618
677
|
|
619
678
|
|
679
|
+
static size_t
|
680
|
+
struct_layout_memsize(const void * data)
|
681
|
+
{
|
682
|
+
const StructLayout *layout = (const StructLayout *)data;
|
683
|
+
size_t memsize = sizeof(StructLayout);
|
684
|
+
memsize += layout->fieldCount * (sizeof(StructField *) + sizeof(ffi_type *));
|
685
|
+
memsize += sizeof(*layout->base.ffiType);
|
686
|
+
return memsize;
|
687
|
+
}
|
688
|
+
|
620
689
|
void
|
621
690
|
rbffi_StructLayout_Init(VALUE moduleFFI)
|
622
691
|
{
|