ffi 0.6.3-x86-mingw32 → 1.0.1-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.

Files changed (64) hide show
  1. data/History.txt +7 -0
  2. data/LICENSE +10 -21
  3. data/README.rdoc +1 -0
  4. data/Rakefile +4 -2
  5. data/ext/ffi_c/AbstractMemory.c +103 -38
  6. data/ext/ffi_c/AbstractMemory.h +15 -22
  7. data/ext/ffi_c/Buffer.c +61 -22
  8. data/ext/ffi_c/Call.c +52 -540
  9. data/ext/ffi_c/Call.h +1 -1
  10. data/ext/ffi_c/DataConverter.c +62 -0
  11. data/ext/ffi_c/DynamicLibrary.c +21 -1
  12. data/ext/ffi_c/Function.c +315 -30
  13. data/ext/ffi_c/MappedType.c +146 -0
  14. data/ext/ffi_c/MappedType.h +57 -0
  15. data/ext/ffi_c/MemoryPointer.c +12 -33
  16. data/ext/ffi_c/Platform.c +2 -0
  17. data/ext/ffi_c/Pointer.c +66 -28
  18. data/ext/ffi_c/Struct.c +19 -306
  19. data/ext/ffi_c/Struct.h +6 -0
  20. data/ext/ffi_c/StructByReference.c +150 -0
  21. data/ext/ffi_c/StructByReference.h +50 -0
  22. data/ext/ffi_c/StructLayout.c +25 -14
  23. data/ext/ffi_c/Type.c +39 -68
  24. data/ext/ffi_c/Type.h +12 -22
  25. data/ext/ffi_c/Types.c +20 -5
  26. data/ext/ffi_c/Types.h +7 -7
  27. data/ext/ffi_c/Variadic.c +21 -17
  28. data/ext/ffi_c/extconf.rb +4 -0
  29. data/ext/ffi_c/ffi.c +8 -2
  30. data/ext/ffi_c/rbffi.h +1 -0
  31. data/lib/ffi/autopointer.rb +23 -22
  32. data/lib/ffi/enum.rb +36 -21
  33. data/lib/ffi/errno.rb +20 -0
  34. data/lib/ffi/ffi.rb +13 -80
  35. data/lib/ffi/io.rb +12 -20
  36. data/lib/ffi/library.rb +109 -92
  37. data/lib/ffi/managedstruct.rb +1 -1
  38. data/lib/ffi/memorypointer.rb +15 -21
  39. data/lib/ffi/platform.rb +24 -28
  40. data/lib/ffi/pointer.rb +14 -21
  41. data/lib/ffi/struct.rb +98 -49
  42. data/lib/ffi/struct_layout_builder.rb +158 -0
  43. data/lib/ffi/types.rb +99 -128
  44. data/lib/ffi/union.rb +20 -0
  45. data/lib/ffi/variadic.rb +33 -22
  46. data/lib/ffi_c.so +0 -0
  47. data/spec/ffi/async_callback_spec.rb +23 -0
  48. data/spec/ffi/callback_spec.rb +62 -0
  49. data/spec/ffi/custom_param_type.rb +31 -0
  50. data/spec/ffi/custom_type_spec.rb +73 -0
  51. data/spec/ffi/enum_spec.rb +19 -0
  52. data/spec/ffi/ffi_spec.rb +24 -0
  53. data/spec/ffi/pointer_spec.rb +15 -0
  54. data/spec/ffi/rbx/memory_pointer_spec.rb +7 -1
  55. data/spec/ffi/strptr_spec.rb +36 -0
  56. data/spec/ffi/struct_packed_spec.rb +46 -0
  57. data/spec/ffi/struct_spec.rb +19 -5
  58. data/spec/ffi/typedef_spec.rb +14 -0
  59. data/tasks/setup.rb +2 -1
  60. metadata +15 -6
  61. data/ext/ffi_c/AutoPointer.c +0 -60
  62. data/ext/ffi_c/AutoPointer.h +0 -18
  63. data/lib/1.8/ffi_c.so +0 -0
  64. data/lib/1.9/ffi_c.so +0 -0
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+
3
+ describe "functions with custom parameter types" do
4
+ before :each do
5
+
6
+ Custom_enum = Class.new do
7
+ extend FFI::DataConverter
8
+ ToNativeMap= { :a => 1, :b => 2 }
9
+ FromNativeMap = { 1 => :a, 2 => :b }
10
+
11
+ def self.native_type
12
+ @native_type_called = true
13
+ FFI::Type::INT32
14
+ end
15
+
16
+ def self.to_native(val, ctx)
17
+ @to_native_called = true
18
+ ToNativeMap[val]
19
+ end
20
+
21
+ def self.from_native(val, ctx)
22
+ @from_native_called = true
23
+ FromNativeMap[val]
24
+ end
25
+ def self.native_type_called?; @native_type_called; end
26
+ def self.from_native_called?; @from_native_called; end
27
+ def self.to_native_called?; @to_native_called; end
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,73 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+
3
+ describe "functions with custom types" do
4
+ before :each do
5
+
6
+ Custom_enum = Class.new do
7
+ extend FFI::DataConverter
8
+ ToNativeMap= { :a => 1, :b => 2, :c => 3 }
9
+ FromNativeMap = { 1 => :a, 2 => :b, 3 => :c }
10
+
11
+ def self.native_type
12
+ @native_type_called = true
13
+ FFI::Type::INT32
14
+ end
15
+
16
+ def self.to_native(val, ctx)
17
+ @to_native_called = true
18
+ ToNativeMap[val]
19
+ end
20
+
21
+ def self.from_native(val, ctx)
22
+ @from_native_called = true
23
+ FromNativeMap[val]
24
+ end
25
+ def self.native_type_called?; @native_type_called; end
26
+ def self.from_native_called?; @from_native_called; end
27
+ def self.to_native_called?; @to_native_called; end
28
+ end
29
+
30
+ end
31
+
32
+ it "can attach with custom return type" do
33
+ lambda do
34
+ m = Module.new do
35
+ extend FFI::Library
36
+ ffi_lib TestLibrary::PATH
37
+ attach_function :ret_s32, [ :int ], Custom_enum
38
+ end
39
+ end.should_not raise_error
40
+ end
41
+
42
+ it "should return object of correct type" do
43
+
44
+ m = Module.new do
45
+
46
+ extend FFI::Library
47
+ ffi_lib TestLibrary::PATH
48
+ attach_function :ret_s32, [ :int ], Custom_enum
49
+ end
50
+
51
+ m.ret_s32(1).is_a?(Symbol).should be_true
52
+ end
53
+
54
+ it "from_native should be called for result" do
55
+ m = Module.new do
56
+ extend FFI::Library
57
+ ffi_lib TestLibrary::PATH
58
+ attach_function :ret_s32, [ :int ], Custom_enum
59
+ end
60
+ m.ret_s32(1)
61
+ Custom_enum.from_native_called?.should be_true
62
+ end
63
+
64
+ it "to_native should be called for parameter" do
65
+ m = Module.new do
66
+ extend FFI::Library
67
+ ffi_lib TestLibrary::PATH
68
+ attach_function :ret_s32, [ Custom_enum ], :int
69
+ end
70
+ m.ret_s32(:a)
71
+ Custom_enum.to_native_called?.should be_true
72
+ end
73
+ end
@@ -89,6 +89,25 @@ describe "A tagged typedef enum" do
89
89
  TestEnum3.test_tagged_typedef_enum4(:c15).should == :c15
