fiddle 1.1.0 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/ext/fiddle/pointer.c CHANGED
@@ -88,8 +88,13 @@ fiddle_ptr_memsize(const void *ptr)
88
88
  }
89
89
 
90
90
  static const rb_data_type_t fiddle_ptr_data_type = {
91
- "fiddle/pointer",
92
- {fiddle_ptr_mark, fiddle_ptr_free, fiddle_ptr_memsize,},
91
+ .wrap_struct_name = "fiddle/pointer",
92
+ .function = {
93
+ .dmark = fiddle_ptr_mark,
94
+ .dfree = fiddle_ptr_free,
95
+ .dsize = fiddle_ptr_memsize,
96
+ },
97
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED
93
98
  };
94
99
 
95
100
  #ifdef HAVE_RUBY_MEMORY_VIEW_H
@@ -135,8 +140,8 @@ rb_fiddle_ptr_new2(VALUE klass, void *ptr, long size, freefunc_t func, VALUE wra
135
140
  data->free = func;
136
141
  data->freed = false;
137
142
  data->size = size;
138
- data->wrap[0] = wrap0;
139
- data->wrap[1] = wrap1;
143
+ RB_OBJ_WRITE(val, &data->wrap[0], wrap0);
144
+ RB_OBJ_WRITE(val, &data->wrap[1], wrap1);
140
145
 
141
146
  return val;
142
147
  }
@@ -235,8 +240,8 @@ rb_fiddle_ptr_initialize(int argc, VALUE argv[], VALUE self)
235
240
  /* Free previous memory. Use of inappropriate initialize may cause SEGV. */
236
241
  (*(data->free))(data->ptr);
237
242
  }
238
- data->wrap[0] = wrap;
239
- data->wrap[1] = funcwrap;
243
+ RB_OBJ_WRITE(self, &data->wrap[0], wrap);
244
+ RB_OBJ_WRITE(self, &data->wrap[1], funcwrap);
240
245
  data->ptr = p;
241
246
  data->size = s;
242
247
  data->free = f;
@@ -314,7 +319,7 @@ rb_fiddle_ptr_s_malloc(int argc, VALUE argv[], VALUE klass)
314
319
  }
315
320
 
316
321
  obj = rb_fiddle_ptr_malloc(klass, s,f);
317
- if (wrap) RPTR_DATA(obj)->wrap[1] = wrap;
322
+ if (wrap) RB_OBJ_WRITE(obj, &RPTR_DATA(obj)->wrap[1], wrap);
318
323
 
319
324
  if (rb_block_given_p()) {
320
325
  if (!f) {
@@ -795,10 +800,37 @@ rb_fiddle_ptr_s_to_ptr(VALUE self, VALUE val)
795
800
  if (num == val) wrap = 0;
796
801
  ptr = rb_fiddle_ptr_new(NUM2PTR(num), 0, NULL);
797
802
  }
798
- if (wrap) RPTR_DATA(ptr)->wrap[0] = wrap;
803
+ if (wrap) RB_OBJ_WRITE(ptr, &RPTR_DATA(ptr)->wrap[0], wrap);
799
804
  return ptr;
800
805
  }
801
806
 
807
+ /*
808
+ * call-seq:
809
+ * Fiddle::Pointer.read(address, len) => string
810
+ *
811
+ * Or read the memory at address +address+ with length +len+ and return a
812
+ * string with that memory
813
+ */
814
+
815
+ static VALUE
816
+ rb_fiddle_ptr_read_mem(VALUE klass, VALUE address, VALUE len)
817
+ {
818
+ return rb_str_new((char *)NUM2PTR(address), NUM2ULONG(len));
819
+ }
820
+
821
+ /*
822
+ * call-seq:
823
+ * Fiddle::Pointer.write(address, str)
824
+ *
825
+ * Write bytes in +str+ to the location pointed to by +address+.
826
+ */
827
+ static VALUE
828
+ rb_fiddle_ptr_write_mem(VALUE klass, VALUE addr, VALUE str)
829
+ {
830
+ memcpy(NUM2PTR(addr), StringValuePtr(str), RSTRING_LEN(str));
831
+ return str;
832
+ }
833
+
802
834
  void
803
835
  Init_fiddle_pointer(void)
