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.

Files changed (151) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +3 -0
  3. data.tar.gz.sig +0 -0
  4. data/.gitignore +22 -0
  5. data/.gitmodules +3 -0
  6. data/.travis.yml +52 -0
  7. data/.yardopts +5 -0
  8. data/Gemfile +15 -0
  9. data/{spec/ffi/LICENSE.SPECS → LICENSE.SPECS} +1 -1
  10. data/README.md +1 -1
  11. data/Rakefile +28 -3
  12. data/appveyor.yml +22 -0
  13. data/ext/ffi_c/Call.c +1 -22
  14. data/ext/ffi_c/Call.h +0 -9
  15. data/ext/ffi_c/Closure.c +54 -0
  16. data/ext/ffi_c/{ClosurePool.h → Closure.h} +13 -23
  17. data/ext/ffi_c/Function.c +16 -25
  18. data/ext/ffi_c/Function.h +1 -2
  19. data/ext/ffi_c/FunctionInfo.c +0 -4
  20. data/ext/ffi_c/MethodHandle.c +33 -268
  21. data/ext/ffi_c/extconf.rb +3 -3
  22. data/ext/ffi_c/ffi.c +2 -2
  23. data/ext/ffi_c/libffi.bsd.mk +3 -3
  24. data/ext/ffi_c/libffi.darwin.mk +1 -1
  25. data/ext/ffi_c/libffi.gnu.mk +1 -1
  26. data/ext/ffi_c/libffi.mk +2 -2
  27. data/ext/ffi_c/libffi.vc.mk +1 -1
  28. data/ext/ffi_c/libffi.vc64.mk +1 -1
  29. data/ext/ffi_c/libffi/.appveyor.yml +48 -0
  30. data/ext/ffi_c/libffi/.gitignore +36 -0
  31. data/ext/ffi_c/libffi/.travis.yml +30 -0
  32. data/ext/ffi_c/libffi/.travis/install.sh +14 -0
  33. data/ext/ffi_c/libffi/Makefile.am +5 -3
  34. data/ext/ffi_c/libffi/acinclude.m4 +6 -0
  35. data/ext/ffi_c/libffi/autogen.sh +1 -1
  36. data/ext/ffi_c/libffi/config.guess +1466 -0
  37. data/ext/ffi_c/libffi/config.sub +1836 -0
  38. data/ext/ffi_c/libffi/configure.ac +2 -2
  39. data/ext/ffi_c/libffi/configure.host +15 -3
  40. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +11 -15
  41. data/ext/ffi_c/libffi/include/ffi.h.in +6 -1
  42. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +465 -59
  43. data/ext/ffi_c/libffi/src/aarch64/ffi.c +33 -10
  44. data/ext/ffi_c/libffi/src/aarch64/sysv.S +2 -2
  45. data/ext/ffi_c/libffi/src/arm/ffi.c +12 -1
  46. data/ext/ffi_c/libffi/src/arm/sysv.S +1 -1
  47. data/ext/ffi_c/libffi/src/closures.c +143 -97
  48. data/ext/ffi_c/libffi/src/ia64/unix.S +2 -0
  49. data/ext/ffi_c/libffi/src/mips/ffi.c +8 -0
  50. data/ext/ffi_c/libffi/src/mips/ffitarget.h +1 -1
  51. data/ext/ffi_c/libffi/src/mips/n32.S +2 -0
  52. data/ext/ffi_c/libffi/src/powerpc/aix.S +239 -1
  53. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +250 -3
  54. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +86 -5
  55. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +3 -0
  56. data/ext/ffi_c/libffi/src/x86/ffi.c +3 -1
  57. data/ext/ffi_c/libffi/src/x86/ffi64.c +26 -5
  58. data/ext/ffi_c/libffi/src/x86/sysv.S +2 -2
  59. data/ext/ffi_c/libffi/src/x86/unix64.S +1 -1
  60. data/ext/ffi_c/libffi/src/x86/win64.S +1 -1
  61. data/ext/ffi_c/libffi/testsuite/Makefile.am +2 -1
  62. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +2 -1
  63. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c +95 -0
  64. data/ffi.gemspec +14 -1
  65. data/lib/ffi/library.rb +1 -1
  66. data/lib/ffi/version.rb +1 -1
  67. data/samples/getlogin.rb +8 -0
  68. data/samples/getpid.rb +8 -0
  69. data/samples/gettimeofday.rb +18 -0
  70. data/samples/hello.rb +7 -0
  71. data/samples/inotify.rb +60 -0
  72. data/samples/pty.rb +76 -0
  73. data/samples/qsort.rb +21 -0
  74. data/samples/sample_helper.rb +6 -0
  75. metadata +59 -81
  76. metadata.gz.sig +0 -0
  77. data/ext/ffi_c/ClosurePool.c +0 -283
  78. data/gen/Rakefile +0 -30
  79. data/libtest/Benchmark.c +0 -52
  80. data/libtest/BoolTest.c +0 -34
  81. data/libtest/BufferTest.c +0 -31
  82. data/libtest/ClosureTest.c +0 -205
  83. data/libtest/EnumTest.c +0 -51
  84. data/libtest/FunctionTest.c +0 -70
  85. data/libtest/GNUmakefile +0 -149
  86. data/libtest/GlobalVariable.c +0 -62
  87. data/libtest/LastErrorTest.c +0 -21
  88. data/libtest/NumberTest.c +0 -132
  89. data/libtest/PointerTest.c +0 -63
  90. data/libtest/ReferenceTest.c +0 -23
  91. data/libtest/StringTest.c +0 -34
  92. data/libtest/StructTest.c +0 -243
  93. data/libtest/UnionTest.c +0 -43
  94. data/libtest/VariadicTest.c +0 -99
  95. data/spec/ffi/async_callback_spec.rb +0 -35
  96. data/spec/ffi/bitmask_spec.rb +0 -575
  97. data/spec/ffi/bool_spec.rb +0 -32
  98. data/spec/ffi/buffer_spec.rb +0 -279
  99. data/spec/ffi/callback_spec.rb +0 -773
  100. data/spec/ffi/custom_param_type.rb +0 -37
  101. data/spec/ffi/custom_type_spec.rb +0 -74
  102. data/spec/ffi/dup_spec.rb +0 -52
  103. data/spec/ffi/enum_spec.rb +0 -423
  104. data/spec/ffi/errno_spec.rb +0 -20
  105. data/spec/ffi/ffi_spec.rb +0 -28
  106. data/spec/ffi/fixtures/Benchmark.c +0 -52
  107. data/spec/ffi/fixtures/BitmaskTest.c +0 -51
  108. data/spec/ffi/fixtures/BoolTest.c +0 -34
  109. data/spec/ffi/fixtures/BufferTest.c +0 -31
  110. data/spec/ffi/fixtures/ClosureTest.c +0 -205
  111. data/spec/ffi/fixtures/EnumTest.c +0 -51
  112. data/spec/ffi/fixtures/FunctionTest.c +0 -142
  113. data/spec/ffi/fixtures/GNUmakefile +0 -149
  114. data/spec/ffi/fixtures/GlobalVariable.c +0 -62
  115. data/spec/ffi/fixtures/LastErrorTest.c +0 -21
  116. data/spec/ffi/fixtures/NumberTest.c +0 -132
  117. data/spec/ffi/fixtures/PipeHelper.h +0 -21
  118. data/spec/ffi/fixtures/PipeHelperPosix.c +0 -41
  119. data/spec/ffi/fixtures/PipeHelperWindows.c +0 -72
  120. data/spec/ffi/fixtures/PointerTest.c +0 -63
  121. data/spec/ffi/fixtures/ReferenceTest.c +0 -23
  122. data/spec/ffi/fixtures/StringTest.c +0 -34
  123. data/spec/ffi/fixtures/StructTest.c +0 -243
  124. data/spec/ffi/fixtures/UnionTest.c +0 -43
  125. data/spec/ffi/fixtures/VariadicTest.c +0 -99
  126. data/spec/ffi/fixtures/classes.rb +0 -438
  127. data/spec/ffi/function_spec.rb +0 -97
  128. data/spec/ffi/io_spec.rb +0 -16
  129. data/spec/ffi/library_spec.rb +0 -286
  130. data/spec/ffi/long_double.rb +0 -30
  131. data/spec/ffi/managed_struct_spec.rb +0 -68
  132. data/spec/ffi/memorypointer_spec.rb +0 -78
  133. data/spec/ffi/number_spec.rb +0 -247
  134. data/spec/ffi/platform_spec.rb +0 -114
  135. data/spec/ffi/pointer_spec.rb +0 -285
  136. data/spec/ffi/rbx/attach_function_spec.rb +0 -34
  137. data/spec/ffi/rbx/memory_pointer_spec.rb +0 -198
  138. data/spec/ffi/rbx/spec_helper.rb +0 -6
  139. data/spec/ffi/rbx/struct_spec.rb +0 -18
  140. data/spec/ffi/spec_helper.rb +0 -93
  141. data/spec/ffi/string_spec.rb +0 -118
  142. data/spec/ffi/strptr_spec.rb +0 -50
  143. data/spec/ffi/struct_by_ref_spec.rb +0 -43
  144. data/spec/ffi/struct_callback_spec.rb +0 -69
  145. data/spec/ffi/struct_initialize_spec.rb +0 -35
  146. data/spec/ffi/struct_packed_spec.rb +0 -50
  147. data/spec/ffi/struct_spec.rb +0 -882
  148. data/spec/ffi/typedef_spec.rb +0 -91
  149. data/spec/ffi/union_spec.rb +0 -67
  150. data/spec/ffi/variadic_spec.rb +0 -132
  151. data/spec/spec.opts +0 -4
@@ -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
@@ -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
@@ -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
@@ -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