90
90
  TestEnum3.test_tagged_typedef_enum4(:c16).should == :c16
91
91
  end
92
+
93
+ it "integers can be used instead of constants" do
94
+ TestEnum3.test_tagged_typedef_enum1(0).should == :c1
95
+ TestEnum3.test_tagged_typedef_enum1(1).should == :c2
96
+ TestEnum3.test_tagged_typedef_enum1(2).should == :c3
97
+ TestEnum3.test_tagged_typedef_enum1(3).should == :c4
98
+ TestEnum3.test_tagged_typedef_enum2(42).should == :c5
99
+ TestEnum3.test_tagged_typedef_enum2(43).should == :c6
100
+ TestEnum3.test_tagged_typedef_enum2(44).should == :c7
101
+ TestEnum3.test_tagged_typedef_enum2(45).should == :c8
102
+ TestEnum3.test_tagged_typedef_enum3(42).should == :c9
103
+ TestEnum3.test_tagged_typedef_enum3(43).should == :c10
104
+ TestEnum3.test_tagged_typedef_enum3(4242).should == :c11
105
+ TestEnum3.test_tagged_typedef_enum3(4243).should == :c12
106
+ TestEnum3.test_tagged_typedef_enum4(42).should == :c13
107
+ TestEnum3.test_tagged_typedef_enum4(4242).should == :c14
108
+ TestEnum3.test_tagged_typedef_enum4(424242).should == :c15
109
+ TestEnum3.test_tagged_typedef_enum4(42424242).should == :c16
110
+ end
92
111
  end
