ffi 1.15.5 → 1.16.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 +54 -0
- data/Gemfile +1 -1
- data/README.md +3 -2
- data/Rakefile +10 -7
- data/ext/ffi_c/AbstractMemory.c +56 -34
- data/ext/ffi_c/AbstractMemory.h +3 -2
- data/ext/ffi_c/ArrayType.c +49 -13
- data/ext/ffi_c/ArrayType.h +1 -0
- data/ext/ffi_c/Buffer.c +86 -29
- data/ext/ffi_c/Call.c +13 -5
- data/ext/ffi_c/DynamicLibrary.c +89 -26
- data/ext/ffi_c/Function.c +238 -98
- data/ext/ffi_c/Function.h +1 -0
- data/ext/ffi_c/FunctionInfo.c +78 -24
- data/ext/ffi_c/LastError.c +25 -7
- data/ext/ffi_c/MappedType.c +66 -23
- data/ext/ffi_c/MappedType.h +0 -2
- data/ext/ffi_c/MemoryPointer.c +34 -7
- data/ext/ffi_c/MethodHandle.c +3 -1
- data/ext/ffi_c/Pointer.c +68 -29
- data/ext/ffi_c/Pointer.h +1 -0
- data/ext/ffi_c/Struct.c +151 -80
- data/ext/ffi_c/Struct.h +7 -4
- data/ext/ffi_c/StructByValue.c +48 -16
- data/ext/ffi_c/StructLayout.c +117 -48
- data/ext/ffi_c/Type.c +104 -36
- data/ext/ffi_c/Type.h +3 -1
- data/ext/ffi_c/Types.c +1 -1
- data/ext/ffi_c/Variadic.c +65 -23
- 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/.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 +460 -0
- data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +171 -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 +144 -104
- data/ext/ffi_c/libffi/acinclude.m4 +10 -112
- 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 +25 -6
- 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 +54 -50
- data/ext/ffi_c/libffi/include/ffi_cfi.h +21 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +29 -0
- data/ext/ffi_c/libffi/include/tramp.h +45 -0
- data/ext/ffi_c/libffi/install-sh +92 -69
- data/ext/ffi_c/libffi/libtool-version +2 -2
- data/ext/ffi_c/libffi/ltmain.sh +512 -315
- 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 +1 -1
- data/ext/ffi_c/libffi/msvcc.sh +1 -1
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +146 -42
- data/ext/ffi_c/libffi/src/aarch64/internal.h +32 -0
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +134 -42
- 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 +133 -47
- data/ext/ffi_c/libffi/src/dlmalloc.c +5 -0
- 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 +621 -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 +240 -65
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +7 -0
- data/ext/ffi_c/libffi/src/mips/n32.S +137 -28
- 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_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 +16 -0
- data/ext/ffi_c/libffi/src/tramp.c +716 -0
- data/ext/ffi_c/libffi/src/wasm32/ffi.c +934 -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 +43 -0
- 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 +127 -114
- data/ext/ffi_c/libffi/testsuite/Makefile.in +137 -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 +80 -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/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.gnu.mk +2 -2
- data/ext/ffi_c/rbffi.h +1 -1
- data/ffi.gemspec +2 -2
- data/lib/ffi/autopointer.rb +7 -22
- data/lib/ffi/compat.rb +43 -0
- data/lib/ffi/data_converter.rb +2 -2
- data/lib/ffi/dynamic_library.rb +89 -0
- data/lib/ffi/enum.rb +18 -11
- data/lib/ffi/ffi.rb +3 -0
- data/lib/ffi/function.rb +71 -0
- data/lib/ffi/library.rb +55 -71
- data/lib/ffi/library_path.rb +109 -0
- data/lib/ffi/managedstruct.rb +1 -1
- 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/struct.rb +2 -1
- data/lib/ffi/struct_layout.rb +1 -1
- data/lib/ffi/struct_layout_builder.rb +1 -1
- data/lib/ffi/types.rb +30 -5
- data/lib/ffi/variadic.rb +19 -8
- data/lib/ffi/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +97 -25
- 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,18 +100,33 @@ 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
|
/*
|
@@ -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,6 +181,8 @@ 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
|
|
@@ -147,7 +195,7 @@ 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
|
|
@@ -160,7 +208,7 @@ 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
|
|
@@ -173,7 +221,7 @@ 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,7 +459,7 @@ struct_layout_allocate(VALUE klass)
|
|
416
459
|
StructLayout* layout;
|
417
460
|
VALUE obj;
|
418
461
|
|
419
|
-
obj =
|
462
|
+
obj = TypedData_Make_Struct(klass, StructLayout, &rbffi_struct_layout_data_type, layout);
|
420
463
|
layout->rbFieldMap = Qnil;
|
421
464
|
layout->rbFieldNames = Qnil;
|
422
465
|
layout->rbFields = Qnil;
|
@@ -443,7 +486,7 @@ struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
|
443
486
|
ffi_type* ltype;
|
444
487
|
int i;
|
445
488
|
|
446
|
-
|
489
|
+
TypedData_Get_Struct(self, StructLayout, &rbffi_struct_layout_data_type, layout);
|
447
490
|
layout->fieldCount = (int) RARRAY_LEN(fields);
|
448
491
|
layout->rbFieldMap = rb_hash_new();
|
449
492
|
layout->rbFieldNames = rb_ary_new2(layout->fieldCount);
|
@@ -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
|
{
|