ffi 1.17.0 → 1.17.4
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 +51 -0
- data/Gemfile +8 -3
- data/README.md +1 -0
- data/Rakefile +8 -5
- data/Steepfile +8 -0
- data/ext/ffi_c/DynamicLibrary.c +1 -1
- data/ext/ffi_c/Function.c +54 -34
- data/ext/ffi_c/MethodHandle.c +4 -2
- data/ext/ffi_c/StructLayout.c +129 -12
- data/ext/ffi_c/libffi/LICENSE +1 -1
- data/ext/ffi_c/libffi/Makefile.am +20 -15
- data/ext/ffi_c/libffi/Makefile.in +41 -54
- data/ext/ffi_c/libffi/README.md +40 -4
- data/ext/ffi_c/libffi/acinclude.m4 +6 -0
- data/ext/ffi_c/libffi/config.guess +80 -22
- data/ext/ffi_c/libffi/config.sub +161 -80
- data/ext/ffi_c/libffi/configure +135 -135
- data/ext/ffi_c/libffi/configure.ac +28 -14
- data/ext/ffi_c/libffi/configure.host +6 -6
- data/ext/ffi_c/libffi/doc/Makefile.in +4 -0
- data/ext/ffi_c/libffi/doc/libffi.texi +27 -4
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +3 -3
- data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +1 -28
- data/ext/ffi_c/libffi/include/Makefile.in +4 -0
- data/ext/ffi_c/libffi/include/ffi.h.in +19 -1
- data/ext/ffi_c/libffi/include/ffi_cfi.h +2 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +17 -0
- data/ext/ffi_c/libffi/libffi.map.in +13 -1
- data/ext/ffi_c/libffi/libtool-version +1 -1
- data/ext/ffi_c/libffi/m4/asmcfi.m4 +28 -11
- data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +13 -3
- data/ext/ffi_c/libffi/man/Makefile.in +4 -0
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +7 -4
- data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +2 -2
- data/ext/ffi_c/libffi/src/aarch64/internal.h +63 -17
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +22 -12
- data/ext/ffi_c/libffi/src/arc/arcompact.S +2 -2
- data/ext/ffi_c/libffi/src/arc/ffi.c +6 -2
- data/ext/ffi_c/libffi/src/arm/sysv.S +1 -1
- data/ext/ffi_c/libffi/src/closures.c +3 -3
- data/ext/ffi_c/libffi/src/dlmalloc.c +1 -0
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +2 -4
- data/ext/ffi_c/libffi/src/mips/n32.S +4 -0
- data/ext/ffi_c/libffi/src/mips/o32.S +4 -0
- data/ext/ffi_c/libffi/src/or1k/ffi.c +2 -2
- data/ext/ffi_c/libffi/src/pa/linux.S +4 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +19 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +26 -19
- data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +26 -16
- data/ext/ffi_c/libffi/src/powerpc/internal.h +10 -0
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +47 -0
- data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +24 -0
- data/ext/ffi_c/libffi/src/prep_cif.c +1 -4
- data/ext/ffi_c/libffi/src/riscv/ffi.c +39 -16
- data/ext/ffi_c/libffi/src/riscv/internal.h +7 -0
- data/ext/ffi_c/libffi/src/riscv/sysv.S +24 -0
- data/ext/ffi_c/libffi/src/s390/ffi.c +28 -1
- data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
- data/ext/ffi_c/libffi/src/s390/sysv.S +38 -0
- data/ext/ffi_c/libffi/src/sparc/ffi.c +16 -0
- data/ext/ffi_c/libffi/src/tramp.c +6 -1
- data/ext/ffi_c/libffi/src/types.c +23 -1
- data/ext/ffi_c/libffi/src/{wasm32 → wasm}/ffi.c +166 -315
- data/ext/ffi_c/libffi/src/{wasm32 → wasm}/ffitarget.h +17 -0
- data/ext/ffi_c/libffi/src/x86/ffi.c +4 -1
- data/ext/ffi_c/libffi/src/x86/ffi64.c +4 -1
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +0 -3
- data/ext/ffi_c/libffi/src/x86/sysv.S +1 -3
- data/ext/ffi_c/libffi/src/x86/sysv_intel.S +1 -3
- data/ext/ffi_c/libffi/testsuite/Makefile.in +10 -4
- data/ext/ffi_c/libffi.mk +5 -0
- data/ffi.gemspec +7 -6
- data/lib/ffi/autopointer.rb +6 -0
- data/lib/ffi/compat.rb +11 -0
- data/lib/ffi/ffi.rb +59 -0
- data/lib/ffi/function.rb +23 -0
- data/lib/ffi/library.rb +19 -3
- data/lib/ffi/struct_by_reference.rb +1 -1
- data/lib/ffi/version.rb +1 -1
- data/samples/hello_ractor.rb +9 -1
- data/samples/qsort_ractor.rb +9 -1
- data/sig/ffi/auto_pointer.rbs +1 -2
- data/sig/ffi/errno.rbs +8 -0
- data/sig/ffi/library.rbs +1 -1
- data/sig/ffi/platform.rbs +49 -0
- data/sig/ffi/struct.rbs +2 -2
- data/sig/ffi/struct_by_reference.rbs +1 -1
- data/sig/ffi.rbs +4 -1
- data.tar.gz.sig +0 -0
- metadata +25 -339
- metadata.gz.sig +0 -0
- data/ext/ffi_c/libffi/.allow-ai-service +0 -0
- data/ext/ffi_c/libffi/.appveyor/site.exp +0 -16
- data/ext/ffi_c/libffi/.appveyor/unix-noexec.exp +0 -7
- data/ext/ffi_c/libffi/.appveyor.yml +0 -84
- data/ext/ffi_c/libffi/.ci/ar-lib +0 -270
- data/ext/ffi_c/libffi/.ci/bfin-sim.exp +0 -58
- data/ext/ffi_c/libffi/.ci/build-cross-in-container.sh +0 -18
- data/ext/ffi_c/libffi/.ci/build-in-container.sh +0 -10
- data/ext/ffi_c/libffi/.ci/build.sh +0 -124
- data/ext/ffi_c/libffi/.ci/compile +0 -351
- data/ext/ffi_c/libffi/.ci/install.sh +0 -78
- data/ext/ffi_c/libffi/.ci/m32r-sim.exp +0 -58
- data/ext/ffi_c/libffi/.ci/moxie-sim.exp +0 -60
- data/ext/ffi_c/libffi/.ci/msvs-detect +0 -1103
- data/ext/ffi_c/libffi/.ci/or1k-sim.exp +0 -58
- data/ext/ffi_c/libffi/.ci/powerpc-eabisim.exp +0 -58
- data/ext/ffi_c/libffi/.ci/site.exp +0 -29
- data/ext/ffi_c/libffi/.ci/wine-sim.exp +0 -55
- data/ext/ffi_c/libffi/.circleci/config.yml +0 -156
- data/ext/ffi_c/libffi/.gitattributes +0 -4
- data/ext/ffi_c/libffi/.github/issue_template.md +0 -10
- data/ext/ffi_c/libffi/.github/workflows/build.yml +0 -479
- data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +0 -172
- data/ext/ffi_c/libffi/.gitignore +0 -46
- data/ext/ffi_c/libffi/src/nios2/ffi.c +0 -304
- data/ext/ffi_c/libffi/src/nios2/ffitarget.h +0 -52
- data/ext/ffi_c/libffi/src/nios2/sysv.S +0 -136
- data/ext/ffi_c/libffi/testsuite/Makefile.am +0 -87
- data/ext/ffi_c/libffi/testsuite/config/default.exp +0 -1
- data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +0 -54
- data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +0 -63
- data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +0 -86
- data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +0 -48
- data/ext/ffi_c/libffi/testsuite/emscripten/test.html +0 -7
- data/ext/ffi_c/libffi/testsuite/emscripten/test_libffi.py +0 -51
- data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +0 -682
- data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +0 -283
- data/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +0 -45
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +0 -28
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +0 -78
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +0 -50
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +0 -63
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +0 -1746
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +0 -2885
- data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +0 -747
- data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +0 -46
- data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +0 -46
- data/ext/ffi_c/libffi/testsuite/libffi.call/bpo_38748.c +0 -41
- data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +0 -54
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +0 -99
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +0 -108
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +0 -114
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +0 -119
- data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +0 -26
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +0 -163
- data/ext/ffi_c/libffi/testsuite/libffi.call/float.c +0 -59
- data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +0 -60
- data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +0 -61
- data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +0 -74
- data/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +0 -62
- data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +0 -110
- data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +0 -59
- data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +0 -57
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +0 -70
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +0 -78
- data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -52
- data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +0 -46
- data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +0 -127
- data/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +0 -59
- data/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc_tc.c +0 -114
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +0 -36
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +0 -43
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +0 -42
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +0 -35
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +0 -36
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +0 -49
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +0 -42
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +0 -34
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +0 -41
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +0 -48
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +0 -36
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +0 -42
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +0 -38
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +0 -42
- data/ext/ffi_c/libffi/testsuite/libffi.call/s55.c +0 -60
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +0 -43
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +0 -49
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +0 -49
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +0 -55
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +0 -67
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +0 -57
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +0 -67
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +0 -60
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +0 -64
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +0 -66
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +0 -64
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +0 -74
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +0 -81
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +0 -68
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_2.c +0 -63
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3.c +0 -65
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_3f.c +0 -65
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4.c +0 -67
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_4f.c +0 -67
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_big.c +0 -93
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_by_value_small.c +0 -61
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_2H.c +0 -63
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_return_8H.c +0 -90
- data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +0 -61
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +0 -78
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_2.c +0 -220
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_3.c +0 -154
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +0 -134
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +0 -134
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +0 -140
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +0 -67
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c +0 -90
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c +0 -83
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c +0 -83
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c +0 -102
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c +0 -91
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c +0 -94
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c +0 -92
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c +0 -96
- data/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c +0 -61
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c +0 -112
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c +0 -117
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c +0 -120
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c +0 -131
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c +0 -93
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c +0 -109
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c +0 -113
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c +0 -145
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c +0 -103
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c +0 -114
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c +0 -103
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c +0 -103
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c +0 -113
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c +0 -120
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c +0 -103
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c +0 -137
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c +0 -116
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c +0 -148
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c +0 -140
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c +0 -121
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c +0 -155
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c +0 -121
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c +0 -102
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c +0 -103
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c +0 -103
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c +0 -111
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c +0 -109
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c +0 -111
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c +0 -147
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c +0 -152
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c +0 -113
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c +0 -108
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c +0 -106
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c +0 -109
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c +0 -108
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c +0 -109
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c +0 -111
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c +0 -68
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double.c +0 -43
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c +0 -69
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c +0 -46
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c +0 -115
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c +0 -80
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c +0 -70
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c +0 -55
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c +0 -78
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c +0 -79
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c +0 -94
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c +0 -99
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c +0 -78
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c +0 -94
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c +0 -79
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c +0 -152
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c +0 -47
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c +0 -44
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c +0 -45
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c +0 -125
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c +0 -45
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c +0 -47
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c +0 -49
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c +0 -49
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c +0 -49
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c +0 -46
- data/ext/ffi_c/libffi/testsuite/libffi.closures/err_bad_abi.c +0 -36
- data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +0 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c +0 -343
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c +0 -175
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c +0 -161
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c +0 -146
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c +0 -137
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct12.c +0 -86
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct13.c +0 -115
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c +0 -119
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c +0 -120
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c +0 -120
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c +0 -121
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c +0 -142
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c +0 -120
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c +0 -142
- data/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c +0 -142
- data/ext/ffi_c/libffi/testsuite/libffi.closures/problem1.c +0 -90
- data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs1.c +0 -86
- data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs2.c +0 -102
- data/ext/ffi_c/libffi/testsuite/libffi.closures/single_entry_structs3.c +0 -101
- data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large.c +0 -145
- data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large2.c +0 -148
- data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c +0 -124
- data/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c +0 -125
- data/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c +0 -75
- data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc +0 -118
- data/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc +0 -55
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +0 -91
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +0 -42
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +0 -71
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +0 -80
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +0 -16
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp +0 -36
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +0 -51
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +0 -7
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +0 -7
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +0 -7
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +0 -86
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +0 -1
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +0 -78
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +0 -37
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +0 -41
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +0 -44
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +0 -10
- data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +0 -34
- data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +0 -28
- data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +0 -1
- data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +0 -36
- data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +0 -19
- data/lib/ffi/tools/types_generator.rb +0 -137
- data/rakelib/ffi_gem_helper.rb +0 -65
|
@@ -42,14 +42,31 @@ typedef void (*ffi_fp)(void);
|
|
|
42
42
|
|
|
43
43
|
typedef enum ffi_abi {
|
|
44
44
|
FFI_FIRST_ABI = 0,
|
|
45
|
+
#if __SIZEOF_POINTER__ == 4
|
|
45
46
|
FFI_WASM32, // "raw", no structures, varargs, or closures (not implemented!)
|
|
46
47
|
FFI_WASM32_EMSCRIPTEN, // structures, varargs, and split 64-bit params
|
|
48
|
+
#elif __SIZEOF_POINTER__ == 8
|
|
49
|
+
FFI_WASM64,
|
|
50
|
+
FFI_WASM64_EMSCRIPTEN,
|
|
51
|
+
#else
|
|
52
|
+
#error "Unknown pointer size"
|
|
53
|
+
#endif
|
|
47
54
|
FFI_LAST_ABI,
|
|
55
|
+
#if __SIZEOF_POINTER__ == 4
|
|
48
56
|
#ifdef __EMSCRIPTEN__
|
|
49
57
|
FFI_DEFAULT_ABI = FFI_WASM32_EMSCRIPTEN
|
|
50
58
|
#else
|
|
51
59
|
FFI_DEFAULT_ABI = FFI_WASM32
|
|
52
60
|
#endif
|
|
61
|
+
#elif __SIZEOF_POINTER__ == 8
|
|
62
|
+
#ifdef __EMSCRIPTEN__
|
|
63
|
+
FFI_DEFAULT_ABI = FFI_WASM64_EMSCRIPTEN
|
|
64
|
+
#else
|
|
65
|
+
FFI_DEFAULT_ABI = FFI_WASM64
|
|
66
|
+
#endif
|
|
67
|
+
#else
|
|
68
|
+
#error "Unknown pointer size"
|
|
69
|
+
#endif
|
|
53
70
|
} ffi_abi;
|
|
54
71
|
|
|
55
72
|
#define FFI_CLOSURES 1
|
|
@@ -118,7 +118,7 @@ ffi_prep_cif_machdep(ffi_cif *cif)
|
|
|
118
118
|
break;
|
|
119
119
|
case FFI_TYPE_STRUCT:
|
|
120
120
|
{
|
|
121
|
-
#
|
|
121
|
+
#if defined(X86_WIN32) || defined(X86_DARWIN)
|
|
122
122
|
size_t size = cif->rtype->size;
|
|
123
123
|
if (size == 1)
|
|
124
124
|
flags = X86_RET_STRUCT_1B;
|
|
@@ -270,6 +270,9 @@ extern void FFI_DECLARE_FASTCALL ffi_call_i386(struct call_frame *, char *) FFI_
|
|
|
270
270
|
#if defined(_MSC_VER)
|
|
271
271
|
#pragma runtime_checks("s", off)
|
|
272
272
|
#endif
|
|
273
|
+
/* n.b. ffi_call_unix64 will steal the alloca'd `stack` variable here for use
|
|
274
|
+
_as its own stack_ - so we need to compile this function without ASAN */
|
|
275
|
+
FFI_ASAN_NO_SANITIZE
|
|
273
276
|
static void
|
|
274
277
|
ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
275
278
|
void **avalue, void *closure)
|
|
@@ -557,6 +557,9 @@ ffi_prep_cif_machdep (ffi_cif *cif)
|
|
|
557
557
|
return FFI_OK;
|
|
558
558
|
}
|
|
559
559
|
|
|
560
|
+
/* n.b. ffi_call_unix64 will steal the alloca'd `stack` variable here for use
|
|
561
|
+
_as its own stack_ - so we need to compile this function without ASAN */
|
|
562
|
+
FFI_ASAN_NO_SANITIZE
|
|
560
563
|
static void
|
|
561
564
|
ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
562
565
|
void **avalue, void *closure)
|
|
@@ -651,7 +654,7 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
|
651
654
|
break;
|
|
652
655
|
default:
|
|
653
656
|
reg_args->gpr[gprcount] = 0;
|
|
654
|
-
memcpy (®_args->gpr[gprcount], a, size);
|
|
657
|
+
memcpy (®_args->gpr[gprcount], a, size <= 8 ? size : 8);
|
|
655
658
|
}
|
|
656
659
|
gprcount++;
|
|
657
660
|
break;
|
|
@@ -41,9 +41,6 @@
|
|
|
41
41
|
|
|
42
42
|
#if defined (X86_64) && defined (__i386__)
|
|
43
43
|
#undef X86_64
|
|
44
|
-
#warning ******************************************************
|
|
45
|
-
#warning ********** X86 IS DEFINED ****************************
|
|
46
|
-
#warning ******************************************************
|
|
47
44
|
#define X86
|
|
48
45
|
#endif
|
|
49
46
|
|
|
@@ -458,9 +458,7 @@ L(UW24):
|
|
|
458
458
|
L(UW25):
|
|
459
459
|
# cfi_def_cfa_offset(closure_FS + 4)
|
|
460
460
|
FFI_CLOSURE_SAVE_REGS
|
|
461
|
-
movl closure_FS-4(%esp), %
|
|
462
|
-
movl closure_FS(%esp), %eax /* load closure */
|
|
463
|
-
movl %ecx, closure_FS(%esp) /* move retaddr */
|
|
461
|
+
movl closure_FS-4(%esp), %eax /* load closure */
|
|
464
462
|
jmp L(do_closure_REGISTER)
|
|
465
463
|
L(UW26):
|
|
466
464
|
# cfi_endproc
|
|
@@ -394,9 +394,7 @@ L(UW24):
|
|
|
394
394
|
L(UW25):
|
|
395
395
|
/* cfi_def_cfa_offset(closure_FS + 4) */
|
|
396
396
|
FFI_CLOSURE_SAVE_REGS
|
|
397
|
-
mov
|
|
398
|
-
mov eax, [esp+closure_FS] /* load closure */
|
|
399
|
-
mov [esp+closure_FS], ecx /* move retaddr */
|
|
397
|
+
mov eax, [esp+closure_FS-4] /* load closure */
|
|
400
398
|
jmp L(do_closure_REGISTER)
|
|
401
399
|
L(UW26):
|
|
402
400
|
/* cfi_endproc */
|
|
@@ -174,6 +174,8 @@ EGREP = @EGREP@
|
|
|
174
174
|
ETAGS = @ETAGS@
|
|
175
175
|
EXEEXT = @EXEEXT@
|
|
176
176
|
FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
|
|
177
|
+
FFI_VERSION_NUMBER = @FFI_VERSION_NUMBER@
|
|
178
|
+
FFI_VERSION_STRING = @FFI_VERSION_STRING@
|
|
177
179
|
FGREP = @FGREP@
|
|
178
180
|
FILECMD = @FILECMD@
|
|
179
181
|
GREP = @GREP@
|
|
@@ -224,6 +226,7 @@ TARGET = @TARGET@
|
|
|
224
226
|
TARGETDIR = @TARGETDIR@
|
|
225
227
|
TARGET_OBJ = @TARGET_OBJ@
|
|
226
228
|
VERSION = @VERSION@
|
|
229
|
+
WASM64_MEMORY64 = @WASM64_MEMORY64@
|
|
227
230
|
abs_builddir = @abs_builddir@
|
|
228
231
|
abs_srcdir = @abs_srcdir@
|
|
229
232
|
abs_top_builddir = @abs_top_builddir@
|
|
@@ -232,6 +235,7 @@ ac_ct_AR = @ac_ct_AR@
|
|
|
232
235
|
ac_ct_CC = @ac_ct_CC@
|
|
233
236
|
ac_ct_CXX = @ac_ct_CXX@
|
|
234
237
|
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
|
238
|
+
ac_ct_READELF = @ac_ct_READELF@
|
|
235
239
|
am__include = @am__include@
|
|
236
240
|
am__leading_dot = @am__leading_dot@
|
|
237
241
|
am__quote = @am__quote@
|
|
@@ -301,8 +305,8 @@ EXTRA_DIST = config/default.exp emscripten/build.sh emscripten/conftest.py \
|
|
|
301
305
|
libffi.call/float1.c libffi.call/float2.c libffi.call/float3.c \
|
|
302
306
|
libffi.call/float4.c libffi.call/float_va.c libffi.call/many.c \
|
|
303
307
|
libffi.call/many2.c libffi.call/many_double.c libffi.call/many_mixed.c \
|
|
304
|
-
libffi.call/negint.c libffi.call/offsets.c libffi.call/
|
|
305
|
-
libffi.call/promotion.c libffi.call/pyobjc_tc.c libffi.call/return_dbl.c \
|
|
308
|
+
libffi.call/negint.c libffi.call/offsets.c libffi.call/overread.c \
|
|
309
|
+
libffi.call/pr1172638.c libffi.call/promotion.c libffi.call/pyobjc_tc.c libffi.call/return_dbl.c \
|
|
306
310
|
libffi.call/return_dbl1.c libffi.call/return_dbl2.c libffi.call/return_fl.c \
|
|
307
311
|
libffi.call/return_fl1.c libffi.call/return_fl2.c libffi.call/return_fl3.c \
|
|
308
312
|
libffi.call/return_ldl.c libffi.call/return_ll.c libffi.call/return_ll1.c \
|
|
@@ -315,10 +319,11 @@ EXTRA_DIST = config/default.exp emscripten/build.sh emscripten/conftest.py \
|
|
|
315
319
|
libffi.call/struct9.c libffi.call/struct_by_value_2.c libffi.call/struct_by_value_3.c \
|
|
316
320
|
libffi.call/struct_by_value_3f.c libffi.call/struct_by_value_4.c libffi.call/struct_by_value_4f.c \
|
|
317
321
|
libffi.call/struct_by_value_big.c libffi.call/struct_by_value_small.c libffi.call/struct_return_2H.c \
|
|
322
|
+
libffi.call/struct_int_float.c libffi.call/longjmp.c \
|
|
318
323
|
libffi.call/struct_return_8H.c libffi.call/uninitialized.c libffi.call/va_1.c \
|
|
319
324
|
libffi.call/va_2.c libffi.call/va_3.c libffi.call/va_struct1.c \
|
|
320
325
|
libffi.call/va_struct2.c libffi.call/va_struct3.c libffi.call/callback.c \
|
|
321
|
-
libffi.call/callback2.c libffi.call/callback3.c libffi.call/callback4.c \
|
|
326
|
+
libffi.call/callback2.c libffi.call/callback3.c libffi.call/callback4.c libffi.call/x32.c \
|
|
322
327
|
libffi.closures/closure.exp libffi.closures/closure_fn0.c libffi.closures/closure_fn1.c \
|
|
323
328
|
libffi.closures/closure_fn2.c libffi.closures/closure_fn3.c libffi.closures/closure_fn4.c \
|
|
324
329
|
libffi.closures/closure_fn5.c libffi.closures/closure_fn6.c libffi.closures/closure_loc_fn0.c \
|
|
@@ -368,7 +373,8 @@ EXTRA_DIST = config/default.exp emscripten/build.sh emscripten/conftest.py \
|
|
|
368
373
|
libffi.complex/return_complex2_float.c libffi.complex/return_complex2_longdouble.c libffi.complex/return_complex_double.c \
|
|
369
374
|
libffi.complex/return_complex_float.c libffi.complex/return_complex_longdouble.c libffi.go/aa-direct.c \
|
|
370
375
|
libffi.go/closure1.c libffi.go/ffitest.h libffi.go/go.exp \
|
|
371
|
-
libffi.go/static-chain.h Makefile.am Makefile.in
|
|
376
|
+
libffi.go/static-chain.h Makefile.am Makefile.in \
|
|
377
|
+
libffi.threads/ffitest.h libffi.threads/threads.exp libffi.threads/tsan.c
|
|
372
378
|
|
|
373
379
|
all: all-am
|
|
374
380
|
|
data/ext/ffi_c/libffi.mk
CHANGED
data/ffi.gemspec
CHANGED
|
@@ -15,13 +15,16 @@ Gem::Specification.new do |s|
|
|
|
15
15
|
s.metadata['wiki_uri'] = 'https://github.com/ffi/ffi/wiki'
|
|
16
16
|
s.metadata['source_code_uri'] = 'https://github.com/ffi/ffi/'
|
|
17
17
|
s.metadata['mailing_list_uri'] = 'http://groups.google.com/group/ruby-ffi'
|
|
18
|
+
s.metadata['rubygems_mfa_required'] = 'true'
|
|
18
19
|
end
|
|
19
20
|
s.files = `git ls-files -z`.split("\x0").reject do |f|
|
|
20
|
-
f =~ /^(\.|bench|gen|libtest|nbproject|spec)/
|
|
21
|
+
f =~ /^(\.|bench|gen|libtest|nbproject|spec|rakelib)/
|
|
21
22
|
end
|
|
22
23
|
|
|
23
24
|
# Add libffi git files
|
|
24
|
-
lfs = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0")
|
|
25
|
+
lfs = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0").reject do |f|
|
|
26
|
+
f =~ /^(\.|testsuite)/
|
|
27
|
+
end
|
|
25
28
|
# Add autoconf generated files of libffi
|
|
26
29
|
lfs += %w[ compile configure config.guess config.sub install-sh ltmain.sh missing fficonfig.h.in ]
|
|
27
30
|
# Add automake generated files of libffi
|
|
@@ -35,8 +38,6 @@ Gem::Specification.new do |s|
|
|
|
35
38
|
s.license = 'BSD-3-Clause'
|
|
36
39
|
s.require_paths << 'ext/ffi_c'
|
|
37
40
|
s.required_ruby_version = '>= 2.5'
|
|
38
|
-
|
|
39
|
-
s.
|
|
40
|
-
s.add_development_dependency 'rake-compiler-dock', '~> 1.0'
|
|
41
|
-
s.add_development_dependency 'rspec', '~> 2.14.1'
|
|
41
|
+
|
|
42
|
+
s.metadata['msys2_mingw_dependencies'] = 'libffi'
|
|
42
43
|
end
|
data/lib/ffi/autopointer.rb
CHANGED
data/lib/ffi/compat.rb
CHANGED
|
@@ -40,4 +40,15 @@ module FFI
|
|
|
40
40
|
obj.freeze
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
|
+
|
|
44
|
+
if defined?(Ractor.shareable_proc)
|
|
45
|
+
# This is for FFI internal use only.
|
|
46
|
+
def self.shareable_proc(**kwargs, &block)
|
|
47
|
+
Ractor.shareable_proc(**kwargs, &block)
|
|
48
|
+
end
|
|
49
|
+
else
|
|
50
|
+
def self.shareable_proc(**_kwargs, &block)
|
|
51
|
+
block
|
|
52
|
+
end
|
|
53
|
+
end
|
|
43
54
|
end
|
data/lib/ffi/ffi.rb
CHANGED
|
@@ -48,3 +48,62 @@ require 'ffi/variadic'
|
|
|
48
48
|
require 'ffi/enum'
|
|
49
49
|
require 'ffi/version'
|
|
50
50
|
require 'ffi/function'
|
|
51
|
+
|
|
52
|
+
module FFI
|
|
53
|
+
module ModernForkTracking
|
|
54
|
+
def _fork
|
|
55
|
+
pid = super
|
|
56
|
+
if pid == 0
|
|
57
|
+
FFI._async_cb_dispatcher_atfork_child
|
|
58
|
+
end
|
|
59
|
+
pid
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
module LegacyForkTracking
|
|
64
|
+
module KernelExt
|
|
65
|
+
def fork
|
|
66
|
+
if block_given?
|
|
67
|
+
super do
|
|
68
|
+
FFI._async_cb_dispatcher_atfork_child
|
|
69
|
+
yield
|
|
70
|
+
end
|
|
71
|
+
else
|
|
72
|
+
pid = super
|
|
73
|
+
FFI._async_cb_dispatcher_atfork_child if pid.nil?
|
|
74
|
+
pid
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
module KernelExtPrivate
|
|
80
|
+
include KernelExt
|
|
81
|
+
private :fork
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
module IOExt
|
|
85
|
+
def popen(*args)
|
|
86
|
+
return super unless args[0] == '-'
|
|
87
|
+
|
|
88
|
+
super(*args) do |pipe|
|
|
89
|
+
FFI._async_cb_dispatcher_atfork_child if pipe.nil?
|
|
90
|
+
yield pipe
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
ruby2_keywords :popen if respond_to?(:ruby2_keywords)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
if Process.respond_to?(:_fork)
|
|
98
|
+
# The nice Ruby 3.1+ way of doing things
|
|
99
|
+
::Process.singleton_class.prepend(ModernForkTracking)
|
|
100
|
+
elsif Process.respond_to?(:fork)
|
|
101
|
+
# Barf. Old CRuby.
|
|
102
|
+
# Most of the inspiration for how to do this was stolen from ActiveSupport.
|
|
103
|
+
::Object.prepend(LegacyForkTracking::KernelExtPrivate)
|
|
104
|
+
::Object.singleton_class.prepend(LegacyForkTracking::KernelExt)
|
|
105
|
+
::Kernel.prepend(LegacyForkTracking::KernelExtPrivate)
|
|
106
|
+
::Kernel.singleton_class.prepend(LegacyForkTracking::KernelExt)
|
|
107
|
+
::IO.singleton_class.prepend(LegacyForkTracking::IOExt)
|
|
108
|
+
end
|
|
109
|
+
end
|
data/lib/ffi/function.rb
CHANGED
|
@@ -51,6 +51,29 @@ module FFI
|
|
|
51
51
|
end
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
+
if RUBY_PLATFORM == 'aarch64-mingw-ucrt'
|
|
55
|
+
# Use a workaround for https://github.com/libffi/libffi/issues/905
|
|
56
|
+
def attach(mod, name)
|
|
57
|
+
this = self
|
|
58
|
+
body = proc do |*args, &block|
|
|
59
|
+
this.call(*args, &block)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
mod.define_method(name, body)
|
|
63
|
+
mod.define_singleton_method(name, body)
|
|
64
|
+
|
|
65
|
+
# Store function Proc's for re-definition as Ractor-shareable in Library#freeze
|
|
66
|
+
funcs = mod.instance_variable_get("@ffi_function_procs")
|
|
67
|
+
unless funcs
|
|
68
|
+
funcs = {}
|
|
69
|
+
mod.instance_variable_set("@ffi_function_procs", funcs)
|
|
70
|
+
end
|
|
71
|
+
funcs[name] = self
|
|
72
|
+
|
|
73
|
+
self
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
54
77
|
# Stash the Function in a module variable so it can be inspected by attached_functions.
|
|
55
78
|
# On CRuby it also ensures that it does not get garbage collected.
|
|
56
79
|
module RegisterAttach
|
data/lib/ffi/library.rb
CHANGED
|
@@ -287,7 +287,7 @@ module FFI
|
|
|
287
287
|
if type.is_a?(Class) && type < FFI::Struct
|
|
288
288
|
# If it is a global struct, just attach directly to the pointer
|
|
289
289
|
s = s = type.new(address) # Assigning twice to suppress unused variable warning
|
|
290
|
-
self.module_eval
|
|
290
|
+
self.module_eval(<<-code, __FILE__, __LINE__)
|
|
291
291
|
@ffi_gsvars = {} unless defined?(@ffi_gsvars)
|
|
292
292
|
@ffi_gsvars[#{mname.inspect}] = s
|
|
293
293
|
def self.#{mname}
|
|
@@ -302,7 +302,7 @@ module FFI
|
|
|
302
302
|
#
|
|
303
303
|
# Attach to this module as mname/mname=
|
|
304
304
|
#
|
|
305
|
-
self.module_eval
|
|
305
|
+
self.module_eval(<<-code, __FILE__, __LINE__)
|
|
306
306
|
@ffi_gvars = {} unless defined?(@ffi_gvars)
|
|
307
307
|
@ffi_gvars[#{mname.inspect}] = s
|
|
308
308
|
def self.#{mname}
|
|
@@ -564,12 +564,28 @@ module FFI
|
|
|
564
564
|
# Freeze all definitions of the module
|
|
565
565
|
#
|
|
566
566
|
# This freezes the module's definitions, so that it can be used in a Ractor.
|
|
567
|
-
# No further
|
|
567
|
+
# No further functions or variables can be attached and no further enums or typedefs can be created in this module afterwards.
|
|
568
568
|
def freeze
|
|
569
|
+
# @ffi_function_procs is only used on aarch64-mingw-ucrt
|
|
570
|
+
instance_variable_get("@ffi_function_procs")&.each do |name, func|
|
|
571
|
+
# Redefine attached functions as Ractor-shareable.
|
|
572
|
+
# The function Proc can't be shareable from the beginning, since it references enums and typedefs.
|
|
573
|
+
this = FFI.make_shareable(func)
|
|
574
|
+
body = FFI.shareable_proc(self: nil) do |*args, &block|
|
|
575
|
+
this.call(*args, &block)
|
|
576
|
+
end
|
|
577
|
+
undef_method(name)
|
|
578
|
+
singleton_class.undef_method(name)
|
|
579
|
+
|
|
580
|
+
define_method(name, body)
|
|
581
|
+
define_singleton_method(name, body)
|
|
582
|
+
end
|
|
583
|
+
|
|
569
584
|
instance_variables.each do |name|
|
|
570
585
|
var = instance_variable_get(name)
|
|
571
586
|
FFI.make_shareable(var)
|
|
572
587
|
end
|
|
588
|
+
super
|
|
573
589
|
nil
|
|
574
590
|
end
|
|
575
591
|
end
|
data/lib/ffi/version.rb
CHANGED
data/samples/hello_ractor.rb
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
|
+
# See the ffi wiki for how to use FFI with Ractors:
|
|
2
|
+
# https://github.com/ffi/ffi/wiki/Ractors
|
|
3
|
+
|
|
1
4
|
require 'ffi'
|
|
2
5
|
|
|
6
|
+
class Ractor
|
|
7
|
+
# compat with Ruby-3.4 and older
|
|
8
|
+
alias value take unless method_defined? :value
|
|
9
|
+
end
|
|
10
|
+
|
|
3
11
|
module Foo
|
|
4
12
|
extend FFI::Library
|
|
5
13
|
ffi_lib FFI::Library::LIBC
|
|
@@ -8,4 +16,4 @@ module Foo
|
|
|
8
16
|
end
|
|
9
17
|
Ractor.new do
|
|
10
18
|
Foo.cputs("Hello, World via libc puts using FFI in a Ractor")
|
|
11
|
-
end.
|
|
19
|
+
end.value
|
data/samples/qsort_ractor.rb
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
|
+
# See the ffi wiki for how to use FFI with Ractors:
|
|
2
|
+
# https://github.com/ffi/ffi/wiki/Ractors
|
|
3
|
+
|
|
1
4
|
require 'ffi'
|
|
2
5
|
|
|
6
|
+
class Ractor
|
|
7
|
+
# compat with Ruby-3.4 and older
|
|
8
|
+
alias value take unless method_defined? :value
|
|
9
|
+
end
|
|
10
|
+
|
|
3
11
|
module LibC
|
|
4
12
|
extend FFI::Library
|
|
5
13
|
ffi_lib FFI::Library::LIBC
|
|
@@ -23,6 +31,6 @@ res = Ractor.new(p) do |p|
|
|
|
23
31
|
i1 < i2 ? -1 : i1 > i2 ? 1 : 0
|
|
24
32
|
end
|
|
25
33
|
puts "After qsort #{p.get_array_of_int32(0, 3).join(', ')}"
|
|
26
|
-
end.
|
|
34
|
+
end.value
|
|
27
35
|
|
|
28
36
|
puts "After ractor termination #{p.get_array_of_int32(0, 3).join(', ')}"
|
data/sig/ffi/auto_pointer.rbs
CHANGED
|
@@ -12,8 +12,7 @@ module FFI
|
|
|
12
12
|
def release: (Pointer ptr) -> void
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
def initialize: (Pointer pointer, Method | ^(
|
|
16
|
-
# | (Pointer pointer) { (self) -> void } -> self # https://github.com/ffi/ffi/issues/1071
|
|
15
|
+
def initialize: (Pointer pointer, Method | ^(instance) -> void | Releaser::_Proc[instance] callable) -> self
|
|
17
16
|
| (Pointer pointer) -> self # where class < `def self.release: (instance pointer) -> void`
|
|
18
17
|
|
|
19
18
|
extend DataConverter[Pointer, instance, nil]
|
data/sig/ffi/errno.rbs
ADDED
data/sig/ffi/library.rbs
CHANGED
|
@@ -33,7 +33,7 @@ module FFI
|
|
|
33
33
|
def find_type: (ffi_lib_type t) -> Type
|
|
34
34
|
def freeze: () -> void
|
|
35
35
|
def function_names: (_ToS name, Array[Type | singleton(Struct)] arg_types) -> Array[String]
|
|
36
|
-
def typedef: [T < Type] (T old, Symbol | DataConverter add, ?untyped) -> T
|
|
36
|
+
def typedef: [T < Type, N, R, C] (T old, Symbol | DataConverter[N, R, C] add, ?untyped) -> T
|
|
37
37
|
| (Symbol old, Symbol add, ?untyped) -> (Type | Enum)
|
|
38
38
|
| [X < DataConverter[N, R, C], N, R, C] (X old, Symbol add, ?untyped) -> Type::Mapped[X, N, R, C]
|
|
39
39
|
| (:enum old, Array[Symbol | Integer] add, ?untyped) -> Enum
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module FFI
|
|
2
|
+
class PlatformError < LoadError
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
module Platform
|
|
6
|
+
OS: String
|
|
7
|
+
|
|
8
|
+
OSVERSION: Integer
|
|
9
|
+
|
|
10
|
+
CPU: String
|
|
11
|
+
|
|
12
|
+
ARCH: String
|
|
13
|
+
|
|
14
|
+
IS_GNU: bool
|
|
15
|
+
IS_LINUX: bool
|
|
16
|
+
IS_MAC: bool
|
|
17
|
+
IS_FREEBSD: bool
|
|
18
|
+
IS_NETBSD: bool
|
|
19
|
+
IS_OPENBSD: bool
|
|
20
|
+
IS_DRAGONFLYBSD: bool
|
|
21
|
+
IS_SOLARIS: bool
|
|
22
|
+
IS_WINDOWS: bool
|
|
23
|
+
IS_BSD: bool
|
|
24
|
+
|
|
25
|
+
NAME: String
|
|
26
|
+
|
|
27
|
+
CONF_DIR: String
|
|
28
|
+
|
|
29
|
+
LIBPREFIX: String
|
|
30
|
+
|
|
31
|
+
LIBSUFFIX: String
|
|
32
|
+
|
|
33
|
+
LIBC: String
|
|
34
|
+
|
|
35
|
+
LITTLE_ENDIAN: Integer
|
|
36
|
+
|
|
37
|
+
BIG_ENDIAN: Integer
|
|
38
|
+
|
|
39
|
+
def self.bsd?: () -> bool
|
|
40
|
+
def self.windows?: () -> bool
|
|
41
|
+
def self.mac?: () -> bool
|
|
42
|
+
def self.solaris?: () -> bool
|
|
43
|
+
def self.unix?: () -> bool
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def self.is_os: (String os) -> bool
|
|
48
|
+
end
|
|
49
|
+
end
|
data/sig/ffi/struct.rbs
CHANGED
|
@@ -4,7 +4,7 @@ module FFI
|
|
|
4
4
|
|
|
5
5
|
type ptr = Type::Mapped[
|
|
6
6
|
StructByReference[Struct[AbstractMemory, untyped], AbstractMemory],
|
|
7
|
-
AbstractMemory,
|
|
7
|
+
AbstractMemory, Struct[AbstractMemory, untyped], untyped
|
|
8
8
|
]
|
|
9
9
|
def self.ptr: (?untyped flags) -> ptr # https://github.com/ffi/ffi/issues/1073
|
|
10
10
|
alias self.by_ref self.ptr
|
|
@@ -22,7 +22,7 @@ module FFI
|
|
|
22
22
|
|
|
23
23
|
def self.auto_ptr: () -> Type::Mapped[
|
|
24
24
|
ManagedStructConverter[ManagedStruct[AutoPointer, untyped], AutoPointer],
|
|
25
|
-
Pointer,
|
|
25
|
+
Pointer, ManagedStruct[AutoPointer, untyped], untyped
|
|
26
26
|
]
|
|
27
27
|
def self.layout: (*layout | Integer) -> StructLayout
|
|
28
28
|
| (Hash[Symbol, layout]) -> StructLayout
|
data/sig/ffi.rbs
CHANGED
|
@@ -14,9 +14,12 @@ module FFI
|
|
|
14
14
|
CURRENT_PROCESS: current_process
|
|
15
15
|
USE_THIS_PROCESS_AS_LIBRARY: current_process
|
|
16
16
|
|
|
17
|
+
class NotFoundError < LoadError
|
|
18
|
+
end
|
|
19
|
+
|
|
17
20
|
private def self.custom_typedefs: () -> type_map
|
|
18
21
|
def self.errno: () -> Integer
|
|
19
|
-
def self.errno=: (Integer) ->
|
|
22
|
+
def self.errno=: (Integer) -> Integer
|
|
20
23
|
def self.find_type: (ffi_auto_type name, ?type_map? type_map) -> Type
|
|
21
24
|
def self.make_shareable: [T] (T obj) -> T
|
|
22
25
|
def self.map_library_name: (_ToS lib) -> String
|
data.tar.gz.sig
CHANGED
|
Binary file
|