93
112
 
94
113
  describe "All enums" do
@@ -0,0 +1,24 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+
3
+ describe "FFI" do
4
+
5
+ describe ".map_library_name" do
6
+
7
+ let(:prefix) { FFI::Platform::LIBPREFIX }
8
+ let(:suffix) { FFI::Platform::LIBSUFFIX }
9
+
10
+ it "should add platform library extension if not present" do
11
+ FFI.map_library_name("#{prefix}dummy").should == "#{prefix}dummy.#{suffix}"
12
+ end
13
+
14
+ it "should add platform library extension even if lib suffix is present in name" do
15
+ FFI.map_library_name("#{prefix}dummy_with_#{suffix}").should == "#{prefix}dummy_with_#{suffix}.#{suffix}"
16
+ end
17
+
18
+ it "should return Platform::LIBC when called with 'c'" do
19
+ FFI.map_library_name('c').should == FFI::Library::LIBC
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -177,7 +177,21 @@ describe "AutoPointer" do
177
177
  end
178
178
  AutoPointerTestHelper.gc_everything loop_count
179
179
  end
180
+
181
+ it "can be used as the return type of a function" do
182
+ lambda do
183
+ Module.new do
184
+ extend FFI::Library
185
+ ffi_lib TestLibrary::PATH
186
+ class CustomAutoPointer < FFI::AutoPointer
187
+ def self.release(ptr); end
188
+ end
189
+ attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], CustomAutoPointer
190
+ end
191
+ end.should_not raise_error
192
+ end
180
193
  end
194
+
181
195
  describe "AutoPointer#new" do
182
196
  class AutoPointerSubclass < FFI::AutoPointer
183
197
  def self.release(ptr); end
@@ -193,3 +207,4 @@ describe "AutoPointer#new" do
193
207
  end
194
208
 
195
209
  end
210
+
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  require "rubygems"
2
3
  require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
3
4
 
@@ -13,7 +14,12 @@ describe "MemoryPointer" do
13
14
  m = FFI::MemoryPointer.from_string("FFI is Awesome")
14
15
  m.type_size.should == 15
15
16
  end
16
-
17
+
18
+ it "makes a pointer from a string with multibyte characters" do
19
+ m = FFI::MemoryPointer.from_string("ぱんだ")
20
+ m.type_size.should == 10
21
+ end
22
+
17
23
  it "reads back a string" do
18
24
  m = FFI::MemoryPointer.from_string("FFI is Awesome")
19
25
  m.read_string.should == "FFI is Awesome"
@@ -0,0 +1,36 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+
3
+ describe "functions returning :strptr" do
4
+ it "can attach function with :strptr return type" do
5
+ lambda do
6
+ m = Module.new do
7
+ extend FFI::Library
8
+ ffi_lib FFI::Library::LIBC
9
+ attach_function :strdup, [ :string ], :strptr
10
+ end
11
+ end.should_not raise_error
12
+ end
13
+
14
+ module StrPtr
15
+ extend FFI::Library
16
+ ffi_lib FFI::Library::LIBC
17
+ attach_function :strdup, [ :string ], :strptr
18
+ attach_function :free, [ :pointer ], :void
19
+ end
20
+
21
+ it "should return [ String, Pointer ]" do
22
+ result = StrPtr.strdup("test")
23
+ result[0].is_a?(String).should be_true
24
+ result[1].is_a?(FFI::Pointer).should be_true
25
+ end
26
+
27
+ it "should return the correct value" do
28
+ result = StrPtr.strdup("test")
29
+ result[0].should == "test"
30
+ end
31
+
32
+ it "should return non-NULL pointer" do
33
+ result = StrPtr.strdup("test")
34
+ result[1].null?.should be_false
35
+ end
36
+ end
@@ -0,0 +1,46 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
2
+
3
+ describe FFI::Struct do
4
+ it "packed :char followed by :int should have size of 5" do
5
+ Class.new(FFI::Struct) do
6
+ packed
7
+ layout :c, :char, :i, :int
8
+ end.size.should == 5
9
+ end
10
+
11
+ it "packed :char followed by :int should have alignment of 1" do
12
+ Class.new(FFI::Struct) do
13
+ packed
14
+ layout :c, :char, :i, :int
15
+ end.alignment.should == 1
16
+ end
17
+
18
+ it "packed(2) :char followed by :int should have size of 6" do
19
+ Class.new(FFI::Struct) do
20
+ packed 2
21
+ layout :c, :char, :i, :int
22
+ end.size.should == 6
23
+ end
24
+
25
+ it "packed(2) :char followed by :int should have alignment of 2" do
26
+ Class.new(FFI::Struct) do
27
+ packed 2
28
+ layout :c, :char, :i, :int
29
+ end.alignment.should == 2
30
+ end
31
+
32
+ it "packed :short followed by int should have size of 6" do
33
+ Class.new(FFI::Struct) do
34
+ packed
35
+ layout :s, :short, :i, :int
36
+ end.size.should == 6
37
+ end
38
+
39
+ it "packed :short followed by int should have alignment of 1" do
40
+ Class.new(FFI::Struct) do
41
+ packed
42
+ layout :s, :short, :i, :int
43
+ end.alignment.should == 1
44
+ end
45
+
46
+ end
@@ -158,7 +158,7 @@ describe "Struct tests" do
158
158
  class TestStruct < FFI::Struct
