ffi 1.15.4 → 1.16.3
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 +90 -0
- data/Gemfile +1 -1
- data/README.md +3 -2
- data/Rakefile +28 -11
- data/ext/ffi_c/AbstractMemory.c +60 -36
- 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 +18 -7
- data/ext/ffi_c/DynamicLibrary.c +89 -26
- data/ext/ffi_c/Function.c +244 -98
- data/ext/ffi_c/Function.h +1 -0
- data/ext/ffi_c/FunctionInfo.c +80 -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 +155 -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 +92 -34
- data/ext/ffi_c/libffi/README.md +144 -104
- 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 +4567 -3822
- 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/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 +136 -120
- 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 +3 -3
- 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/tools/const_generator.rb +5 -4
- data/lib/ffi/types.rb +32 -6
- data/lib/ffi/variadic.rb +19 -8
- data/lib/ffi/version.rb +1 -1
- data/rakelib/ffi_gem_helper.rb +1 -1
- data/samples/hello_ractor.rb +11 -0
- data/samples/qsort_ractor.rb +28 -0
- data.tar.gz.sig +0 -0
- metadata +103 -28
- metadata.gz.sig +0 -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
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011, 2014, 2019 Free Software Foundation, Inc.
|
1
|
+
# Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011, 2014, 2019, 2022 Free Software Foundation, Inc.
|
2
2
|
|
3
3
|
# This program is free software; you can redistribute it and/or modify
|
4
4
|
# it under the terms of the GNU General Public License as published by
|
@@ -45,7 +45,7 @@ proc is-effective-target { arg } {
|
|
45
45
|
if { [info procs check_effective_target_${arg}] != [list] } {
|
46
46
|
set selected [check_effective_target_${arg}]
|
47
47
|
} else {
|
48
|
-
error "unknown effective target keyword `$arg'"
|
48
|
+
error "unknown effective target keyword `$arg'"
|
49
49
|
}
|
50
50
|
verbose "is-effective-target: $arg $selected" 2
|
51
51
|
return $selected
|
@@ -196,7 +196,7 @@ if { [info procs saved-dg-process-target] == [list] } {
|
|
196
196
|
return "N"
|
197
197
|
}
|
198
198
|
return [dg-process-target-1 $xfail_selector]
|
199
|
-
|
199
|
+
|
200
200
|
}
|
201
201
|
return [dg-process-target-1 $selector]
|
202
202
|
}
|
@@ -221,6 +221,13 @@ proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } {
|
|
221
221
|
set output_match [lreplace $output_match 1 1 $x]
|
222
222
|
}
|
223
223
|
|
224
|
+
if { [ istarget "wasm32-*-*" ] } {
|
225
|
+
# emscripten will get confused if told to build as .exe
|
226
|
+
set exec_suffix ""
|
227
|
+
} else {
|
228
|
+
set exec_suffix ".exe"
|
229
|
+
}
|
230
|
+
|
224
231
|
# Set up the compiler flags, based on what we're going to do.
|
225
232
|
|
226
233
|
set options [list]
|
@@ -231,7 +238,7 @@ proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } {
|
|
231
238
|
}
|
232
239
|
"link" {
|
233
240
|
set compile_type "executable"
|
234
|
-
set output_file "[file rootname [file tail $prog]]
|
241
|
+
set output_file "[file rootname [file tail $prog]]$exec_suffix"
|
235
242
|
# The following line is needed for targets like the i960 where
|
236
243
|
# the default output file is b.out. Sigh.
|
237
244
|
}
|
@@ -240,7 +247,7 @@ proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } {
|
|
240
247
|
# FIXME: "./" is to cope with "." not being in $PATH.
|
241
248
|
# Should this be handled elsewhere?
|
242
249
|
# YES.
|
243
|
-
set output_file "./[file rootname [file tail $prog]]
|
250
|
+
set output_file "./[file rootname [file tail $prog]]$exec_suffix"
|
244
251
|
# This is the only place where we care if an executable was
|
245
252
|
# created or not. If it was, dg.exp will try to run it.
|
246
253
|
remote_file build delete $output_file;
|
@@ -269,6 +276,10 @@ proc libffi-dg-test { prog do_what extra_tool_flags } {
|
|
269
276
|
proc libffi-dg-prune { target_triplet text } {
|
270
277
|
# We get this with some qemu emulated systems (eg. ppc64le-linux-gnu)
|
271
278
|
regsub -all "(^|\n)\[^\n\]*unable to perform all requested operations" $text "" text
|
279
|
+
# We get this from sparc64 linux systems
|
280
|
+
regsub -all "(^|\n)\[^\n\]*warning: .* has a LOAD segment with RWX permissions" $text "" text
|
281
|
+
# Ignore Emscripten INFO messages
|
282
|
+
regsub -all "(^|\n)(cache|shared):INFO:\[^\n\]*" $text "" text
|
272
283
|
return $text
|
273
284
|
}
|
274
285
|
|
@@ -292,9 +303,6 @@ proc libffi-init { args } {
|
|
292
303
|
verbose "libffi $blddirffi"
|
293
304
|
|
294
305
|
# Which compiler are we building with?
|
295
|
-
set tmp [grep "$blddirffi/config.log" "^ax_cv_c_compiler_vendor.*$"]
|
296
|
-
regexp -- {^[^=]*=(.*)$} $tmp nil compiler_vendor
|
297
|
-
|
298
306
|
if { [string match $compiler_vendor "gnu"] } {
|
299
307
|
set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a]
|
300
308
|
if {$gccdir != ""} {
|
@@ -379,7 +387,9 @@ proc libffi_target_compile { source dest type options } {
|
|
379
387
|
|
380
388
|
if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"]
|
381
389
|
|| [istarget "*-*-darwin2*"] } {
|
382
|
-
lappend options "additional_flags=-Wl,-allow_stack_execute"
|
390
|
+
# lappend options "additional_flags=-Wl,-allow_stack_execute"
|
391
|
+
lappend options "additional_flags=-Wno-unused-command-line-argument"
|
392
|
+
lappend options "additional_flags=-Wl,-search_paths_first"
|
383
393
|
}
|
384
394
|
|
385
395
|
# If you're building the compiler with --prefix set to a place
|
@@ -397,17 +407,29 @@ proc libffi_target_compile { source dest type options } {
|
|
397
407
|
|
398
408
|
lappend options "libs= -lffi"
|
399
409
|
|
400
|
-
if { [string match "
|
401
|
-
|
402
|
-
|
410
|
+
if { ![string match "*android*" $target_triplet] } {
|
411
|
+
|
412
|
+
if { [string match "aarch64*-*-linux*" $target_triplet] } {
|
413
|
+
lappend options "libs= -lpthread"
|
414
|
+
}
|
403
415
|
|
404
|
-
|
405
|
-
|
406
|
-
|
416
|
+
# this may be required for g++, but just confused clang.
|
417
|
+
if { [string match "*.cc" $source] } {
|
418
|
+
lappend options "c++"
|
419
|
+
if { [string match "*-*-darwin*" $target_triplet] } {
|
420
|
+
lappend options "libs= -lc++"
|
421
|
+
}
|
422
|
+
}
|
423
|
+
|
424
|
+
if { [string match "arc*-*-linux*" $target_triplet] } {
|
425
|
+
lappend options "libs= -lpthread"
|
426
|
+
}
|
407
427
|
}
|
408
428
|
|
409
|
-
|
410
|
-
|
429
|
+
# emscripten emits this warning while building the feature test
|
430
|
+
# which causes it to be seen as unsupported.
|
431
|
+
if { [string match "wasm32-*" $target_triplet] } {
|
432
|
+
lappend options "additional_flags=-Wno-unused-command-line-argument"
|
411
433
|
}
|
412
434
|
|
413
435
|
verbose "options: $options"
|
@@ -489,7 +511,7 @@ proc run-many-tests { testcases extra_flags } {
|
|
489
511
|
set common "-W -Wall"
|
490
512
|
if [info exists env(LIBFFI_TEST_OPTIMIZATION)] {
|
491
513
|
set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ]
|
492
|
-
} else {
|
514
|
+
} else {
|
493
515
|
set optimizations { "-O0" "-O2" }
|
494
516
|
}
|
495
517
|
}
|
@@ -497,7 +519,7 @@ proc run-many-tests { testcases extra_flags } {
|
|
497
519
|
set common "-W -Wall -Wno-psabi"
|
498
520
|
if [info exists env(LIBFFI_TEST_OPTIMIZATION)] {
|
499
521
|
set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ]
|
500
|
-
} else {
|
522
|
+
} else {
|
501
523
|
set optimizations { "-O0" "-O2" }
|
502
524
|
}
|
503
525
|
}
|
@@ -506,7 +528,7 @@ proc run-many-tests { testcases extra_flags } {
|
|
506
528
|
set common ""
|
507
529
|
if [info exists env(LIBFFI_TEST_OPTIMIZATION)] {
|
508
530
|
set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ]
|
509
|
-
} else {
|
531
|
+
} else {
|
510
532
|
set optimizations { "" }
|
511
533
|
}
|
512
534
|
}
|
@@ -595,7 +617,7 @@ proc check-flags { args } {
|
|
595
617
|
# compare them to the actual options.
|
596
618
|
if { [string compare [lindex $args 2] "*"] == 0
|
597
619
|
&& [string compare [lindex $args 3] "" ] == 0 } {
|
598
|
-
set result 1
|
620
|
+
set result 1
|
599
621
|
} else {
|
600
622
|
# The target list might be an effective-target keyword, so replace
|
601
623
|
# the original list with "*-*-*", since we already know it matches.
|
@@ -175,7 +175,7 @@ proc set_ld_library_path_env_vars { } {
|
|
175
175
|
} else {
|
176
176
|
setenv DYLD_LIBRARY_PATH "$ld_library_path"
|
177
177
|
}
|
178
|
-
if { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } {
|
178
|
+
if { [istarget *-*-cygwin*] || [ istarget *-*-msys* ] || [istarget *-*-mingw*] } {
|
179
179
|
if { $orig_path_saved } {
|
180
180
|
setenv PATH "$ld_library_path:$orig_path"
|
181
181
|
} else {
|
@@ -271,7 +271,7 @@ proc get_shlib_extension { } {
|
|
271
271
|
|
272
272
|
if { [ istarget *-*-darwin* ] } {
|
273
273
|
set shlib_ext "dylib"
|
274
|
-
} elseif { [ istarget *-*-cygwin* ] || [ istarget *-*-mingw* ] } {
|
274
|
+
} elseif { [ istarget *-*-cygwin* ] || [ istarget *-*-msys* ] || [ istarget *-*-mingw* ] } {
|
275
275
|
set shlib_ext "dll"
|
276
276
|
} elseif { [ istarget hppa*-*-hpux* ] } {
|
277
277
|
set shlib_ext "sl"
|
@@ -64,7 +64,11 @@ typedef struct {
|
|
64
64
|
typedef struct { char c[3]; } T;
|
65
65
|
typedef struct { char c[33],c1; } X;
|
66
66
|
|
67
|
-
|
67
|
+
/* Don't use a number over 127, as some systems use signed chars and
|
68
|
+
the test case 25 doesn't account for this, resulting in undefined
|
69
|
+
behavior. See https://github.com/libffi/libffi/issues/598. */
|
70
|
+
char c1='a', c2=127, c3=(char)1;
|
71
|
+
|
68
72
|
short s1=32767, s2=(short)32768, s3=3, s4=4, s5=5, s6=6, s7=7, s8=8, s9=9;
|
69
73
|
int i1=1, i2=2, i3=3, i4=4, i5=5, i6=6, i7=7, i8=8, i9=9,
|
70
74
|
i10=11, i11=12, i12=13, i13=14, i14=15, i15=16, i16=17;
|
@@ -0,0 +1,41 @@
|
|
1
|
+
/* Area: bpo-38748
|
2
|
+
Purpose: test for stdcall alignment problem
|
3
|
+
Source: github.com/python/cpython/pull/26204 */
|
4
|
+
|
5
|
+
/* { dg-do run } */
|
6
|
+
|
7
|
+
#include "ffitest.h"
|
8
|
+
#include "ffi_common.h"
|
9
|
+
|
10
|
+
static UINT32 ABI_ATTR align_arguments(UINT32 l1,
|
11
|
+
UINT64 l2)
|
12
|
+
{
|
13
|
+
return l1 + (UINT32) l2;
|
14
|
+
}
|
15
|
+
|
16
|
+
int main(void)
|
17
|
+
{
|
18
|
+
ffi_cif cif;
|
19
|
+
ffi_type *args[4] = {
|
20
|
+
&ffi_type_uint32,
|
21
|
+
&ffi_type_uint64
|
22
|
+
};
|
23
|
+
ffi_arg lr1, lr2;
|
24
|
+
UINT32 l1 = 1;
|
25
|
+
UINT64 l2 = 2;
|
26
|
+
void *values[2] = {&l1, &l2};
|
27
|
+
|
28
|
+
/* Initialize the cif */
|
29
|
+
CHECK(ffi_prep_cif(&cif, ABI_NUM, 2,
|
30
|
+
&ffi_type_uint32, args) == FFI_OK);
|
31
|
+
|
32
|
+
lr1 = align_arguments(l1, l2);
|
33
|
+
|
34
|
+
ffi_call(&cif, FFI_FN(align_arguments), &lr2, values);
|
35
|
+
|
36
|
+
if (lr1 == lr2)
|
37
|
+
printf("bpo-38748 arguments tests ok!\n");
|
38
|
+
else
|
39
|
+
CHECK(0);
|
40
|
+
exit(0);
|
41
|
+
}
|
@@ -5,6 +5,9 @@
|
|
5
5
|
#include <ffi.h>
|
6
6
|
#include "fficonfig.h"
|
7
7
|
|
8
|
+
#include <float.h>
|
9
|
+
#include <math.h>
|
10
|
+
|
8
11
|
#if defined HAVE_STDINT_H
|
9
12
|
#include <stdint.h>
|
10
13
|
#endif
|
@@ -15,7 +18,29 @@
|
|
15
18
|
|
16
19
|
#define MAX_ARGS 256
|
17
20
|
|
18
|
-
#define CHECK(x)
|
21
|
+
#define CHECK(x) \
|
22
|
+
do { \
|
23
|
+
if(!(x)){ \
|
24
|
+
printf("Check failed:\n%s\n", #x); \
|
25
|
+
abort(); \
|
26
|
+
} \
|
27
|
+
} while(0)
|
28
|
+
|
29
|
+
#define CHECK_FLOAT_EQ(x, y) \
|
30
|
+
do { \
|
31
|
+
if(fabs((x) - (y)) > FLT_EPSILON){ \
|
32
|
+
printf("Check failed CHECK_FLOAT_EQ(%s, %s)\n", #x, #y); \
|
33
|
+
abort(); \
|
34
|
+
} \
|
35
|
+
} while(0)
|
36
|
+
|
37
|
+
#define CHECK_DOUBLE_EQ(x, y) \
|
38
|
+
do { \
|
39
|
+
if(fabs((x) - (y)) > DBL_EPSILON){ \
|
40
|
+
printf("Check failed CHECK_FLOAT_EQ(%s, %s)\n", #x, #y); \
|
41
|
+
abort(); \
|
42
|
+
} \
|
43
|
+
} while(0)
|
19
44
|
|
20
45
|
/* Define macros so that compilers other than gcc can run the tests. */
|
21
46
|
#undef __UNUSED__
|
@@ -63,8 +88,8 @@
|
|
63
88
|
|
64
89
|
#endif
|
65
90
|
|
66
|
-
/*
|
67
|
-
#if defined(
|
91
|
+
/* msvc kludge. */
|
92
|
+
#if defined(_MSC_VER)
|
68
93
|
#define PRIdLL "I64d"
|
69
94
|
#define PRIuLL "I64u"
|
70
95
|
#else
|
@@ -74,6 +74,7 @@ int main (void)
|
|
74
74
|
/* { dg-output "\n0: 2.0 : total: 2.0" } */
|
75
75
|
printf("ffi: %.1f\n", resfp);
|
76
76
|
/* { dg-output "\nffi: 2.0" } */
|
77
|
+
CHECK_DOUBLE_EQ(resfp, 2);
|
77
78
|
|
78
79
|
/* Second test, float_va_fn(2,2.0,3.0,4.0), now with variadic params */
|
79
80
|
/* Call it statically and then via ffi */
|
@@ -81,6 +82,7 @@ int main (void)
|
|
81
82
|
/* { dg-output "\n2: 2.0 : 0:3.0 1:4.0 total: 11.0" } */
|
82
83
|
printf("compiled: %.1f\n", resfp);
|
83
84
|
/* { dg-output "\ncompiled: 11.0" } */
|
85
|
+
CHECK_DOUBLE_EQ(resfp, 11);
|
84
86
|
|
85
87
|
arg_types[0] = &ffi_type_uint;
|
86
88
|
arg_types[1] = &ffi_type_double;
|
@@ -102,6 +104,7 @@ int main (void)
|
|
102
104
|
/* { dg-output "\n2: 2.0 : 0:3.0 1:4.0 total: 11.0" } */
|
103
105
|
printf("ffi: %.1f\n", resfp);
|
104
106
|
/* { dg-output "\nffi: 11.0" } */
|
107
|
+
CHECK_DOUBLE_EQ(resfp, 11);
|
105
108
|
|
106
109
|
exit(0);
|
107
110
|
}
|
@@ -9,6 +9,9 @@
|
|
9
9
|
#include "ffitest.h"
|
10
10
|
static long long return_ll(int ll0, long long ll1, int ll2)
|
11
11
|
{
|
12
|
+
CHECK(ll0 == 11111111);
|
13
|
+
CHECK(ll1 == 11111111111000LL);
|
14
|
+
CHECK(ll2 == 11111111);
|
12
15
|
return ll0 + ll1 + ll2;
|
13
16
|
}
|
14
17
|
|
@@ -39,5 +42,7 @@ int main (void)
|
|
39
42
|
ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values);
|
40
43
|
printf("res: %" PRIdLL ", %" PRIdLL "\n", rlonglong, ll0 + ll1 + ll2);
|
41
44
|
/* { dg-output "res: 11111133333222, 11111133333222" } */
|
45
|
+
CHECK(rlonglong == 11111133333222);
|
46
|
+
CHECK(ll0 + ll1 + ll2 == 11111133333222);
|
42
47
|
exit(0);
|
43
48
|
}
|
@@ -8,6 +8,8 @@
|
|
8
8
|
#include "ffitest.h"
|
9
9
|
static long return_sl(long l1, long l2)
|
10
10
|
{
|
11
|
+
CHECK(l1 == 1073741823L);
|
12
|
+
CHECK(l2 == 1073741824L);
|
11
13
|
return l1 - l2;
|
12
14
|
}
|
13
15
|
|
@@ -33,6 +35,8 @@ int main (void)
|
|
33
35
|
ffi_call(&cif, FFI_FN(return_sl), &res, values);
|
34
36
|
printf("res: %ld, %ld\n", (long)res, l1 - l2);
|
35
37
|
/* { dg-output "res: -1, -1" } */
|
38
|
+
CHECK((long)res == -1);
|
39
|
+
CHECK(l1 + 1 == l2);
|
36
40
|
|
37
41
|
exit(0);
|
38
42
|
}
|
@@ -8,6 +8,8 @@
|
|
8
8
|
#include "ffitest.h"
|
9
9
|
static unsigned long return_ul(unsigned long ul1, unsigned long ul2)
|
10
10
|
{
|
11
|
+
CHECK(ul1 == 1073741823L);
|
12
|
+
CHECK(ul2 == 1073741824L);
|
11
13
|
return ul1 + ul2;
|
12
14
|
}
|
13
15
|
|
@@ -33,6 +35,8 @@ int main (void)
|
|
33
35
|
ffi_call(&cif, FFI_FN(return_ul), &res, values);
|
34
36
|
printf("res: %lu, %lu\n", (unsigned long)res, ul1 + ul2);
|
35
37
|
/* { dg-output "res: 2147483647, 2147483647" } */
|
38
|
+
CHECK(res == 2147483647L);
|
39
|
+
CHECK(ul1 + ul2 == 2147483647L);
|
36
40
|
|
37
41
|
exit(0);
|
38
42
|
}
|
@@ -0,0 +1,60 @@
|
|
1
|
+
/* Area: ffi_call
|
2
|
+
Purpose: Check structures.
|
3
|
+
Limitations: none.
|
4
|
+
PR: none.
|
5
|
+
Originator: From the original ffitest.c */
|
6
|
+
|
7
|
+
/* { dg-do run } */
|
8
|
+
#include "ffitest.h"
|
9
|
+
|
10
|
+
typedef struct
|
11
|
+
{
|
12
|
+
float f;
|
13
|
+
} s55;
|
14
|
+
|
15
|
+
static s55 ABI_ATTR f55(s55 ts, float f)
|
16
|
+
{
|
17
|
+
s55 r;
|
18
|
+
r.f = ts.f + f;
|
19
|
+
printf ("f55>> %g + %g = %g\n", ts.f, f, r.f);
|
20
|
+
return r;
|
21
|
+
}
|
22
|
+
|
23
|
+
int main (void)
|
24
|
+
{
|
25
|
+
ffi_cif cif;
|
26
|
+
s55 F, Fr;
|
27
|
+
float f;
|
28
|
+
void *values[] = { &F, &f };
|
29
|
+
ffi_type s55_type;
|
30
|
+
ffi_type *args[] = { &s55_type, &ffi_type_float };
|
31
|
+
ffi_type *s55_type_elements[] = { &ffi_type_float, NULL };
|
32
|
+
|
33
|
+
/* This is a hack to get a properly aligned result buffer */
|
34
|
+
s55 *s55_result =
|
35
|
+
(s55 *) malloc (sizeof(s55));
|
36
|
+
|
37
|
+
s55_type.size = 0;
|
38
|
+
s55_type.alignment = 0;
|
39
|
+
s55_type.type = FFI_TYPE_STRUCT;
|
40
|
+
s55_type.elements = s55_type_elements;
|
41
|
+
|
42
|
+
/* Initialize the cif */
|
43
|
+
CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, &s55_type, args) == FFI_OK);
|
44
|
+
|
45
|
+
F.f = 1;
|
46
|
+
Fr = f55(F, 2.14);
|
47
|
+
printf ("%g\n", Fr.f);
|
48
|
+
|
49
|
+
F.f = 1;
|
50
|
+
f = 2.14;
|
51
|
+
ffi_call(&cif, FFI_FN(f55), s55_result, values);
|
52
|
+
printf ("%g\n", s55_result->f);
|
53
|
+
|
54
|
+
fflush(0);
|
55
|
+
|
56
|
+
CHECK(fabs(Fr.f - s55_result->f) < FLT_EPSILON);
|
57
|
+
|
58
|
+
free (s55_result);
|
59
|
+
exit(0);
|
60
|
+
}
|
@@ -7,9 +7,9 @@
|
|
7
7
|
/* { dg-do run } */
|
8
8
|
#include "ffitest.h"
|
9
9
|
|
10
|
-
static
|
10
|
+
static unsigned int ABI_ATTR my_strlen(char *s)
|
11
11
|
{
|
12
|
-
return (strlen(s));
|
12
|
+
return (unsigned int) (strlen(s));
|
13
13
|
}
|
14
14
|
|
15
15
|
int main (void)
|
@@ -22,23 +22,22 @@ int main (void)
|
|
22
22
|
|
23
23
|
args[0] = &ffi_type_pointer;
|
24
24
|
values[0] = (void*) &s;
|
25
|
-
|
25
|
+
|
26
26
|
/* Initialize the cif */
|
27
27
|
CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
|
28
|
-
&
|
29
|
-
|
28
|
+
&ffi_type_uint, args) == FFI_OK);
|
29
|
+
|
30
30
|
s = "a";
|
31
31
|
ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
|
32
32
|
CHECK(rint == 1);
|
33
|
-
|
33
|
+
|
34
34
|
s = "1234567";
|
35
35
|
ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
|
36
36
|
CHECK(rint == 7);
|
37
|
-
|
37
|
+
|
38
38
|
s = "1234567890123456789012345";
|
39
39
|
ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
|
40
40
|
CHECK(rint == 25);
|
41
|
-
|
41
|
+
|
42
42
|
exit (0);
|
43
43
|
}
|
44
|
-
|
@@ -8,9 +8,9 @@
|
|
8
8
|
|
9
9
|
#include "ffitest.h"
|
10
10
|
|
11
|
-
static
|
11
|
+
static int ABI_ATTR my_f(float a, char *s, int i)
|
12
12
|
{
|
13
|
-
return (
|
13
|
+
return (int) strlen(s) + (int) a + i;
|
14
14
|
}
|
15
15
|
|
16
16
|
int main (void)
|
@@ -0,0 +1,63 @@
|
|
1
|
+
/* Area: ffi_call
|
2
|
+
Purpose: Check structures.
|
3
|
+
Limitations: none.
|
4
|
+
PR: none.
|
5
|
+
Originator: From the original ffitest.c */
|
6
|
+
|
7
|
+
/* { dg-do run } */
|
8
|
+
#include "ffitest.h"
|
9
|
+
|
10
|
+
typedef struct
|
11
|
+
{
|
12
|
+
unsigned int ui01;
|
13
|
+
unsigned int ui02;
|
14
|
+
} test_structure_1;
|
15
|
+
|
16
|
+
static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
|
17
|
+
{
|
18
|
+
ts.ui02++;
|
19
|
+
|
20
|
+
return ts;
|
21
|
+
}
|
22
|
+
|
23
|
+
int main (void)
|
24
|
+
{
|
25
|
+
ffi_cif cif;
|
26
|
+
ffi_type *args[MAX_ARGS];
|
27
|
+
void *values[MAX_ARGS];
|
28
|
+
ffi_type ts1_type;
|
29
|
+
ffi_type *ts1_type_elements[3];
|
30
|
+
|
31
|
+
test_structure_1 ts1_arg;
|
32
|
+
|
33
|
+
/* This is a hack to get a properly aligned result buffer */
|
34
|
+
test_structure_1 *ts1_result =
|
35
|
+
(test_structure_1 *) malloc (sizeof(test_structure_1));
|
36
|
+
|
37
|
+
ts1_type.size = 0;
|
38
|
+
ts1_type.alignment = 0;
|
39
|
+
ts1_type.type = FFI_TYPE_STRUCT;
|
40
|
+
ts1_type.elements = ts1_type_elements;
|
41
|
+
ts1_type_elements[0] = &ffi_type_uint;
|
42
|
+
ts1_type_elements[1] = &ffi_type_uint;
|
43
|
+
ts1_type_elements[2] = NULL;
|
44
|
+
|
45
|
+
args[0] = &ts1_type;
|
46
|
+
values[0] = &ts1_arg;
|
47
|
+
|
48
|
+
/* Initialize the cif */
|
49
|
+
CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
|
50
|
+
&ts1_type, args) == FFI_OK);
|
51
|
+
|
52
|
+
ts1_arg.ui02 = 555;
|
53
|
+
|
54
|
+
ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
|
55
|
+
|
56
|
+
CHECK(ts1_result->ui02 == 556);
|
57
|
+
|
58
|
+
/* This will fail if ffi_call isn't passing the struct by value. */
|
59
|
+
CHECK(ts1_arg.ui02 == 555);
|
60
|
+
|
61
|
+
free (ts1_result);
|
62
|
+
exit(0);
|
63
|
+
}
|
@@ -0,0 +1,65 @@
|
|
1
|
+
/* Area: ffi_call
|
2
|
+
Purpose: Check structures.
|
3
|
+
Limitations: none.
|
4
|
+
PR: none.
|
5
|
+
Originator: From the original ffitest.c */
|
6
|
+
|
7
|
+
/* { dg-do run } */
|
8
|
+
#include "ffitest.h"
|
9
|
+
|
10
|
+
typedef struct
|
11
|
+
{
|
12
|
+
unsigned int ui01;
|
13
|
+
unsigned int ui02;
|
14
|
+
unsigned int ui03;
|
15
|
+
} test_structure_1;
|
16
|
+
|
17
|
+
static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
|
18
|
+
{
|
19
|
+
ts.ui03++;
|
20
|
+
|
21
|
+
return ts;
|
22
|
+
}
|
23
|
+
|
24
|
+
int main (void)
|
25
|
+
{
|
26
|
+
ffi_cif cif;
|
27
|
+
ffi_type *args[MAX_ARGS];
|
28
|
+
void *values[MAX_ARGS];
|
29
|
+
ffi_type ts1_type;
|
30
|
+
ffi_type *ts1_type_elements[4];
|
31
|
+
|
32
|
+
test_structure_1 ts1_arg;
|
33
|
+
|
34
|
+
/* This is a hack to get a properly aligned result buffer */
|
35
|
+
test_structure_1 *ts1_result =
|
36
|
+
(test_structure_1 *) malloc (sizeof(test_structure_1));
|
37
|
+
|
38
|
+
ts1_type.size = 0;
|
39
|
+
ts1_type.alignment = 0;
|
40
|
+
ts1_type.type = FFI_TYPE_STRUCT;
|
41
|
+
ts1_type.elements = ts1_type_elements;
|
42
|
+
ts1_type_elements[0] = &ffi_type_uint;
|
43
|
+
ts1_type_elements[1] = &ffi_type_uint;
|
44
|
+
ts1_type_elements[2] = &ffi_type_uint;
|
45
|
+
ts1_type_elements[3] = NULL;
|
46
|
+
|
47
|
+
args[0] = &ts1_type;
|
48
|
+
values[0] = &ts1_arg;
|
49
|
+
|
50
|
+
/* Initialize the cif */
|
51
|
+
CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
|
52
|
+
&ts1_type, args) == FFI_OK);
|
53
|
+
|
54
|
+
ts1_arg.ui03 = 555;
|
55
|
+
|
56
|
+
ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
|
57
|
+
|
58
|
+
CHECK(ts1_result->ui03 == 556);
|
59
|
+
|
60
|
+
/* This will fail if ffi_call isn't passing the struct by value. */
|
61
|
+
CHECK(ts1_arg.ui03 == 555);
|
62
|
+
|
63
|
+
free (ts1_result);
|
64
|
+
exit(0);
|
65
|
+
}
|