ffi 0.1.0
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.
- data/LICENSE +51 -0
- data/README +0 -0
- data/Rakefile +90 -0
- data/ext/AbstractMemory.c +254 -0
- data/ext/AbstractMemory.h +36 -0
- data/ext/Buffer.c +94 -0
- data/ext/Callback.c +240 -0
- data/ext/Callback.h +47 -0
- data/ext/Invoker.c +269 -0
- data/ext/MemoryPointer.c +164 -0
- data/ext/MemoryPointer.h +25 -0
- data/ext/Platform.c +41 -0
- data/ext/Platform.h +23 -0
- data/ext/Types.c +65 -0
- data/ext/Types.h +51 -0
- data/ext/extconf.rb +13 -0
- data/ext/ffi.c +54 -0
- data/ext/ffi.mk +24 -0
- data/ext/libffi.darwin.mk +44 -0
- data/ext/libffi.mk +10 -0
- data/ext/libffi/ChangeLog +3243 -0
- data/ext/libffi/ChangeLog.libffi +347 -0
- data/ext/libffi/ChangeLog.libgcj +40 -0
- data/ext/libffi/ChangeLog.v1 +764 -0
- data/ext/libffi/LICENSE +21 -0
- data/ext/libffi/Makefile.am +177 -0
- data/ext/libffi/Makefile.in +1640 -0
- data/ext/libffi/README +328 -0
- data/ext/libffi/TODO +1 -0
- data/ext/libffi/acinclude.m4 +92 -0
- data/ext/libffi/aclocal.m4 +7516 -0
- data/ext/libffi/compile +142 -0
- data/ext/libffi/config.guess +1516 -0
- data/ext/libffi/config.sub +1626 -0
- data/ext/libffi/configure +24414 -0
- data/ext/libffi/configure.ac +365 -0
- data/ext/libffi/configure.host +11 -0
- data/ext/libffi/depcomp +584 -0
- data/ext/libffi/doc/libffi.info +533 -0
- data/ext/libffi/doc/libffi.texi +541 -0
- data/ext/libffi/doc/stamp-vti +4 -0
- data/ext/libffi/doc/version.texi +4 -0
- data/ext/libffi/fficonfig.h.in +160 -0
- data/ext/libffi/include/Makefile.am +9 -0
- data/ext/libffi/include/Makefile.in +422 -0
- data/ext/libffi/include/ffi.h.in +393 -0
- data/ext/libffi/include/ffi_common.h +98 -0
- data/ext/libffi/install-sh +323 -0
- data/ext/libffi/libffi.pc.in +10 -0
- data/ext/libffi/libtool-version +29 -0
- data/ext/libffi/ltcf-c.sh +861 -0
- data/ext/libffi/ltcf-cxx.sh +1069 -0
- data/ext/libffi/ltcf-gcj.sh +700 -0
- data/ext/libffi/ltconfig +2862 -0
- data/ext/libffi/ltmain.sh +6930 -0
- data/ext/libffi/man/Makefile.am +8 -0
- data/ext/libffi/man/Makefile.in +395 -0
- data/ext/libffi/man/ffi.3 +31 -0
- data/ext/libffi/man/ffi_call.3 +103 -0
- data/ext/libffi/man/ffi_prep_cif.3 +66 -0
- data/ext/libffi/mdate-sh +201 -0
- data/ext/libffi/missing +353 -0
- data/ext/libffi/mkinstalldirs +158 -0
- data/ext/libffi/src/alpha/ffi.c +284 -0
- data/ext/libffi/src/alpha/ffitarget.h +48 -0
- data/ext/libffi/src/alpha/osf.S +366 -0
- data/ext/libffi/src/arm/ffi.c +309 -0
- data/ext/libffi/src/arm/ffitarget.h +49 -0
- data/ext/libffi/src/arm/sysv.S +299 -0
- data/ext/libffi/src/closures.c +596 -0
- data/ext/libffi/src/cris/ffi.c +383 -0
- data/ext/libffi/src/cris/ffitarget.h +51 -0
- data/ext/libffi/src/cris/sysv.S +215 -0
- data/ext/libffi/src/debug.c +59 -0
- data/ext/libffi/src/dlmalloc.c +5099 -0
- data/ext/libffi/src/frv/eabi.S +128 -0
- data/ext/libffi/src/frv/ffi.c +292 -0
- data/ext/libffi/src/frv/ffitarget.h +61 -0
- data/ext/libffi/src/ia64/ffi.c +580 -0
- data/ext/libffi/src/ia64/ffitarget.h +50 -0
- data/ext/libffi/src/ia64/ia64_flags.h +40 -0
- data/ext/libffi/src/ia64/unix.S +560 -0
- data/ext/libffi/src/java_raw_api.c +359 -0
- data/ext/libffi/src/m32r/ffi.c +232 -0
- data/ext/libffi/src/m32r/ffitarget.h +48 -0
- data/ext/libffi/src/m32r/sysv.S +121 -0
- data/ext/libffi/src/m68k/ffi.c +278 -0
- data/ext/libffi/src/m68k/ffitarget.h +49 -0
- data/ext/libffi/src/m68k/sysv.S +234 -0
- data/ext/libffi/src/mips/ffi.c +926 -0
- data/ext/libffi/src/mips/ffitarget.h +202 -0
- data/ext/libffi/src/mips/n32.S +534 -0
- data/ext/libffi/src/mips/o32.S +381 -0
- data/ext/libffi/src/pa/ffi.c +709 -0
- data/ext/libffi/src/pa/ffitarget.h +77 -0
- data/ext/libffi/src/pa/hpux32.S +368 -0
- data/ext/libffi/src/pa/linux.S +357 -0
- data/ext/libffi/src/powerpc/aix.S +225 -0
- data/ext/libffi/src/powerpc/aix_closure.S +247 -0
- data/ext/libffi/src/powerpc/asm.h +125 -0
- data/ext/libffi/src/powerpc/darwin.S +245 -0
- data/ext/libffi/src/powerpc/darwin_closure.S +317 -0
- data/ext/libffi/src/powerpc/ffi.c +1429 -0
- data/ext/libffi/src/powerpc/ffi_darwin.c +800 -0
- data/ext/libffi/src/powerpc/ffitarget.h +118 -0
- data/ext/libffi/src/powerpc/linux64.S +187 -0
- data/ext/libffi/src/powerpc/linux64_closure.S +236 -0
- data/ext/libffi/src/powerpc/ppc_closure.S +327 -0
- data/ext/libffi/src/powerpc/sysv.S +230 -0
- data/ext/libffi/src/prep_cif.c +174 -0
- data/ext/libffi/src/raw_api.c +254 -0
- data/ext/libffi/src/s390/ffi.c +780 -0
- data/ext/libffi/src/s390/ffitarget.h +60 -0
- data/ext/libffi/src/s390/sysv.S +434 -0
- data/ext/libffi/src/sh/ffi.c +716 -0
- data/ext/libffi/src/sh/ffitarget.h +49 -0
- data/ext/libffi/src/sh/sysv.S +850 -0
- data/ext/libffi/src/sh64/ffi.c +453 -0
- data/ext/libffi/src/sh64/ffitarget.h +53 -0
- data/ext/libffi/src/sh64/sysv.S +530 -0
- data/ext/libffi/src/sparc/ffi.c +610 -0
- data/ext/libffi/src/sparc/ffitarget.h +66 -0
- data/ext/libffi/src/sparc/v8.S +272 -0
- data/ext/libffi/src/sparc/v9.S +307 -0
- data/ext/libffi/src/types.c +77 -0
- data/ext/libffi/src/x86/darwin.S +443 -0
- data/ext/libffi/src/x86/darwin64.S +416 -0
- data/ext/libffi/src/x86/ffi.c +475 -0
- data/ext/libffi/src/x86/ffi64.c +572 -0
- data/ext/libffi/src/x86/ffitarget.h +90 -0
- data/ext/libffi/src/x86/freebsd.S +458 -0
- data/ext/libffi/src/x86/sysv.S +437 -0
- data/ext/libffi/src/x86/unix64.S +418 -0
- data/ext/libffi/src/x86/win32.S +391 -0
- data/ext/libffi/testsuite/Makefile.am +71 -0
- data/ext/libffi/testsuite/Makefile.in +447 -0
- data/ext/libffi/testsuite/config/default.exp +1 -0
- data/ext/libffi/testsuite/lib/libffi-dg.exp +289 -0
- data/ext/libffi/testsuite/lib/target-libpath.exp +263 -0
- data/ext/libffi/testsuite/lib/wrapper.exp +45 -0
- data/ext/libffi/testsuite/libffi.call/call.exp +36 -0
- data/ext/libffi/testsuite/libffi.call/closure_fn0.c +97 -0
- data/ext/libffi/testsuite/libffi.call/closure_fn1.c +89 -0
- data/ext/libffi/testsuite/libffi.call/closure_fn2.c +89 -0
- data/ext/libffi/testsuite/libffi.call/closure_fn3.c +90 -0
- data/ext/libffi/testsuite/libffi.call/closure_fn4.c +97 -0
- data/ext/libffi/testsuite/libffi.call/closure_fn5.c +99 -0
- data/ext/libffi/testsuite/libffi.call/closure_fn6.c +98 -0
- data/ext/libffi/testsuite/libffi.call/closure_stdcall.c +72 -0
- data/ext/libffi/testsuite/libffi.call/cls_12byte.c +102 -0
- data/ext/libffi/testsuite/libffi.call/cls_16byte.c +103 -0
- data/ext/libffi/testsuite/libffi.call/cls_18byte.c +104 -0
- data/ext/libffi/testsuite/libffi.call/cls_19byte.c +110 -0
- data/ext/libffi/testsuite/libffi.call/cls_1_1byte.c +97 -0
- data/ext/libffi/testsuite/libffi.call/cls_20byte.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_20byte1.c +101 -0
- data/ext/libffi/testsuite/libffi.call/cls_24byte.c +121 -0
- data/ext/libffi/testsuite/libffi.call/cls_2byte.c +98 -0
- data/ext/libffi/testsuite/libffi.call/cls_3_1byte.c +103 -0
- data/ext/libffi/testsuite/libffi.call/cls_3byte1.c +98 -0
- data/ext/libffi/testsuite/libffi.call/cls_3byte2.c +98 -0
- data/ext/libffi/testsuite/libffi.call/cls_4_1byte.c +106 -0
- data/ext/libffi/testsuite/libffi.call/cls_4byte.c +98 -0
- data/ext/libffi/testsuite/libffi.call/cls_5_1_byte.c +117 -0
- data/ext/libffi/testsuite/libffi.call/cls_5byte.c +106 -0
- data/ext/libffi/testsuite/libffi.call/cls_64byte.c +132 -0
- data/ext/libffi/testsuite/libffi.call/cls_6_1_byte.c +121 -0
- data/ext/libffi/testsuite/libffi.call/cls_6byte.c +107 -0
- data/ext/libffi/testsuite/libffi.call/cls_7_1_byte.c +125 -0
- data/ext/libffi/testsuite/libffi.call/cls_7byte.c +105 -0
- data/ext/libffi/testsuite/libffi.call/cls_8byte.c +96 -0
- data/ext/libffi/testsuite/libffi.call/cls_9byte1.c +98 -0
- data/ext/libffi/testsuite/libffi.call/cls_9byte2.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_double.c +101 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_float.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_longdouble.c +100 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_pointer.c +101 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_sint16.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_sint32.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_sint64.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_uint16.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_uint32.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_align_uint64.c +100 -0
- data/ext/libffi/testsuite/libffi.call/cls_double.c +51 -0
- data/ext/libffi/testsuite/libffi.call/cls_float.c +51 -0
- data/ext/libffi/testsuite/libffi.call/cls_multi_schar.c +82 -0
- data/ext/libffi/testsuite/libffi.call/cls_multi_sshort.c +82 -0
- data/ext/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +94 -0
- data/ext/libffi/testsuite/libffi.call/cls_multi_uchar.c +99 -0
- data/ext/libffi/testsuite/libffi.call/cls_multi_ushort.c +82 -0
- data/ext/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +94 -0
- data/ext/libffi/testsuite/libffi.call/cls_schar.c +52 -0
- data/ext/libffi/testsuite/libffi.call/cls_sint.c +50 -0
- data/ext/libffi/testsuite/libffi.call/cls_sshort.c +50 -0
- data/ext/libffi/testsuite/libffi.call/cls_uchar.c +50 -0
- data/ext/libffi/testsuite/libffi.call/cls_uint.c +51 -0
- data/ext/libffi/testsuite/libffi.call/cls_ulonglong.c +54 -0
- data/ext/libffi/testsuite/libffi.call/cls_ushort.c +51 -0
- data/ext/libffi/testsuite/libffi.call/ffitest.h +86 -0
- data/ext/libffi/testsuite/libffi.call/float.c +59 -0
- data/ext/libffi/testsuite/libffi.call/float1.c +58 -0
- data/ext/libffi/testsuite/libffi.call/float2.c +57 -0
- data/ext/libffi/testsuite/libffi.call/float3.c +72 -0
- data/ext/libffi/testsuite/libffi.call/float4.c +62 -0
- data/ext/libffi/testsuite/libffi.call/many.c +69 -0
- data/ext/libffi/testsuite/libffi.call/many_win32.c +63 -0
- data/ext/libffi/testsuite/libffi.call/negint.c +53 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct.c +160 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct1.c +169 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct10.c +141 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct2.c +118 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct3.c +119 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct4.c +119 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct5.c +120 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct6.c +139 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct7.c +119 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct8.c +139 -0
- data/ext/libffi/testsuite/libffi.call/nested_struct9.c +139 -0
- data/ext/libffi/testsuite/libffi.call/problem1.c +98 -0
- data/ext/libffi/testsuite/libffi.call/promotion.c +59 -0
- data/ext/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
- data/ext/libffi/testsuite/libffi.call/return_dbl.c +35 -0
- data/ext/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
- data/ext/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
- data/ext/libffi/testsuite/libffi.call/return_fl.c +35 -0
- data/ext/libffi/testsuite/libffi.call/return_fl1.c +36 -0
- data/ext/libffi/testsuite/libffi.call/return_fl2.c +49 -0
- data/ext/libffi/testsuite/libffi.call/return_fl3.c +42 -0
- data/ext/libffi/testsuite/libffi.call/return_ldl.c +34 -0
- data/ext/libffi/testsuite/libffi.call/return_ll.c +41 -0
- data/ext/libffi/testsuite/libffi.call/return_ll1.c +42 -0
- data/ext/libffi/testsuite/libffi.call/return_sc.c +36 -0
- data/ext/libffi/testsuite/libffi.call/return_sl.c +38 -0
- data/ext/libffi/testsuite/libffi.call/return_uc.c +38 -0
- data/ext/libffi/testsuite/libffi.call/return_ul.c +38 -0
- data/ext/libffi/testsuite/libffi.call/strlen.c +44 -0
- data/ext/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
- data/ext/libffi/testsuite/libffi.call/struct1.c +65 -0
- data/ext/libffi/testsuite/libffi.call/struct2.c +67 -0
- data/ext/libffi/testsuite/libffi.call/struct3.c +59 -0
- data/ext/libffi/testsuite/libffi.call/struct4.c +63 -0
- data/ext/libffi/testsuite/libffi.call/struct5.c +65 -0
- data/ext/libffi/testsuite/libffi.call/struct6.c +64 -0
- data/ext/libffi/testsuite/libffi.call/struct7.c +74 -0
- data/ext/libffi/testsuite/libffi.call/struct8.c +80 -0
- data/ext/libffi/testsuite/libffi.call/struct9.c +67 -0
- data/ext/libffi/testsuite/libffi.special/ffitestcxx.h +86 -0
- data/ext/libffi/testsuite/libffi.special/special.exp +38 -0
- data/ext/libffi/testsuite/libffi.special/unwindtest.cc +123 -0
- data/ext/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
- data/ext/libffi/texinfo.tex +7482 -0
- data/ext/rbffi.h +32 -0
- data/lib/ffi.rb +2 -0
- data/lib/ffi/buffer.rb +25 -0
- data/lib/ffi/callback.rb +10 -0
- data/lib/ffi/ffi.rb +259 -0
- data/lib/ffi/memorypointer.rb +169 -0
- data/lib/ffi/platform.rb +75 -0
- data/lib/ffi/struct.rb +263 -0
- data/nbproject/Makefile-Default.mk +54 -0
- data/nbproject/Makefile-impl.mk +123 -0
- data/nbproject/configurations.xml +169 -0
- data/nbproject/private/configurations.xml +22 -0
- data/nbproject/private/private.xml +7 -0
- data/nbproject/project.properties +0 -0
- data/nbproject/project.xml +11 -0
- data/samples/getlogin.rb +7 -0
- data/samples/getpid.rb +7 -0
- data/samples/gettimeofday.rb +13 -0
- data/samples/hello.rb +7 -0
- data/samples/qsort.rb +20 -0
- data/specs/buffer_spec.rb +141 -0
- data/specs/callback_spec.rb +31 -0
- data/specs/rbx/attach_function_spec.rb +26 -0
- data/specs/rbx/memory_pointer_spec.rb +108 -0
- data/specs/rbx/spec_helper.rb +1 -0
- data/specs/rbx/struct_spec.rb +13 -0
- data/specs/spec_helper.rb +2 -0
- metadata +359 -0
data/lib/ffi/platform.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
module FFI
|
3
|
+
class PlatformError < FFI::NativeError; end
|
4
|
+
|
5
|
+
module Platform
|
6
|
+
OS = case Config::CONFIG['host_os'].downcase
|
7
|
+
when /linux/
|
8
|
+
"linux"
|
9
|
+
when /darwin/
|
10
|
+
"darwin"
|
11
|
+
when /freebsd/
|
12
|
+
"freebsd"
|
13
|
+
when /openbsd/
|
14
|
+
"openbsd"
|
15
|
+
when /sunos|solaris/
|
16
|
+
"solaris"
|
17
|
+
when /win/
|
18
|
+
"windows"
|
19
|
+
else
|
20
|
+
raise FFI::PlatformError, "Unknown operating system: #{OS_}"
|
21
|
+
end
|
22
|
+
ARCH = case CPU.downcase
|
23
|
+
when /i?86|x86|i86pc/
|
24
|
+
"i386"
|
25
|
+
when /amd64|x86_64/
|
26
|
+
"x86_64"
|
27
|
+
else
|
28
|
+
raise FFI::PlatformError, "Unknown cpu architecture: #{ARCH_}"
|
29
|
+
end
|
30
|
+
private
|
31
|
+
def self.is_os(os)
|
32
|
+
OS == os
|
33
|
+
end
|
34
|
+
|
35
|
+
NAME = "#{ARCH}-#{OS}"
|
36
|
+
IS_LINUX = is_os("linux")
|
37
|
+
IS_MAC = is_os("darwin")
|
38
|
+
IS_FREEBSD = is_os("freebsd")
|
39
|
+
IS_OPENBSD = is_os("openbsd")
|
40
|
+
IS_WINDOWS = is_os("windows")
|
41
|
+
IS_BSD = IS_MAC || IS_FREEBSD || IS_OPENBSD
|
42
|
+
public
|
43
|
+
LIBC = if IS_WINDOWS
|
44
|
+
"msvcrt"
|
45
|
+
elsif IS_LINUX
|
46
|
+
"libc.so.6"
|
47
|
+
else
|
48
|
+
"c"
|
49
|
+
end
|
50
|
+
LIBPREFIX = IS_WINDOWS ? '' : 'lib'
|
51
|
+
LIBSUFFIX = case OS
|
52
|
+
when /darwin/
|
53
|
+
'.dylib'
|
54
|
+
when /linux|bsd|solaris/
|
55
|
+
'.so'
|
56
|
+
when /win/
|
57
|
+
'.dll'
|
58
|
+
else
|
59
|
+
raise PlatformError, "Cannot determine shared library extension for #{OS}"
|
60
|
+
end
|
61
|
+
def self.bsd?
|
62
|
+
IS_BSD
|
63
|
+
end
|
64
|
+
def self.windows?
|
65
|
+
IS_WINDOWS
|
66
|
+
end
|
67
|
+
def self.mac?
|
68
|
+
IS_MAC
|
69
|
+
end
|
70
|
+
def self.unix?
|
71
|
+
!IS_WINDOWS
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
data/lib/ffi/struct.rb
ADDED
@@ -0,0 +1,263 @@
|
|
1
|
+
require 'ffi/platform'
|
2
|
+
module FFI
|
3
|
+
class StructLayout
|
4
|
+
def initialize(fields, size)
|
5
|
+
@fields = fields
|
6
|
+
@size = size
|
7
|
+
end
|
8
|
+
|
9
|
+
def [](name)
|
10
|
+
@fields[name]
|
11
|
+
end
|
12
|
+
def size
|
13
|
+
@size
|
14
|
+
end
|
15
|
+
end
|
16
|
+
class StructLayoutBuilder
|
17
|
+
LONG_ALIGN = Platform::ARCH =~ /sparc.*/ ? 64 : Platform::LONG_SIZE
|
18
|
+
ADDRESS_ALIGN = Platform::ARCH =~ /sparc.*/ ? 64 : Platform::ADDRESS_SIZE
|
19
|
+
FLOAT_ALIGN = Platform::ARCH =~ /sparc.*/ ? 64 : Platform::ADDRESS_SIZE
|
20
|
+
DOUBLE_ALIGN = Platform::ARCH =~ /sparc.*/ ? 64 : Platform::ADDRESS_SIZE
|
21
|
+
class Field
|
22
|
+
def initialize(off)
|
23
|
+
@off = off
|
24
|
+
end
|
25
|
+
|
26
|
+
def offset
|
27
|
+
@off
|
28
|
+
end
|
29
|
+
def size
|
30
|
+
self.size
|
31
|
+
end
|
32
|
+
def align
|
33
|
+
self.align
|
34
|
+
end
|
35
|
+
def self.align
|
36
|
+
self.size
|
37
|
+
end
|
38
|
+
end
|
39
|
+
class Signed8 < Field
|
40
|
+
def self.size; 8; end
|
41
|
+
def put(ptr, val)
|
42
|
+
ptr.put_int8(@off, val)
|
43
|
+
end
|
44
|
+
def get(ptr)
|
45
|
+
ptr.get_int8(@off)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
class Unsigned8 < Field
|
49
|
+
def self.size; 8; end
|
50
|
+
def put(ptr, val)
|
51
|
+
ptr.put_uint8(@off, val)
|
52
|
+
end
|
53
|
+
def get(ptr)
|
54
|
+
ptr.get_uint8(@off)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
class Signed16 < Field
|
58
|
+
def self.size; 16; end
|
59
|
+
def put(ptr, val)
|
60
|
+
ptr.put_int16(@off, val)
|
61
|
+
end
|
62
|
+
def get(ptr)
|
63
|
+
ptr.get_int16(@off)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
class Unsigned16 < Field
|
67
|
+
def self.size; 16; end
|
68
|
+
def put(ptr, val)
|
69
|
+
ptr.put_uint16(@off, val)
|
70
|
+
end
|
71
|
+
def get(ptr)
|
72
|
+
ptr.get_uint16(@off)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
class Signed32 < Field
|
76
|
+
def self.size; 32; end
|
77
|
+
def put(ptr, val)
|
78
|
+
ptr.put_int32(@off, val)
|
79
|
+
end
|
80
|
+
def get(ptr)
|
81
|
+
ptr.get_int32(@off)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
class Unsigned32 < Field
|
85
|
+
def self.size; 32; end
|
86
|
+
def put(ptr, val)
|
87
|
+
ptr.put_uint32(@off, val)
|
88
|
+
end
|
89
|
+
def get(ptr)
|
90
|
+
ptr.get_uint32(@off)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
class Signed64 < Field
|
94
|
+
def self.size; 64; end
|
95
|
+
def self.align; LONG_ALIGN; end
|
96
|
+
def put(ptr, val)
|
97
|
+
ptr.put_int64(@off, val)
|
98
|
+
end
|
99
|
+
def get(ptr)
|
100
|
+
ptr.get_int64(@off)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
class Unsigned64 < Field
|
104
|
+
def self.size; 64; end
|
105
|
+
def self.align; LONG_ALIGN; end
|
106
|
+
def put(ptr, val)
|
107
|
+
ptr.put_uint64(@off, val)
|
108
|
+
end
|
109
|
+
def get(ptr)
|
110
|
+
ptr.get_uint64(@off)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
def initialize
|
114
|
+
@fields = {}
|
115
|
+
@size = 0
|
116
|
+
end
|
117
|
+
def add_field(name, type, offset=nil)
|
118
|
+
field_class = case type
|
119
|
+
when :char, NativeType::INT8
|
120
|
+
Signed8
|
121
|
+
when :uchar, NativeType::UINT8
|
122
|
+
Unsigned8
|
123
|
+
when :short, NativeType::INT16
|
124
|
+
Signed16
|
125
|
+
when :ushort, NativeType::UINT16
|
126
|
+
Unsigned16
|
127
|
+
when :long, NativeType::LONG
|
128
|
+
FFI::Platform::LONG_SIZE == 32 ? Signed32 : Signed64
|
129
|
+
when :ulong, NativeType::ULONG
|
130
|
+
FFI::Platform::LONG_SIZE == 32 ? Unsigned32 : Unsigned64
|
131
|
+
when :int, NativeType::INT32
|
132
|
+
Signed32
|
133
|
+
when :uint, NativeType::UINT32
|
134
|
+
Unsigned32
|
135
|
+
when :long_long, NativeType::INT64
|
136
|
+
Signed64
|
137
|
+
when :ulong_long, NativeType::UINT64
|
138
|
+
Unsigned64
|
139
|
+
else
|
140
|
+
raise ArgumentError, "Unknown type: #{type}"
|
141
|
+
end
|
142
|
+
|
143
|
+
size = field_class.size / 8
|
144
|
+
off = offset ? offset.to_i : align(@size, field_class.align)
|
145
|
+
@fields[name] = field_class.new(off)
|
146
|
+
@size = off + size
|
147
|
+
end
|
148
|
+
def build
|
149
|
+
StructLayout.new @fields, @size
|
150
|
+
end
|
151
|
+
def align(offset, bits)
|
152
|
+
bytes = bits / 8
|
153
|
+
mask = bytes - 1;
|
154
|
+
off = offset;
|
155
|
+
((off & mask) != 0) ? (off & ~mask) + bytes : off
|
156
|
+
end
|
157
|
+
end
|
158
|
+
class BaseStruct
|
159
|
+
Buffer = FFI::Buffer
|
160
|
+
attr_reader :pointer
|
161
|
+
|
162
|
+
def initialize(pointer = nil, *spec)
|
163
|
+
@cspec = self.class.layout(*spec)
|
164
|
+
|
165
|
+
if pointer then
|
166
|
+
@pointer = pointer
|
167
|
+
else
|
168
|
+
@pointer = MemoryPointer.new size
|
169
|
+
end
|
170
|
+
end
|
171
|
+
def self.alloc_inout(clear = true)
|
172
|
+
self.new(Buffer.alloc_inout(@size, 1, clear))
|
173
|
+
end
|
174
|
+
def self.alloc_in(clear = true)
|
175
|
+
self.new(Buffer.alloc_in(@size, 1, clear))
|
176
|
+
end
|
177
|
+
def self.alloc_out(clear = true)
|
178
|
+
self.new(Buffer.alloc_out(@size, 1, clear))
|
179
|
+
end
|
180
|
+
def self.size
|
181
|
+
@size
|
182
|
+
end
|
183
|
+
def self.members
|
184
|
+
@layout.members
|
185
|
+
end
|
186
|
+
def size
|
187
|
+
self.class.size
|
188
|
+
end
|
189
|
+
def [](field)
|
190
|
+
@cspec[field].get(@pointer)
|
191
|
+
end
|
192
|
+
def []=(field, val)
|
193
|
+
@cspec[field].put(@pointer, val)
|
194
|
+
end
|
195
|
+
def members
|
196
|
+
@cspec.members
|
197
|
+
end
|
198
|
+
def values
|
199
|
+
@cspec.members.map { |m| self[m] }
|
200
|
+
end
|
201
|
+
def clear
|
202
|
+
@pointer.clear
|
203
|
+
self
|
204
|
+
end
|
205
|
+
end
|
206
|
+
class Struct < BaseStruct
|
207
|
+
def self.jruby_layout(spec)
|
208
|
+
raise "Ruby version not supported" if RUBY_VERSION =~ /1.8.*/
|
209
|
+
builder = FFI::StructLayoutBuilder.new
|
210
|
+
spec[0].each do |name,type|
|
211
|
+
builder.add_field(name, FFI.find_type(type))
|
212
|
+
end
|
213
|
+
builder.build
|
214
|
+
end
|
215
|
+
def self.rubinius_layout(spec)
|
216
|
+
builder = FFI::StructLayoutBuilder.new
|
217
|
+
i = 0
|
218
|
+
while i < spec.size
|
219
|
+
name, type, offset = spec[i, 3]
|
220
|
+
|
221
|
+
code = FFI.find_type(type)
|
222
|
+
builder.add_field(name, code, offset)
|
223
|
+
i += 3
|
224
|
+
end
|
225
|
+
builder.build
|
226
|
+
end
|
227
|
+
def self.layout(*spec)
|
228
|
+
|
229
|
+
return @layout if spec.size == 0
|
230
|
+
cspec = spec[0].kind_of?(Hash) ? jruby_layout(spec) : rubinius_layout(spec)
|
231
|
+
|
232
|
+
@layout = cspec unless self == FFI::Struct
|
233
|
+
@size = cspec.size
|
234
|
+
return cspec
|
235
|
+
end
|
236
|
+
def self.config(base, *fields)
|
237
|
+
config = Config::CONFIG
|
238
|
+
@size = config["#{base}.sizeof"]
|
239
|
+
|
240
|
+
builder = StructLayoutBuilder.new
|
241
|
+
|
242
|
+
fields.each do |field|
|
243
|
+
offset = config["#{base}.#{field}.offset"]
|
244
|
+
size = config["#{base}.#{field}.size"]
|
245
|
+
type = config["#{base}.#{field}.type"]
|
246
|
+
type = type ? type.to_sym : FFI.size_to_type(size)
|
247
|
+
|
248
|
+
code = FFI.find_type type
|
249
|
+
if (code == NativeType::CHAR_ARRAY)
|
250
|
+
builder.add_char_array(field.to_s, size, offset)
|
251
|
+
else
|
252
|
+
builder.add_field(field.to_s, code, offset)
|
253
|
+
end
|
254
|
+
end
|
255
|
+
cspec = builder.build
|
256
|
+
|
257
|
+
@layout = cspec
|
258
|
+
@size = cspec.size if @size < cspec.size
|
259
|
+
|
260
|
+
return cspec
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#
|
2
|
+
# Generated Makefile - do not edit!
|
3
|
+
#
|
4
|
+
# Edit the Makefile in the project folder instead (../Makefile). Each target
|
5
|
+
# has a -pre and a -post target defined where you can add customized code.
|
6
|
+
#
|
7
|
+
# This makefile implements configuration specific macros and targets.
|
8
|
+
|
9
|
+
|
10
|
+
# Environment
|
11
|
+
MKDIR=mkdir
|
12
|
+
CP=cp
|
13
|
+
CCADMIN=CCadmin
|
14
|
+
RANLIB=ranlib
|
15
|
+
CC=gcc
|
16
|
+
CCC=g++
|
17
|
+
CXX=g++
|
18
|
+
FC=
|
19
|
+
|
20
|
+
# Include project Makefile
|
21
|
+
include ruby-ffi-Makefile.mk
|
22
|
+
|
23
|
+
# Object Directory
|
24
|
+
OBJECTDIR=build/Default/GNU-MacOSX
|
25
|
+
|
26
|
+
# Object Files
|
27
|
+
OBJECTFILES=
|
28
|
+
|
29
|
+
# C Compiler Flags
|
30
|
+
CFLAGS=
|
31
|
+
|
32
|
+
# CC Compiler Flags
|
33
|
+
CCFLAGS=
|
34
|
+
CXXFLAGS=
|
35
|
+
|
36
|
+
# Fortran Compiler Flags
|
37
|
+
FFLAGS=
|
38
|
+
|
39
|
+
# Link Libraries and Options
|
40
|
+
LDLIBSOPTIONS=
|
41
|
+
|
42
|
+
# Build Targets
|
43
|
+
.build-conf: ${BUILD_SUBPROJECTS}
|
44
|
+
cd . && make -f Makefile
|
45
|
+
|
46
|
+
# Subprojects
|
47
|
+
.build-subprojects:
|
48
|
+
|
49
|
+
# Clean Targets
|
50
|
+
.clean-conf:
|
51
|
+
cd . && make -f Makefile clean
|
52
|
+
|
53
|
+
# Subprojects
|
54
|
+
.clean-subprojects:
|
@@ -0,0 +1,123 @@
|
|
1
|
+
#
|
2
|
+
# Generated Makefile - do not edit!
|
3
|
+
#
|
4
|
+
# Edit the Makefile in the project folder instead (../Makefile). Each target
|
5
|
+
# has a pre- and a post- target defined where you can add customization code.
|
6
|
+
#
|
7
|
+
# This makefile implements macros and targets common to all configurations.
|
8
|
+
#
|
9
|
+
# NOCDDL
|
10
|
+
|
11
|
+
|
12
|
+
# Building and Cleaning subprojects are done by default, but can be controlled with the SUB
|
13
|
+
# macro. If SUB=no, subprojects will not be built or cleaned. The following macro
|
14
|
+
# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf
|
15
|
+
# and .clean-reqprojects-conf unless SUB has the value 'no'
|
16
|
+
SUB_no=NO
|
17
|
+
SUBPROJECTS=${SUB_${SUB}}
|
18
|
+
BUILD_SUBPROJECTS_=.build-subprojects
|
19
|
+
BUILD_SUBPROJECTS_NO=
|
20
|
+
BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}}
|
21
|
+
CLEAN_SUBPROJECTS_=.clean-subprojects
|
22
|
+
CLEAN_SUBPROJECTS_NO=
|
23
|
+
CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}}
|
24
|
+
|
25
|
+
|
26
|
+
# Project Name
|
27
|
+
PROJECTNAME=ruby-ffi
|
28
|
+
|
29
|
+
# Active Configuration
|
30
|
+
DEFAULTCONF=Default
|
31
|
+
CONF=${DEFAULTCONF}
|
32
|
+
|
33
|
+
# All Configurations
|
34
|
+
ALLCONFS=Default
|
35
|
+
|
36
|
+
|
37
|
+
# build
|
38
|
+
.build-impl: .validate-impl .depcheck-impl
|
39
|
+
@#echo "=> Running $@... Configuration=$(CONF)"
|
40
|
+
${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf
|
41
|
+
|
42
|
+
|
43
|
+
# clean
|
44
|
+
.clean-impl: .validate-impl .depcheck-impl
|
45
|
+
@#echo "=> Running $@... Configuration=$(CONF)"
|
46
|
+
${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf
|
47
|
+
|
48
|
+
|
49
|
+
# clobber
|
50
|
+
.clobber-impl: .depcheck-impl
|
51
|
+
@#echo "=> Running $@..."
|
52
|
+
for CONF in ${ALLCONFS}; \
|
53
|
+
do \
|
54
|
+
${MAKE} -f nbproject/Makefile-$${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf; \
|
55
|
+
done
|
56
|
+
|
57
|
+
# all
|
58
|
+
.all-impl: .depcheck-impl
|
59
|
+
@#echo "=> Running $@..."
|
60
|
+
for CONF in ${ALLCONFS}; \
|
61
|
+
do \
|
62
|
+
${MAKE} -f nbproject/Makefile-$${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf; \
|
63
|
+
done
|
64
|
+
|
65
|
+
# dependency checking support
|
66
|
+
.depcheck-impl:
|
67
|
+
@echo "# This code depends on make tool being used" >.dep.inc
|
68
|
+
@if [ -n "${MAKE_VERSION}" ]; then \
|
69
|
+
echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \
|
70
|
+
echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \
|
71
|
+
echo "include \$${DEPFILES}" >>.dep.inc; \
|
72
|
+
echo "endif" >>.dep.inc; \
|
73
|
+
else \
|
74
|
+
echo ".KEEP_STATE:" >>.dep.inc; \
|
75
|
+
echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \
|
76
|
+
fi
|
77
|
+
|
78
|
+
# configuration validation
|
79
|
+
.validate-impl:
|
80
|
+
@if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
|
81
|
+
then \
|
82
|
+
echo ""; \
|
83
|
+
echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \
|
84
|
+
echo "See 'make help' for details."; \
|
85
|
+
echo "Current directory: " `pwd`; \
|
86
|
+
echo ""; \
|
87
|
+
fi
|
88
|
+
@if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
|
89
|
+
then \
|
90
|
+
exit 1; \
|
91
|
+
fi
|
92
|
+
|
93
|
+
|
94
|
+
# help
|
95
|
+
.help-impl:
|
96
|
+
@echo "This makefile supports the following configurations:"
|
97
|
+
@echo " ${ALLCONFS}"
|
98
|
+
@echo ""
|
99
|
+
@echo "and the following targets:"
|
100
|
+
@echo " build (default target)"
|
101
|
+
@echo " clean"
|
102
|
+
@echo " clobber"
|
103
|
+
@echo " all"
|
104
|
+
@echo " help"
|
105
|
+
@echo ""
|
106
|
+
@echo "Makefile Usage:"
|
107
|
+
@echo " make [CONF=<CONFIGURATION>] [SUB=no] build"
|
108
|
+
@echo " make [CONF=<CONFIGURATION>] [SUB=no] clean"
|
109
|
+
@echo " make [SUB=no] clobber"
|
110
|
+
@echo " make [SUB=no] all"
|
111
|
+
@echo " make help"
|
112
|
+
@echo ""
|
113
|
+
@echo "Target 'build' will build a specific configuration and, unless 'SUB=no',"
|
114
|
+
@echo " also build subprojects."
|
115
|
+
@echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no',"
|
116
|
+
@echo " also clean subprojects."
|
117
|
+
@echo "Target 'clobber' will remove all built files from all configurations and,"
|
118
|
+
@echo " unless 'SUB=no', also from subprojects."
|
119
|
+
@echo "Target 'all' will will build all configurations and, unless 'SUB=no',"
|
120
|
+
@echo " also build subprojects."
|
121
|
+
@echo "Target 'help' prints this message."
|
122
|
+
@echo ""
|
123
|
+
|