159
159
  layout :c, :char
160
160
  end
161
- attach_function :struct_field_s8, [ TestStruct ], :char
161
+ attach_function :struct_field_s8, [ TestStruct.in ], :char
162
162
  end
163
163
  end
164
164
  it "Can use Struct subclass as IN parameter type" do
@@ -327,8 +327,8 @@ describe "Struct tests" do
327
327
  layout :add, :add,
328
328
  :sub, :sub
329
329
  end
330
- attach_function :struct_call_add_cb, [TestStruct, :int, :int], :int
331
- attach_function :struct_call_sub_cb, [TestStruct, :int, :int], :int
330
+ attach_function :struct_call_add_cb, [TestStruct.in, :int, :int], :int
331
+ attach_function :struct_call_sub_cb, [TestStruct.in, :int, :int], :int
332
332
  end
333
333
  it "Can have CallbackInfo struct field" do
334
334
  s = CallbackMember::TestStruct.new
@@ -336,8 +336,8 @@ describe "Struct tests" do
336
336
  sub_proc = lambda { |a, b| a-b }
337
337
  s[:add] = add_proc
338
338
  s[:sub] = sub_proc
339
- CallbackMember.struct_call_add_cb(s.pointer, 40, 2).should == 42
340
- CallbackMember.struct_call_sub_cb(s.pointer, 44, 2).should == 42
339
+ CallbackMember.struct_call_add_cb(s, 40, 2).should == 42
340
+ CallbackMember.struct_call_sub_cb(s, 44, 2).should == 42
341
341
  end
342
342
  it "Can return its members as a list" do
343
343
  class TestStruct < FFI::Struct
@@ -621,4 +621,18 @@ describe "Struct allocation" do
621
621
  p.put_uint(4, 0xdeadbeef)
622
622
  S.new(p[1])[:i].should == 0xdeadbeef
623
623
  end
624
+
625
+ it "null? should be true when initialized with NULL pointer" do
626
+ class S < FFI::Struct
627
+ layout :i, :uint
628
+ end
629
+ S.new(Pointer::NULL).null?.should be_true
630
+ end
631
+
632
+ it "null? should be false when initialized with non-NULL pointer" do
633
+ class S < FFI::Struct
634
+ layout :i, :uint
635
+ end
636
+ S.new(MemoryPointer.new(S)).null?.should be_false
637
+ end
624
638
  end
@@ -45,4 +45,18 @@ describe "Custom type definitions" do
45
45
  s[:a] = 0x12345678
46
46
  s.pointer.get_uint(0).should == 0x12345678
47
47
  end
48
+
49
+ it "attach_function after a typedef should not reject normal types" do
50
+ lambda do
51
+ Module.new do
52
+ extend FFI::Library
53
+ # enum() will insert a custom typedef called :foo for the enum
54
+ enum :foo, [ :a, :b ]
55
+ typedef :int, :bar
56
+
57
+ ffi_lib TestLibrary::PATH
58
+ attach_function :ptr_ret_int32_t, [ :string, :foo ], :bar
59
+ end
60
+ end.should_not raise_error
61
+ end
48
62
  end
