ffi 1.9.21 → 1.9.22
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 +5 -5
- checksums.yaml.gz.sig +3 -0
- data.tar.gz.sig +0 -0
- 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/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/extconf.rb +3 -3
- data/ext/ffi_c/ffi.c +2 -2
- data/ext/ffi_c/libffi.bsd.mk +3 -3
- data/ext/ffi_c/libffi.darwin.mk +1 -1
- data/ext/ffi_c/libffi.gnu.mk +1 -1
- data/ext/ffi_c/libffi.mk +2 -2
- data/ext/ffi_c/libffi.vc.mk +1 -1
- data/ext/ffi_c/libffi.vc64.mk +1 -1
- data/ext/ffi_c/libffi/.appveyor.yml +48 -0
- data/ext/ffi_c/libffi/.gitignore +36 -0
- data/ext/ffi_c/libffi/.travis.yml +30 -0
- data/ext/ffi_c/libffi/.travis/install.sh +14 -0
- data/ext/ffi_c/libffi/Makefile.am +5 -3
- data/ext/ffi_c/libffi/acinclude.m4 +6 -0
- data/ext/ffi_c/libffi/autogen.sh +1 -1
- data/ext/ffi_c/libffi/config.guess +1466 -0
- data/ext/ffi_c/libffi/config.sub +1836 -0
- data/ext/ffi_c/libffi/configure.ac +2 -2
- data/ext/ffi_c/libffi/configure.host +15 -3
- data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +11 -15
- data/ext/ffi_c/libffi/include/ffi.h.in +6 -1
- data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +465 -59
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +33 -10
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +2 -2
- data/ext/ffi_c/libffi/src/arm/ffi.c +12 -1
- data/ext/ffi_c/libffi/src/arm/sysv.S +1 -1
- data/ext/ffi_c/libffi/src/closures.c +143 -97
- data/ext/ffi_c/libffi/src/ia64/unix.S +2 -0
- data/ext/ffi_c/libffi/src/mips/ffi.c +8 -0
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +1 -1
- data/ext/ffi_c/libffi/src/mips/n32.S +2 -0
- data/ext/ffi_c/libffi/src/powerpc/aix.S +239 -1
- data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +250 -3
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +86 -5
- data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +3 -0
- data/ext/ffi_c/libffi/src/x86/ffi.c +3 -1
- data/ext/ffi_c/libffi/src/x86/ffi64.c +26 -5
- data/ext/ffi_c/libffi/src/x86/sysv.S +2 -2
- data/ext/ffi_c/libffi/src/x86/unix64.S +1 -1
- data/ext/ffi_c/libffi/src/x86/win64.S +1 -1
- data/ext/ffi_c/libffi/testsuite/Makefile.am +2 -1
- data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +2 -1
- data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c +95 -0
- data/ffi.gemspec +14 -1
- 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 +59 -81
- metadata.gz.sig +0 -0
- data/ext/ffi_c/ClosurePool.c +0 -283
- 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/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/spec/ffi/function_spec.rb
DELETED
@@ -1,97 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# This file is part of ruby-ffi.
|
3
|
-
# For licensing, see LICENSE.SPECS
|
4
|
-
#
|
5
|
-
|
6
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
7
|
-
|
8
|
-
describe FFI::Function do
|
9
|
-
module LibTest
|
10
|
-
extend FFI::Library
|
11
|
-
ffi_lib TestLibrary::PATH
|
12
|
-
attach_function :testFunctionAdd, [:int, :int, :pointer], :int
|
13
|
-
end
|
14
|
-
before do
|
15
|
-
@libtest = FFI::DynamicLibrary.open(TestLibrary::PATH,
|
16
|
-
FFI::DynamicLibrary::RTLD_LAZY | FFI::DynamicLibrary::RTLD_GLOBAL)
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'is initialized with a signature and a block' do
|
20
|
-
fn = FFI::Function.new(:int, []) { 5 }
|
21
|
-
expect(fn.call).to eql 5
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'raises an error when passing a wrong signature' do
|
25
|
-
expect { FFI::Function.new([], :int).new { } }.to raise_error TypeError
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'returns a native pointer' do
|
29
|
-
expect(FFI::Function.new(:int, []) { }).to be_a_kind_of FFI::Pointer
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'can be used as callback from C passing to it a block' do
|
33
|
-
function_add = FFI::Function.new(:int, [:int, :int]) { |a, b| a + b }
|
34
|
-
expect(LibTest.testFunctionAdd(10, 10, function_add)).to eq(20)
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'can be used as callback from C passing to it a Proc object' do
|
38
|
-
function_add = FFI::Function.new(:int, [:int, :int], Proc.new { |a, b| a + b })
|
39
|
-
expect(LibTest.testFunctionAdd(10, 10, function_add)).to eq(20)
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'can be used to wrap an existing function pointer' do
|
43
|
-
expect(FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd')).call(10, 10)).to eq(20)
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'can be attached to a module' do
|
47
|
-
module Foo; end
|
48
|
-
fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd'))
|
49
|
-
fp.attach(Foo, 'add')
|
50
|
-
expect(Foo.add(10, 10)).to eq(20)
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'can be used to extend an object' do
|
54
|
-
fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd'))
|
55
|
-
foo = Object.new
|
56
|
-
class << foo
|
57
|
-
def singleton_class
|
58
|
-
class << self; self; end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
fp.attach(foo.singleton_class, 'add')
|
62
|
-
expect(foo.add(10, 10)).to eq(20)
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'can wrap a blocking function' do
|
66
|
-
fpOpen = FFI::Function.new(:pointer, [ ], @libtest.find_function('testBlockingOpen'))
|
67
|
-
fpRW = FFI::Function.new(:char, [ :pointer, :char ], @libtest.find_function('testBlockingRW'), :blocking => true)
|
68
|
-
fpWR = FFI::Function.new(:char, [ :pointer, :char ], @libtest.find_function('testBlockingWR'), :blocking => true)
|
69
|
-
fpClose = FFI::Function.new(:void, [ :pointer ], @libtest.find_function('testBlockingClose'))
|
70
|
-
handle = fpOpen.call
|
71
|
-
expect(handle).not_to be_null
|
72
|
-
begin
|
73
|
-
thWR = Thread.new { fpWR.call(handle, 63) }
|
74
|
-
thRW = Thread.new { fpRW.call(handle, 64) }
|
75
|
-
expect(thWR.value).to eq(64)
|
76
|
-
expect(thRW.value).to eq(63)
|
77
|
-
ensure
|
78
|
-
fpClose.call(handle)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'autorelease flag is set to true by default' do
|
83
|
-
fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd'))
|
84
|
-
expect(fp.autorelease?).to be true
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'can explicity free itself' do
|
88
|
-
fp = FFI::Function.new(:int, []) { }
|
89
|
-
fp.free
|
90
|
-
expect { fp.free }.to raise_error RuntimeError
|
91
|
-
end
|
92
|
-
|
93
|
-
it 'can\'t explicity free itself if not previously allocated' do
|
94
|
-
fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd'))
|
95
|
-
expect { fp.free }.to raise_error RuntimeError
|
96
|
-
end
|
97
|
-
end
|
data/spec/ffi/io_spec.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# This file is part of ruby-ffi.
|
3
|
-
# For licensing, see LICENSE.SPECS
|
4
|
-
#
|
5
|
-
|
6
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
7
|
-
|
8
|
-
if false # disabled for #390
|
9
|
-
describe "FFI::IO.for_fd" do
|
10
|
-
it "produces an IO wrapping the specified file descriptor" do
|
11
|
-
expect do
|
12
|
-
FFI::IO.for_fd(2, "r")
|
13
|
-
end.to_not raise_error
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
data/spec/ffi/library_spec.rb
DELETED
@@ -1,286 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# This file is part of ruby-ffi.
|
3
|
-
# For licensing, see LICENSE.SPECS
|
4
|
-
#
|
5
|
-
|
6
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
7
|
-
|
8
|
-
describe "Library" do
|
9
|
-
describe ".enum_value" do
|
10
|
-
m = Module.new do
|
11
|
-
extend FFI::Library
|
12
|
-
enum :something, [:one, :two]
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should return a value for a valid key" do
|
16
|
-
expect(m.enum_value(:one)).to eq(0)
|
17
|
-
expect(m.enum_value(:two)).to eq(1)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should return nil for an invalid key" do
|
21
|
-
expect(m.enum_value(:three)).to be nil
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
describe "#ffi_convention" do
|
26
|
-
it "defaults to :default" do
|
27
|
-
m = Module.new do
|
28
|
-
extend FFI::Library
|
29
|
-
end
|
30
|
-
expect(m.ffi_convention).to eq(:default)
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should be settable" do
|
34
|
-
m = Module.new do
|
35
|
-
extend FFI::Library
|
36
|
-
end
|
37
|
-
|
38
|
-
expect(m.ffi_convention).to eq(:default)
|
39
|
-
m.ffi_convention :stdcall
|
40
|
-
expect(m.ffi_convention).to eq(:stdcall)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
if FFI::Platform::OS =~ /windows|cygwin/ && FFI::Platform::ARCH == 'i386'
|
45
|
-
module LibTestStdcall
|
46
|
-
extend FFI::Library
|
47
|
-
ffi_lib TestLibrary::PATH
|
48
|
-
ffi_convention :stdcall
|
49
|
-
|
50
|
-
class StructUCDP < FFI::Struct
|
51
|
-
layout :a1, :uchar,
|
52
|
-
:a2, :double,
|
53
|
-
:a3, :pointer
|
54
|
-
end
|
55
|
-
|
56
|
-
attach_function :testStdcallManyParams, [ :pointer, :int8, :int16, :int32, :int64,
|
57
|
-
StructUCDP.by_value, StructUCDP.by_ref, :float, :double ], :void
|
58
|
-
end
|
59
|
-
|
60
|
-
it "adds stdcall decoration: testStdcallManyParams@64" do
|
61
|
-
s = LibTestStdcall::StructUCDP.new
|
62
|
-
po = FFI::MemoryPointer.new :long
|
63
|
-
LibTestStdcall.testStdcallManyParams po, 1, 2, 3, 4, s, s, 1.0, 2.0
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
describe "ffi_lib" do
|
68
|
-
it "empty name list should raise error" do
|
69
|
-
expect {
|
70
|
-
Module.new do |m|
|
71
|
-
m.extend FFI::Library
|
72
|
-
ffi_lib
|
73
|
-
end
|
74
|
-
}.to raise_error(LoadError)
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
78
|
-
|
79
|
-
unless RbConfig::CONFIG['target_os'] =~ /mswin|mingw/
|
80
|
-
it "attach_function with no library specified" do
|
81
|
-
expect {
|
82
|
-
Module.new do |m|
|
83
|
-
m.extend FFI::Library
|
84
|
-
attach_function :getpid, [ ], :uint
|
85
|
-
end
|
86
|
-
}.to raise_error
|
87
|
-
end
|
88
|
-
|
89
|
-
it "attach_function :getpid from this process" do
|
90
|
-
expect {
|
91
|
-
expect(Module.new do |m|
|
92
|
-
m.extend FFI::Library
|
93
|
-
ffi_lib FFI::Library::CURRENT_PROCESS
|
94
|
-
attach_function :getpid, [ ], :uint
|
95
|
-
end.getpid).to eq(Process.pid)
|
96
|
-
}.not_to raise_error
|
97
|
-
end
|
98
|
-
|
99
|
-
it "loads library using symbol" do
|
100
|
-
expect {
|
101
|
-
expect(Module.new do |m|
|
102
|
-
m.extend FFI::Library
|
103
|
-
ffi_lib :c
|
104
|
-
attach_function :getpid, [ ], :uint
|
105
|
-
end.getpid).to eq(Process.pid)
|
106
|
-
}.not_to raise_error
|
107
|
-
end
|
108
|
-
|
109
|
-
it "attach_function :getpid from [ 'c', 'libc.so.6'] " do
|
110
|
-
expect {
|
111
|
-
expect(Module.new do |m|
|
112
|
-
m.extend FFI::Library
|
113
|
-
ffi_lib [ 'c', 'libc.so.6' ]
|
114
|
-
attach_function :getpid, [ ], :uint
|
115
|
-
end.getpid).to eq(Process.pid)
|
116
|
-
}.not_to raise_error
|
117
|
-
end
|
118
|
-
|
119
|
-
it "attach_function :getpid from [ 'libc.so.6', 'c' ] " do
|
120
|
-
expect {
|
121
|
-
expect(Module.new do |m|
|
122
|
-
m.extend FFI::Library
|
123
|
-
ffi_lib [ 'libc.so.6', 'c' ]
|
124
|
-
attach_function :getpid, [ ], :uint
|
125
|
-
end.getpid).to eq(Process.pid)
|
126
|
-
}.not_to raise_error
|
127
|
-
end
|
128
|
-
|
129
|
-
it "attach_function :getpid from [ 'libfubar.so.0xdeadbeef', nil, 'c' ] " do
|
130
|
-
expect {
|
131
|
-
expect(Module.new do |m|
|
132
|
-
m.extend FFI::Library
|
133
|
-
ffi_lib [ 'libfubar.so.0xdeadbeef', nil, 'c' ]
|
134
|
-
attach_function :getpid, [ ], :uint
|
135
|
-
end.getpid).to eq(Process.pid)
|
136
|
-
}.not_to raise_error
|
137
|
-
end
|
138
|
-
|
139
|
-
it "attach_function :getpid from [ 'libfubar.so.0xdeadbeef' ] " do
|
140
|
-
expect {
|
141
|
-
expect(Module.new do |m|
|
142
|
-
m.extend FFI::Library
|
143
|
-
ffi_lib 'libfubar.so.0xdeadbeef'
|
144
|
-
attach_function :getpid, [ ], :uint
|
145
|
-
end.getpid).to eq(Process.pid)
|
146
|
-
}.to raise_error(LoadError)
|
147
|
-
end
|
148
|
-
|
149
|
-
it "attach_function :bool_return_true from [ File.expand_path(#{TestLibrary::PATH.inspect}) ]" do
|
150
|
-
mod = Module.new do |m|
|
151
|
-
m.extend FFI::Library
|
152
|
-
ffi_lib File.expand_path(TestLibrary::PATH)
|
153
|
-
attach_function :bool_return_true, [ ], :bool
|
154
|
-
end
|
155
|
-
expect(mod.bool_return_true).to be true
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def gvar_lib(name, type)
|
160
|
-
Module.new do |m|
|
161
|
-
m.extend FFI::Library
|
162
|
-
ffi_lib TestLibrary::PATH
|
163
|
-
attach_variable :gvar, "gvar_#{name}", type
|
164
|
-
attach_function :get, "gvar_#{name}_get", [], type
|
165
|
-
attach_function :set, "gvar_#{name}_set", [ type ], :void
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
def gvar_test(name, type, val)
|
170
|
-
lib = gvar_lib(name, type)
|
171
|
-
lib.set(val)
|
172
|
-
expect(lib.gvar).to eq(val)
|
173
|
-
lib.set(0)
|
174
|
-
lib.gvar = val
|
175
|
-
expect(lib.get).to eq(val)
|
176
|
-
end
|
177
|
-
|
178
|
-
[ 0, 127, -128, -1 ].each do |i|
|
179
|
-
it ":char variable" do
|
180
|
-
gvar_test("s8", :char, i)
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
[ 0, 0x7f, 0x80, 0xff ].each do |i|
|
185
|
-
it ":uchar variable" do
|
186
|
-
gvar_test("u8", :uchar, i)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
[ 0, 0x7fff, -0x8000, -1 ].each do |i|
|
191
|
-
it ":short variable" do
|
192
|
-
gvar_test("s16", :short, i)
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
[ 0, 0x7fff, 0x8000, 0xffff ].each do |i|
|
197
|
-
it ":ushort variable" do
|
198
|
-
gvar_test("u16", :ushort, i)
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
[ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
|
203
|
-
it ":int variable" do
|
204
|
-
gvar_test("s32", :int, i)
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
[ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
|
209
|
-
it ":uint variable" do
|
210
|
-
gvar_test("u32", :uint, i)
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
[ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
|
215
|
-
it ":long_long variable" do
|
216
|
-
gvar_test("s64", :long_long, i)
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
[ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
|
221
|
-
it ":ulong_long variable" do
|
222
|
-
gvar_test("u64", :ulong_long, i)
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
if FFI::Platform::LONG_SIZE == 32
|
227
|
-
[ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
|
228
|
-
it ":long variable" do
|
229
|
-
gvar_test("long", :long, i)
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
|
-
[ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
|
234
|
-
it ":ulong variable" do
|
235
|
-
gvar_test("ulong", :ulong, i)
|
236
|
-
end
|
237
|
-
end
|
238
|
-
else
|
239
|
-
[ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
|
240
|
-
it ":long variable" do
|
241
|
-
gvar_test("long", :long, i)
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
[ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
|
246
|
-
it ":ulong variable" do
|
247
|
-
gvar_test("ulong", :ulong, i)
|
248
|
-
end
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
it "Pointer variable" do
|
253
|
-
lib = gvar_lib("pointer", :pointer)
|
254
|
-
val = FFI::MemoryPointer.new :long
|
255
|
-
lib.set(val)
|
256
|
-
expect(lib.gvar).to eq(val)
|
257
|
-
lib.set(nil)
|
258
|
-
lib.gvar = val
|
259
|
-
expect(lib.get).to eq(val)
|
260
|
-
end
|
261
|
-
|
262
|
-
[ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
|
263
|
-
it "structure" do
|
264
|
-
class GlobalStruct < FFI::Struct
|
265
|
-
layout :data, :long
|
266
|
-
end
|
267
|
-
|
268
|
-
lib = Module.new do |m|
|
269
|
-
m.extend FFI::Library
|
270
|
-
ffi_lib TestLibrary::PATH
|
271
|
-
attach_variable :gvar, "gvar_gstruct", GlobalStruct
|
272
|
-
attach_function :get, "gvar_gstruct_get", [], GlobalStruct
|
273
|
-
attach_function :set, "gvar_gstruct_set", [ GlobalStruct ], :void
|
274
|
-
end
|
275
|
-
|
276
|
-
val = GlobalStruct.new
|
277
|
-
val[:data] = i
|
278
|
-
lib.set(val)
|
279
|
-
expect(lib.gvar[:data]).to eq(i)
|
280
|
-
val[:data] = 0
|
281
|
-
lib.gvar[:data] = i
|
282
|
-
val = GlobalStruct.new(lib.get)
|
283
|
-
expect(val[:data]).to eq(i)
|
284
|
-
end
|
285
|
-
end
|
286
|
-
end
|
data/spec/ffi/long_double.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# This file is part of ruby-ffi.
|
3
|
-
# For licensing, see LICENSE.SPECS
|
4
|
-
#
|
5
|
-
|
6
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
7
|
-
require 'bigdecimal'
|
8
|
-
|
9
|
-
describe ":long_double arguments and return values" do
|
10
|
-
module LibTest
|
11
|
-
extend FFI::Library
|
12
|
-
ffi_lib TestLibrary::PATH
|
13
|
-
attach_function :add_f128, [ :long_double, :long_double ], :long_double
|
14
|
-
attach_function :ret_f128, [ :long_double ], :long_double
|
15
|
-
end
|
16
|
-
|
17
|
-
it "returns first parameter" do
|
18
|
-
expect(LibTest.ret_f128(0.1)).to be_within(0.01).of(0.1)
|
19
|
-
end
|
20
|
-
|
21
|
-
it "returns first parameter with high precision" do
|
22
|
-
ld = BigDecimal.new("1.234567890123456789")
|
23
|
-
tolerance = BigDecimal.new("0.0000000000000000001")
|
24
|
-
expect(LibTest.ret_f128(ld)).to be_within(tolerance).of(ld)
|
25
|
-
end
|
26
|
-
|
27
|
-
it "add two long double numbers" do
|
28
|
-
expect(LibTest.add_f128(0.1, 0.2)).to be_within(0.01).of(0.3)
|
29
|
-
end
|
30
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# This file is part of ruby-ffi.
|
3
|
-
# For licensing, see LICENSE.SPECS
|
4
|
-
#
|
5
|
-
|
6
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
7
|
-
|
8
|
-
describe "Managed Struct" do
|
9
|
-
include FFI
|
10
|
-
module ManagedStructTestLib
|
11
|
-
extend FFI::Library
|
12
|
-
ffi_lib TestLibrary::PATH
|
13
|
-
attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should raise an error if release() is not defined" do
|
17
|
-
class NoRelease < FFI::ManagedStruct ; layout :i, :int; end
|
18
|
-
expect { NoRelease.new(ManagedStructTestLib.ptr_from_address(0x12345678)) }.to raise_error(NoMethodError)
|
19
|
-
end
|
20
|
-
|
21
|
-
it "should be the right class" do
|
22
|
-
class WhatClassAmI < FFI::ManagedStruct
|
23
|
-
layout :i, :int
|
24
|
-
def self.release
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
expect(WhatClassAmI.new(ManagedStructTestLib.ptr_from_address(0x12345678)).class).to eq(WhatClassAmI)
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should build with self reference" do
|
32
|
-
class ClassWithSelfRef < FFI::ManagedStruct
|
33
|
-
layout :data, self.ptr
|
34
|
-
def self.release
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
expect(ClassWithSelfRef.new(ManagedStructTestLib.ptr_from_address(0x12345678)).class).to eq(ClassWithSelfRef)
|
39
|
-
end
|
40
|
-
|
41
|
-
# see #427
|
42
|
-
it "should release memory properly", :broken => true do
|
43
|
-
class PleaseReleaseMe < FFI::ManagedStruct
|
44
|
-
layout :i, :int
|
45
|
-
@@count = 0
|
46
|
-
def self.release
|
47
|
-
@@count += 1
|
48
|
-
end
|
49
|
-
def self.wait_gc(count)
|
50
|
-
loop = 5
|
51
|
-
while loop > 0 && @@count < count
|
52
|
-
loop -= 1
|
53
|
-
TestLibrary.force_gc
|
54
|
-
sleep 0.05 if @@count < count
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
loop_count = 30
|
60
|
-
wiggle_room = 5
|
61
|
-
|
62
|
-
expect(PleaseReleaseMe).to receive(:release).at_least(loop_count-wiggle_room).times
|
63
|
-
loop_count.times do
|
64
|
-
PleaseReleaseMe.new(ManagedStructTestLib.ptr_from_address(0x12345678))
|
65
|
-
end
|
66
|
-
PleaseReleaseMe.wait_gc loop_count
|
67
|
-
end
|
68
|
-
end
|