fiddle 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/fiddle/closure.c +131 -33
- data/ext/fiddle/conversions.c +64 -11
- data/ext/fiddle/conversions.h +2 -0
- data/ext/fiddle/extconf.rb +11 -22
- data/ext/fiddle/fiddle.c +213 -54
- data/ext/fiddle/fiddle.h +37 -2
- data/ext/fiddle/function.c +7 -2
- data/ext/fiddle/handle.c +62 -6
- data/ext/fiddle/pointer.c +42 -8
- data/ext/fiddle/win32/libffi-config.rb +5 -5
- data/fiddle.gemspec +0 -3
- data/lib/fiddle/closure.rb +25 -0
- data/lib/fiddle/cparser.rb +28 -14
- data/lib/fiddle/import.rb +2 -0
- data/lib/fiddle/pack.rb +30 -17
- data/lib/fiddle/value.rb +13 -15
- data/lib/fiddle/version.rb +1 -1
- data/lib/fiddle.rb +34 -1
- metadata +6 -9
- data/bin/downloader.rb +0 -331
- data/bin/extlibs.rb +0 -262
- data/ext/fiddle/extlibs +0 -13
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
|
-
|
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]
|
139
|
-
data->wrap[1]
|
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]
|
239
|
-
data->wrap[1]
|
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]
|
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]
|
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
|
-
|
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 =
|
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
|
-
|
44
|
+
File.binwrite("#{builddir}/include/ffi.h", hdr)
|
45
45
|
|
46
|
-
mk =
|
46
|
+
mk = File.binread("#{basedir}/libffi.mk.tmpl")
|
47
47
|
mk.gsub!(/@(\w+)@/) {conf[$1] || $&}
|
48
|
-
|
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",
|
data/lib/fiddle/closure.rb
CHANGED
@@ -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
|
data/lib/fiddle/cparser.rb
CHANGED
@@ -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
|
168
|
-
when /\
|
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+
|
171
|
-
|
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
|
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
|
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
|
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
|
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
|
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
|
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
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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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 => "
|
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
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
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[
|
49
|
-
PACK_MAP[TYPE_LONG_LONG] =
|
50
|
-
|
51
|
-
|
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").
|
9
|
+
[val].pack("c").unpack1("C")
|
10
10
|
when TYPE_SHORT
|
11
|
-
[val].pack("s!").
|
11
|
+
[val].pack("s!").unpack1("S!")
|
12
12
|
when TYPE_INT
|
13
|
-
[val].pack("i!").
|
13
|
+
[val].pack("i!").unpack1("I!")
|
14
14
|
when TYPE_LONG
|
15
|
-
[val].pack("l!").
|
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").
|
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").
|
29
|
+
[val].pack("C").unpack1("c")
|
30
30
|
when TYPE_SHORT
|
31
|
-
[val].pack("S!").
|
31
|
+
[val].pack("S!").unpack1("s!")
|
32
32
|
when TYPE_INT
|
33
|
-
[val].pack("I!").
|
33
|
+
[val].pack("I!").unpack1("i!")
|
34
34
|
when TYPE_LONG
|
35
|
-
[val].pack("L!").
|
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").
|
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").
|
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").
|
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
|
data/lib/fiddle/version.rb
CHANGED
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
|
-
|
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.
|
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:
|
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.
|
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: []
|