ffi 1.9.18 → 1.9.23
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 +5 -5
- data/.gitignore +22 -0
- data/.gitmodules +3 -0
- data/.travis.yml +52 -0
- data/.yardopts +5 -0
- data/Gemfile +15 -0
- data/{spec/ffi/LICENSE.SPECS → LICENSE.SPECS} +1 -1
- data/README.md +3 -4
- data/Rakefile +41 -5
- data/appveyor.yml +22 -0
- data/ext/ffi_c/AbstractMemory.c +6 -1
- data/ext/ffi_c/Call.c +1 -22
- data/ext/ffi_c/Call.h +0 -9
- data/ext/ffi_c/Closure.c +54 -0
- data/ext/ffi_c/{ClosurePool.h → Closure.h} +13 -23
- data/ext/ffi_c/Function.c +16 -25
- data/ext/ffi_c/Function.h +1 -2
- data/ext/ffi_c/FunctionInfo.c +0 -4
- data/ext/ffi_c/MethodHandle.c +33 -268
- data/ext/ffi_c/Platform.c +10 -2
- data/ext/ffi_c/extconf.rb +10 -5
- data/ext/ffi_c/ffi.c +2 -2
- data/ext/ffi_c/libffi/.appveyor.yml +48 -0
- data/ext/ffi_c/libffi/.gitignore +36 -0
- data/ext/ffi_c/libffi/.travis/install.sh +14 -0
- data/ext/ffi_c/libffi/.travis.yml +30 -0
- data/ext/ffi_c/libffi/ChangeLog.libffi +2 -2
- data/ext/ffi_c/libffi/{ChangeLog → ChangeLog.libffi-3.1} +1402 -2
- data/ext/ffi_c/libffi/ChangeLog.v1 +1 -1
- data/ext/ffi_c/libffi/LICENSE +1 -1
- data/ext/ffi_c/libffi/Makefile.am +169 -158
- data/ext/ffi_c/libffi/Makefile.in +927 -938
- data/ext/ffi_c/libffi/README +164 -52
- data/ext/ffi_c/libffi/acinclude.m4 +387 -0
- data/ext/ffi_c/libffi/autogen.sh +2 -0
- data/ext/ffi_c/libffi/config.guess +336 -371
- data/ext/ffi_c/libffi/config.sub +246 -115
- data/ext/ffi_c/libffi/configure +6976 -2189
- data/ext/ffi_c/libffi/configure.ac +148 -256
- data/ext/ffi_c/libffi/configure.host +277 -4
- data/ext/ffi_c/libffi/doc/Makefile.am +3 -0
- data/ext/ffi_c/libffi/doc/Makefile.in +811 -0
- data/ext/ffi_c/libffi/doc/libffi.texi +430 -45
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +24 -13
- data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +203 -0
- data/ext/ffi_c/libffi/include/Makefile.am +3 -3
- data/ext/ffi_c/libffi/include/Makefile.in +188 -71
- data/ext/ffi_c/libffi/include/ffi.h.in +112 -50
- data/ext/ffi_c/libffi/include/ffi_cfi.h +55 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +32 -11
- data/ext/ffi_c/libffi/install-sh +190 -202
- data/ext/ffi_c/libffi/libffi.map.in +80 -0
- data/ext/ffi_c/libffi/libffi.pc.in +3 -2
- data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +1043 -0
- data/ext/ffi_c/libffi/libtool-ldflags +106 -0
- data/ext/ffi_c/libffi/libtool-version +1 -1
- data/ext/ffi_c/libffi/ltmain.sh +3553 -2033
- data/ext/ffi_c/libffi/m4/asmcfi.m4 +13 -0
- data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +69 -0
- data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +13 -8
- data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +31 -104
- data/ext/ffi_c/libffi/m4/{ax_check_compiler_flags.m4 → ax_check_compile_flag.m4} +30 -34
- data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +32 -11
- data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +6 -5
- data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +31 -21
- data/ext/ffi_c/libffi/man/Makefile.am +2 -2
- data/ext/ffi_c/libffi/man/Makefile.in +141 -49
- data/ext/ffi_c/libffi/man/ffi.3 +10 -0
- data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +6 -4
- data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +73 -0
- data/ext/ffi_c/libffi/missing +150 -311
- data/ext/ffi_c/libffi/msvcc.sh +72 -9
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +964 -0
- data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +81 -0
- data/ext/ffi_c/libffi/src/aarch64/internal.h +67 -0
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +438 -0
- data/ext/ffi_c/libffi/src/alpha/ffi.c +335 -98
- data/ext/ffi_c/libffi/src/alpha/ffitarget.h +10 -1
- data/ext/ffi_c/libffi/src/alpha/internal.h +23 -0
- data/ext/ffi_c/libffi/src/alpha/osf.S +161 -266
- data/ext/ffi_c/libffi/src/arc/arcompact.S +135 -0
- data/ext/ffi_c/libffi/src/arc/ffi.c +266 -0
- data/ext/ffi_c/libffi/src/arc/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/arm/ffi.c +608 -517
- data/ext/ffi_c/libffi/src/arm/ffitarget.h +24 -7
- data/ext/ffi_c/libffi/src/arm/internal.h +7 -0
- data/ext/ffi_c/libffi/src/arm/sysv.S +303 -417
- data/ext/ffi_c/libffi/src/avr32/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/bfin/ffi.c +196 -0
- data/ext/ffi_c/libffi/src/bfin/ffitarget.h +43 -0
- data/ext/ffi_c/libffi/src/bfin/sysv.S +179 -0
- data/ext/ffi_c/libffi/src/closures.c +366 -45
- data/ext/ffi_c/libffi/src/cris/ffi.c +10 -7
- data/ext/ffi_c/libffi/src/cris/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/debug.c +6 -1
- data/ext/ffi_c/libffi/src/dlmalloc.c +16 -11
- data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
- data/ext/ffi_c/libffi/src/frv/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/ia64/ffi.c +11 -7
- data/ext/ffi_c/libffi/src/ia64/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/ia64/unix.S +2 -0
- data/ext/ffi_c/libffi/src/java_raw_api.c +23 -5
- data/ext/ffi_c/libffi/src/m32r/ffi.c +1 -1
- data/ext/ffi_c/libffi/src/m32r/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/m68k/ffi.c +87 -13
- data/ext/ffi_c/libffi/src/m68k/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/m68k/sysv.S +119 -32
- data/ext/ffi_c/libffi/src/m88k/ffi.c +400 -0
- data/ext/ffi_c/libffi/src/m88k/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/m88k/obsd.S +209 -0
- data/ext/ffi_c/libffi/src/metag/ffi.c +330 -0
- data/ext/ffi_c/libffi/{fficonfig.hw → src/metag/ffitarget.h} +22 -26
- data/ext/ffi_c/libffi/src/metag/sysv.S +311 -0
- data/ext/ffi_c/libffi/src/microblaze/ffi.c +321 -0
- data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/microblaze/sysv.S +302 -0
- data/ext/ffi_c/libffi/src/mips/ffi.c +103 -28
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +10 -3
- data/ext/ffi_c/libffi/src/mips/n32.S +128 -56
- data/ext/ffi_c/libffi/src/mips/o32.S +148 -27
- data/ext/ffi_c/libffi/src/moxie/eabi.S +55 -82
- data/ext/ffi_c/libffi/src/moxie/ffi.c +40 -44
- data/ext/ffi_c/libffi/src/moxie/ffitarget.h +52 -0
- data/ext/ffi_c/libffi/src/nios2/ffi.c +304 -0
- data/ext/ffi_c/libffi/src/nios2/ffitarget.h +52 -0
- data/ext/ffi_c/libffi/src/nios2/sysv.S +136 -0
- data/ext/ffi_c/libffi/src/or1k/ffi.c +328 -0
- data/ext/ffi_c/libffi/src/or1k/ffitarget.h +58 -0
- data/ext/ffi_c/libffi/src/or1k/sysv.S +107 -0
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +8 -1
- data/ext/ffi_c/libffi/src/powerpc/aix.S +245 -7
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +253 -4
- data/ext/ffi_c/libffi/src/powerpc/asm.h +2 -2
- data/ext/ffi_c/libffi/src/powerpc/darwin.S +2 -7
- data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +22 -26
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +103 -1378
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +111 -30
- data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +945 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +94 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +923 -0
- data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +103 -44
- data/ext/ffi_c/libffi/src/powerpc/linux64.S +100 -59
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +360 -108
- data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +138 -68
- data/ext/ffi_c/libffi/src/powerpc/sysv.S +68 -112
- data/ext/ffi_c/libffi/src/prep_cif.c +108 -24
- data/ext/ffi_c/libffi/src/raw_api.c +18 -5
- data/ext/ffi_c/libffi/src/s390/ffi.c +294 -318
- data/ext/ffi_c/libffi/src/s390/ffitarget.h +9 -1
- data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
- data/ext/ffi_c/libffi/src/s390/sysv.S +257 -366
- data/ext/ffi_c/libffi/src/sh/ffi.c +4 -3
- data/ext/ffi_c/libffi/src/sh/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/sh64/ffi.c +3 -2
- data/ext/ffi_c/libffi/src/sh64/ffitarget.h +6 -1
- data/ext/ffi_c/libffi/src/sparc/ffi.c +326 -527
- data/ext/ffi_c/libffi/src/sparc/ffi64.c +608 -0
- data/ext/ffi_c/libffi/src/sparc/ffitarget.h +20 -7
- data/ext/ffi_c/libffi/src/sparc/internal.h +26 -0
- data/ext/ffi_c/libffi/src/sparc/v8.S +364 -234
- data/ext/ffi_c/libffi/src/sparc/v9.S +340 -207
- data/ext/ffi_c/libffi/src/tile/ffi.c +355 -0
- data/ext/ffi_c/libffi/src/tile/ffitarget.h +65 -0
- data/ext/ffi_c/libffi/src/tile/tile.S +360 -0
- data/ext/ffi_c/libffi/src/types.c +43 -14
- data/ext/ffi_c/libffi/src/vax/elfbsd.S +195 -0
- data/ext/ffi_c/libffi/src/vax/ffi.c +276 -0
- data/ext/ffi_c/libffi/src/vax/ffitarget.h +49 -0
- data/ext/ffi_c/libffi/src/x86/asmnames.h +30 -0
- data/ext/ffi_c/libffi/src/x86/ffi.c +591 -500
- data/ext/ffi_c/libffi/src/x86/ffi64.c +359 -116
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +55 -35
- data/ext/ffi_c/libffi/src/x86/ffiw64.c +287 -0
- data/ext/ffi_c/libffi/src/x86/internal.h +29 -0
- data/ext/ffi_c/libffi/src/x86/internal64.h +22 -0
- data/ext/ffi_c/libffi/src/x86/sysv.S +975 -400
- data/ext/ffi_c/libffi/src/x86/unix64.S +398 -299
- data/ext/ffi_c/libffi/src/x86/win64.S +222 -458
- data/ext/ffi_c/libffi/src/x86/win64_intel.S +237 -0
- data/ext/ffi_c/libffi/src/xtensa/ffi.c +298 -0
- data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +53 -0
- data/ext/ffi_c/libffi/src/xtensa/sysv.S +253 -0
- data/ext/ffi_c/libffi/stamp-h.in +1 -0
- data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -73
- data/ext/ffi_c/libffi/testsuite/Makefile.in +219 -111
- data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +121 -25
- data/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +21 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +46 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/{closure_stdcall.c → closure_simple.c} +7 -16
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c +95 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +4 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +4 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +4 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +10 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +3 -3
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +10 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +70 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +55 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +11 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +114 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +45 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +45 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +23 -40
- data/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +3 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +6 -4
- data/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +4 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +107 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +18 -19
- data/ext/ffi_c/libffi/testsuite/libffi.call/many.c +6 -16
- data/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +57 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +70 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +78 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +0 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +8 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +121 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +6 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +46 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +127 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +7 -7
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +7 -7
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +5 -5
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +49 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +49 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +55 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +9 -7
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +7 -7
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +7 -6
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +9 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +9 -9
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +61 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest.cc +3 -10
- data/ext/ffi_c/libffi/testsuite/{libffi.special → libffi.call}/unwindtest_ffi_call.cc +2 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +196 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +121 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +123 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +125 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +91 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +42 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +71 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +80 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +16 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/{libffi.special/special.exp → libffi.complex/complex.exp} +9 -8
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +51 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +7 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +7 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +7 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +86 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +78 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +37 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +41 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +44 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +10 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +34 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +28 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +36 -0
- data/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +19 -0
- data/ext/ffi_c/libffi.bsd.mk +11 -5
- data/ext/ffi_c/libffi.darwin.mk +14 -4
- data/ext/ffi_c/libffi.gnu.mk +3 -2
- data/ext/ffi_c/libffi.mk +10 -5
- data/ext/ffi_c/libffi.vc.mk +1 -1
- data/ext/ffi_c/libffi.vc64.mk +1 -1
- data/ffi.gemspec +16 -3
- data/lib/ffi/enum.rb +124 -0
- data/lib/ffi/library.rb +66 -14
- data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
- data/lib/ffi/platform/x86_64-windows/types.conf +113 -20
- data/lib/ffi/platform.rb +7 -2
- data/lib/ffi/pointer.rb +1 -0
- data/lib/ffi/struct.rb +0 -2
- data/lib/ffi/version.rb +1 -2
- data/samples/getlogin.rb +8 -0
- data/samples/getpid.rb +8 -0
- data/samples/gettimeofday.rb +18 -0
- data/samples/hello.rb +7 -0
- data/samples/inotify.rb +60 -0
- data/samples/pty.rb +76 -0
- data/samples/qsort.rb +21 -0
- data/samples/sample_helper.rb +6 -0
- metadata +164 -115
- data/ext/ffi_c/ClosurePool.c +0 -283
- data/ext/ffi_c/libffi/Makefile.vc +0 -141
- data/ext/ffi_c/libffi/Makefile.vc64 +0 -141
- data/ext/ffi_c/libffi/aclocal.m4 +0 -1873
- data/ext/ffi_c/libffi/build-ios.sh +0 -67
- data/ext/ffi_c/libffi/compile +0 -143
- data/ext/ffi_c/libffi/depcomp +0 -630
- data/ext/ffi_c/libffi/doc/libffi.info +0 -593
- data/ext/ffi_c/libffi/doc/stamp-vti +0 -4
- data/ext/ffi_c/libffi/include/ffi.h.vc +0 -427
- data/ext/ffi_c/libffi/include/ffi.h.vc64 +0 -427
- data/ext/ffi_c/libffi/m4/libtool.m4 +0 -7831
- data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -369
- data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -123
- data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
- data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -98
- data/ext/ffi_c/libffi/mdate-sh +0 -201
- data/ext/ffi_c/libffi/src/arm/gentramp.sh +0 -118
- data/ext/ffi_c/libffi/src/arm/trampoline.S +0 -4450
- data/ext/ffi_c/libffi/src/x86/darwin.S +0 -444
- data/ext/ffi_c/libffi/src/x86/darwin64.S +0 -416
- data/ext/ffi_c/libffi/src/x86/freebsd.S +0 -458
- data/ext/ffi_c/libffi/src/x86/win32.S +0 -1065
- data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +0 -300
- data/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c +0 -63
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c +0 -44
- data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +0 -96
- data/ext/ffi_c/libffi/texinfo.tex +0 -7210
- data/gen/Rakefile +0 -30
- data/libtest/Benchmark.c +0 -52
- data/libtest/BoolTest.c +0 -34
- data/libtest/BufferTest.c +0 -31
- data/libtest/ClosureTest.c +0 -205
- data/libtest/EnumTest.c +0 -51
- data/libtest/FunctionTest.c +0 -70
- data/libtest/GNUmakefile +0 -149
- data/libtest/GlobalVariable.c +0 -62
- data/libtest/LastErrorTest.c +0 -21
- data/libtest/NumberTest.c +0 -132
- data/libtest/PointerTest.c +0 -63
- data/libtest/ReferenceTest.c +0 -23
- data/libtest/StringTest.c +0 -34
- data/libtest/StructTest.c +0 -243
- data/libtest/UnionTest.c +0 -43
- data/libtest/VariadicTest.c +0 -99
- data/spec/ffi/async_callback_spec.rb +0 -35
- data/spec/ffi/bool_spec.rb +0 -32
- data/spec/ffi/buffer_spec.rb +0 -279
- data/spec/ffi/callback_spec.rb +0 -773
- data/spec/ffi/custom_param_type.rb +0 -37
- data/spec/ffi/custom_type_spec.rb +0 -74
- data/spec/ffi/dup_spec.rb +0 -52
- data/spec/ffi/enum_spec.rb +0 -423
- data/spec/ffi/errno_spec.rb +0 -20
- data/spec/ffi/ffi_spec.rb +0 -28
- data/spec/ffi/fixtures/Benchmark.c +0 -52
- data/spec/ffi/fixtures/BoolTest.c +0 -34
- data/spec/ffi/fixtures/BufferTest.c +0 -31
- data/spec/ffi/fixtures/ClosureTest.c +0 -205
- data/spec/ffi/fixtures/EnumTest.c +0 -51
- data/spec/ffi/fixtures/FunctionTest.c +0 -142
- data/spec/ffi/fixtures/GNUmakefile +0 -149
- data/spec/ffi/fixtures/GlobalVariable.c +0 -62
- data/spec/ffi/fixtures/LastErrorTest.c +0 -21
- data/spec/ffi/fixtures/NumberTest.c +0 -132
- data/spec/ffi/fixtures/PipeHelper.h +0 -21
- data/spec/ffi/fixtures/PipeHelperPosix.c +0 -41
- data/spec/ffi/fixtures/PipeHelperWindows.c +0 -72
- data/spec/ffi/fixtures/PointerTest.c +0 -63
- data/spec/ffi/fixtures/ReferenceTest.c +0 -23
- data/spec/ffi/fixtures/StringTest.c +0 -34
- data/spec/ffi/fixtures/StructTest.c +0 -243
- data/spec/ffi/fixtures/UnionTest.c +0 -43
- data/spec/ffi/fixtures/VariadicTest.c +0 -99
- data/spec/ffi/fixtures/classes.rb +0 -438
- data/spec/ffi/function_spec.rb +0 -97
- data/spec/ffi/io_spec.rb +0 -16
- data/spec/ffi/library_spec.rb +0 -286
- data/spec/ffi/long_double.rb +0 -30
- data/spec/ffi/managed_struct_spec.rb +0 -68
- data/spec/ffi/memorypointer_spec.rb +0 -78
- data/spec/ffi/number_spec.rb +0 -247
- data/spec/ffi/platform_spec.rb +0 -114
- data/spec/ffi/pointer_spec.rb +0 -285
- data/spec/ffi/rbx/attach_function_spec.rb +0 -34
- data/spec/ffi/rbx/memory_pointer_spec.rb +0 -194
- data/spec/ffi/rbx/spec_helper.rb +0 -6
- data/spec/ffi/rbx/struct_spec.rb +0 -18
- data/spec/ffi/spec_helper.rb +0 -93
- data/spec/ffi/string_spec.rb +0 -118
- data/spec/ffi/strptr_spec.rb +0 -50
- data/spec/ffi/struct_by_ref_spec.rb +0 -43
- data/spec/ffi/struct_callback_spec.rb +0 -69
- data/spec/ffi/struct_initialize_spec.rb +0 -35
- data/spec/ffi/struct_packed_spec.rb +0 -50
- data/spec/ffi/struct_spec.rb +0 -886
- data/spec/ffi/typedef_spec.rb +0 -91
- data/spec/ffi/union_spec.rb +0 -67
- data/spec/ffi/variadic_spec.rb +0 -132
- data/spec/spec.opts +0 -4
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
#include <stdlib.h>
|
|
34
34
|
|
|
35
35
|
extern void ffi_closure_ASM (void);
|
|
36
|
+
extern void ffi_go_closure_ASM (void);
|
|
36
37
|
|
|
37
38
|
enum {
|
|
38
39
|
/* The assembly depends on these exact flags.
|
|
@@ -255,7 +256,7 @@ ffi_prep_args (extended_cif *ecif, unsigned long *const stack)
|
|
|
255
256
|
case FFI_TYPE_STRUCT:
|
|
256
257
|
size_al = (*ptr)->size;
|
|
257
258
|
#if defined(POWERPC_DARWIN64)
|
|
258
|
-
next_arg = (unsigned long *)
|
|
259
|
+
next_arg = (unsigned long *)FFI_ALIGN((char *)next_arg, (*ptr)->alignment);
|
|
259
260
|
darwin64_pass_struct_by_value (*ptr, (char *) *p_argv,
|
|
260
261
|
(unsigned) size_al,
|
|
261
262
|
(unsigned int *) &fparg_count,
|
|
@@ -266,7 +267,7 @@ ffi_prep_args (extended_cif *ecif, unsigned long *const stack)
|
|
|
266
267
|
/* If the first member of the struct is a double, then include enough
|
|
267
268
|
padding in the struct size to align it to double-word. */
|
|
268
269
|
if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE)
|
|
269
|
-
size_al =
|
|
270
|
+
size_al = FFI_ALIGN((*ptr)->size, 8);
|
|
270
271
|
|
|
271
272
|
# if defined(POWERPC64)
|
|
272
273
|
FFI_ASSERT (abi != FFI_DARWIN);
|
|
@@ -302,10 +303,10 @@ ffi_prep_args (extended_cif *ecif, unsigned long *const stack)
|
|
|
302
303
|
}
|
|
303
304
|
|
|
304
305
|
/* Check that we didn't overrun the stack... */
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
306
|
+
/* FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS);
|
|
307
|
+
FFI_ASSERT((unsigned *)fpr_base
|
|
308
|
+
<= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS);
|
|
309
|
+
FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); */
|
|
309
310
|
}
|
|
310
311
|
|
|
311
312
|
#if defined(POWERPC_DARWIN64)
|
|
@@ -352,7 +353,7 @@ darwin64_struct_size_exceeds_gprs_p (ffi_type *s, char *src, unsigned *nfpr)
|
|
|
352
353
|
ffi_type *p = s->elements[i];
|
|
353
354
|
/* Find the start of this item (0 for the first one). */
|
|
354
355
|
if (i > 0)
|
|
355
|
-
struct_offset =
|
|
356
|
+
struct_offset = FFI_ALIGN(struct_offset, p->alignment);
|
|
356
357
|
|
|
357
358
|
item_base = src + struct_offset;
|
|
358
359
|
|
|
@@ -436,7 +437,7 @@ darwin64_pass_struct_floats (ffi_type *s, char *src,
|
|
|
436
437
|
ffi_type *p = s->elements[i];
|
|
437
438
|
/* Find the start of this item (0 for the first one). */
|
|
438
439
|
if (i > 0)
|
|
439
|
-
struct_offset =
|
|
440
|
+
struct_offset = FFI_ALIGN(struct_offset, p->alignment);
|
|
440
441
|
item_base = src + struct_offset;
|
|
441
442
|
|
|
442
443
|
switch (p->type)
|
|
@@ -527,7 +528,7 @@ darwin64_struct_floats_to_mem (ffi_type *s, char *dest, double *fprs, unsigned *
|
|
|
527
528
|
ffi_type *p = s->elements[i];
|
|
528
529
|
/* Find the start of this item (0 for the first one). */
|
|
529
530
|
if (i > 0)
|
|
530
|
-
struct_offset =
|
|
531
|
+
struct_offset = FFI_ALIGN(struct_offset, p->alignment);
|
|
531
532
|
item_base = dest + struct_offset;
|
|
532
533
|
|
|
533
534
|
switch (p->type)
|
|
@@ -593,7 +594,7 @@ darwin_adjust_aggregate_sizes (ffi_type *s)
|
|
|
593
594
|
/* Natural alignment for all items. */
|
|
594
595
|
align = p->alignment;
|
|
595
596
|
#else
|
|
596
|
-
/*
|
|
597
|
+
/* Natural alignment for the first item... */
|
|
597
598
|
if (i == 0)
|
|
598
599
|
align = p->alignment;
|
|
599
600
|
else if (p->alignment == 16 || p->alignment < 4)
|
|
@@ -604,10 +605,10 @@ darwin_adjust_aggregate_sizes (ffi_type *s)
|
|
|
604
605
|
align = 4;
|
|
605
606
|
#endif
|
|
606
607
|
/* Pad, if necessary, before adding the current item. */
|
|
607
|
-
s->size =
|
|
608
|
+
s->size = FFI_ALIGN(s->size, align) + p->size;
|
|
608
609
|
}
|
|
609
610
|
|
|
610
|
-
s->size =
|
|
611
|
+
s->size = FFI_ALIGN(s->size, s->alignment);
|
|
611
612
|
|
|
612
613
|
/* This should not be necessary on m64, but harmless. */
|
|
613
614
|
if (s->elements[0]->type == FFI_TYPE_UINT64
|
|
@@ -640,10 +641,10 @@ aix_adjust_aggregate_sizes (ffi_type *s)
|
|
|
640
641
|
align = p->alignment;
|
|
641
642
|
if (i != 0 && p->type == FFI_TYPE_DOUBLE)
|
|
642
643
|
align = 4;
|
|
643
|
-
s->size =
|
|
644
|
+
s->size = FFI_ALIGN(s->size, align) + p->size;
|
|
644
645
|
}
|
|
645
646
|
|
|
646
|
-
s->size =
|
|
647
|
+
s->size = FFI_ALIGN(s->size, s->alignment);
|
|
647
648
|
|
|
648
649
|
if (s->elements[0]->type == FFI_TYPE_UINT64
|
|
649
650
|
|| s->elements[0]->type == FFI_TYPE_SINT64
|
|
@@ -809,9 +810,9 @@ ffi_prep_cif_machdep (ffi_cif *cif)
|
|
|
809
810
|
16-byte-aligned. */
|
|
810
811
|
if (fparg_count >= NUM_FPR_ARG_REGISTERS)
|
|
811
812
|
#if defined (POWERPC64)
|
|
812
|
-
intarg_count =
|
|
813
|
+
intarg_count = FFI_ALIGN(intarg_count, 2);
|
|
813
814
|
#else
|
|
814
|
-
intarg_count =
|
|
815
|
+
intarg_count = FFI_ALIGN(intarg_count, 4);
|
|
815
816
|
#endif
|
|
816
817
|
break;
|
|
817
818
|
#endif
|
|
@@ -838,7 +839,7 @@ ffi_prep_cif_machdep (ffi_cif *cif)
|
|
|
838
839
|
#if defined(POWERPC_DARWIN64)
|
|
839
840
|
align_words = (*ptr)->alignment >> 3;
|
|
840
841
|
if (align_words)
|
|
841
|
-
intarg_count =
|
|
842
|
+
intarg_count = FFI_ALIGN(intarg_count, align_words);
|
|
842
843
|
/* Base size of the struct. */
|
|
843
844
|
intarg_count += (size_al + 7) / 8;
|
|
844
845
|
/* If 16 bytes then don't worry about floats. */
|
|
@@ -848,11 +849,11 @@ ffi_prep_cif_machdep (ffi_cif *cif)
|
|
|
848
849
|
#else
|
|
849
850
|
align_words = (*ptr)->alignment >> 2;
|
|
850
851
|
if (align_words)
|
|
851
|
-
intarg_count =
|
|
852
|
+
intarg_count = FFI_ALIGN(intarg_count, align_words);
|
|
852
853
|
/* If the first member of the struct is a double, then align
|
|
853
854
|
the struct to double-word.
|
|
854
855
|
if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE)
|
|
855
|
-
size_al =
|
|
856
|
+
size_al = FFI_ALIGN((*ptr)->size, 8); */
|
|
856
857
|
# ifdef POWERPC64
|
|
857
858
|
intarg_count += (size_al + 7) / 8;
|
|
858
859
|
# else
|
|
@@ -897,7 +898,7 @@ ffi_prep_cif_machdep (ffi_cif *cif)
|
|
|
897
898
|
bytes += NUM_GPR_ARG_REGISTERS * sizeof(long);
|
|
898
899
|
|
|
899
900
|
/* The stack space allocated needs to be a multiple of 16 bytes. */
|
|
900
|
-
bytes =
|
|
901
|
+
bytes = FFI_ALIGN(bytes, 16) ;
|
|
901
902
|
|
|
902
903
|
cif->flags = flags;
|
|
903
904
|
cif->bytes = bytes;
|
|
@@ -908,6 +909,9 @@ ffi_prep_cif_machdep (ffi_cif *cif)
|
|
|
908
909
|
extern void ffi_call_AIX(extended_cif *, long, unsigned, unsigned *,
|
|
909
910
|
void (*fn)(void), void (*fn2)(void));
|
|
910
911
|
|
|
912
|
+
extern void ffi_call_go_AIX(extended_cif *, long, unsigned, unsigned *,
|
|
913
|
+
void (*fn)(void), void (*fn2)(void), void *closure);
|
|
914
|
+
|
|
911
915
|
extern void ffi_call_DARWIN(extended_cif *, long, unsigned, unsigned *,
|
|
912
916
|
void (*fn)(void), void (*fn2)(void), ffi_type*);
|
|
913
917
|
|
|
@@ -946,6 +950,38 @@ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
|
|
|
946
950
|
}
|
|
947
951
|
}
|
|
948
952
|
|
|
953
|
+
void
|
|
954
|
+
ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue,
|
|
955
|
+
void *closure)
|
|
956
|
+
{
|
|
957
|
+
extended_cif ecif;
|
|
958
|
+
|
|
959
|
+
ecif.cif = cif;
|
|
960
|
+
ecif.avalue = avalue;
|
|
961
|
+
|
|
962
|
+
/* If the return value is a struct and we don't have a return
|
|
963
|
+
value address then we need to make one. */
|
|
964
|
+
|
|
965
|
+
if ((rvalue == NULL) &&
|
|
966
|
+
(cif->rtype->type == FFI_TYPE_STRUCT))
|
|
967
|
+
{
|
|
968
|
+
ecif.rvalue = alloca (cif->rtype->size);
|
|
969
|
+
}
|
|
970
|
+
else
|
|
971
|
+
ecif.rvalue = rvalue;
|
|
972
|
+
|
|
973
|
+
switch (cif->abi)
|
|
974
|
+
{
|
|
975
|
+
case FFI_AIX:
|
|
976
|
+
ffi_call_go_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
|
|
977
|
+
FFI_FN(ffi_prep_args), closure);
|
|
978
|
+
break;
|
|
979
|
+
default:
|
|
980
|
+
FFI_ASSERT(0);
|
|
981
|
+
break;
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
|
|
949
985
|
static void flush_icache(char *);
|
|
950
986
|
static void flush_range(char *, int);
|
|
951
987
|
|
|
@@ -1065,15 +1101,39 @@ ffi_prep_closure_loc (ffi_closure* closure,
|
|
|
1065
1101
|
closure->cif = cif;
|
|
1066
1102
|
closure->fun = fun;
|
|
1067
1103
|
closure->user_data = user_data;
|
|
1104
|
+
break;
|
|
1068
1105
|
|
|
1069
1106
|
default:
|
|
1070
|
-
|
|
1071
|
-
FFI_ASSERT(0);
|
|
1107
|
+
return FFI_BAD_ABI;
|
|
1072
1108
|
break;
|
|
1073
1109
|
}
|
|
1074
1110
|
return FFI_OK;
|
|
1075
1111
|
}
|
|
1076
1112
|
|
|
1113
|
+
ffi_status
|
|
1114
|
+
ffi_prep_go_closure (ffi_go_closure* closure,
|
|
1115
|
+
ffi_cif* cif,
|
|
1116
|
+
void (*fun)(ffi_cif*, void*, void**, void*))
|
|
1117
|
+
{
|
|
1118
|
+
switch (cif->abi)
|
|
1119
|
+
{
|
|
1120
|
+
case FFI_AIX:
|
|
1121
|
+
|
|
1122
|
+
FFI_ASSERT (cif->abi == FFI_AIX);
|
|
1123
|
+
|
|
1124
|
+
closure->tramp = (void *)ffi_go_closure_ASM;
|
|
1125
|
+
closure->cif = cif;
|
|
1126
|
+
closure->fun = fun;
|
|
1127
|
+
return FFI_OK;
|
|
1128
|
+
|
|
1129
|
+
// For now, ffi_prep_go_closure is only implemented for AIX, not for Darwin
|
|
1130
|
+
default:
|
|
1131
|
+
return FFI_BAD_ABI;
|
|
1132
|
+
break;
|
|
1133
|
+
}
|
|
1134
|
+
return FFI_OK;
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1077
1137
|
static void
|
|
1078
1138
|
flush_icache(char *addr)
|
|
1079
1139
|
{
|
|
@@ -1108,6 +1168,10 @@ ffi_type *
|
|
|
1108
1168
|
ffi_closure_helper_DARWIN (ffi_closure *, void *,
|
|
1109
1169
|
unsigned long *, ffi_dblfl *);
|
|
1110
1170
|
|
|
1171
|
+
ffi_type *
|
|
1172
|
+
ffi_go_closure_helper_DARWIN (ffi_go_closure*, void *,
|
|
1173
|
+
unsigned long *, ffi_dblfl *);
|
|
1174
|
+
|
|
1111
1175
|
/* Basically the trampoline invokes ffi_closure_ASM, and on
|
|
1112
1176
|
entry, r11 holds the address of the closure.
|
|
1113
1177
|
After storing the registers that could possibly contain
|
|
@@ -1115,8 +1179,10 @@ ffi_closure_helper_DARWIN (ffi_closure *, void *,
|
|
|
1115
1179
|
up space for a return value, ffi_closure_ASM invokes the
|
|
1116
1180
|
following helper function to do most of the work. */
|
|
1117
1181
|
|
|
1118
|
-
ffi_type *
|
|
1119
|
-
|
|
1182
|
+
static ffi_type *
|
|
1183
|
+
ffi_closure_helper_common (ffi_cif* cif,
|
|
1184
|
+
void (*fun)(ffi_cif*, void*, void**, void*),
|
|
1185
|
+
void *user_data, void *rvalue,
|
|
1120
1186
|
unsigned long *pgr, ffi_dblfl *pfr)
|
|
1121
1187
|
{
|
|
1122
1188
|
/* rvalue is the pointer to space for return value in closure assembly
|
|
@@ -1134,14 +1200,12 @@ ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
|
|
|
1134
1200
|
void ** avalue;
|
|
1135
1201
|
ffi_type ** arg_types;
|
|
1136
1202
|
long i, avn;
|
|
1137
|
-
ffi_cif * cif;
|
|
1138
1203
|
ffi_dblfl * end_pfr = pfr + NUM_FPR_ARG_REGISTERS;
|
|
1139
1204
|
unsigned size_al;
|
|
1140
1205
|
#if defined(POWERPC_DARWIN64)
|
|
1141
1206
|
unsigned fpsused = 0;
|
|
1142
1207
|
#endif
|
|
1143
1208
|
|
|
1144
|
-
cif = closure->cif;
|
|
1145
1209
|
avalue = alloca (cif->nargs * sizeof(void *));
|
|
1146
1210
|
|
|
1147
1211
|
if (cif->rtype->type == FFI_TYPE_STRUCT)
|
|
@@ -1208,7 +1272,7 @@ ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
|
|
|
1208
1272
|
case FFI_TYPE_STRUCT:
|
|
1209
1273
|
size_al = arg_types[i]->size;
|
|
1210
1274
|
#if defined(POWERPC_DARWIN64)
|
|
1211
|
-
pgr = (unsigned long *)
|
|
1275
|
+
pgr = (unsigned long *)FFI_ALIGN((char *)pgr, arg_types[i]->alignment);
|
|
1212
1276
|
if (size_al < 3 || size_al == 4)
|
|
1213
1277
|
{
|
|
1214
1278
|
avalue[i] = ((char *)pgr)+8-size_al;
|
|
@@ -1233,9 +1297,9 @@ ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
|
|
|
1233
1297
|
/* If the first member of the struct is a double, then align
|
|
1234
1298
|
the struct to double-word. */
|
|
1235
1299
|
if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE)
|
|
1236
|
-
size_al =
|
|
1300
|
+
size_al = FFI_ALIGN(arg_types[i]->size, 8);
|
|
1237
1301
|
# if defined(POWERPC64)
|
|
1238
|
-
FFI_ASSERT (cif->abi != FFI_DARWIN)
|
|
1302
|
+
FFI_ASSERT (cif->abi != FFI_DARWIN);
|
|
1239
1303
|
avalue[i] = pgr;
|
|
1240
1304
|
pgr += (size_al + 7) / 8;
|
|
1241
1305
|
# else
|
|
@@ -1352,8 +1416,25 @@ ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
|
|
|
1352
1416
|
i++;
|
|
1353
1417
|
}
|
|
1354
1418
|
|
|
1355
|
-
(
|
|
1419
|
+
(fun) (cif, rvalue, avalue, user_data);
|
|
1356
1420
|
|
|
1357
1421
|
/* Tell ffi_closure_ASM to perform return type promotions. */
|
|
1358
1422
|
return cif->rtype;
|
|
1359
1423
|
}
|
|
1424
|
+
|
|
1425
|
+
ffi_type *
|
|
1426
|
+
ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
|
|
1427
|
+
unsigned long *pgr, ffi_dblfl *pfr)
|
|
1428
|
+
{
|
|
1429
|
+
return ffi_closure_helper_common (closure->cif, closure->fun,
|
|
1430
|
+
closure->user_data, rvalue, pgr, pfr);
|
|
1431
|
+
}
|
|
1432
|
+
|
|
1433
|
+
ffi_type *
|
|
1434
|
+
ffi_go_closure_helper_DARWIN (ffi_go_closure *closure, void *rvalue,
|
|
1435
|
+
unsigned long *pgr, ffi_dblfl *pfr)
|
|
1436
|
+
{
|
|
1437
|
+
return ffi_closure_helper_common (closure->cif, closure->fun,
|
|
1438
|
+
closure, rvalue, pgr, pfr);
|
|
1439
|
+
}
|
|
1440
|
+
|