@@ -171,7 +171,8 @@ HAVE_GIT = (Dir.entries(Dir.pwd).include?('.git') and
171
171
  # Add bones as a development dependency
172
172
  #
173
173
  if HAVE_BONES
174
- PROJ.gem.development_dependencies << ['bones', ">= #{Bones::VERSION}"]
174
+ bones_version = defined?(Bones::VERSION) ? Bones::VERSION : Bones.version
175
+ PROJ.gem.development_dependencies << ['bones', ">= #{bones_version}"]
175
176
  end
176
177
 
177
178
  # Reads a file at +path+ and spits out an array of the +paragraphs+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 1.0.1
5
5
  platform: x86-mingw32
6
6
  authors:
7
7
  - Wayne Meissner
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-03-10 00:00:00 +10:00
12
+ date: 2010-12-03 00:00:00 +10:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -45,14 +45,13 @@ files:
45
45
  - ext/ffi_c/AbstractMemory.h
46
46
  - ext/ffi_c/ArrayType.c
47
47
  - ext/ffi_c/ArrayType.h
48
- - ext/ffi_c/AutoPointer.c
49
- - ext/ffi_c/AutoPointer.h
50
48
  - ext/ffi_c/Buffer.c
51
49
  - ext/ffi_c/Call.c
52
50
  - ext/ffi_c/Call.h
53
51
  - ext/ffi_c/ClosurePool.c
54
52
  - ext/ffi_c/ClosurePool.h
55
53
  - ext/ffi_c/compat.h
54
+ - ext/ffi_c/DataConverter.c
56
55
  - ext/ffi_c/DynamicLibrary.c
57
56
  - ext/ffi_c/DynamicLibrary.h
58
57
  - ext/ffi_c/endian.h
@@ -318,6 +317,8 @@ files:
318
317
  - ext/ffi_c/libffi.darwin.mk
319
318
  - ext/ffi_c/libffi.gnu.mk
320
319
  - ext/ffi_c/libffi.mk
320
+ - ext/ffi_c/MappedType.c
321
+ - ext/ffi_c/MappedType.h
321
322
  - ext/ffi_c/MemoryPointer.c
322
323
  - ext/ffi_c/MemoryPointer.h
323
324
  - ext/ffi_c/MethodHandle.c
@@ -329,6 +330,8 @@ files:
329
330
  - ext/ffi_c/rbffi.h
330
331
  - ext/ffi_c/Struct.c
331
332
  - ext/ffi_c/Struct.h
333
+ - ext/ffi_c/StructByReference.c
334
+ - ext/ffi_c/StructByReference.h
332
335
  - ext/ffi_c/StructByValue.c
333
336
  - ext/ffi_c/StructByValue.h
334
337
  - ext/ffi_c/StructLayout.c
@@ -351,6 +354,7 @@ files:
351
354
  - lib/ffi/platform.rb
352
355
  - lib/ffi/pointer.rb
353
356
  - lib/ffi/struct.rb
357
+ - lib/ffi/struct_layout_builder.rb
354
358
  - lib/ffi/tools/const_generator.rb
355
359
  - lib/ffi/tools/generator.rb
356
360
  - lib/ffi/tools/generator_task.rb
@@ -360,11 +364,15 @@ files:
360
364
  - lib/ffi/union.rb
361
365
  - lib/ffi/variadic.rb
362
366
  - lib/ffi.rb
367
+ - spec/ffi/async_callback_spec.rb
363
368
  - spec/ffi/bool_spec.rb
364
369
  - spec/ffi/buffer_spec.rb
365
370
  - spec/ffi/callback_spec.rb
371
+ - spec/ffi/custom_param_type.rb
372
+ - spec/ffi/custom_type_spec.rb
366
373
  - spec/ffi/enum_spec.rb
367
374
  - spec/ffi/errno_spec.rb
375
+ - spec/ffi/ffi_spec.rb
368
376
  - spec/ffi/function_spec.rb
369
377
  - spec/ffi/library_spec.rb
370
378
  - spec/ffi/managed_struct_spec.rb
@@ -376,8 +384,10 @@ files:
376
384
  - spec/ffi/rbx/struct_spec.rb
377
385
  - spec/ffi/spec_helper.rb
378
386
  - spec/ffi/string_spec.rb
387
+ - spec/ffi/strptr_spec.rb
379
388
  - spec/ffi/struct_callback_spec.rb
380
389
  - spec/ffi/struct_initialize_spec.rb
390
+ - spec/ffi/struct_packed_spec.rb
381
391
  - spec/ffi/struct_spec.rb
382
392
  - spec/ffi/typedef_spec.rb
383
393
  - spec/ffi/union_spec.rb
@@ -395,8 +405,7 @@ files:
395
405
  - tasks/spec.rake
396
406
  - tasks/svn.rake
397
407
  - tasks/test.rake
398
- - lib/1.8/ffi_c.so
399
- - lib/1.9/ffi_c.so
408
+ - lib/ffi_c.so
400
409
  has_rdoc: true
401
410
  homepage: http://wiki.github.com/ffi/ffi
402
411
  licenses: []