ffi 1.9.21-x86-mingw32 → 1.9.22-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ffi might be problematic. Click here for more details.
- checksums.yaml +4 -4
- 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 +1 -1
- data/Rakefile +28 -3
- data/appveyor.yml +22 -0
- data/ffi.gemspec +14 -1
- data/lib/2.0/ffi_c.so +0 -0
- data/lib/2.1/ffi_c.so +0 -0
- data/lib/2.2/ffi_c.so +0 -0
- data/lib/2.3/ffi_c.so +0 -0
- data/lib/2.4/ffi_c.so +0 -0
- data/lib/2.5/ffi_c.so +0 -0
- data/lib/ffi/library.rb +1 -1
- data/lib/ffi/version.rb +1 -1
- 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 +17 -526
- data/ext/ffi_c/AbstractMemory.c +0 -1109
- data/ext/ffi_c/AbstractMemory.h +0 -175
- data/ext/ffi_c/ArrayType.c +0 -162
- data/ext/ffi_c/ArrayType.h +0 -59
- data/ext/ffi_c/Buffer.c +0 -365
- data/ext/ffi_c/Call.c +0 -517
- data/ext/ffi_c/Call.h +0 -110
- data/ext/ffi_c/ClosurePool.c +0 -283
- data/ext/ffi_c/ClosurePool.h +0 -57
- data/ext/ffi_c/DataConverter.c +0 -91
- data/ext/ffi_c/DynamicLibrary.c +0 -339
- data/ext/ffi_c/DynamicLibrary.h +0 -98
- data/ext/ffi_c/Function.c +0 -998
- data/ext/ffi_c/Function.h +0 -87
- data/ext/ffi_c/FunctionInfo.c +0 -271
- data/ext/ffi_c/LastError.c +0 -184
- data/ext/ffi_c/LastError.h +0 -47
- data/ext/ffi_c/LongDouble.c +0 -63
- data/ext/ffi_c/LongDouble.h +0 -51
- data/ext/ffi_c/MappedType.c +0 -168
- data/ext/ffi_c/MappedType.h +0 -59
- data/ext/ffi_c/MemoryPointer.c +0 -197
- data/ext/ffi_c/MemoryPointer.h +0 -53
- data/ext/ffi_c/MethodHandle.c +0 -358
- data/ext/ffi_c/MethodHandle.h +0 -55
- data/ext/ffi_c/Platform.c +0 -129
- data/ext/ffi_c/Platform.h +0 -45
- data/ext/ffi_c/Pointer.c +0 -508
- data/ext/ffi_c/Pointer.h +0 -63
- data/ext/ffi_c/Struct.c +0 -829
- data/ext/ffi_c/Struct.h +0 -106
- data/ext/ffi_c/StructByReference.c +0 -190
- data/ext/ffi_c/StructByReference.h +0 -50
- data/ext/ffi_c/StructByValue.c +0 -150
- data/ext/ffi_c/StructByValue.h +0 -55
- data/ext/ffi_c/StructLayout.c +0 -698
- data/ext/ffi_c/Thread.c +0 -352
- data/ext/ffi_c/Thread.h +0 -95
- data/ext/ffi_c/Type.c +0 -397
- data/ext/ffi_c/Type.h +0 -62
- data/ext/ffi_c/Types.c +0 -139
- data/ext/ffi_c/Types.h +0 -89
- data/ext/ffi_c/Variadic.c +0 -304
- data/ext/ffi_c/compat.h +0 -78
- data/ext/ffi_c/extconf.rb +0 -71
- data/ext/ffi_c/ffi.c +0 -98
- data/ext/ffi_c/libffi.bsd.mk +0 -40
- data/ext/ffi_c/libffi.darwin.mk +0 -105
- data/ext/ffi_c/libffi.gnu.mk +0 -32
- data/ext/ffi_c/libffi.mk +0 -18
- data/ext/ffi_c/libffi.vc.mk +0 -26
- data/ext/ffi_c/libffi.vc64.mk +0 -26
- data/ext/ffi_c/libffi/ChangeLog.libffi +0 -584
- data/ext/ffi_c/libffi/ChangeLog.libffi-3.1 +0 -6000
- data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
- data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
- data/ext/ffi_c/libffi/LICENSE +0 -21
- data/ext/ffi_c/libffi/Makefile.am +0 -205
- data/ext/ffi_c/libffi/Makefile.in +0 -1805
- data/ext/ffi_c/libffi/README +0 -454
- data/ext/ffi_c/libffi/acinclude.m4 +0 -473
- data/ext/ffi_c/libffi/aclocal.m4 +0 -2134
- data/ext/ffi_c/libffi/autogen.sh +0 -2
- data/ext/ffi_c/libffi/autom4te.cache/output.0 +0 -21972
- data/ext/ffi_c/libffi/autom4te.cache/output.1 +0 -21972
- data/ext/ffi_c/libffi/autom4te.cache/output.2 +0 -21972
- data/ext/ffi_c/libffi/autom4te.cache/output.3 +0 -21972
- data/ext/ffi_c/libffi/autom4te.cache/requests +0 -331
- data/ext/ffi_c/libffi/autom4te.cache/traces.0 +0 -4010
- data/ext/ffi_c/libffi/autom4te.cache/traces.1 +0 -1005
- data/ext/ffi_c/libffi/autom4te.cache/traces.2 +0 -4010
- data/ext/ffi_c/libffi/autom4te.cache/traces.3 +0 -4010
- data/ext/ffi_c/libffi/compile +0 -347
- data/ext/ffi_c/libffi/config.guess +0 -1462
- data/ext/ffi_c/libffi/config.sub +0 -1825
- data/ext/ffi_c/libffi/configure +0 -21972
- data/ext/ffi_c/libffi/configure.ac +0 -388
- data/ext/ffi_c/libffi/configure.host +0 -272
- data/ext/ffi_c/libffi/depcomp +0 -791
- data/ext/ffi_c/libffi/doc/Makefile.am +0 -3
- data/ext/ffi_c/libffi/doc/Makefile.in +0 -811
- data/ext/ffi_c/libffi/doc/libffi.texi +0 -985
- data/ext/ffi_c/libffi/doc/mdate-sh +0 -228
- data/ext/ffi_c/libffi/doc/texinfo.tex +0 -10079
- data/ext/ffi_c/libffi/doc/version.texi +0 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +0 -210
- data/ext/ffi_c/libffi/fficonfig.h.in~ +0 -210
- data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +0 -207
- data/ext/ffi_c/libffi/include/Makefile.am +0 -9
- data/ext/ffi_c/libffi/include/Makefile.in +0 -604
- data/ext/ffi_c/libffi/include/ffi.h.in +0 -484
- data/ext/ffi_c/libffi/include/ffi_cfi.h +0 -55
- data/ext/ffi_c/libffi/include/ffi_common.h +0 -147
- data/ext/ffi_c/libffi/install-sh +0 -508
- data/ext/ffi_c/libffi/libffi.map.in +0 -80
- data/ext/ffi_c/libffi/libffi.pc.in +0 -11
- data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +0 -637
- data/ext/ffi_c/libffi/libtool-ldflags +0 -106
- data/ext/ffi_c/libffi/libtool-version +0 -29
- data/ext/ffi_c/libffi/ltmain.sh +0 -11156
- data/ext/ffi_c/libffi/m4/asmcfi.m4 +0 -13
- data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +0 -69
- data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +0 -181
- data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +0 -122
- data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +0 -72
- data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +0 -84
- data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +0 -70
- data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +0 -301
- data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +0 -225
- data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +0 -79
- data/ext/ffi_c/libffi/m4/libtool.m4 +0 -8387
- data/ext/ffi_c/libffi/m4/ltoptions.m4 +0 -437
- data/ext/ffi_c/libffi/m4/ltsugar.m4 +0 -124
- data/ext/ffi_c/libffi/m4/ltversion.m4 +0 -23
- data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +0 -99
- data/ext/ffi_c/libffi/man/Makefile.am +0 -8
- data/ext/ffi_c/libffi/man/Makefile.in +0 -558
- data/ext/ffi_c/libffi/man/ffi.3 +0 -41
- data/ext/ffi_c/libffi/man/ffi_call.3 +0 -103
- data/ext/ffi_c/libffi/man/ffi_prep_cif.3 +0 -68
- data/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +0 -73
- data/ext/ffi_c/libffi/missing +0 -215
- data/ext/ffi_c/libffi/msvcc.sh +0 -260
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +0 -941
- data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +0 -81
- data/ext/ffi_c/libffi/src/aarch64/internal.h +0 -67
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +0 -438
- data/ext/ffi_c/libffi/src/alpha/ffi.c +0 -521
- data/ext/ffi_c/libffi/src/alpha/ffitarget.h +0 -57
- data/ext/ffi_c/libffi/src/alpha/internal.h +0 -23
- data/ext/ffi_c/libffi/src/alpha/osf.S +0 -282
- data/ext/ffi_c/libffi/src/arc/arcompact.S +0 -135
- data/ext/ffi_c/libffi/src/arc/ffi.c +0 -266
- data/ext/ffi_c/libffi/src/arc/ffitarget.h +0 -53
- data/ext/ffi_c/libffi/src/arm/ffi.c +0 -808
- data/ext/ffi_c/libffi/src/arm/ffitarget.h +0 -82
- data/ext/ffi_c/libffi/src/arm/internal.h +0 -7
- data/ext/ffi_c/libffi/src/arm/sysv.S +0 -383
- data/ext/ffi_c/libffi/src/avr32/ffi.c +0 -423
- data/ext/ffi_c/libffi/src/avr32/ffitarget.h +0 -55
- data/ext/ffi_c/libffi/src/avr32/sysv.S +0 -208
- data/ext/ffi_c/libffi/src/bfin/ffi.c +0 -196
- data/ext/ffi_c/libffi/src/bfin/ffitarget.h +0 -43
- data/ext/ffi_c/libffi/src/bfin/sysv.S +0 -179
- data/ext/ffi_c/libffi/src/closures.c +0 -890
- data/ext/ffi_c/libffi/src/cris/ffi.c +0 -386
- data/ext/ffi_c/libffi/src/cris/ffitarget.h +0 -56
- data/ext/ffi_c/libffi/src/cris/sysv.S +0 -215
- data/ext/ffi_c/libffi/src/debug.c +0 -64
- data/ext/ffi_c/libffi/src/dlmalloc.c +0 -5166
- data/ext/ffi_c/libffi/src/frv/eabi.S +0 -128
- data/ext/ffi_c/libffi/src/frv/ffi.c +0 -292
- data/ext/ffi_c/libffi/src/frv/ffitarget.h +0 -62
- data/ext/ffi_c/libffi/src/ia64/ffi.c +0 -586
- data/ext/ffi_c/libffi/src/ia64/ffitarget.h +0 -55
- data/ext/ffi_c/libffi/src/ia64/ia64_flags.h +0 -40
- data/ext/ffi_c/libffi/src/ia64/unix.S +0 -560
- data/ext/ffi_c/libffi/src/java_raw_api.c +0 -374
- data/ext/ffi_c/libffi/src/m32r/ffi.c +0 -232
- data/ext/ffi_c/libffi/src/m32r/ffitarget.h +0 -53
- data/ext/ffi_c/libffi/src/m32r/sysv.S +0 -121
- data/ext/ffi_c/libffi/src/m68k/ffi.c +0 -362
- data/ext/ffi_c/libffi/src/m68k/ffitarget.h +0 -54
- data/ext/ffi_c/libffi/src/m68k/sysv.S +0 -357
- data/ext/ffi_c/libffi/src/m88k/ffi.c +0 -400
- data/ext/ffi_c/libffi/src/m88k/ffitarget.h +0 -49
- data/ext/ffi_c/libffi/src/m88k/obsd.S +0 -209
- data/ext/ffi_c/libffi/src/metag/ffi.c +0 -330
- data/ext/ffi_c/libffi/src/metag/ffitarget.h +0 -53
- data/ext/ffi_c/libffi/src/metag/sysv.S +0 -311
- data/ext/ffi_c/libffi/src/microblaze/ffi.c +0 -321
- data/ext/ffi_c/libffi/src/microblaze/ffitarget.h +0 -53
- data/ext/ffi_c/libffi/src/microblaze/sysv.S +0 -302
- data/ext/ffi_c/libffi/src/mips/ffi.c +0 -1105
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +0 -249
- data/ext/ffi_c/libffi/src/mips/n32.S +0 -661
- data/ext/ffi_c/libffi/src/mips/o32.S +0 -502
- data/ext/ffi_c/libffi/src/moxie/eabi.S +0 -101
- data/ext/ffi_c/libffi/src/moxie/ffi.c +0 -272
- data/ext/ffi_c/libffi/src/moxie/ffitarget.h +0 -52
- 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/src/or1k/ffi.c +0 -328
- data/ext/ffi_c/libffi/src/or1k/ffitarget.h +0 -58
- data/ext/ffi_c/libffi/src/or1k/sysv.S +0 -107
- data/ext/ffi_c/libffi/src/pa/ffi.c +0 -719
- data/ext/ffi_c/libffi/src/pa/ffitarget.h +0 -85
- data/ext/ffi_c/libffi/src/pa/hpux32.S +0 -368
- data/ext/ffi_c/libffi/src/pa/linux.S +0 -357
- data/ext/ffi_c/libffi/src/powerpc/aix.S +0 -328
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +0 -447
- data/ext/ffi_c/libffi/src/powerpc/asm.h +0 -125
- data/ext/ffi_c/libffi/src/powerpc/darwin.S +0 -378
- data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +0 -571
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +0 -173
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +0 -1359
- data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +0 -945
- data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +0 -94
- data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +0 -923
- data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +0 -195
- data/ext/ffi_c/libffi/src/powerpc/linux64.S +0 -228
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +0 -488
- data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +0 -397
- data/ext/ffi_c/libffi/src/powerpc/sysv.S +0 -175
- data/ext/ffi_c/libffi/src/prep_cif.c +0 -261
- data/ext/ffi_c/libffi/src/raw_api.c +0 -267
- data/ext/ffi_c/libffi/src/s390/ffi.c +0 -756
- data/ext/ffi_c/libffi/src/s390/ffitarget.h +0 -70
- data/ext/ffi_c/libffi/src/s390/internal.h +0 -11
- data/ext/ffi_c/libffi/src/s390/sysv.S +0 -325
- data/ext/ffi_c/libffi/src/sh/ffi.c +0 -717
- data/ext/ffi_c/libffi/src/sh/ffitarget.h +0 -54
- data/ext/ffi_c/libffi/src/sh/sysv.S +0 -850
- data/ext/ffi_c/libffi/src/sh64/ffi.c +0 -469
- data/ext/ffi_c/libffi/src/sh64/ffitarget.h +0 -58
- data/ext/ffi_c/libffi/src/sh64/sysv.S +0 -539
- data/ext/ffi_c/libffi/src/sparc/ffi.c +0 -468
- data/ext/ffi_c/libffi/src/sparc/ffi64.c +0 -608
- data/ext/ffi_c/libffi/src/sparc/ffitarget.h +0 -81
- data/ext/ffi_c/libffi/src/sparc/internal.h +0 -26
- data/ext/ffi_c/libffi/src/sparc/v8.S +0 -443
- data/ext/ffi_c/libffi/src/sparc/v9.S +0 -440
- data/ext/ffi_c/libffi/src/tile/ffi.c +0 -355
- data/ext/ffi_c/libffi/src/tile/ffitarget.h +0 -65
- data/ext/ffi_c/libffi/src/tile/tile.S +0 -360
- data/ext/ffi_c/libffi/src/types.c +0 -106
- data/ext/ffi_c/libffi/src/vax/elfbsd.S +0 -195
- data/ext/ffi_c/libffi/src/vax/ffi.c +0 -276
- data/ext/ffi_c/libffi/src/vax/ffitarget.h +0 -49
- data/ext/ffi_c/libffi/src/x86/asmnames.h +0 -30
- data/ext/ffi_c/libffi/src/x86/ffi.c +0 -733
- data/ext/ffi_c/libffi/src/x86/ffi64.c +0 -857
- data/ext/ffi_c/libffi/src/x86/ffitarget.h +0 -141
- data/ext/ffi_c/libffi/src/x86/ffiw64.c +0 -287
- data/ext/ffi_c/libffi/src/x86/internal.h +0 -29
- data/ext/ffi_c/libffi/src/x86/internal64.h +0 -22
- data/ext/ffi_c/libffi/src/x86/sysv.S +0 -1043
- data/ext/ffi_c/libffi/src/x86/unix64.S +0 -525
- data/ext/ffi_c/libffi/src/x86/win64.S +0 -232
- data/ext/ffi_c/libffi/src/x86/win64_intel.S +0 -237
- data/ext/ffi_c/libffi/src/xtensa/ffi.c +0 -298
- data/ext/ffi_c/libffi/src/xtensa/ffitarget.h +0 -53
- data/ext/ffi_c/libffi/src/xtensa/sysv.S +0 -253
- data/ext/ffi_c/libffi/stamp-h.in +0 -1
- data/ext/ffi_c/libffi/testsuite/Makefile.am +0 -85
- data/ext/ffi_c/libffi/testsuite/Makefile.in +0 -607
- data/ext/ffi_c/libffi/testsuite/config/default.exp +0 -1
- data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +0 -445
- 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.call/align_mixed.c +0 -46
- data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +0 -30
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +0 -89
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +0 -81
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +0 -81
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +0 -82
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +0 -89
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +0 -92
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +0 -90
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +0 -95
- data/ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c +0 -55
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +0 -94
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +0 -95
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +0 -96
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +0 -102
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +0 -89
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +0 -91
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +0 -93
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +0 -113
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +0 -90
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +0 -95
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +0 -90
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +0 -90
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +0 -98
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +0 -90
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +0 -109
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +0 -98
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +0 -124
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +0 -113
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +0 -99
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +0 -117
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +0 -97
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +0 -88
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +0 -90
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +0 -91
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +0 -93
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +0 -91
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +0 -92
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +0 -132
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +0 -115
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +0 -95
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +0 -91
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +0 -91
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +0 -92
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +0 -91
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +0 -91
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +0 -93
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +0 -66
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +0 -43
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +0 -61
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +0 -42
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +0 -105
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +0 -61
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +0 -70
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +0 -55
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +0 -74
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +0 -74
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +0 -86
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +0 -91
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +0 -74
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +0 -86
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +0 -74
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +0 -142
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +0 -44
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +0 -42
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +0 -42
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +0 -114
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +0 -42
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +0 -44
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +0 -43
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +0 -45
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +0 -45
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +0 -47
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +0 -43
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +0 -44
- data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +0 -36
- 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 -136
- 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 -60
- 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 -107
- data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +0 -341
- 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/nested_struct.c +0 -152
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +0 -161
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +0 -133
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +0 -121
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +0 -110
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +0 -111
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +0 -111
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +0 -112
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +0 -131
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +0 -111
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +0 -131
- data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +0 -131
- 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/problem1.c +0 -90
- 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 -43
- 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 -38
- 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 -38
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +0 -145
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +0 -148
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +0 -124
- data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +0 -125
- data/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +0 -44
- 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/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/testclosure.c +0 -70
- data/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +0 -61
- data/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest.cc +0 -117
- data/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc +0 -54
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +0 -196
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +0 -121
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +0 -123
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +0 -125
- 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/ext/ffi_c/rbffi.h +0 -57
- data/ext/ffi_c/rbffi_endian.h +0 -59
- data/ext/ffi_c/win32/stdbool.h +0 -8
- data/ext/ffi_c/win32/stdint.h +0 -201
- 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/bitmask_spec.rb +0 -575
- 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/embed-test/ext/Makefile +0 -242
- 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/BitmaskTest.c +0 -51
- 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 -198
- 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 -882
- 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
data/ext/ffi_c/StructByValue.h
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* Copyright (c) 2009, Wayne Meissner
|
3
|
-
*
|
4
|
-
* Copyright (c) 2008-2013, Ruby FFI project contributors
|
5
|
-
* All rights reserved.
|
6
|
-
*
|
7
|
-
* Redistribution and use in source and binary forms, with or without
|
8
|
-
* modification, are permitted provided that the following conditions are met:
|
9
|
-
* * Redistributions of source code must retain the above copyright
|
10
|
-
* notice, this list of conditions and the following disclaimer.
|
11
|
-
* * Redistributions in binary form must reproduce the above copyright
|
12
|
-
* notice, this list of conditions and the following disclaimer in the
|
13
|
-
* documentation and/or other materials provided with the distribution.
|
14
|
-
* * Neither the name of the Ruby FFI project nor the
|
15
|
-
* names of its contributors may be used to endorse or promote products
|
16
|
-
* derived from this software without specific prior written permission.
|
17
|
-
*
|
18
|
-
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
19
|
-
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
20
|
-
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
-
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
22
|
-
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
23
|
-
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
24
|
-
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
25
|
-
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
26
|
-
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
27
|
-
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
-
*/
|
29
|
-
|
30
|
-
#ifndef RBFFI_STRUCTBYVALUE_H
|
31
|
-
#define RBFFI_STRUCTBYVALUE_H
|
32
|
-
|
33
|
-
#include <ruby.h>
|
34
|
-
#include "Type.h"
|
35
|
-
|
36
|
-
#ifdef __cplusplus
|
37
|
-
extern "C" {
|
38
|
-
#endif
|
39
|
-
|
40
|
-
typedef struct StructByValue_ {
|
41
|
-
Type base;
|
42
|
-
VALUE rbStructClass;
|
43
|
-
VALUE rbStructLayout;
|
44
|
-
} StructByValue;
|
45
|
-
|
46
|
-
void rbffi_StructByValue_Init(VALUE moduleFFI);
|
47
|
-
|
48
|
-
extern VALUE rbffi_StructByValueClass;
|
49
|
-
|
50
|
-
#ifdef __cplusplus
|
51
|
-
}
|
52
|
-
#endif
|
53
|
-
|
54
|
-
#endif /* RBFFI_STRUCTBYVALUE_H */
|
55
|
-
|
data/ext/ffi_c/StructLayout.c
DELETED
@@ -1,698 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* Copyright (c) 2008, 2009, Wayne Meissner
|
3
|
-
* Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com>
|
4
|
-
*
|
5
|
-
* Copyright (c) 2008-2013, Ruby FFI project contributors
|
6
|
-
* All rights reserved.
|
7
|
-
*
|
8
|
-
* Redistribution and use in source and binary forms, with or without
|
9
|
-
* modification, are permitted provided that the following conditions are met:
|
10
|
-
* * Redistributions of source code must retain the above copyright
|
11
|
-
* notice, this list of conditions and the following disclaimer.
|
12
|
-
* * Redistributions in binary form must reproduce the above copyright
|
13
|
-
* notice, this list of conditions and the following disclaimer in the
|
14
|
-
* documentation and/or other materials provided with the distribution.
|
15
|
-
* * Neither the name of the Ruby FFI project nor the
|
16
|
-
* names of its contributors may be used to endorse or promote products
|
17
|
-
* derived from this software without specific prior written permission.
|
18
|
-
*
|
19
|
-
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
-
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
-
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
22
|
-
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
23
|
-
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
24
|
-
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
25
|
-
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
26
|
-
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
-
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
28
|
-
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
-
*/
|
30
|
-
|
31
|
-
#include <sys/types.h>
|
32
|
-
|
33
|
-
#ifndef _MSC_VER
|
34
|
-
# include <sys/param.h>
|
35
|
-
# include <stdint.h>
|
36
|
-
# include <stdbool.h>
|
37
|
-
#else
|
38
|
-
# include "win32/stdbool.h"
|
39
|
-
# include "win32/stdint.h"
|
40
|
-
#endif
|
41
|
-
#include <ruby.h>
|
42
|
-
#include "rbffi.h"
|
43
|
-
#include "compat.h"
|
44
|
-
#include "AbstractMemory.h"
|
45
|
-
#include "Pointer.h"
|
46
|
-
#include "MemoryPointer.h"
|
47
|
-
#include "Function.h"
|
48
|
-
#include "Types.h"
|
49
|
-
#include "StructByValue.h"
|
50
|
-
#include "ArrayType.h"
|
51
|
-
#include "Function.h"
|
52
|
-
#include "MappedType.h"
|
53
|
-
#include "Struct.h"
|
54
|
-
|
55
|
-
#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1)
|
56
|
-
|
57
|
-
static void struct_layout_mark(StructLayout *);
|
58
|
-
static void struct_layout_free(StructLayout *);
|
59
|
-
static void struct_field_mark(StructField* );
|
60
|
-
|
61
|
-
VALUE rbffi_StructLayoutFieldClass = Qnil;
|
62
|
-
VALUE rbffi_StructLayoutNumberFieldClass = Qnil, rbffi_StructLayoutPointerFieldClass = Qnil;
|
63
|
-
VALUE rbffi_StructLayoutStringFieldClass = Qnil;
|
64
|
-
VALUE rbffi_StructLayoutFunctionFieldClass = Qnil, rbffi_StructLayoutArrayFieldClass = Qnil;
|
65
|
-
|
66
|
-
VALUE rbffi_StructLayoutClass = Qnil;
|
67
|
-
|
68
|
-
|
69
|
-
static VALUE
|
70
|
-
struct_field_allocate(VALUE klass)
|
71
|
-
{
|
72
|
-
StructField* field;
|
73
|
-
VALUE obj;
|
74
|
-
|
75
|
-
obj = Data_Make_Struct(klass, StructField, struct_field_mark, -1, field);
|
76
|
-
field->rbType = Qnil;
|
77
|
-
field->rbName = Qnil;
|
78
|
-
|
79
|
-
return obj;
|
80
|
-
}
|
81
|
-
|
82
|
-
static void
|
83
|
-
struct_field_mark(StructField* f)
|
84
|
-
{
|
85
|
-
rb_gc_mark(f->rbType);
|
86
|
-
rb_gc_mark(f->rbName);
|
87
|
-
}
|
88
|
-
|
89
|
-
/*
|
90
|
-
* call-seq: initialize(name, offset, type)
|
91
|
-
* @param [String,Symbol] name
|
92
|
-
* @param [Fixnum] offset
|
93
|
-
* @param [FFI::Type] type
|
94
|
-
* @return [self]
|
95
|
-
* A new FFI::StructLayout::Field instance.
|
96
|
-
*/
|
97
|
-
static VALUE
|
98
|
-
struct_field_initialize(int argc, VALUE* argv, VALUE self)
|
99
|
-
{
|
100
|
-
VALUE rbOffset = Qnil, rbName = Qnil, rbType = Qnil;
|
101
|
-
StructField* field;
|
102
|
-
int nargs;
|
103
|
-
|
104
|
-
Data_Get_Struct(self, StructField, field);
|
105
|
-
|
106
|
-
nargs = rb_scan_args(argc, argv, "3", &rbName, &rbOffset, &rbType);
|
107
|
-
|
108
|
-
if (TYPE(rbName) != T_SYMBOL && TYPE(rbName) != T_STRING) {
|
109
|
-
rb_raise(rb_eTypeError, "wrong argument type %s (expected Symbol/String)",
|
110
|
-
rb_obj_classname(rbName));
|
111
|
-
}
|
112
|
-
|
113
|
-
Check_Type(rbOffset, T_FIXNUM);
|
114
|
-
|
115
|
-
if (!rb_obj_is_kind_of(rbType, rbffi_TypeClass)) {
|
116
|
-
rb_raise(rb_eTypeError, "wrong argument type %s (expected FFI::Type)",
|
117
|
-
rb_obj_classname(rbType));
|
118
|
-
}
|
119
|
-
|
120
|
-
field->offset = NUM2UINT(rbOffset);
|
121
|
-
field->rbName = (TYPE(rbName) == T_SYMBOL) ? rbName : rb_str_intern(rbName);
|
122
|
-
field->rbType = rbType;
|
123
|
-
Data_Get_Struct(field->rbType, Type, field->type);
|
124
|
-
field->memoryOp = get_memory_op(field->type);
|
125
|
-
field->referenceIndex = -1;
|
126
|
-
|
127
|
-
switch (field->type->nativeType == NATIVE_MAPPED ? ((MappedType *) field->type)->type->nativeType : field->type->nativeType) {
|
128
|
-
case NATIVE_FUNCTION:
|
129
|
-
case NATIVE_CALLBACK:
|
130
|
-
case NATIVE_POINTER:
|
131
|
-
field->referenceRequired = true;
|
132
|
-
break;
|
133
|
-
|
134
|
-
default:
|
135
|
-
field->referenceRequired = (rb_respond_to(self, rb_intern("reference_required?"))
|
136
|
-
&& RTEST(rb_funcall2(self, rb_intern("reference_required?"), 0, NULL)))
|
137
|
-
|| (rb_respond_to(rbType, rb_intern("reference_required?"))
|
138
|
-
&& RTEST(rb_funcall2(rbType, rb_intern("reference_required?"), 0, NULL)));
|
139
|
-
break;
|
140
|
-
}
|
141
|
-
|
142
|
-
return self;
|
143
|
-
}
|
144
|
-
|
145
|
-
/*
|
146
|
-
* call-seq: offset
|
147
|
-
* @return [Numeric]
|
148
|
-
* Get the field offset.
|
149
|
-
*/
|
150
|
-
static VALUE
|
151
|
-
struct_field_offset(VALUE self)
|
152
|
-
{
|
153
|
-
StructField* field;
|
154
|
-
Data_Get_Struct(self, StructField, field);
|
155
|
-
return UINT2NUM(field->offset);
|
156
|
-
}
|
157
|
-
|
158
|
-
/*
|
159
|
-
* call-seq: size
|
160
|
-
* @return [Numeric]
|
161
|
-
* Get the field size.
|
162
|
-
*/
|
163
|
-
static VALUE
|
164
|
-
struct_field_size(VALUE self)
|
165
|
-
{
|
166
|
-
StructField* field;
|
167
|
-
Data_Get_Struct(self, StructField, field);
|
168
|
-
return UINT2NUM(field->type->ffiType->size);
|
169
|
-
}
|
170
|
-
|
171
|
-
/*
|
172
|
-
* call-seq: alignment
|
173
|
-
* @return [Numeric]
|
174
|
-
* Get the field alignment.
|
175
|
-
*/
|
176
|
-
static VALUE
|
177
|
-
struct_field_alignment(VALUE self)
|
178
|
-
{
|
179
|
-
StructField* field;
|
180
|
-
Data_Get_Struct(self, StructField, field);
|
181
|
-
return UINT2NUM(field->type->ffiType->alignment);
|
182
|
-
}
|
183
|
-
|
184
|
-
/*
|
185
|
-
* call-seq: type
|
186
|
-
* @return [Type]
|
187
|
-
* Get the field type.
|
188
|
-
*/
|
189
|
-
static VALUE
|
190
|
-
struct_field_type(VALUE self)
|
191
|
-
{
|
192
|
-
StructField* field;
|
193
|
-
Data_Get_Struct(self, StructField, field);
|
194
|
-
|
195
|
-
return field->rbType;
|
196
|
-
}
|
197
|
-
|
198
|
-
/*
|
199
|
-
* call-seq: name
|
200
|
-
* @return [Symbol]
|
201
|
-
* Get the field name.
|
202
|
-
*/
|
203
|
-
static VALUE
|
204
|
-
struct_field_name(VALUE self)
|
205
|
-
{
|
206
|
-
StructField* field;
|
207
|
-
Data_Get_Struct(self, StructField, field);
|
208
|
-
return field->rbName;
|
209
|
-
}
|
210
|
-
|
211
|
-
/*
|
212
|
-
* call-seq: get(pointer)
|
213
|
-
* @param [AbstractMemory] pointer pointer on a {Struct}
|
214
|
-
* @return [Object]
|
215
|
-
* Get an object of type {#type} from memory pointed by +pointer+.
|
216
|
-
*/
|
217
|
-
static VALUE
|
218
|
-
struct_field_get(VALUE self, VALUE pointer)
|
219
|
-
{
|
220
|
-
StructField* f;
|
221
|
-
|
222
|
-
Data_Get_Struct(self, StructField, f);
|
223
|
-
if (f->memoryOp == NULL) {
|
224
|
-
rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(f->rbType));
|
225
|
-
return Qnil;
|
226
|
-
}
|
227
|
-
|
228
|
-
return (*f->memoryOp->get)(MEMORY(pointer), f->offset);
|
229
|
-
}
|
230
|
-
|
231
|
-
/*
|
232
|
-
* call-seq: put(pointer, value)
|
233
|
-
* @param [AbstractMemory] pointer pointer on a {Struct}
|
234
|
-
* @param [Object] value this object must be a kind of {#type}
|
235
|
-
* @return [self]
|
236
|
-
* Put an object to memory pointed by +pointer+.
|
237
|
-
*/
|
238
|
-
static VALUE
|
239
|
-
struct_field_put(VALUE self, VALUE pointer, VALUE value)
|
240
|
-
{
|
241
|
-
StructField* f;
|
242
|
-
|
243
|
-
Data_Get_Struct(self, StructField, f);
|
244
|
-
if (f->memoryOp == NULL) {
|
245
|
-
rb_raise(rb_eArgError, "put not supported for %s", rb_obj_classname(f->rbType));
|
246
|
-
return self;
|
247
|
-
}
|
248
|
-
|
249
|
-
(*f->memoryOp->put)(MEMORY(pointer), f->offset, value);
|
250
|
-
|
251
|
-
return self;
|
252
|
-
}
|
253
|
-
|
254
|
-
/*
|
255
|
-
* call-seq: get(pointer)
|
256
|
-
* @param [AbstractMemory] pointer pointer on a {Struct}
|
257
|
-
* @return [Function]
|
258
|
-
* Get a {Function} from memory pointed by +pointer+.
|
259
|
-
*/
|
260
|
-
static VALUE
|
261
|
-
function_field_get(VALUE self, VALUE pointer)
|
262
|
-
{
|
263
|
-
StructField* f;
|
264
|
-
|
265
|
-
Data_Get_Struct(self, StructField, f);
|
266
|
-
|
267
|
-
return rbffi_Function_NewInstance(f->rbType, (*rbffi_AbstractMemoryOps.pointer->get)(MEMORY(pointer), f->offset));
|
268
|
-
}
|
269
|
-
|
270
|
-
/*
|
271
|
-
* call-seq: put(pointer, proc)
|
272
|
-
* @param [AbstractMemory] pointer pointer to a {Struct}
|
273
|
-
* @param [Function, Proc] proc
|
274
|
-
* @return [Function]
|
275
|
-
* Set a {Function} to memory pointed by +pointer+ as a function.
|
276
|
-
*
|
277
|
-
* If a Proc is submitted as +proc+, it is automatically transformed to a {Function}.
|
278
|
-
*/
|
279
|
-
static VALUE
|
280
|
-
function_field_put(VALUE self, VALUE pointer, VALUE proc)
|
281
|
-
{
|
282
|
-
StructField* f;
|
283
|
-
VALUE value = Qnil;
|
284
|
-
|
285
|
-
Data_Get_Struct(self, StructField, f);
|
286
|
-
|
287
|
-
if (NIL_P(proc) || rb_obj_is_kind_of(proc, rbffi_FunctionClass)) {
|
288
|
-
value = proc;
|
289
|
-
} else if (rb_obj_is_kind_of(proc, rb_cProc) || rb_respond_to(proc, rb_intern("call"))) {
|
290
|
-
value = rbffi_Function_ForProc(f->rbType, proc);
|
291
|
-
} else {
|
292
|
-
rb_raise(rb_eTypeError, "wrong type (expected Proc or Function)");
|
293
|
-
}
|
294
|
-
|
295
|
-
(*rbffi_AbstractMemoryOps.pointer->put)(MEMORY(pointer), f->offset, value);
|
296
|
-
|
297
|
-
return self;
|
298
|
-
}
|
299
|
-
|
300
|
-
static inline bool
|
301
|
-
isCharArray(ArrayType* arrayType)
|
302
|
-
{
|
303
|
-
return arrayType->componentType->nativeType == NATIVE_INT8
|
304
|
-
|| arrayType->componentType->nativeType == NATIVE_UINT8;
|
305
|
-
}
|
306
|
-
|
307
|
-
/*
|
308
|
-
* call-seq: get(pointer)
|
309
|
-
* @param [AbstractMemory] pointer pointer on a {Struct}
|
310
|
-
* @return [FFI::StructLayout::CharArray, FFI::Struct::InlineArray]
|
311
|
-
* Get an array from a {Struct}.
|
312
|
-
*/
|
313
|
-
static VALUE
|
314
|
-
array_field_get(VALUE self, VALUE pointer)
|
315
|
-
{
|
316
|
-
StructField* f;
|
317
|
-
ArrayType* array;
|
318
|
-
VALUE argv[2];
|
319
|
-
|
320
|
-
Data_Get_Struct(self, StructField, f);
|
321
|
-
Data_Get_Struct(f->rbType, ArrayType, array);
|
322
|
-
|
323
|
-
argv[0] = pointer;
|
324
|
-
argv[1] = self;
|
325
|
-
|
326
|
-
return rb_class_new_instance(2, argv, isCharArray(array)
|
327
|
-
? rbffi_StructLayoutCharArrayClass : rbffi_StructInlineArrayClass);
|
328
|
-
}
|
329
|
-
|
330
|
-
/*
|
331
|
-
* call-seq: put(pointer, value)
|
332
|
-
* @param [AbstractMemory] pointer pointer on a {Struct}
|
333
|
-
* @param [String, Array] value +value+ may be a String only if array's type is a kind of +int8+
|
334
|
-
* @return [value]
|
335
|
-
* Set an array in a {Struct}.
|
336
|
-
*/
|
337
|
-
static VALUE
|
338
|
-
array_field_put(VALUE self, VALUE pointer, VALUE value)
|
339
|
-
{
|
340
|
-
StructField* f;
|
341
|
-
ArrayType* array;
|
342
|
-
|
343
|
-
|
344
|
-
Data_Get_Struct(self, StructField, f);
|
345
|
-
Data_Get_Struct(f->rbType, ArrayType, array);
|
346
|
-
|
347
|
-
if (isCharArray(array) && rb_obj_is_instance_of(value, rb_cString)) {
|
348
|
-
VALUE argv[2];
|
349
|
-
|
350
|
-
argv[0] = INT2FIX(f->offset);
|
351
|
-
argv[1] = value;
|
352
|
-
|
353
|
-
rb_funcall2(pointer, rb_intern("put_string"), 2, argv);
|
354
|
-
|
355
|
-
} else {
|
356
|
-
#ifdef notyet
|
357
|
-
MemoryOp* op;
|
358
|
-
int count = RARRAY_LEN(value);
|
359
|
-
int i;
|
360
|
-
AbstractMemory* memory = MEMORY(pointer);
|
361
|
-
|
362
|
-
if (count > array->length) {
|
363
|
-
rb_raise(rb_eIndexError, "array too large");
|
364
|
-
}
|
365
|
-
|
366
|
-
/* clear the contents in case of a short write */
|
367
|
-
checkWrite(memory);
|
368
|
-
checkBounds(memory, f->offset, f->type->ffiType->size);
|
369
|
-
if (count < array->length) {
|
370
|
-
memset(memory->address + f->offset + (count * array->componentType->ffiType->size),
|
371
|
-
0, (array->length - count) * array->componentType->ffiType->size);
|
372
|
-
}
|
373
|
-
|
374
|
-
/* now copy each element in */
|
375
|
-
if ((op = get_memory_op(array->componentType)) != NULL) {
|
376
|
-
|
377
|
-
for (i = 0; i < count; ++i) {
|
378
|
-
(*op->put)(memory, f->offset + (i * array->componentType->ffiType->size), rb_ary_entry(value, i));
|
379
|
-
}
|
380
|
-
|
381
|
-
} else if (array->componentType->nativeType == NATIVE_STRUCT) {
|
382
|
-
|
383
|
-
for (i = 0; i < count; ++i) {
|
384
|
-
VALUE entry = rb_ary_entry(value, i);
|
385
|
-
Struct* s;
|
386
|
-
|
387
|
-
if (!rb_obj_is_kind_of(entry, rbffi_StructClass)) {
|
388
|
-
rb_raise(rb_eTypeError, "array element not an instance of FFI::Struct");
|
389
|
-
break;
|
390
|
-
}
|
391
|
-
|
392
|
-
Data_Get_Struct(entry, Struct, s);
|
393
|
-
checkRead(s->pointer);
|
394
|
-
checkBounds(s->pointer, 0, array->componentType->ffiType->size);
|
395
|
-
|
396
|
-
memcpy(memory->address + f->offset + (i * array->componentType->ffiType->size),
|
397
|
-
s->pointer->address, array->componentType->ffiType->size);
|
398
|
-
}
|
399
|
-
|
400
|
-
} else {
|
401
|
-
rb_raise(rb_eNotImpError, "put not supported for arrays of type %s", rb_obj_classname(array->rbComponentType));
|
402
|
-
}
|
403
|
-
#else
|
404
|
-
rb_raise(rb_eNotImpError, "cannot set array field");
|
405
|
-
#endif
|
406
|
-
}
|
407
|
-
|
408
|
-
return value;
|
409
|
-
}
|
410
|
-
|
411
|
-
|
412
|
-
static VALUE
|
413
|
-
struct_layout_allocate(VALUE klass)
|
414
|
-
{
|
415
|
-
StructLayout* layout;
|
416
|
-
VALUE obj;
|
417
|
-
|
418
|
-
obj = Data_Make_Struct(klass, StructLayout, struct_layout_mark, struct_layout_free, layout);
|
419
|
-
layout->rbFieldMap = Qnil;
|
420
|
-
layout->rbFieldNames = Qnil;
|
421
|
-
layout->rbFields = Qnil;
|
422
|
-
layout->fieldSymbolTable = st_init_numtable();
|
423
|
-
layout->base.ffiType = xcalloc(1, sizeof(*layout->base.ffiType));
|
424
|
-
layout->base.ffiType->size = 0;
|
425
|
-
layout->base.ffiType->alignment = 0;
|
426
|
-
layout->base.ffiType->type = FFI_TYPE_STRUCT;
|
427
|
-
|
428
|
-
return obj;
|
429
|
-
}
|
430
|
-
|
431
|
-
/*
|
432
|
-
* call-seq: initialize(fields, size, align)
|
433
|
-
* @param [Array<StructLayout::Field>] fields
|
434
|
-
* @param [Numeric] size
|
435
|
-
* @param [Numeric] align
|
436
|
-
* @return [self]
|
437
|
-
* A new StructLayout instance.
|
438
|
-
*/
|
439
|
-
static VALUE
|
440
|
-
struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
|
441
|
-
{
|
442
|
-
StructLayout* layout;
|
443
|
-
ffi_type* ltype;
|
444
|
-
int i;
|
445
|
-
|
446
|
-
Data_Get_Struct(self, StructLayout, layout);
|
447
|
-
layout->fieldCount = (int) RARRAY_LEN(fields);
|
448
|
-
layout->rbFieldMap = rb_hash_new();
|
449
|
-
layout->rbFieldNames = rb_ary_new2(layout->fieldCount);
|
450
|
-
layout->size = (int) FFI_ALIGN(NUM2INT(size), NUM2INT(align));
|
451
|
-
layout->align = NUM2INT(align);
|
452
|
-
layout->fields = xcalloc(layout->fieldCount, sizeof(StructField *));
|
453
|
-
layout->ffiTypes = xcalloc(layout->fieldCount + 1, sizeof(ffi_type *));
|
454
|
-
layout->rbFields = rb_ary_new2(layout->fieldCount);
|
455
|
-
layout->referenceFieldCount = 0;
|
456
|
-
layout->base.ffiType->elements = layout->ffiTypes;
|
457
|
-
layout->base.ffiType->size = layout->size;
|
458
|
-
layout->base.ffiType->alignment = layout->align;
|
459
|
-
|
460
|
-
ltype = layout->base.ffiType;
|
461
|
-
for (i = 0; i < (int) layout->fieldCount; ++i) {
|
462
|
-
VALUE rbField = rb_ary_entry(fields, i);
|
463
|
-
VALUE rbName;
|
464
|
-
StructField* field;
|
465
|
-
ffi_type* ftype;
|
466
|
-
|
467
|
-
|
468
|
-
if (!rb_obj_is_kind_of(rbField, rbffi_StructLayoutFieldClass)) {
|
469
|
-
rb_raise(rb_eTypeError, "wrong type for field %d.", i);
|
470
|
-
}
|
471
|
-
rbName = rb_funcall2(rbField, rb_intern("name"), 0, NULL);
|
472
|
-
|
473
|
-
Data_Get_Struct(rbField, StructField, field);
|
474
|
-
layout->fields[i] = field;
|
475
|
-
|
476
|
-
if (field->type == NULL || field->type->ffiType == NULL) {
|
477
|
-
rb_raise(rb_eRuntimeError, "type of field %d not supported", i);
|
478
|
-
}
|
479
|
-
|
480
|
-
ftype = field->type->ffiType;
|
481
|
-
if (ftype->size == 0 && i < ((int) layout->fieldCount - 1)) {
|
482
|
-
rb_raise(rb_eTypeError, "type of field %d has zero size", i);
|
483
|
-
}
|
484
|
-
|
485
|
-
if (field->referenceRequired) {
|
486
|
-
field->referenceIndex = layout->referenceFieldCount++;
|
487
|
-
}
|
488
|
-
|
489
|
-
|
490
|
-
layout->ffiTypes[i] = ftype->size > 0 ? ftype : NULL;
|
491
|
-
st_insert(layout->fieldSymbolTable, rbName, rbField);
|
492
|
-
rb_hash_aset(layout->rbFieldMap, rbName, rbField);
|
493
|
-
rb_ary_push(layout->rbFields, rbField);
|
494
|
-
rb_ary_push(layout->rbFieldNames, rbName);
|
495
|
-
}
|
496
|
-
|
497
|
-
if (ltype->size == 0) {
|
498
|
-
rb_raise(rb_eRuntimeError, "Struct size is zero");
|
499
|
-
}
|
500
|
-
|
501
|
-
return self;
|
502
|
-
}
|
503
|
-
|
504
|
-
/*
|
505
|
-
* call-seq: [](field)
|
506
|
-
* @param [Symbol] field
|
507
|
-
* @return [StructLayout::Field]
|
508
|
-
* Get a field from the layout.
|
509
|
-
*/
|
510
|
-
static VALUE
|
511
|
-
struct_layout_union_bang(VALUE self)
|
512
|
-
{
|
513
|
-
const ffi_type *alignment_types[] = { &ffi_type_sint8, &ffi_type_sint16, &ffi_type_sint32, &ffi_type_sint64,
|
514
|
-
&ffi_type_float, &ffi_type_double, &ffi_type_longdouble, NULL };
|
515
|
-
StructLayout* layout;
|
516
|
-
ffi_type *t = NULL;
|
517
|
-
int count, i;
|
518
|
-
|
519
|
-
Data_Get_Struct(self, StructLayout, layout);
|
520
|
-
|
521
|
-
for (i = 0; alignment_types[i] != NULL; ++i) {
|
522
|
-
if (alignment_types[i]->alignment == layout->align) {
|
523
|
-
t = (ffi_type *) alignment_types[i];
|
524
|
-
break;
|
525
|
-
}
|
526
|
-
}
|
527
|
-
if (t == NULL) {
|
528
|
-
rb_raise(rb_eRuntimeError, "cannot create libffi union representation for alignment %d", layout->align);
|
529
|
-
return Qnil;
|
530
|
-
}
|
531
|
-
|
532
|
-
count = (int) layout->size / (int) t->size;
|
533
|
-
xfree(layout->ffiTypes);
|
534
|
-
layout->ffiTypes = xcalloc(count + 1, sizeof(ffi_type *));
|
535
|
-
layout->base.ffiType->elements = layout->ffiTypes;
|
536
|
-
|
537
|
-
for (i = 0; i < count; ++i) {
|
538
|
-
layout->ffiTypes[i] = t;
|
539
|
-
}
|
540
|
-
|
541
|
-
return self;
|
542
|
-
}
|
543
|
-
|
544
|
-
static VALUE
|
545
|
-
struct_layout_aref(VALUE self, VALUE field)
|
546
|
-
{
|
547
|
-
StructLayout* layout;
|
548
|
-
|
549
|
-
Data_Get_Struct(self, StructLayout, layout);
|
550
|
-
|
551
|
-
return rb_hash_aref(layout->rbFieldMap, field);
|
552
|
-
}
|
553
|
-
|
554
|
-
/*
|
555
|
-
* call-seq: fields
|
556
|
-
* @return [Array<StructLayout::Field>]
|
557
|
-
* Get fields list.
|
558
|
-
*/
|
559
|
-
static VALUE
|
560
|
-
struct_layout_fields(VALUE self)
|
561
|
-
{
|
562
|
-
StructLayout* layout;
|
563
|
-
|
564
|
-
Data_Get_Struct(self, StructLayout, layout);
|
565
|
-
|
566
|
-
return rb_ary_dup(layout->rbFields);
|
567
|
-
}
|
568
|
-
|
569
|
-
/*
|
570
|
-
* call-seq: members
|
571
|
-
* @return [Array<Symbol>]
|
572
|
-
* Get list of field names.
|
573
|
-
*/
|
574
|
-
static VALUE
|
575
|
-
struct_layout_members(VALUE self)
|
576
|
-
{
|
577
|
-
StructLayout* layout;
|
578
|
-
|
579
|
-
Data_Get_Struct(self, StructLayout, layout);
|
580
|
-
|
581
|
-
return rb_ary_dup(layout->rbFieldNames);
|
582
|
-
}
|
583
|
-
|
584
|
-
/*
|
585
|
-
* call-seq: to_a
|
586
|
-
* @return [Array<StructLayout::Field>]
|
587
|
-
* Get an array of fields.
|
588
|
-
*/
|
589
|
-
static VALUE
|
590
|
-
struct_layout_to_a(VALUE self)
|
591
|
-
{
|
592
|
-
StructLayout* layout;
|
593
|
-
|
594
|
-
Data_Get_Struct(self, StructLayout, layout);
|
595
|
-
|
596
|
-
return rb_ary_dup(layout->rbFields);
|
597
|
-
}
|
598
|
-
|
599
|
-
static void
|
600
|
-
struct_layout_mark(StructLayout *layout)
|
601
|
-
{
|
602
|
-
rb_gc_mark(layout->rbFieldMap);
|
603
|
-
rb_gc_mark(layout->rbFieldNames);
|
604
|
-
rb_gc_mark(layout->rbFields);
|
605
|
-
}
|
606
|
-
|
607
|
-
static void
|
608
|
-
struct_layout_free(StructLayout *layout)
|
609
|
-
{
|
610
|
-
xfree(layout->ffiTypes);
|
611
|
-
xfree(layout->base.ffiType);
|
612
|
-
xfree(layout->fields);
|
613
|
-
st_free_table(layout->fieldSymbolTable);
|
614
|
-
xfree(layout);
|
615
|
-
}
|
616
|
-
|
617
|
-
|
618
|
-
void
|
619
|
-
rbffi_StructLayout_Init(VALUE moduleFFI)
|
620
|
-
{
|
621
|
-
VALUE ffi_Type = rbffi_TypeClass;
|
622
|
-
|
623
|
-
/*
|
624
|
-
* Document-class: FFI::StructLayout < FFI::Type
|
625
|
-
*
|
626
|
-
* This class aims at defining a struct layout.
|
627
|
-
*/
|
628
|
-
rbffi_StructLayoutClass = rb_define_class_under(moduleFFI, "StructLayout", ffi_Type);
|
629
|
-
rb_global_variable(&rbffi_StructLayoutClass);
|
630
|
-
|
631
|
-
/*
|
632
|
-
* Document-class: FFI::StructLayout::Field
|
633
|
-
* A field in a {StructLayout}.
|
634
|
-
*/
|
635
|
-
rbffi_StructLayoutFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Field", rb_cObject);
|
636
|
-
rb_global_variable(&rbffi_StructLayoutFieldClass);
|
637
|
-
|
638
|
-
/*
|
639
|
-
* Document-class: FFI::StructLayout::Number
|
640
|
-
* A numeric {Field} in a {StructLayout}.
|
641
|
-
*/
|
642
|
-
rbffi_StructLayoutNumberFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Number", rbffi_StructLayoutFieldClass);
|
643
|
-
rb_global_variable(&rbffi_StructLayoutNumberFieldClass);
|
644
|
-
|
645
|
-
/*
|
646
|
-
* Document-class: FFI::StructLayout::String
|
647
|
-
* A string {Field} in a {StructLayout}.
|
648
|
-
*/
|
649
|
-
rbffi_StructLayoutStringFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "String", rbffi_StructLayoutFieldClass);
|
650
|
-
rb_global_variable(&rbffi_StructLayoutStringFieldClass);
|
651
|
-
|
652
|
-
/*
|
653
|
-
* Document-class: FFI::StructLayout::Pointer
|
654
|
-
* A pointer {Field} in a {StructLayout}.
|
655
|
-
*/
|
656
|
-
rbffi_StructLayoutPointerFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Pointer", rbffi_StructLayoutFieldClass);
|
657
|
-
rb_global_variable(&rbffi_StructLayoutPointerFieldClass);
|
658
|
-
|
659
|
-
/*
|
660
|
-
* Document-class: FFI::StructLayout::Function
|
661
|
-
* A function pointer {Field} in a {StructLayout}.
|
662
|
-
*/
|
663
|
-
rbffi_StructLayoutFunctionFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Function", rbffi_StructLayoutFieldClass);
|
664
|
-
rb_global_variable(&rbffi_StructLayoutFunctionFieldClass);
|
665
|
-
|
666
|
-
/*
|
667
|
-
* Document-class: FFI::StructLayout::Array
|
668
|
-
* An array {Field} in a {StructLayout}.
|
669
|
-
*/
|
670
|
-
rbffi_StructLayoutArrayFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Array", rbffi_StructLayoutFieldClass);
|
671
|
-
rb_global_variable(&rbffi_StructLayoutArrayFieldClass);
|
672
|
-
|
673
|
-
rb_define_alloc_func(rbffi_StructLayoutFieldClass, struct_field_allocate);
|
674
|
-
rb_define_method(rbffi_StructLayoutFieldClass, "initialize", struct_field_initialize, -1);
|
675
|
-
rb_define_method(rbffi_StructLayoutFieldClass, "offset", struct_field_offset, 0);
|
676
|
-
rb_define_method(rbffi_StructLayoutFieldClass, "size", struct_field_size, 0);
|
677
|
-
rb_define_method(rbffi_StructLayoutFieldClass, "alignment", struct_field_alignment, 0);
|
678
|
-
rb_define_method(rbffi_StructLayoutFieldClass, "name", struct_field_name, 0);
|
679
|
-
rb_define_method(rbffi_StructLayoutFieldClass, "type", struct_field_type, 0);
|
680
|
-
rb_define_method(rbffi_StructLayoutFieldClass, "put", struct_field_put, 2);
|
681
|
-
rb_define_method(rbffi_StructLayoutFieldClass, "get", struct_field_get, 1);
|
682
|
-
|
683
|
-
rb_define_method(rbffi_StructLayoutFunctionFieldClass, "put", function_field_put, 2);
|
684
|
-
rb_define_method(rbffi_StructLayoutFunctionFieldClass, "get", function_field_get, 1);
|
685
|
-
|
686
|
-
rb_define_method(rbffi_StructLayoutArrayFieldClass, "get", array_field_get, 1);
|
687
|
-
rb_define_method(rbffi_StructLayoutArrayFieldClass, "put", array_field_put, 2);
|
688
|
-
|
689
|
-
rb_define_alloc_func(rbffi_StructLayoutClass, struct_layout_allocate);
|
690
|
-
rb_define_method(rbffi_StructLayoutClass, "initialize", struct_layout_initialize, 3);
|
691
|
-
rb_define_method(rbffi_StructLayoutClass, "[]", struct_layout_aref, 1);
|
692
|
-
rb_define_method(rbffi_StructLayoutClass, "fields", struct_layout_fields, 0);
|
693
|
-
rb_define_method(rbffi_StructLayoutClass, "members", struct_layout_members, 0);
|
694
|
-
rb_define_method(rbffi_StructLayoutClass, "to_a", struct_layout_to_a, 0);
|
695
|
-
rb_define_method(rbffi_StructLayoutClass, "__union!", struct_layout_union_bang, 0);
|
696
|
-
|
697
|
-
}
|
698
|
-
|