fiddle 1.1.2 → 1.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +9 -4
- data/ext/fiddle/closure.c +2 -2
- data/ext/fiddle/conversions.c +0 -2
- data/ext/fiddle/extconf.rb +15 -5
- data/ext/fiddle/fiddle.c +0 -1
- data/ext/fiddle/fiddle.h +11 -1
- data/ext/fiddle/function.c +7 -3
- data/ext/fiddle/handle.c +2 -3
- data/ext/fiddle/memory_view.c +7 -2
- data/ext/fiddle/pinned.c +7 -3
- data/ext/fiddle/pointer.c +4 -3
- data/fiddle.gemspec +2 -4
- data/lib/fiddle/ffi_backend.rb +627 -0
- data/lib/fiddle/pack.rb +6 -0
- data/lib/fiddle/struct.rb +27 -6
- data/lib/fiddle/version.rb +1 -1
- data/lib/fiddle.rb +44 -9
- metadata +5 -7
- data/ext/fiddle/win32/fficonfig.h +0 -29
- data/ext/fiddle/win32/libffi-3.2.1-mswin.patch +0 -191
- data/ext/fiddle/win32/libffi-config.rb +0 -48
- data/ext/fiddle/win32/libffi.mk.tmpl +0 -96
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a45e277aca605b7e6ca64874fcb263a34c4ec365ee3c718c3df7e6d37e0786d7
|
4
|
+
data.tar.gz: a441f4a982a218093e53de55f101f1afb0307c8764a028ad60b703d0f81c906e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4abc678600a35970e801719b4319908312e312db6ff987c020b52047c37ec123e2168346db6ad534462d0591645eaa40ea57851fd0e2e7bab92e297928c0d464
|
7
|
+
data.tar.gz: 9a8cbe9817d22c1d740caecf58252781c8268eea84a9957fe1704ac917482981fe4fe862d6d95d4a17ce8ac94a6b9cbc1272609ae77ab6d1f97901dcb2239a09
|
data/Rakefile
CHANGED
@@ -17,8 +17,13 @@ namespace :version do
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
Rake::ExtensionTask.new("
|
20
|
+
if RUBY_ENGINE == "ruby"
|
21
|
+
require 'rake/extensiontask'
|
22
|
+
Rake::ExtensionTask.new("fiddle")
|
23
|
+
Rake::ExtensionTask.new("-test-/memory_view")
|
24
|
+
task test: :compile
|
25
|
+
else
|
26
|
+
task :compile
|
27
|
+
end
|
23
28
|
|
24
|
-
task
|
29
|
+
task default: :test
|
data/ext/fiddle/closure.c
CHANGED
@@ -61,7 +61,7 @@ const rb_data_type_t closure_data_type = {
|
|
61
61
|
.dfree = dealloc,
|
62
62
|
.dsize = closure_memsize
|
63
63
|
},
|
64
|
-
.flags =
|
64
|
+
.flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS,
|
65
65
|
};
|
66
66
|
|
67
67
|
struct callback_args {
|
@@ -300,6 +300,7 @@ initialize_body(VALUE user_data)
|
|
300
300
|
cl->argv[i] = rb_fiddle_int_to_ffi_type(NUM2INT(arg));
|
301
301
|
}
|
302
302
|
cl->argv[argc] = NULL;
|
303
|
+
OBJ_FREEZE_RAW(normalized_args);
|
303
304
|
|
304
305
|
ret = rb_fiddle_type_ensure(ret);
|
305
306
|
rb_iv_set(data->self, "@ctype", ret);
|
@@ -455,4 +456,3 @@ Init_fiddle_closure(void)
|
|
455
456
|
*/
|
456
457
|
rb_define_method(cFiddleClosure, "freed?", closure_freed_p, 0);
|
457
458
|
}
|
458
|
-
/* vim: set noet sw=4 sts=4 */
|
data/ext/fiddle/conversions.c
CHANGED
data/ext/fiddle/extconf.rb
CHANGED
@@ -1,4 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rbconfig"
|
4
|
+
|
5
|
+
unless RUBY_ENGINE == "ruby"
|
6
|
+
File.write('Makefile', <<-MAKEFILE)
|
7
|
+
all install clean:
|
8
|
+
#{RbConfig::CONFIG["NULLCMD"]}
|
9
|
+
|
10
|
+
.PHONY: all install clean
|
11
|
+
MAKEFILE
|
12
|
+
return
|
13
|
+
end
|
14
|
+
|
2
15
|
require 'mkmf'
|
3
16
|
|
4
17
|
# :stopdoc:
|
@@ -63,11 +76,6 @@ unless bundle
|
|
63
76
|
end
|
64
77
|
if have_ffi_header && (have_library('ffi') || have_library('libffi'))
|
65
78
|
have_libffi = true
|
66
|
-
checking_for("undefined FFI_GO_CLOSURES is used") do
|
67
|
-
if egrep_cpp(/warning: 'FFI_GO_CLOSURES' is not defined/, cpp_include(ffi_header), "2>&1")
|
68
|
-
$defs.push('-DFFI_GO_CLOSURES=0')
|
69
|
-
end
|
70
|
-
end
|
71
79
|
end
|
72
80
|
end
|
73
81
|
|
@@ -218,6 +226,8 @@ if libffi
|
|
218
226
|
$LOCAL_LIBS.prepend("#{libffi.a} ").strip! # to exts.mk
|
219
227
|
$INCFLAGS.gsub!(/-I#{libffi.dir}/, '-I$(LIBFFI_DIR)')
|
220
228
|
end
|
229
|
+
|
230
|
+
have_func("rb_str_to_interned_str")
|
221
231
|
create_makefile 'fiddle' do |conf|
|
222
232
|
if !libffi
|
223
233
|
next conf << "LIBFFI_CLEAN = none\n"
|
data/ext/fiddle/fiddle.c
CHANGED
data/ext/fiddle/fiddle.h
CHANGED
@@ -40,6 +40,7 @@
|
|
40
40
|
# endif
|
41
41
|
#endif
|
42
42
|
|
43
|
+
#define FFI_GO_CLOSURES 0 /* fiddle does not use go closures */
|
43
44
|
#ifdef USE_HEADER_HACKS
|
44
45
|
#include <ffi/ffi.h>
|
45
46
|
#else
|
@@ -236,5 +237,14 @@ VALUE rb_fiddle_new_function(VALUE address, VALUE arg_types, VALUE ret_type);
|
|
236
237
|
typedef void (*rb_fiddle_freefunc_t)(void*);
|
237
238
|
VALUE rb_fiddle_ptr_new_wrap(void *ptr, long size, rb_fiddle_freefunc_t func, VALUE wrap0, VALUE wrap1);
|
238
239
|
|
240
|
+
enum {
|
241
|
+
FIDDLE_DEFAULT_TYPED_DATA_FLAGS = (
|
242
|
+
RUBY_TYPED_FREE_IMMEDIATELY |
|
243
|
+
RUBY_TYPED_WB_PROTECTED |
|
244
|
+
#ifdef RUBY_TYPED_FROZEN_SHAREABLE
|
245
|
+
RUBY_TYPED_FROZEN_SHAREABLE |
|
246
|
+
#endif
|
247
|
+
0)
|
248
|
+
};
|
249
|
+
|
239
250
|
#endif
|
240
|
-
/* vim: set noet sws=4 sw=4: */
|
data/ext/fiddle/function.c
CHANGED
@@ -59,7 +59,7 @@ const rb_data_type_t function_data_type = {
|
|
59
59
|
.dfree = deallocate,
|
60
60
|
.dsize = function_memsize
|
61
61
|
},
|
62
|
-
.flags =
|
62
|
+
.flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS,
|
63
63
|
};
|
64
64
|
|
65
65
|
static VALUE
|
@@ -153,6 +153,11 @@ initialize(int argc, VALUE argv[], VALUE self)
|
|
153
153
|
rb_get_kwargs(kwargs, kw, 0, kw_max_, args);
|
154
154
|
if (args[kw_name] != Qundef) {
|
155
155
|
name = args[kw_name];
|
156
|
+
#ifdef HAVE_RB_STR_TO_INTERNED_STR
|
157
|
+
if (RB_TYPE_P(name, RUBY_T_STRING)) {
|
158
|
+
name = rb_str_to_interned_str(name);
|
159
|
+
}
|
160
|
+
#endif
|
156
161
|
}
|
157
162
|
if (args[kw_need_gvl] != Qundef) {
|
158
163
|
need_gvl = args[kw_need_gvl];
|
@@ -371,7 +376,7 @@ function_call(int argc, VALUE argv[], VALUE self)
|
|
371
376
|
args.values[i_call] = (void *)&generic_args[i_call];
|
372
377
|
}
|
373
378
|
args.values[i_call] = NULL;
|
374
|
-
args.fn = (void(*)(void))NUM2PTR(cfunc);
|
379
|
+
args.fn = (void(*)(void))(VALUE)NUM2PTR(cfunc);
|
375
380
|
|
376
381
|
if (RTEST(need_gvl)) {
|
377
382
|
ffi_call(args.cif, args.fn, &(args.retval), args.values);
|
@@ -493,4 +498,3 @@ Init_fiddle_function(void)
|
|
493
498
|
*/
|
494
499
|
rb_define_method(cFiddleFunction, "initialize", initialize, -1);
|
495
500
|
}
|
496
|
-
/* vim: set noet sws=4 sw=4: */
|
data/ext/fiddle/handle.c
CHANGED
@@ -56,7 +56,8 @@ static const rb_data_type_t fiddle_handle_data_type = {
|
|
56
56
|
.dfree = fiddle_handle_free,
|
57
57
|
.dsize = fiddle_handle_memsize
|
58
58
|
},
|
59
|
-
.flags =
|
59
|
+
.flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS & ~RUBY_TYPED_FREE_IMMEDIATELY,
|
60
|
+
/* keeping while its symbols are referred. */
|
60
61
|
};
|
61
62
|
|
62
63
|
/*
|
@@ -587,5 +588,3 @@ Init_fiddle_handle(void)
|
|
587
588
|
rb_define_method(rb_cHandle, "enable_close", rb_fiddle_handle_enable_close, 0);
|
588
589
|
rb_define_method(rb_cHandle, "close_enabled?", rb_fiddle_handle_close_enabled_p, 0);
|
589
590
|
}
|
590
|
-
|
591
|
-
/* vim: set noet sws=4 sw=4: */
|
data/ext/fiddle/memory_view.c
CHANGED
@@ -64,8 +64,13 @@ fiddle_memview_memsize(const void *ptr)
|
|
64
64
|
}
|
65
65
|
|
66
66
|
static const rb_data_type_t fiddle_memview_data_type = {
|
67
|
-
"fiddle/memory_view",
|
68
|
-
|
67
|
+
.wrap_struct_name = "fiddle/memory_view",
|
68
|
+
.function = {
|
69
|
+
.dmark = fiddle_memview_mark,
|
70
|
+
.dfree = fiddle_memview_free,
|
71
|
+
.dsize = fiddle_memview_memsize,
|
72
|
+
},
|
73
|
+
.flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS,
|
69
74
|
};
|
70
75
|
|
71
76
|
static VALUE
|
data/ext/fiddle/pinned.c
CHANGED
@@ -24,9 +24,13 @@ pinned_memsize(const void *ptr)
|
|
24
24
|
}
|
25
25
|
|
26
26
|
static const rb_data_type_t pinned_data_type = {
|
27
|
-
"fiddle/pinned",
|
28
|
-
|
29
|
-
|
27
|
+
.wrap_struct_name = "fiddle/pinned",
|
28
|
+
.function = {
|
29
|
+
.dmark = pinned_mark,
|
30
|
+
.dfree = RUBY_TYPED_DEFAULT_FREE,
|
31
|
+
.dsize = pinned_memsize,
|
32
|
+
},
|
33
|
+
.flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS,
|
30
34
|
};
|
31
35
|
|
32
36
|
static VALUE
|
data/ext/fiddle/pointer.c
CHANGED
@@ -94,7 +94,7 @@ static const rb_data_type_t fiddle_ptr_data_type = {
|
|
94
94
|
.dfree = fiddle_ptr_free,
|
95
95
|
.dsize = fiddle_ptr_memsize,
|
96
96
|
},
|
97
|
-
.flags =
|
97
|
+
.flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS,
|
98
98
|
};
|
99
99
|
|
100
100
|
#ifdef HAVE_RUBY_MEMORY_VIEW_H
|
@@ -570,7 +570,7 @@ rb_fiddle_ptr_inspect(VALUE self)
|
|
570
570
|
|
571
571
|
TypedData_Get_Struct(self, struct ptr_data, &fiddle_ptr_data_type, data);
|
572
572
|
return rb_sprintf("#<%"PRIsVALUE":%p ptr=%p size=%ld free=%p>",
|
573
|
-
RB_OBJ_CLASSNAME(self), (void *)data, data->ptr, data->size, (void *)data->free);
|
573
|
+
RB_OBJ_CLASSNAME(self), (void *)data, data->ptr, data->size, (void *)(VALUE)data->free);
|
574
574
|
}
|
575
575
|
|
576
576
|
/*
|
@@ -827,7 +827,8 @@ rb_fiddle_ptr_read_mem(VALUE klass, VALUE address, VALUE len)
|
|
827
827
|
static VALUE
|
828
828
|
rb_fiddle_ptr_write_mem(VALUE klass, VALUE addr, VALUE str)
|
829
829
|
{
|
830
|
-
|
830
|
+
const char *ptr = StringValuePtr(str);
|
831
|
+
memcpy(NUM2PTR(addr), ptr, RSTRING_LEN(str));
|
831
832
|
return str;
|
832
833
|
}
|
833
834
|
|
data/fiddle.gemspec
CHANGED
@@ -34,14 +34,11 @@ Gem::Specification.new do |spec|
|
|
34
34
|
"ext/fiddle/memory_view.c",
|
35
35
|
"ext/fiddle/pinned.c",
|
36
36
|
"ext/fiddle/pointer.c",
|
37
|
-
"ext/fiddle/win32/fficonfig.h",
|
38
|
-
"ext/fiddle/win32/libffi-3.2.1-mswin.patch",
|
39
|
-
"ext/fiddle/win32/libffi-config.rb",
|
40
|
-
"ext/fiddle/win32/libffi.mk.tmpl",
|
41
37
|
"fiddle.gemspec",
|
42
38
|
"lib/fiddle.rb",
|
43
39
|
"lib/fiddle/closure.rb",
|
44
40
|
"lib/fiddle/cparser.rb",
|
41
|
+
"lib/fiddle/ffi_backend.rb",
|
45
42
|
"lib/fiddle/function.rb",
|
46
43
|
"lib/fiddle/import.rb",
|
47
44
|
"lib/fiddle/pack.rb",
|
@@ -56,4 +53,5 @@ Gem::Specification.new do |spec|
|
|
56
53
|
spec.required_ruby_version = ">= 2.5.0"
|
57
54
|
|
58
55
|
spec.metadata["msys2_mingw_dependencies"] = "libffi"
|
56
|
+
spec.metadata["changelog_uri"] = "https://github.com/ruby/fiddle/releases"
|
59
57
|
end
|