fiddle 1.0.3 → 1.0.4
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/Rakefile +1 -0
- data/ext/fiddle/conversions.c +44 -0
- data/ext/fiddle/depend +2 -0
- data/ext/fiddle/extconf.rb +4 -1
- data/ext/fiddle/fiddle.c +88 -0
- data/ext/fiddle/fiddle.h +61 -31
- data/ext/fiddle/function.c +47 -18
- data/ext/fiddle/memory_view.c +254 -0
- data/ext/fiddle/pointer.c +41 -0
- data/fiddle.gemspec +1 -0
- data/lib/fiddle/cparser.rb +62 -24
- data/lib/fiddle/function.rb +5 -0
- data/lib/fiddle/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7e244560b492c43b7458506409f4d624372766d882e306a48a08fc9ad32671b
|
4
|
+
data.tar.gz: 9a166eb1dded473780e8ea89d1240da28ff6be73e72f2026eff14f6e55f060b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c4509d95af60a2f16047e431580a3e6b1828b0bcf0820302d678c1b2f8e9462df767ce5a6c7e60ef728fa0d7a3afe667cbbe982e161802dafc49ed0a398bf2a
|
7
|
+
data.tar.gz: 00623b0e514fad355b76ec9d59273c15759d5991c2832c6df10c23ad06ef98f628d5d6381cfd75449ee0c2811b3f58d66b55824993c5d3aef1a2d2be1d79a8de
|
data/Rakefile
CHANGED
data/ext/fiddle/conversions.c
CHANGED
@@ -22,6 +22,18 @@ rb_fiddle_type_ensure(VALUE type)
|
|
22
22
|
ID long_id;
|
23
23
|
#ifdef TYPE_LONG_LONG
|
24
24
|
ID long_long_id;
|
25
|
+
#endif
|
26
|
+
#ifdef TYPE_INT8_T
|
27
|
+
ID int8_t_id;
|
28
|
+
#endif
|
29
|
+
#ifdef TYPE_INT16_T
|
30
|
+
ID int16_t_id;
|
31
|
+
#endif
|
32
|
+
#ifdef TYPE_INT32_T
|
33
|
+
ID int32_t_id;
|
34
|
+
#endif
|
35
|
+
#ifdef TYPE_INT64_T
|
36
|
+
ID int64_t_id;
|
25
37
|
#endif
|
26
38
|
ID float_id;
|
27
39
|
ID double_id;
|
@@ -40,6 +52,18 @@ rb_fiddle_type_ensure(VALUE type)
|
|
40
52
|
RUBY_CONST_ID(long_id, "long");
|
41
53
|
#ifdef TYPE_LONG_LONG
|
42
54
|
RUBY_CONST_ID(long_long_id, "long_long");
|
55
|
+
#endif
|
56
|
+
#ifdef TYPE_INT8_T
|
57
|
+
RUBY_CONST_ID(int8_t_id, "int8_t");
|
58
|
+
#endif
|
59
|
+
#ifdef TYPE_INT16_T
|
60
|
+
RUBY_CONST_ID(int16_t_id, "int16_t");
|
61
|
+
#endif
|
62
|
+
#ifdef TYPE_INT32_T
|
63
|
+
RUBY_CONST_ID(int32_t_id, "int32_t");
|
64
|
+
#endif
|
65
|
+
#ifdef TYPE_INT64_T
|
66
|
+
RUBY_CONST_ID(int64_t_id, "int64_t");
|
43
67
|
#endif
|
44
68
|
RUBY_CONST_ID(float_id, "float");
|
45
69
|
RUBY_CONST_ID(double_id, "double");
|
@@ -72,6 +96,26 @@ rb_fiddle_type_ensure(VALUE type)
|
|
72
96
|
else if (type_id == long_long_id) {
|
73
97
|
return INT2NUM(TYPE_LONG_LONG);
|
74
98
|
}
|
99
|
+
#endif
|
100
|
+
#ifdef TYPE_INT8_T
|
101
|
+
else if (type_id == int8_t_id) {
|
102
|
+
return INT2NUM(TYPE_INT8_T);
|
103
|
+
}
|
104
|
+
#endif
|
105
|
+
#ifdef TYPE_INT16_T
|
106
|
+
else if (type_id == int16_t_id) {
|
107
|
+
return INT2NUM(TYPE_INT16_T);
|
108
|
+
}
|
109
|
+
#endif
|
110
|
+
#ifdef TYPE_INT32_T
|
111
|
+
else if (type_id == int32_t_id) {
|
112
|
+
return INT2NUM(TYPE_INT32_T);
|
113
|
+
}
|
114
|
+
#endif
|
115
|
+
#ifdef TYPE_INT64_T
|
116
|
+
else if (type_id == int64_t_id) {
|
117
|
+
return INT2NUM(TYPE_INT64_T);
|
118
|
+
}
|
75
119
|
#endif
|
76
120
|
else if (type_id == float_id) {
|
77
121
|
return INT2NUM(TYPE_FLOAT);
|
data/ext/fiddle/depend
CHANGED
data/ext/fiddle/extconf.rb
CHANGED
@@ -177,11 +177,14 @@ types.each do |type, signed|
|
|
177
177
|
end
|
178
178
|
end
|
179
179
|
|
180
|
+
if have_header("ruby/memory_view.h")
|
181
|
+
have_type("rb_memory_view_t", ["ruby/memory_view.h"])
|
182
|
+
end
|
183
|
+
|
180
184
|
if libffi
|
181
185
|
$LOCAL_LIBS.prepend("./#{libffi.a} ").strip! # to exts.mk
|
182
186
|
$INCFLAGS.gsub!(/-I#{libffi.dir}/, '-I$(LIBFFI_DIR)')
|
183
187
|
end
|
184
|
-
$INCFLAGS << " -I$(top_srcdir)"
|
185
188
|
create_makefile 'fiddle' do |conf|
|
186
189
|
if !libffi
|
187
190
|
next conf << "LIBFFI_CLEAN = none\n"
|
data/ext/fiddle/fiddle.c
CHANGED
@@ -7,6 +7,10 @@ VALUE rb_eFiddleError;
|
|
7
7
|
void Init_fiddle_pointer(void);
|
8
8
|
void Init_fiddle_pinned(void);
|
9
9
|
|
10
|
+
#ifdef FIDDLE_MEMORY_VIEW
|
11
|
+
void Init_fiddle_memory_view(void);
|
12
|
+
#endif
|
13
|
+
|
10
14
|
/*
|
11
15
|
* call-seq: Fiddle.malloc(size)
|
12
16
|
*
|
@@ -204,6 +208,38 @@ Init_fiddle(void)
|
|
204
208
|
rb_define_const(mFiddle, "TYPE_LONG_LONG", INT2NUM(TYPE_LONG_LONG));
|
205
209
|
#endif
|
206
210
|
|
211
|
+
#ifdef TYPE_INT8_T
|
212
|
+
/* Document-const: TYPE_INT8_T
|
213
|
+
*
|
214
|
+
* C type - int8_t
|
215
|
+
*/
|
216
|
+
rb_define_const(mFiddle, "TYPE_INT8_T", INT2NUM(TYPE_INT8_T));
|
217
|
+
#endif
|
218
|
+
|
219
|
+
#ifdef TYPE_INT16_T
|
220
|
+
/* Document-const: TYPE_INT16_T
|
221
|
+
*
|
222
|
+
* C type - int16_t
|
223
|
+
*/
|
224
|
+
rb_define_const(mFiddle, "TYPE_INT16_T", INT2NUM(TYPE_INT16_T));
|
225
|
+
#endif
|
226
|
+
|
227
|
+
#ifdef TYPE_INT32_T
|
228
|
+
/* Document-const: TYPE_INT32_T
|
229
|
+
*
|
230
|
+
* C type - int32_t
|
231
|
+
*/
|
232
|
+
rb_define_const(mFiddle, "TYPE_INT32_T", INT2NUM(TYPE_INT32_T));
|
233
|
+
#endif
|
234
|
+
|
235
|
+
#ifdef TYPE_INT64_T
|
236
|
+
/* Document-const: TYPE_INT64_T
|
237
|
+
*
|
238
|
+
* C type - int64_t
|
239
|
+
*/
|
240
|
+
rb_define_const(mFiddle, "TYPE_INT64_T", INT2NUM(TYPE_INT64_T));
|
241
|
+
#endif
|
242
|
+
|
207
243
|
/* Document-const: TYPE_FLOAT
|
208
244
|
*
|
209
245
|
* C type - float
|
@@ -298,6 +334,30 @@ Init_fiddle(void)
|
|
298
334
|
rb_define_const(mFiddle, "ALIGN_LONG_LONG", INT2NUM(ALIGN_LONG_LONG));
|
299
335
|
#endif
|
300
336
|
|
337
|
+
/* Document-const: ALIGN_INT8_T
|
338
|
+
*
|
339
|
+
* The alignment size of a int8_t
|
340
|
+
*/
|
341
|
+
rb_define_const(mFiddle, "ALIGN_INT8_T", INT2NUM(ALIGN_INT8_T));
|
342
|
+
|
343
|
+
/* Document-const: ALIGN_INT16_T
|
344
|
+
*
|
345
|
+
* The alignment size of a int16_t
|
346
|
+
*/
|
347
|
+
rb_define_const(mFiddle, "ALIGN_INT16_T", INT2NUM(ALIGN_INT16_T));
|
348
|
+
|
349
|
+
/* Document-const: ALIGN_INT32_T
|
350
|
+
*
|
351
|
+
* The alignment size of a int32_t
|
352
|
+
*/
|
353
|
+
rb_define_const(mFiddle, "ALIGN_INT32_T", INT2NUM(ALIGN_INT32_T));
|
354
|
+
|
355
|
+
/* Document-const: ALIGN_INT64_T
|
356
|
+
*
|
357
|
+
* The alignment size of a int64_t
|
358
|
+
*/
|
359
|
+
rb_define_const(mFiddle, "ALIGN_INT64_T", INT2NUM(ALIGN_INT64_T));
|
360
|
+
|
301
361
|
/* Document-const: ALIGN_FLOAT
|
302
362
|
*
|
303
363
|
* The alignment size of a float
|
@@ -388,6 +448,30 @@ Init_fiddle(void)
|
|
388
448
|
rb_define_const(mFiddle, "SIZEOF_LONG_LONG", INT2NUM(sizeof(LONG_LONG)));
|
389
449
|
#endif
|
390
450
|
|
451
|
+
/* Document-const: SIZEOF_INT8_T
|
452
|
+
*
|
453
|
+
* size of a int8_t
|
454
|
+
*/
|
455
|
+
rb_define_const(mFiddle, "SIZEOF_INT8_T", INT2NUM(sizeof(int8_t)));
|
456
|
+
|
457
|
+
/* Document-const: SIZEOF_INT16_T
|
458
|
+
*
|
459
|
+
* size of a int16_t
|
460
|
+
*/
|
461
|
+
rb_define_const(mFiddle, "SIZEOF_INT16_T", INT2NUM(sizeof(int16_t)));
|
462
|
+
|
463
|
+
/* Document-const: SIZEOF_INT32_T
|
464
|
+
*
|
465
|
+
* size of a int32_t
|
466
|
+
*/
|
467
|
+
rb_define_const(mFiddle, "SIZEOF_INT32_T", INT2NUM(sizeof(int32_t)));
|
468
|
+
|
469
|
+
/* Document-const: SIZEOF_INT64_T
|
470
|
+
*
|
471
|
+
* size of a int64_t
|
472
|
+
*/
|
473
|
+
rb_define_const(mFiddle, "SIZEOF_INT64_T", INT2NUM(sizeof(int64_t)));
|
474
|
+
|
391
475
|
/* Document-const: SIZEOF_FLOAT
|
392
476
|
*
|
393
477
|
* size of a float
|
@@ -461,5 +545,9 @@ Init_fiddle(void)
|
|
461
545
|
Init_fiddle_handle();
|
462
546
|
Init_fiddle_pointer();
|
463
547
|
Init_fiddle_pinned();
|
548
|
+
|
549
|
+
#ifdef FIDDLE_MEMORY_VIEW
|
550
|
+
Init_fiddle_memory_view();
|
551
|
+
#endif
|
464
552
|
}
|
465
553
|
/* vim: set noet sws=4 sw=4: */
|
data/ext/fiddle/fiddle.h
CHANGED
@@ -58,38 +58,38 @@
|
|
58
58
|
# error "CHAR_BIT not supported"
|
59
59
|
#endif
|
60
60
|
|
61
|
-
#
|
62
|
-
#
|
63
|
-
#
|
64
|
-
#
|
65
|
-
#
|
66
|
-
#
|
67
|
-
#
|
68
|
-
#
|
69
|
-
#
|
61
|
+
#if SIZEOF_SHORT == 2
|
62
|
+
# define ffi_type_ushort ffi_type_uint16
|
63
|
+
# define ffi_type_sshort ffi_type_sint16
|
64
|
+
#elif SIZEOF_SHORT == 4
|
65
|
+
# define ffi_type_ushort ffi_type_uint32
|
66
|
+
# define ffi_type_sshort ffi_type_sint32
|
67
|
+
#else
|
68
|
+
# error "short size not supported"
|
69
|
+
#endif
|
70
70
|
|
71
|
-
#
|
72
|
-
#
|
73
|
-
#
|
74
|
-
#
|
75
|
-
#
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
71
|
+
#if SIZEOF_INT == 2
|
72
|
+
# define ffi_type_uint ffi_type_uint16
|
73
|
+
# define ffi_type_sint ffi_type_sint16
|
74
|
+
#elif SIZEOF_INT == 4
|
75
|
+
# define ffi_type_uint ffi_type_uint32
|
76
|
+
# define ffi_type_sint ffi_type_sint32
|
77
|
+
#elif SIZEOF_INT == 8
|
78
|
+
# define ffi_type_uint ffi_type_uint64
|
79
|
+
# define ffi_type_sint ffi_type_sint64
|
80
|
+
#else
|
81
|
+
# error "int size not supported"
|
82
|
+
#endif
|
83
83
|
|
84
|
-
#
|
85
|
-
#
|
86
|
-
#
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
90
|
-
#
|
91
|
-
#
|
92
|
-
#
|
84
|
+
#if SIZEOF_LONG == 4
|
85
|
+
# define ffi_type_ulong ffi_type_uint32
|
86
|
+
# define ffi_type_slong ffi_type_sint32
|
87
|
+
#elif SIZEOF_LONG == 8
|
88
|
+
# define ffi_type_ulong ffi_type_uint64
|
89
|
+
# define ffi_type_slong ffi_type_sint64
|
90
|
+
#else
|
91
|
+
# error "long size not supported"
|
92
|
+
#endif
|
93
93
|
|
94
94
|
#if HAVE_LONG_LONG
|
95
95
|
# if SIZEOF_LONG_LONG == 8
|
@@ -118,6 +118,27 @@
|
|
118
118
|
#define TYPE_VARIADIC 9
|
119
119
|
#define TYPE_CONST_STRING 10
|
120
120
|
|
121
|
+
#define TYPE_INT8_T TYPE_CHAR
|
122
|
+
#if SIZEOF_SHORT == 2
|
123
|
+
# define TYPE_INT16_T TYPE_SHORT
|
124
|
+
#elif SIZEOF_INT == 2
|
125
|
+
# define TYPE_INT16_T TYPE_INT
|
126
|
+
#endif
|
127
|
+
#if SIZEOF_SHORT == 4
|
128
|
+
# define TYPE_INT32_T TYPE_SHORT
|
129
|
+
#elif SIZEOF_INT == 4
|
130
|
+
# define TYPE_INT32_T TYPE_INT
|
131
|
+
#elif SIZEOF_LONG == 4
|
132
|
+
# define TYPE_INT32_T TYPE_LONG
|
133
|
+
#endif
|
134
|
+
#if SIZEOF_INT == 8
|
135
|
+
# define TYPE_INT64_T TYPE_INT
|
136
|
+
#elif SIZEOF_LONG == 8
|
137
|
+
# define TYPE_INT64_T TYPE_LONG
|
138
|
+
#elif defined(TYPE_LONG_LONG)
|
139
|
+
# define TYPE_INT64_T TYPE_LONG_LONG
|
140
|
+
#endif
|
141
|
+
|
121
142
|
#ifndef TYPE_SSIZE_T
|
122
143
|
# if SIZEOF_SIZE_T == SIZEOF_INT
|
123
144
|
# define TYPE_SSIZE_T TYPE_INT
|
@@ -153,8 +174,8 @@
|
|
153
174
|
#define ALIGN_OF(type) offsetof(struct {char align_c; type align_x;}, align_x)
|
154
175
|
|
155
176
|
#define ALIGN_VOIDP ALIGN_OF(void*)
|
156
|
-
#define ALIGN_SHORT ALIGN_OF(short)
|
157
177
|
#define ALIGN_CHAR ALIGN_OF(char)
|
178
|
+
#define ALIGN_SHORT ALIGN_OF(short)
|
158
179
|
#define ALIGN_INT ALIGN_OF(int)
|
159
180
|
#define ALIGN_LONG ALIGN_OF(long)
|
160
181
|
#if HAVE_LONG_LONG
|
@@ -163,6 +184,15 @@
|
|
163
184
|
#define ALIGN_FLOAT ALIGN_OF(float)
|
164
185
|
#define ALIGN_DOUBLE ALIGN_OF(double)
|
165
186
|
|
187
|
+
#define ALIGN_INT8_T ALIGN_OF(int8_t)
|
188
|
+
#define ALIGN_INT16_T ALIGN_OF(int16_t)
|
189
|
+
#define ALIGN_INT32_T ALIGN_OF(int32_t)
|
190
|
+
#define ALIGN_INT64_T ALIGN_OF(int64_t)
|
191
|
+
|
192
|
+
#ifdef HAVE_TYPE_RB_MEMORY_VIEW_T
|
193
|
+
# define FIDDLE_MEMORY_VIEW
|
194
|
+
#endif
|
195
|
+
|
166
196
|
extern VALUE mFiddle;
|
167
197
|
extern VALUE rb_eFiddleDLError;
|
168
198
|
|
data/ext/fiddle/function.c
CHANGED
@@ -77,18 +77,6 @@ rb_fiddle_new_function(VALUE address, VALUE arg_types, VALUE ret_type)
|
|
77
77
|
return rb_class_new_instance(3, argv, cFiddleFunction);
|
78
78
|
}
|
79
79
|
|
80
|
-
static int
|
81
|
-
parse_keyword_arg_i(VALUE key, VALUE value, VALUE self)
|
82
|
-
{
|
83
|
-
if (key == ID2SYM(rb_intern("name"))) {
|
84
|
-
rb_iv_set(self, "@name", value);
|
85
|
-
} else {
|
86
|
-
rb_raise(rb_eArgError, "unknown keyword: %"PRIsVALUE,
|
87
|
-
RB_OBJ_STRING(key));
|
88
|
-
}
|
89
|
-
return ST_CONTINUE;
|
90
|
-
}
|
91
|
-
|
92
80
|
static VALUE
|
93
81
|
normalize_argument_types(const char *name,
|
94
82
|
VALUE arg_types,
|
@@ -134,15 +122,40 @@ static VALUE
|
|
134
122
|
initialize(int argc, VALUE argv[], VALUE self)
|
135
123
|
{
|
136
124
|
ffi_cif * cif;
|
137
|
-
VALUE ptr, arg_types, ret_type, abi,
|
125
|
+
VALUE ptr, arg_types, ret_type, abi, kwargs;
|
126
|
+
VALUE name = Qnil;
|
127
|
+
VALUE need_gvl = Qfalse;
|
138
128
|
int c_ret_type;
|
139
129
|
bool is_variadic = false;
|
140
130
|
ffi_abi c_ffi_abi;
|
141
131
|
void *cfunc;
|
142
132
|
|
143
|
-
rb_scan_args(argc, argv, "31:", &ptr, &arg_types, &ret_type, &abi, &
|
133
|
+
rb_scan_args(argc, argv, "31:", &ptr, &arg_types, &ret_type, &abi, &kwargs);
|
144
134
|
rb_iv_set(self, "@closure", ptr);
|
145
135
|
|
136
|
+
if (!NIL_P(kwargs)) {
|
137
|
+
enum {
|
138
|
+
kw_name,
|
139
|
+
kw_need_gvl,
|
140
|
+
kw_max_,
|
141
|
+
};
|
142
|
+
static ID kw[kw_max_];
|
143
|
+
VALUE args[kw_max_];
|
144
|
+
if (!kw[0]) {
|
145
|
+
kw[kw_name] = rb_intern_const("name");
|
146
|
+
kw[kw_need_gvl] = rb_intern_const("need_gvl");
|
147
|
+
}
|
148
|
+
rb_get_kwargs(kwargs, kw, 0, kw_max_, args);
|
149
|
+
if (args[kw_name] != Qundef) {
|
150
|
+
name = args[kw_name];
|
151
|
+
}
|
152
|
+
if (args[kw_need_gvl] != Qundef) {
|
153
|
+
need_gvl = args[kw_need_gvl];
|
154
|
+
}
|
155
|
+
}
|
156
|
+
rb_iv_set(self, "@name", name);
|
157
|
+
rb_iv_set(self, "@need_gvl", need_gvl);
|
158
|
+
|
146
159
|
ptr = rb_Integer(ptr);
|
147
160
|
cfunc = NUM2PTR(ptr);
|
148
161
|
PTR2NUM(cfunc);
|
@@ -170,8 +183,6 @@ initialize(int argc, VALUE argv[], VALUE self)
|
|
170
183
|
rb_iv_set(self, "@abi", abi);
|
171
184
|
rb_iv_set(self, "@is_variadic", is_variadic ? Qtrue : Qfalse);
|
172
185
|
|
173
|
-
if (!NIL_P(kwds)) rb_hash_foreach(kwds, parse_keyword_arg_i, self);
|
174
|
-
|
175
186
|
TypedData_Get_Struct(self, ffi_cif, &function_data_type, cif);
|
176
187
|
cif->arg_types = NULL;
|
177
188
|
|
@@ -205,6 +216,7 @@ function_call(int argc, VALUE argv[], VALUE self)
|
|
205
216
|
VALUE arg_types;
|
206
217
|
VALUE cPointer;
|
207
218
|
VALUE is_variadic;
|
219
|
+
VALUE need_gvl;
|
208
220
|
int n_arg_types;
|
209
221
|
int n_fixed_args = 0;
|
210
222
|
int n_call_args = 0;
|
@@ -218,6 +230,7 @@ function_call(int argc, VALUE argv[], VALUE self)
|
|
218
230
|
arg_types = rb_iv_get(self, "@argument_types");
|
219
231
|
cPointer = rb_const_get(mFiddle, rb_intern("Pointer"));
|
220
232
|
is_variadic = rb_iv_get(self, "@is_variadic");
|
233
|
+
need_gvl = rb_iv_get(self, "@need_gvl");
|
221
234
|
|
222
235
|
n_arg_types = RARRAY_LENINT(arg_types);
|
223
236
|
n_fixed_args = n_arg_types;
|
@@ -355,7 +368,12 @@ function_call(int argc, VALUE argv[], VALUE self)
|
|
355
368
|
args.values[i_call] = NULL;
|
356
369
|
args.fn = (void(*)(void))NUM2PTR(cfunc);
|
357
370
|
|
358
|
-
(
|
371
|
+
if (RTEST(need_gvl)) {
|
372
|
+
ffi_call(args.cif, args.fn, &(args.retval), args.values);
|
373
|
+
}
|
374
|
+
else {
|
375
|
+
(void)rb_thread_call_without_gvl(nogvl_ffi_call, &args, 0, 0);
|
376
|
+
}
|
359
377
|
|
360
378
|
rb_funcall(mFiddle, rb_intern("last_error="), 1, INT2NUM(errno));
|
361
379
|
#if defined(_WIN32)
|
@@ -433,6 +451,10 @@ Init_fiddle_function(void)
|
|
433
451
|
* Caller must ensure the underlying function is called in a
|
434
452
|
* thread-safe manner if running in a multi-threaded process.
|
435
453
|
*
|
454
|
+
* Note that it is not thread-safe to use this method to
|
455
|
+
* directly or indirectly call many Ruby C-extension APIs unless
|
456
|
+
* you don't pass +need_gvl: true+ to Fiddle::Function#new.
|
457
|
+
*
|
436
458
|
* For an example see Fiddle::Function
|
437
459
|
*
|
438
460
|
*/
|
@@ -440,13 +462,20 @@ Init_fiddle_function(void)
|
|
440
462
|
|
441
463
|
/*
|
442
464
|
* Document-method: new
|
443
|
-
* call-seq: new(ptr,
|
465
|
+
* call-seq: new(ptr,
|
466
|
+
* args,
|
467
|
+
* ret_type,
|
468
|
+
* abi = DEFAULT,
|
469
|
+
* name: nil,
|
470
|
+
* need_gvl: false)
|
444
471
|
*
|
445
472
|
* Constructs a Function object.
|
446
473
|
* * +ptr+ is a referenced function, of a Fiddle::Handle
|
447
474
|
* * +args+ is an Array of arguments, passed to the +ptr+ function
|
448
475
|
* * +ret_type+ is the return type of the function
|
449
476
|
* * +abi+ is the ABI of the function
|
477
|
+
* * +name+ is the name of the function
|
478
|
+
* * +need_gvl+ is whether GVL is needed to call the function
|
450
479
|
*
|
451
480
|
*/
|
452
481
|
rb_define_method(cFiddleFunction, "initialize", initialize, -1);
|
@@ -0,0 +1,254 @@
|
|
1
|
+
#include <stdbool.h>
|
2
|
+
#include <ruby/ruby.h>
|
3
|
+
|
4
|
+
#ifdef HAVE_RUBY_MEMORY_VIEW_H
|
5
|
+
# include <ruby/memory_view.h>
|
6
|
+
#endif
|
7
|
+
|
8
|
+
#if SIZEOF_INTPTR_T == SIZEOF_LONG_LONG
|
9
|
+
# define INTPTR2NUM LL2NUM
|
10
|
+
# define UINTPTR2NUM ULL2NUM
|
11
|
+
#elif SIZEOF_INTPTR_T == SIZEOF_LONG
|
12
|
+
# define INTPTR2NUM LONG2NUM
|
13
|
+
# define UINTPTR2NUM ULONG2NUM
|
14
|
+
#else
|
15
|
+
# define INTPTR2NUM INT2NUM
|
16
|
+
# define UINTPTR2NUM UINT2NUM
|
17
|
+
#endif
|
18
|
+
|
19
|
+
#include <fiddle.h>
|
20
|
+
|
21
|
+
#ifdef FIDDLE_MEMORY_VIEW
|
22
|
+
VALUE rb_cMemoryView = Qnil;
|
23
|
+
|
24
|
+
struct memview_data {
|
25
|
+
rb_memory_view_t view;
|
26
|
+
rb_memory_view_item_component_t *members;
|
27
|
+
size_t n_members;
|
28
|
+
};
|
29
|
+
|
30
|
+
static void
|
31
|
+
fiddle_memview_mark(void *ptr)
|
32
|
+
{
|
33
|
+
const struct memview_data *data = ptr;
|
34
|
+
rb_gc_mark(data->view.obj);
|
35
|
+
}
|
36
|
+
|
37
|
+
static void
|
38
|
+
fiddle_memview_free(void *ptr)
|
39
|
+
{
|
40
|
+
struct memview_data *data = ptr;
|
41
|
+
rb_memory_view_release(&data->view);
|
42
|
+
if (data->members)
|
43
|
+
xfree(data->members);
|
44
|
+
xfree(ptr);
|
45
|
+
}
|
46
|
+
|
47
|
+
static size_t
|
48
|
+
fiddle_memview_memsize(const void *ptr)
|
49
|
+
{
|
50
|
+
const struct memview_data *data = ptr;
|
51
|
+
return sizeof(*data) + sizeof(rb_memory_view_item_component_t)*data->n_members + (size_t)data->view.len;
|
52
|
+
}
|
53
|
+
|
54
|
+
static const rb_data_type_t fiddle_memview_data_type = {
|
55
|
+
"fiddle/memory_view",
|
56
|
+
{fiddle_memview_mark, fiddle_memview_free, fiddle_memview_memsize,},
|
57
|
+
};
|
58
|
+
|
59
|
+
static VALUE
|
60
|
+
rb_fiddle_memview_s_allocate(VALUE klass)
|
61
|
+
{
|
62
|
+
struct memview_data *data;
|
63
|
+
VALUE obj = TypedData_Make_Struct(klass, struct memview_data, &fiddle_memview_data_type, data);
|
64
|
+
data->view.obj = Qnil;
|
65
|
+
data->members = NULL;
|
66
|
+
data->n_members = 0;
|
67
|
+
return obj;
|
68
|
+
}
|
69
|
+
|
70
|
+
static VALUE
|
71
|
+
rb_fiddle_memview_initialize(VALUE obj, VALUE target)
|
72
|
+
{
|
73
|
+
struct memview_data *data;
|
74
|
+
TypedData_Get_Struct(obj, struct memview_data, &fiddle_memview_data_type, data);
|
75
|
+
|
76
|
+
if (!rb_memory_view_get(target, &data->view, 0)) {
|
77
|
+
rb_raise(rb_eArgError, "Unable to get a memory view from %+"PRIsVALUE, target);
|
78
|
+
}
|
79
|
+
|
80
|
+
return Qnil;
|
81
|
+
}
|
82
|
+
|
83
|
+
static VALUE
|
84
|
+
rb_fiddle_memview_get_obj(VALUE obj)
|
85
|
+
{
|
86
|
+
struct memview_data *data;
|
87
|
+
TypedData_Get_Struct(obj, struct memview_data, &fiddle_memview_data_type, data);
|
88
|
+
|
89
|
+
return data->view.obj;
|
90
|
+
}
|
91
|
+
|
92
|
+
static VALUE
|
93
|
+
rb_fiddle_memview_get_length(VALUE obj)
|
94
|
+
{
|
95
|
+
struct memview_data *data;
|
96
|
+
TypedData_Get_Struct(obj, struct memview_data, &fiddle_memview_data_type, data);
|
97
|
+
|
98
|
+
if (NIL_P(data->view.obj)) return Qnil;
|
99
|
+
return SSIZET2NUM(data->view.len);
|
100
|
+
}
|
101
|
+
|
102
|
+
static VALUE
|
103
|
+
rb_fiddle_memview_get_readonly(VALUE obj)
|
104
|
+
{
|
105
|
+
struct memview_data *data;
|
106
|
+
TypedData_Get_Struct(obj, struct memview_data, &fiddle_memview_data_type, data);
|
107
|
+
|
108
|
+
if (NIL_P(data->view.obj)) return Qnil;
|
109
|
+
return data->view.readonly ? Qtrue : Qfalse;
|
110
|
+
}
|
111
|
+
|
112
|
+
static VALUE
|
113
|
+
rb_fiddle_memview_get_format(VALUE obj)
|
114
|
+
{
|
115
|
+
struct memview_data *data;
|
116
|
+
TypedData_Get_Struct(obj, struct memview_data, &fiddle_memview_data_type, data);
|
117
|
+
|
118
|
+
if (NIL_P(data->view.obj)) return Qnil;
|
119
|
+
return data->view.format == NULL ? Qnil : rb_str_new_cstr(data->view.format);
|
120
|
+
}
|
121
|
+
|
122
|
+
static VALUE
|
123
|
+
rb_fiddle_memview_get_item_size(VALUE obj)
|
124
|
+
{
|
125
|
+
struct memview_data *data;
|
126
|
+
TypedData_Get_Struct(obj, struct memview_data, &fiddle_memview_data_type, data);
|
127
|
+
|
128
|
+
if (NIL_P(data->view.obj)) return Qnil;
|
129
|
+
return SSIZET2NUM(data->view.item_size);
|
130
|
+
}
|
131
|
+
|
132
|
+
static VALUE
|
133
|
+
rb_fiddle_memview_get_ndim(VALUE obj)
|
134
|
+
{
|
135
|
+
struct memview_data *data;
|
136
|
+
TypedData_Get_Struct(obj, struct memview_data, &fiddle_memview_data_type, data);
|
137
|
+
|
138
|
+
if (NIL_P(data->view.obj)) return Qnil;
|
139
|
+
return SSIZET2NUM(data->view.ndim);
|
140
|
+
}
|
141
|
+
|
142
|
+
static VALUE
|
143
|
+
rb_fiddle_memview_get_shape(VALUE obj)
|
144
|
+
{
|
145
|
+
struct memview_data *data;
|
146
|
+
TypedData_Get_Struct(obj, struct memview_data, &fiddle_memview_data_type, data);
|
147
|
+
|
148
|
+
if (NIL_P(data->view.obj)) return Qnil;
|
149
|
+
if (data->view.shape == NULL) return Qnil;
|
150
|
+
|
151
|
+
const ssize_t ndim = data->view.ndim;
|
152
|
+
VALUE shape = rb_ary_new_capa(ndim);
|
153
|
+
ssize_t i;
|
154
|
+
for (i = 0; i < ndim; ++i) {
|
155
|
+
rb_ary_push(shape, SSIZET2NUM(data->view.shape[i]));
|
156
|
+
}
|
157
|
+
return shape;
|
158
|
+
}
|
159
|
+
|
160
|
+
static VALUE
|
161
|
+
rb_fiddle_memview_get_strides(VALUE obj)
|
162
|
+
{
|
163
|
+
struct memview_data *data;
|
164
|
+
TypedData_Get_Struct(obj, struct memview_data, &fiddle_memview_data_type, data);
|
165
|
+
|
166
|
+
if (NIL_P(data->view.obj)) return Qnil;
|
167
|
+
if (data->view.strides == NULL) return Qnil;
|
168
|
+
|
169
|
+
const ssize_t ndim = data->view.ndim;
|
170
|
+
VALUE strides = rb_ary_new_capa(ndim);
|
171
|
+
ssize_t i;
|
172
|
+
for (i = 0; i < ndim; ++i) {
|
173
|
+
rb_ary_push(strides, SSIZET2NUM(data->view.strides[i]));
|
174
|
+
}
|
175
|
+
return strides;
|
176
|
+
}
|
177
|
+
|
178
|
+
static VALUE
|
179
|
+
rb_fiddle_memview_get_sub_offsets(VALUE obj)
|
180
|
+
{
|
181
|
+
struct memview_data *data;
|
182
|
+
TypedData_Get_Struct(obj, struct memview_data, &fiddle_memview_data_type, data);
|
183
|
+
|
184
|
+
if (NIL_P(data->view.obj)) return Qnil;
|
185
|
+
if (data->view.sub_offsets == NULL) return Qnil;
|
186
|
+
|
187
|
+
const ssize_t ndim = data->view.ndim;
|
188
|
+
VALUE sub_offsets = rb_ary_new_capa(ndim);
|
189
|
+
ssize_t i;
|
190
|
+
for (i = 0; i < ndim; ++i) {
|
191
|
+
rb_ary_push(sub_offsets, SSIZET2NUM(data->view.sub_offsets[i]));
|
192
|
+
}
|
193
|
+
return sub_offsets;
|
194
|
+
}
|
195
|
+
|
196
|
+
static VALUE
|
197
|
+
rb_fiddle_memview_aref(int argc, VALUE *argv, VALUE obj)
|
198
|
+
{
|
199
|
+
struct memview_data *data;
|
200
|
+
TypedData_Get_Struct(obj, struct memview_data, &fiddle_memview_data_type, data);
|
201
|
+
|
202
|
+
if (NIL_P(data->view.obj)) return Qnil;
|
203
|
+
|
204
|
+
const ssize_t ndim = data->view.ndim;
|
205
|
+
if (argc != ndim) {
|
206
|
+
rb_raise(rb_eIndexError, "wrong number of index (%d for %"PRIdSIZE")", argc, ndim);
|
207
|
+
}
|
208
|
+
|
209
|
+
VALUE indices_v = 0;
|
210
|
+
ssize_t *indices = ALLOCV_N(ssize_t, indices_v, ndim);
|
211
|
+
|
212
|
+
ssize_t i;
|
213
|
+
for (i = 0; i < ndim; ++i) {
|
214
|
+
ssize_t x = NUM2SSIZET(argv[i]);
|
215
|
+
indices[i] = x;
|
216
|
+
}
|
217
|
+
|
218
|
+
uint8_t *ptr = rb_memory_view_get_item_pointer(&data->view, indices);
|
219
|
+
ALLOCV_END(indices_v);
|
220
|
+
|
221
|
+
if (data->view.format == NULL) {
|
222
|
+
return INT2FIX(*ptr);
|
223
|
+
}
|
224
|
+
|
225
|
+
if (!data->members) {
|
226
|
+
const char *err;
|
227
|
+
if (rb_memory_view_parse_item_format(data->view.format, &data->members, &data->n_members, &err) < 0) {
|
228
|
+
rb_raise(rb_eRuntimeError, "Unable to recognize item format at %"PRIdSIZE" in \"%s\"",
|
229
|
+
err - data->view.format, data->view.format);
|
230
|
+
}
|
231
|
+
}
|
232
|
+
|
233
|
+
return rb_memory_view_extract_item_members(ptr, data->members, data->n_members);
|
234
|
+
}
|
235
|
+
|
236
|
+
void
|
237
|
+
Init_fiddle_memory_view(void)
|
238
|
+
{
|
239
|
+
rb_cMemoryView = rb_define_class_under(mFiddle, "MemoryView", rb_cObject);
|
240
|
+
rb_define_alloc_func(rb_cMemoryView, rb_fiddle_memview_s_allocate);
|
241
|
+
rb_define_method(rb_cMemoryView, "initialize", rb_fiddle_memview_initialize, 1);
|
242
|
+
rb_define_method(rb_cMemoryView, "obj", rb_fiddle_memview_get_obj, 0);
|
243
|
+
rb_define_method(rb_cMemoryView, "length", rb_fiddle_memview_get_length, 0);
|
244
|
+
rb_define_method(rb_cMemoryView, "readonly?", rb_fiddle_memview_get_readonly, 0);
|
245
|
+
rb_define_method(rb_cMemoryView, "format", rb_fiddle_memview_get_format, 0);
|
246
|
+
rb_define_method(rb_cMemoryView, "item_size", rb_fiddle_memview_get_item_size, 0);
|
247
|
+
rb_define_method(rb_cMemoryView, "ndim", rb_fiddle_memview_get_ndim, 0);
|
248
|
+
rb_define_method(rb_cMemoryView, "shape", rb_fiddle_memview_get_shape, 0);
|
249
|
+
rb_define_method(rb_cMemoryView, "strides", rb_fiddle_memview_get_strides, 0);
|
250
|
+
rb_define_method(rb_cMemoryView, "sub_offsets", rb_fiddle_memview_get_sub_offsets, 0);
|
251
|
+
rb_define_method(rb_cMemoryView, "[]", rb_fiddle_memview_aref, -1);
|
252
|
+
}
|
253
|
+
|
254
|
+
#endif /* FIDDLE_MEMORY_VIEW */
|
data/ext/fiddle/pointer.c
CHANGED
@@ -5,6 +5,11 @@
|
|
5
5
|
#include <stdbool.h>
|
6
6
|
#include <ruby/ruby.h>
|
7
7
|
#include <ruby/io.h>
|
8
|
+
|
9
|
+
#ifdef HAVE_RUBY_MEMORY_VIEW_H
|
10
|
+
# include <ruby/memory_view.h>
|
11
|
+
#endif
|
12
|
+
|
8
13
|
#include <ctype.h>
|
9
14
|
#include <fiddle.h>
|
10
15
|
|
@@ -87,6 +92,38 @@ static const rb_data_type_t fiddle_ptr_data_type = {
|
|
87
92
|
{fiddle_ptr_mark, fiddle_ptr_free, fiddle_ptr_memsize,},
|
88
93
|
};
|
89
94
|
|
95
|
+
#ifdef FIDDLE_MEMORY_VIEW
|
96
|
+
static struct ptr_data *
|
97
|
+
fiddle_ptr_check_memory_view(VALUE obj)
|
98
|
+
{
|
99
|
+
struct ptr_data *data;
|
100
|
+
TypedData_Get_Struct(obj, struct ptr_data, &fiddle_ptr_data_type, data);
|
101
|
+
if (data->ptr == NULL || data->size == 0) return NULL;
|
102
|
+
return data;
|
103
|
+
}
|
104
|
+
|
105
|
+
static int
|
106
|
+
fiddle_ptr_memory_view_available_p(VALUE obj)
|
107
|
+
{
|
108
|
+
return fiddle_ptr_check_memory_view(obj) != NULL;
|
109
|
+
}
|
110
|
+
|
111
|
+
static int
|
112
|
+
fiddle_ptr_get_memory_view(VALUE obj, rb_memory_view_t *view, int flags)
|
113
|
+
{
|
114
|
+
struct ptr_data *data = fiddle_ptr_check_memory_view(obj);
|
115
|
+
rb_memory_view_init_as_byte_array(view, obj, data->ptr, data->size, true);
|
116
|
+
|
117
|
+
return 1;
|
118
|
+
}
|
119
|
+
|
120
|
+
static const rb_memory_view_entry_t fiddle_ptr_memory_view_entry = {
|
121
|
+
fiddle_ptr_get_memory_view,
|
122
|
+
NULL,
|
123
|
+
fiddle_ptr_memory_view_available_p
|
124
|
+
};
|
125
|
+
#endif
|
126
|
+
|
90
127
|
static VALUE
|
91
128
|
rb_fiddle_ptr_new2(VALUE klass, void *ptr, long size, freefunc_t func)
|
92
129
|
{
|
@@ -795,6 +832,10 @@ Init_fiddle_pointer(void)
|
|
795
832
|
rb_define_method(rb_cPointer, "size", rb_fiddle_ptr_size_get, 0);
|
796
833
|
rb_define_method(rb_cPointer, "size=", rb_fiddle_ptr_size_set, 1);
|
797
834
|
|
835
|
+
#ifdef FIDDLE_MEMORY_VIEW
|
836
|
+
rb_memory_view_register(rb_cPointer, &fiddle_ptr_memory_view_entry);
|
837
|
+
#endif
|
838
|
+
|
798
839
|
/* Document-const: NULL
|
799
840
|
*
|
800
841
|
* A NULL pointer
|
data/fiddle.gemspec
CHANGED
data/lib/fiddle/cparser.rb
CHANGED
@@ -153,47 +153,85 @@ module Fiddle
|
|
153
153
|
return [parse_ctype(ty[0], tymap), ty[1]]
|
154
154
|
when 'void'
|
155
155
|
return TYPE_VOID
|
156
|
-
when
|
157
|
-
|
158
|
-
return TYPE_LONG_LONG
|
159
|
-
else
|
156
|
+
when /\A(?:(?:signed\s+)?long\s+long(?:\s+int\s+)?|int64_t)(?:\s+\w+)?\z/
|
157
|
+
unless Fiddle.const_defined?(:TYPE_LONG_LONG)
|
160
158
|
raise(RuntimeError, "unsupported type: #{ty}")
|
161
159
|
end
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
else
|
160
|
+
return TYPE_LONG_LONG
|
161
|
+
when /\A(?:unsigned\s+long\s+long(?:\s+int\s+)?|uint64_t)(?:\s+\w+)?\z/
|
162
|
+
unless Fiddle.const_defined?(:TYPE_LONG_LONG)
|
166
163
|
raise(RuntimeError, "unsupported type: #{ty}")
|
167
164
|
end
|
168
|
-
|
165
|
+
return -TYPE_LONG_LONG
|
166
|
+
when /\A(?:signed\s+)?long(?:\s+int\s+)?(?:\s+\w+)?\z/
|
169
167
|
return TYPE_LONG
|
170
|
-
when
|
168
|
+
when /\Aunsigned\s+long(?:\s+int\s+)?(?:\s+\w+)?\z/
|
171
169
|
return -TYPE_LONG
|
172
|
-
when
|
170
|
+
when /\A(?:signed\s+)?int(?:\s+\w+)?\z/
|
173
171
|
return TYPE_INT
|
174
|
-
when
|
172
|
+
when /\A(?:unsigned\s+int|uint)(?:\s+\w+)?\z/
|
175
173
|
return -TYPE_INT
|
176
|
-
when
|
174
|
+
when /\A(?:signed\s+)?short(?:\s+int\s+)?(?:\s+\w+)?\z/
|
177
175
|
return TYPE_SHORT
|
178
|
-
when
|
176
|
+
when /\Aunsigned\s+short(?:\s+int\s+)?(?:\s+\w+)?\z/
|
179
177
|
return -TYPE_SHORT
|
180
|
-
when
|
178
|
+
when /\A(?:signed\s+)?char(?:\s+\w+)?\z/
|
181
179
|
return TYPE_CHAR
|
182
|
-
when
|
180
|
+
when /\Aunsigned\s+char(?:\s+\w+)?\z/
|
183
181
|
return -TYPE_CHAR
|
184
|
-
when
|
182
|
+
when /\Aint8_t(?:\s+\w+)?\z/
|
183
|
+
unless Fiddle.const_defined?(:TYPE_INT8_T)
|
184
|
+
raise(RuntimeError, "unsupported type: #{ty}")
|
185
|
+
end
|
186
|
+
return TYPE_INT8_T
|
187
|
+
when /\Auint8_t(?:\s+\w+)?\z/
|
188
|
+
unless Fiddle.const_defined?(:TYPE_INT8_T)
|
189
|
+
raise(RuntimeError, "unsupported type: #{ty}")
|
190
|
+
end
|
191
|
+
return -TYPE_INT8_T
|
192
|
+
when /\Aint16_t(?:\s+\w+)?\z/
|
193
|
+
unless Fiddle.const_defined?(:TYPE_INT16_T)
|
194
|
+
raise(RuntimeError, "unsupported type: #{ty}")
|
195
|
+
end
|
196
|
+
return TYPE_INT16_T
|
197
|
+
when /\Auint16_t(?:\s+\w+)?\z/
|
198
|
+
unless Fiddle.const_defined?(:TYPE_INT16_T)
|
199
|
+
raise(RuntimeError, "unsupported type: #{ty}")
|
200
|
+
end
|
201
|
+
return -TYPE_INT16_T
|
202
|
+
when /\Aint32_t(?:\s+\w+)?\z/
|
203
|
+
unless Fiddle.const_defined?(:TYPE_INT32_T)
|
204
|
+
raise(RuntimeError, "unsupported type: #{ty}")
|
205
|
+
end
|
206
|
+
return TYPE_INT32_T
|
207
|
+
when /\Auint32_t(?:\s+\w+)?\z/
|
208
|
+
unless Fiddle.const_defined?(:TYPE_INT32_T)
|
209
|
+
raise(RuntimeError, "unsupported type: #{ty}")
|
210
|
+
end
|
211
|
+
return -TYPE_INT32_T
|
212
|
+
when /\Aint64_t(?:\s+\w+)?\z/
|
213
|
+
unless Fiddle.const_defined?(:TYPE_INT64_T)
|
214
|
+
raise(RuntimeError, "unsupported type: #{ty}")
|
215
|
+
end
|
216
|
+
return TYPE_INT64_T
|
217
|
+
when /\Auint64_t(?:\s+\w+)?\z/
|
218
|
+
unless Fiddle.const_defined?(:TYPE_INT64_T)
|
219
|
+
raise(RuntimeError, "unsupported type: #{ty}")
|
220
|
+
end
|
221
|
+
return -TYPE_INT64_T
|
222
|
+
when /\Afloat(?:\s+\w+)?\z/
|
185
223
|
return TYPE_FLOAT
|
186
|
-
when
|
224
|
+
when /\Adouble(?:\s+\w+)?\z/
|
187
225
|
return TYPE_DOUBLE
|
188
|
-
when
|
226
|
+
when /\Asize_t(?:\s+\w+)?\z/
|
189
227
|
return TYPE_SIZE_T
|
190
|
-
when
|
228
|
+
when /\Assize_t(?:\s+\w+)?\z/
|
191
229
|
return TYPE_SSIZE_T
|
192
|
-
when
|
230
|
+
when /\Aptrdiff_t(?:\s+\w+)?\z/
|
193
231
|
return TYPE_PTRDIFF_T
|
194
|
-
when
|
232
|
+
when /\Aintptr_t(?:\s+\w+)?\z/
|
195
233
|
return TYPE_INTPTR_T
|
196
|
-
when
|
234
|
+
when /\Auintptr_t(?:\s+\w+)?\z/
|
197
235
|
return TYPE_UINTPTR_T
|
198
236
|
when /\*/, /\[[\s\d]*\]/
|
199
237
|
return TYPE_VOIDP
|
@@ -213,7 +251,7 @@ module Fiddle
|
|
213
251
|
|
214
252
|
def split_arguments(arguments, sep=',')
|
215
253
|
return [] if arguments.strip == 'void'
|
216
|
-
arguments.scan(/([\w\*\s]+\(\*\w*\)\(.*?\)|[\w\*\s\[\]]+|\.\.\.)(?:#{sep}\s
|
254
|
+
arguments.scan(/([\w\*\s]+\(\*\w*\)\(.*?\)|[\w\*\s\[\]]+|\.\.\.)(?:#{sep}\s*|\z)/).collect {|m| m[0]}
|
217
255
|
end
|
218
256
|
|
219
257
|
def compact(signature)
|
data/lib/fiddle/function.rb
CHANGED
data/lib/fiddle/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fiddle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Patterson
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-
|
12
|
+
date: 2020-12-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -79,6 +79,7 @@ files:
|
|
79
79
|
- ext/fiddle/function.c
|
80
80
|
- ext/fiddle/function.h
|
81
81
|
- ext/fiddle/handle.c
|
82
|
+
- ext/fiddle/memory_view.c
|
82
83
|
- ext/fiddle/pinned.c
|
83
84
|
- ext/fiddle/pointer.c
|
84
85
|
- ext/fiddle/win32/fficonfig.h
|
@@ -117,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
118
|
- !ruby/object:Gem::Version
|
118
119
|
version: '0'
|
119
120
|
requirements: []
|
120
|
-
rubygems_version: 3.
|
121
|
+
rubygems_version: 3.1.4
|
121
122
|
signing_key:
|
122
123
|
specification_version: 4
|
123
124
|
summary: A libffi wrapper for Ruby.
|