804
836
  {
@@ -815,6 +847,8 @@ Init_fiddle_pointer(void)
815
847
  rb_define_singleton_method(rb_cPointer, "malloc", rb_fiddle_ptr_s_malloc, -1);
816
848
  rb_define_singleton_method(rb_cPointer, "to_ptr", rb_fiddle_ptr_s_to_ptr, 1);
817
849
  rb_define_singleton_method(rb_cPointer, "[]", rb_fiddle_ptr_s_to_ptr, 1);
850
+ rb_define_singleton_method(rb_cPointer, "read", rb_fiddle_ptr_read_mem, 2);
851
+ rb_define_singleton_method(rb_cPointer, "write", rb_fiddle_ptr_write_mem, 2);
818
852
  rb_define_method(rb_cPointer, "initialize", rb_fiddle_ptr_initialize, -1);
819
853
  rb_define_method(rb_cPointer, "free=", rb_fiddle_ptr_free_set, 1);
820
854
  rb_define_method(rb_cPointer, "free", rb_fiddle_ptr_free_get, 0);
@@ -23,7 +23,7 @@ until ARGV.empty?
23
23
  end
24
24
  end
25
25
 
26
- IO.foreach("#{srcdir}/configure.ac") do |line|
26
+ File.foreach("#{srcdir}/configure.ac") do |line|
27
27
  if /^AC_INIT\((.*)\)/ =~ line
28
28
  version = $1.split(/,\s*/)[1]
29
29
  version.gsub!(/\A\[|\]\z/, '')
@@ -38,11 +38,11 @@ conf['TARGET'] = /^x64/ =~ host ? "X86_WIN64" : "X86_WIN32"
38
38
  FileUtils.mkdir_p([builddir, "#{builddir}/include", "#{builddir}/src/x86"])
39
39
  FileUtils.cp("#{basedir}/fficonfig.h", ".", preserve: true)
40
40
 
41
- hdr = IO.binread("#{srcdir}/include/ffi.h.in")
41
+ hdr = File.binread("#{srcdir}/include/ffi.h.in")
42
42
  hdr.gsub!(/@(\w+)@/) {conf[$1] || $&}
43
43
  hdr.gsub!(/^(#if\s+)@\w+@/, '\10')
44
- IO.binwrite("#{builddir}/include/ffi.h", hdr)
44
+ File.binwrite("#{builddir}/include/ffi.h", hdr)
45
45
 
46
- mk = IO.binread("#{basedir}/libffi.mk.tmpl")
46
+ mk = File.binread("#{basedir}/libffi.mk.tmpl")
47
47
  mk.gsub!(/@(\w+)@/) {conf[$1] || $&}
48
- IO.binwrite("Makefile", mk)
48
+ File.binwrite("Makefile", mk)
data/fiddle.gemspec CHANGED
@@ -20,15 +20,12 @@ Gem::Specification.new do |spec|
20
20
  "LICENSE.txt",
21
21
  "README.md",
22
22
  "Rakefile",
23
- "bin/downloader.rb",
24
- "bin/extlibs.rb",
25
23
  "ext/fiddle/closure.c",
26
24
  "ext/fiddle/closure.h",
27
25
  "ext/fiddle/conversions.c",
28
26
  "ext/fiddle/conversions.h",
29
27
  "ext/fiddle/depend",
30
28
  "ext/fiddle/extconf.rb",
31
- "ext/fiddle/extlibs",
32
29
  "ext/fiddle/fiddle.c",
33
30
  "ext/fiddle/fiddle.h",
34
31
  "ext/fiddle/function.c",
@@ -1,6 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
  module Fiddle
3
3
  class Closure
4
+ class << self
5
+ # Create a new closure. If a block is given, the created closure
6
+ # is automatically freed after the given block is executed.
7
+ #
8
+ # The all given arguments are passed to Fiddle::Closure.new. So
9
+ # using this method without block equals to Fiddle::Closure.new.
10
+ #
11
+ # == Example
12
+ #
13
+ # Fiddle::Closure.create(TYPE_INT, [TYPE_INT]) do |closure|
14
+ # # closure is freed automatically when this block is finished.
15
+ # end
16
+ def create(*args)
17
+ if block_given?
18
+ closure = new(*args)
19
+ begin
20
+ yield(closure)
21
+ ensure
22
+ closure.free
23
+ end
24
+ else
25
+ new(*args)
26
+ end
27
+ end
28
+ end
4
29
 
5
30
  # the C type of the return of the FFI closure
6
31
  attr_reader :ctype
@@ -164,23 +164,35 @@ module Fiddle
164
164
  unless Fiddle.const_defined?(:TYPE_LONG_LONG)
165
165
  raise(RuntimeError, "unsupported type: #{ty}")
166
166
  end
167
- return -TYPE_LONG_LONG
168
- when /\A(?:signed\s+)?long(?:\s+int\s+)?(?:\s+\w+)?\z/
167
+ return TYPE_ULONG_LONG
168
+ when /\Aunsigned\s+long(?:\s+int\s+)?(?:\s+\w+)?\z/,
169
+ /\Aunsigned\s+int\s+long(?:\s+\w+)?\z/,
170
+ /\Along(?:\s+int)?\s+unsigned(?:\s+\w+)?\z/,
171
+ /\Aint\s+unsigned\s+long(?:\s+\w+)?\z/,
172
+ /\A(?:int\s+)?long\s+unsigned(?:\s+\w+)?\z/
173
+ return TYPE_ULONG
174
+ when /\A(?:signed\s+)?long(?:\s+int\s+)?(?:\s+\w+)?\z/,
175
+ /\A(?:signed\s+)?int\s+long(?:\s+\w+)?\z/,
176
+ /\Along(?:\s+int)?\s+signed(?:\s+\w+)?\z/
169
177
  return TYPE_LONG
170
- when /\Aunsigned\s+long(?:\s+int\s+)?(?:\s+\w+)?\z/
171
- return -TYPE_LONG
178
+ when /\Aunsigned\s+short(?:\s+int\s+)?(?:\s+\w+)?\z/,
179
+ /\Aunsigned\s+int\s+short(?:\s+\w+)?\z/,
180
+ /\Ashort(?:\s+int)?\s+unsigned(?:\s+\w+)?\z/,
181
+ /\Aint\s+unsigned\s+short(?:\s+\w+)?\z/,
182
+ /\A(?:int\s+)?short\s+unsigned(?:\s+\w+)?\z/
183
+ return TYPE_USHORT
184
+ when /\A(?:signed\s+)?short(?:\s+int\s+)?(?:\s+\w+)?\z/,
185
+ /\A(?:signed\s+)?int\s+short(?:\s+\w+)?\z/,
186
+ /\Aint\s+(?:signed\s+)?short(?:\s+\w+)?\z/
187
+ return TYPE_SHORT
172
188
  when /\A(?:signed\s+)?int(?:\s+\w+)?\z/
173
189
  return TYPE_INT
174
190
  when /\A(?:unsigned\s+int|uint)(?:\s+\w+)?\z/
175
- return -TYPE_INT
176
- when /\A(?:signed\s+)?short(?:\s+int\s+)?(?:\s+\w+)?\z/
177
- return TYPE_SHORT
178
- when /\Aunsigned\s+short(?:\s+int\s+)?(?:\s+\w+)?\z/
179
- return -TYPE_SHORT
191
+ return TYPE_UINT
180
192
  when /\A(?:signed\s+)?char(?:\s+\w+)?\z/
181
193
  return TYPE_CHAR
182
194
  when /\Aunsigned\s+char(?:\s+\w+)?\z/
183
- return -TYPE_CHAR
195
+ return TYPE_UCHAR
184
196
  when /\Aint8_t(?:\s+\w+)?\z/
185
197
  unless Fiddle.const_defined?(:TYPE_INT8_T)
186
198
  raise(RuntimeError, "unsupported type: #{ty}")
@@ -190,7 +202,7 @@ module Fiddle
190
202
  unless Fiddle.const_defined?(:TYPE_INT8_T)
191
203
  raise(RuntimeError, "unsupported type: #{ty}")
192
204
  end
193
- return -TYPE_INT8_T
205
+ return TYPE_UINT8_T
194
206
  when /\Aint16_t(?:\s+\w+)?\z/
195
207
  unless Fiddle.const_defined?(:TYPE_INT16_T)
196
208
  raise(RuntimeError, "unsupported type: #{ty}")
@@ -200,7 +212,7 @@ module Fiddle
200
212
  unless Fiddle.const_defined?(:TYPE_INT16_T)
201
213
  raise(RuntimeError, "unsupported type: #{ty}")
202
214
  end
203
- return -TYPE_INT16_T
215
+ return TYPE_UINT16_T
204
216
  when /\Aint32_t(?:\s+\w+)?\z/
205
217
  unless Fiddle.const_defined?(:TYPE_INT32_T)
206
218
  raise(RuntimeError, "unsupported type: #{ty}")
@@ -210,7 +222,7 @@ module Fiddle
210
222
  unless Fiddle.const_defined?(:TYPE_INT32_T)
211
223
  raise(RuntimeError, "unsupported type: #{ty}")
212
224
  end
213
- return -TYPE_INT32_T
225
+ return TYPE_UINT32_T
214
226
  when /\Aint64_t(?:\s+\w+)?\z/
215
227
  unless Fiddle.const_defined?(:TYPE_INT64_T)
216
228
  raise(RuntimeError, "unsupported type: #{ty}")
@@ -220,7 +232,7 @@ module Fiddle
220
232
  unless Fiddle.const_defined?(:TYPE_INT64_T)
221
233
  raise(RuntimeError, "unsupported type: #{ty}")
222
234
  end
223
- return -TYPE_INT64_T
235
+ return TYPE_UINT64_T
224
236
  when /\Afloat(?:\s+\w+)?\z/
225
237
  return TYPE_FLOAT
226
238
  when /\Adouble(?:\s+\w+)?\z/
@@ -235,6 +247,8 @@ module Fiddle
235
247
  return TYPE_INTPTR_T
236
248
  when /\Auintptr_t(?:\s+\w+)?\z/
237
249
  return TYPE_UINTPTR_T
250
+ when "bool"
251
+ return TYPE_BOOL
238
252
  when /\*/, /\[[\s\d]*\]/
239
253
  return TYPE_VOIDP
240
254
  when "..."
data/lib/fiddle/import.rb CHANGED
@@ -119,6 +119,8 @@ module Fiddle
119
119
  return SIZEOF_VOIDP
120
120
  when TYPE_CONST_STRING
121
121
  return SIZEOF_CONST_STRING
122
+ when TYPE_BOOL
123
+ return SIZEOF_BOOL
122
124
  else
123
125
  if defined?(TYPE_LONG_LONG) and
124
126
  ty == TYPE_LONG_LONG
data/lib/fiddle/pack.rb CHANGED
@@ -11,25 +11,36 @@ module Fiddle
11
11
  TYPE_LONG => ALIGN_LONG,
12
12
  TYPE_FLOAT => ALIGN_FLOAT,
13
13
  TYPE_DOUBLE => ALIGN_DOUBLE,
14
- -TYPE_CHAR => ALIGN_CHAR,
15
- -TYPE_SHORT => ALIGN_SHORT,
16
- -TYPE_INT => ALIGN_INT,
17
- -TYPE_LONG => ALIGN_LONG,
14
+ TYPE_UCHAR => ALIGN_CHAR,
15
+ TYPE_USHORT => ALIGN_SHORT,
16
+ TYPE_UINT => ALIGN_INT,
17
+ TYPE_ULONG => ALIGN_LONG,
18
+ TYPE_BOOL => ALIGN_BOOL,
18
19
  }
19
20
 
20
21
  PACK_MAP = {
21
- TYPE_VOIDP => "l!",
22
+ TYPE_VOIDP => "L!",
22
23
  TYPE_CHAR => "c",
23
24
  TYPE_SHORT => "s!",
24
25
  TYPE_INT => "i!",
25
26
  TYPE_LONG => "l!",
26
27
  TYPE_FLOAT => "f",
27
28
  TYPE_DOUBLE => "d",
28
- -TYPE_CHAR => "c",
29
- -TYPE_SHORT => "s!",
30
- -TYPE_INT => "i!",
31
- -TYPE_LONG => "l!",
29
+ TYPE_UCHAR => "C",
30
+ TYPE_USHORT => "S!",
31
+ TYPE_UINT => "I!",
32
+ TYPE_ULONG => "L!",
32
33
  }
34
+ case SIZEOF_BOOL
35
+ when SIZEOF_CHAR
36
+ PACK_MAP[TYPE_BOOL] = PACK_MAP[TYPE_UCHAR]
37
+ when SIZEOF_SHORT
38
+ PACK_MAP[TYPE_BOOL] = PACK_MAP[TYPE_USHORT]
39
+ when SIZEOF_INT
40
+ PACK_MAP[TYPE_BOOL] = PACK_MAP[TYPE_UINT]
41
+ when SIZEOF_LONG
42
+ PACK_MAP[TYPE_BOOL] = PACK_MAP[TYPE_ULONG]
43
+ end
33
44
 
34
45
  SIZE_MAP = {
35
46
  TYPE_VOIDP => SIZEOF_VOIDP,
@@ -39,16 +50,18 @@ module Fiddle
39
50
  TYPE_LONG => SIZEOF_LONG,
40
51
  TYPE_FLOAT => SIZEOF_FLOAT,
41
52
  TYPE_DOUBLE => SIZEOF_DOUBLE,
42
- -TYPE_CHAR => SIZEOF_CHAR,
43
- -TYPE_SHORT => SIZEOF_SHORT,
44
- -TYPE_INT => SIZEOF_INT,
45
- -TYPE_LONG => SIZEOF_LONG,
53
+ TYPE_UCHAR => SIZEOF_CHAR,
54
+ TYPE_USHORT => SIZEOF_SHORT,
55
+ TYPE_UINT => SIZEOF_INT,
56
+ TYPE_ULONG => SIZEOF_LONG,
57
+ TYPE_BOOL => SIZEOF_BOOL,
46
58
  }
47
59
  if defined?(TYPE_LONG_LONG)
48
- ALIGN_MAP[TYPE_LONG_LONG] = ALIGN_MAP[-TYPE_LONG_LONG] = ALIGN_LONG_LONG
49
- PACK_MAP[TYPE_LONG_LONG] = PACK_MAP[-TYPE_LONG_LONG] = "q"
50
- SIZE_MAP[TYPE_LONG_LONG] = SIZE_MAP[-TYPE_LONG_LONG] = SIZEOF_LONG_LONG
51
- PACK_MAP[TYPE_VOIDP] = "q" if SIZEOF_LONG_LONG == SIZEOF_VOIDP
60
+ ALIGN_MAP[TYPE_LONG_LONG] = ALIGN_MAP[TYPE_ULONG_LONG] = ALIGN_LONG_LONG
61
+ PACK_MAP[TYPE_LONG_LONG] = "q"
62
+ PACK_MAP[TYPE_ULONG_LONG] = "Q"
63
+ SIZE_MAP[TYPE_LONG_LONG] = SIZE_MAP[TYPE_ULONG_LONG] = SIZEOF_LONG_LONG
64
+ PACK_MAP[TYPE_VOIDP] = "Q" if SIZEOF_LONG_LONG == SIZEOF_VOIDP
52
65
  end
53
66
 
54
67
  def align(addr, align)
data/lib/fiddle/value.rb CHANGED
@@ -6,17 +6,17 @@ module Fiddle
6
6
  def unsigned_value(val, ty)
7
7
  case ty.abs
8
8
  when TYPE_CHAR
9
- [val].pack("c").unpack("C")[0]
9
+ [val].pack("c").unpack1("C")
10
10
  when TYPE_SHORT
11
- [val].pack("s!").unpack("S!")[0]
11
+ [val].pack("s!").unpack1("S!")
12
12
  when TYPE_INT
13
- [val].pack("i!").unpack("I!")[0]
13
+ [val].pack("i!").unpack1("I!")
14
14
  when TYPE_LONG
15
- [val].pack("l!").unpack("L!")[0]
15
+ [val].pack("l!").unpack1("L!")
16
16
  else
17
17
  if defined?(TYPE_LONG_LONG) and
18
18
  ty.abs == TYPE_LONG_LONG
19
- [val].pack("q").unpack("Q")[0]
19
+ [val].pack("q").unpack1("Q")
20
20
  else
21
21
  val
22
22
  end
@@ -26,17 +26,17 @@ module Fiddle
26
26
  def signed_value(val, ty)
27
27
  case ty.abs
28
28
  when TYPE_CHAR
29
- [val].pack("C").unpack("c")[0]
29
+ [val].pack("C").unpack1("c")
30
30
  when TYPE_SHORT
31
- [val].pack("S!").unpack("s!")[0]
31
+ [val].pack("S!").unpack1("s!")
32
32
  when TYPE_INT
33
- [val].pack("I!").unpack("i!")[0]
33
+ [val].pack("I!").unpack1("i!")
34
34
  when TYPE_LONG
35
- [val].pack("L!").unpack("l!")[0]
35
+ [val].pack("L!").unpack1("l!")
36
36
  else
37
37
  if defined?(TYPE_LONG_LONG) and
38
38
  ty.abs == TYPE_LONG_LONG
39
- [val].pack("Q").unpack("q")[0]
39
+ [val].pack("Q").unpack1("q")
40
40
  else
41
41
  val
42
42
  end
@@ -80,11 +80,11 @@ module Fiddle
80
80
  else
81
81
  case SIZEOF_VOIDP
82
82
  when SIZEOF_LONG
83
- return [arg].pack("p").unpack("l!")[0]
83
+ return [arg].pack("p").unpack1("l!")
84
84
  else
85
85
  if defined?(SIZEOF_LONG_LONG) and
86
86
  SIZEOF_VOIDP == SIZEOF_LONG_LONG
87
- return [arg].pack("p").unpack("q")[0]
87
+ return [arg].pack("p").unpack1("q")
88
88
  else
89
89
  raise(RuntimeError, "sizeof(void*)?")
90
90
  end
@@ -102,10 +102,8 @@ module Fiddle
102
102
  return val.unpack('C*')
103
103
  end
104
104
  end
105
- return arg
106
- else
107
- return arg
108
105
  end
106
+ return arg
109
107
  else
110
108
  if( arg.respond_to?(:to_ptr) )
111
109
  return arg.to_ptr.to_i
@@ -1,3 +1,3 @@
1
1
  module Fiddle
2
- VERSION = "1.1.0"
2
+ VERSION = "1.1.2"
3
3
  end
data/lib/fiddle.rb CHANGED
@@ -58,7 +58,36 @@ module Fiddle
58
58
  #
59
59
  # See Fiddle::Handle.new for more.
60
60
  def dlopen library
61
- Fiddle::Handle.new library
61
+ begin
62
+ Fiddle::Handle.new(library)
63
+ rescue DLError => error
64
+ case RUBY_PLATFORM
65
+ when /linux/
66
+ case error.message
67
+ when /\A(\/.+?): (?:invalid ELF header|file too short)/
68
+ # This may be a linker script:
69
+ # https://sourceware.org/binutils/docs/ld.html#Scripts
70
+ path = $1
71
+ else
72
+ raise
73
+ end
74
+ else
75
+ raise
76
+ end
77
+
78
+ File.open(path) do |input|
79
+ input.each_line do |line|
80
+ case line
81
+ when /\A\s*(?:INPUT|GROUP)\s*\(\s*([^\s,\)]+)/
82
+ # TODO: Should we support multiple files?
83
+ return dlopen($1)
84
+ end
85
+ end
86
+ end
87
+
88
+ # Not found
89
+ raise
90
+ end
62
91
  end
63
92
  module_function :dlopen
64
93
 
@@ -67,4 +96,8 @@ module Fiddle
67
96
  RTLD_GLOBAL = Handle::RTLD_GLOBAL # :nodoc:
68
97
  RTLD_LAZY = Handle::RTLD_LAZY # :nodoc:
69
98
  RTLD_NOW = Handle::RTLD_NOW # :nodoc:
99
+
100
+ Fiddle::Types.constants.each do |type|
101
+ const_set "TYPE_#{type}", Fiddle::Types.const_get(type)
102
+ end
70
103
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fiddle
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Patterson
8
8
  - SHIBATA Hiroshi
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-10-22 00:00:00.000000000 Z
12
+ date: 2023-11-08 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: A libffi wrapper for Ruby.
15
15
  email:
@@ -23,15 +23,12 @@ files:
23
23
  - LICENSE.txt
24
24
  - README.md
25
25
  - Rakefile
26
- - bin/downloader.rb
27
- - bin/extlibs.rb
28
26
  - ext/fiddle/closure.c
29
27
  - ext/fiddle/closure.h
30
28
  - ext/fiddle/conversions.c
31
29
  - ext/fiddle/conversions.h
32
30
  - ext/fiddle/depend
33
31
  - ext/fiddle/extconf.rb
34
- - ext/fiddle/extlibs
35
32
  - ext/fiddle/fiddle.c
36
33
  - ext/fiddle/fiddle.h
37
34
  - ext/fiddle/function.c
@@ -61,7 +58,7 @@ licenses:
61
58
  - BSD-2-Clause
62
59
  metadata:
63
60
  msys2_mingw_dependencies: libffi
64
- post_install_message:
61
+ post_install_message:
65
62
  rdoc_options: []
66
63
  require_paths:
67
64
  - lib
@@ -76,8 +73,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
73
  - !ruby/object:Gem::Version
77
74
  version: '0'
78
75
  requirements: []
79
- rubygems_version: 3.3.0.dev
80
- signing_key:
76
+ rubygems_version: 3.5.0.dev
77
+ signing_key:
81
78
  specification_version: 4
82
79
  summary: A libffi wrapper for Ruby.
83
80
  test_files: []