fiddle 1.1.1 → 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 +29 -4
- data/ext/fiddle/conversions.c +54 -1
- data/ext/fiddle/conversions.h +2 -0
- data/ext/fiddle/extconf.rb +5 -0
- data/ext/fiddle/fiddle.c +39 -14
- data/ext/fiddle/fiddle.h +16 -2
- data/ext/fiddle/function.c +7 -2
- data/ext/fiddle/handle.c +7 -2
- data/ext/fiddle/pointer.c +42 -8
- data/ext/fiddle/win32/libffi-config.rb +5 -5
- data/lib/fiddle/cparser.rb +21 -7
- data/lib/fiddle/import.rb +2 -0
- data/lib/fiddle/pack.rb +12 -0
- data/lib/fiddle/value.rb +13 -15
- data/lib/fiddle/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 17a63516f0bbb623b730ccaa32e98df18c1b3c447b99027b82125ab788363175
|
4
|
+
data.tar.gz: 6b834175e32765e9a13edfb4f32390b48d8914d5bbe8e0b50b215f409b4ee192
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz: '
|
6
|
+
metadata.gz: 0c0bf76f5288d9241daa1ec0f2dae597a33a428afb893d7cf274cfd6c247c99eb93280f4fe1883b2fbabeb844cae9e272df2209feaba69cd781b689f772fb3f6
|
7
|
+
data.tar.gz: '038a55b29aafc16824c2d0498be0e22851c0f5e97956ee961220cd606dcb55a6615cdaca8ec0481e1fb6e9a4d28ec544ac86e78cf640c0e0cb551e65266b0a7d'
|
data/ext/fiddle/closure.c
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#include <fiddle.h>
|
2
|
+
#include <stdbool.h>
|
2
3
|
#include <ruby/thread.h>
|
3
4
|
|
4
5
|
int ruby_thread_has_gvl_p(void); /* from internal.h */
|
@@ -54,10 +55,13 @@ closure_memsize(const void * ptr)
|
|
54
55
|
}
|
55
56
|
|
56
57
|
const rb_data_type_t closure_data_type = {
|
57
|
-
"fiddle/closure",
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
.wrap_struct_name = "fiddle/closure",
|
59
|
+
.function = {
|
60
|
+
.dmark = 0,
|
61
|
+
.dfree = dealloc,
|
62
|
+
.dsize = closure_memsize
|
63
|
+
},
|
64
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
61
65
|
};
|
62
66
|
|
63
67
|
struct callback_args {
|
@@ -136,6 +140,20 @@ with_gvl_callback(void *ptr)
|
|
136
140
|
rb_ary_push(params,
|
137
141
|
rb_str_new_cstr(*((const char **)(x->args[i]))));
|
138
142
|
break;
|
143
|
+
case TYPE_BOOL:
|
144
|
+
if (sizeof(bool) == sizeof(char)) {
|
145
|
+
rb_ary_push(params, CBOOL2RBBOOL(*(unsigned char *)x->args[i]));
|
146
|
+
} else if (sizeof(bool) == sizeof(short)) {
|
147
|
+
rb_ary_push(params, CBOOL2RBBOOL(*(unsigned short *)x->args[i]));
|
148
|
+
} else if (sizeof(bool) == sizeof(int)) {
|
149
|
+
rb_ary_push(params, CBOOL2RBBOOL(*(unsigned int *)x->args[i]));
|
150
|
+
} else if (sizeof(bool) == sizeof(long)) {
|
151
|
+
rb_ary_push(params, CBOOL2RBBOOL(*(unsigned long *)x->args[i]));
|
152
|
+
} else {
|
153
|
+
rb_raise(rb_eNotImpError, "bool isn't supported: %u",
|
154
|
+
(unsigned int)sizeof(bool));
|
155
|
+
}
|
156
|
+
break;
|
139
157
|
default:
|
140
158
|
rb_raise(rb_eRuntimeError, "closure args: %d", type);
|
141
159
|
}
|
@@ -185,6 +203,13 @@ with_gvl_callback(void *ptr)
|
|
185
203
|
/* Dangerous. Callback must keep reference of the String. */
|
186
204
|
*((const char **)(x->resp)) = StringValueCStr(ret);
|
187
205
|
break;
|
206
|
+
case TYPE_BOOL:
|
207
|
+
if (sizeof(bool) == sizeof(long)) {
|
208
|
+
*(unsigned long *)x->resp = RB_TEST(ret);
|
209
|
+
} else {
|
210
|
+
*(ffi_arg *)x->resp = RB_TEST(ret);
|
211
|
+
}
|
212
|
+
break;
|
188
213
|
default:
|
189
214
|
rb_raise(rb_eRuntimeError, "closure retval: %d", type);
|
190
215
|
}
|
data/ext/fiddle/conversions.c
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
#include <stdbool.h>
|
2
|
+
|
1
3
|
#include <fiddle.h>
|
2
4
|
|
3
5
|
VALUE
|
@@ -44,6 +46,7 @@ rb_fiddle_type_ensure(VALUE type)
|
|
44
46
|
ID ptrdiff_t_id;
|
45
47
|
ID intptr_t_id;
|
46
48
|
ID uintptr_t_id;
|
49
|
+
ID bool_id;
|
47
50
|
RUBY_CONST_ID(void_id, "void");
|
48
51
|
RUBY_CONST_ID(voidp_id, "voidp");
|
49
52
|
RUBY_CONST_ID(char_id, "char");
|
@@ -74,6 +77,7 @@ rb_fiddle_type_ensure(VALUE type)
|
|
74
77
|
RUBY_CONST_ID(ptrdiff_t_id, "ptrdiff_t");
|
75
78
|
RUBY_CONST_ID(intptr_t_id, "intptr_t");
|
76
79
|
RUBY_CONST_ID(uintptr_t_id, "uintptr_t");
|
80
|
+
RUBY_CONST_ID(bool_id, "bool");
|
77
81
|
if (type_id == void_id) {
|
78
82
|
return INT2NUM(TYPE_VOID);
|
79
83
|
}
|
@@ -144,6 +148,9 @@ rb_fiddle_type_ensure(VALUE type)
|
|
144
148
|
else if (type_id == uintptr_t_id) {
|
145
149
|
return INT2NUM(TYPE_UINTPTR_T);
|
146
150
|
}
|
151
|
+
else if (type_id == bool_id) {
|
152
|
+
return INT2NUM(TYPE_BOOL);
|
153
|
+
}
|
147
154
|
else {
|
148
155
|
type = original_type;
|
149
156
|
}
|
@@ -187,6 +194,20 @@ rb_fiddle_int_to_ffi_type(int type)
|
|
187
194
|
return &ffi_type_double;
|
188
195
|
case TYPE_CONST_STRING:
|
189
196
|
return &ffi_type_pointer;
|
197
|
+
case TYPE_BOOL:
|
198
|
+
signed_p = 0;
|
199
|
+
if (sizeof(bool) == sizeof(char)) {
|
200
|
+
return rb_ffi_type_of(char);
|
201
|
+
} else if (sizeof(bool) == sizeof(short)) {
|
202
|
+
return rb_ffi_type_of(short);
|
203
|
+
} else if (sizeof(bool) == sizeof(int)) {
|
204
|
+
return rb_ffi_type_of(int);
|
205
|
+
} else if (sizeof(bool) == sizeof(long)) {
|
206
|
+
return rb_ffi_type_of(long);
|
207
|
+
} else {
|
208
|
+
rb_raise(rb_eNotImpError, "bool isn't supported: %u",
|
209
|
+
(unsigned int)sizeof(bool));
|
210
|
+
}
|
190
211
|
default:
|
191
212
|
rb_raise(rb_eRuntimeError, "unknown type %d", type);
|
192
213
|
}
|
@@ -209,7 +230,11 @@ rb_fiddle_value_to_generic(int type, VALUE *src, fiddle_generic *dst)
|
|
209
230
|
dst->pointer = NUM2PTR(rb_Integer(*src));
|
210
231
|
break;
|
211
232
|
case TYPE_CHAR:
|
212
|
-
|
233
|
+
if (RB_TYPE_P(*src, RUBY_T_STRING) && RSTRING_LEN(*src) == 1) {
|
234
|
+
dst->schar = RSTRING_PTR(*src)[0];
|
235
|
+
} else {
|
236
|
+
dst->schar = (signed char)NUM2INT(*src);
|
237
|
+
}
|
213
238
|
break;
|
214
239
|
case TYPE_UCHAR:
|
215
240
|
dst->uchar = (unsigned char)NUM2UINT(*src);
|
@@ -254,8 +279,23 @@ rb_fiddle_value_to_generic(int type, VALUE *src, fiddle_generic *dst)
|
|
254
279
|
dst->pointer = rb_string_value_cstr(src);
|
255
280
|
}
|
256
281
|
break;
|
282
|
+
case TYPE_BOOL:
|
283
|
+
if (sizeof(bool) == sizeof(char)) {
|
284
|
+
dst->uchar = RB_TEST(*src);
|
285
|
+
} else if (sizeof(bool) == sizeof(short)) {
|
286
|
+
dst->ushort = RB_TEST(*src);
|
287
|
+
} else if (sizeof(bool) == sizeof(int)) {
|
288
|
+
dst->uint = RB_TEST(*src);
|
289
|
+
} else if (sizeof(bool) == sizeof(long)) {
|
290
|
+
dst->ulong = RB_TEST(*src);
|
291
|
+
} else {
|
292
|
+
rb_raise(rb_eNotImpError, "bool isn't supported: %u",
|
293
|
+
(unsigned int)sizeof(bool));
|
294
|
+
}
|
295
|
+
break;
|
257
296
|
default:
|
258
297
|
rb_raise(rb_eRuntimeError, "unknown type %d", type);
|
298
|
+
break;
|
259
299
|
}
|
260
300
|
}
|
261
301
|
|
@@ -314,6 +354,19 @@ rb_fiddle_generic_to_value(VALUE rettype, fiddle_generic retval)
|
|
314
354
|
else {
|
315
355
|
return Qnil;
|
316
356
|
}
|
357
|
+
case TYPE_BOOL:
|
358
|
+
if (sizeof(bool) == sizeof(char)) {
|
359
|
+
return CBOOL2RBBOOL((unsigned char)retval.fffi_arg);
|
360
|
+
} else if (sizeof(bool) == sizeof(short)) {
|
361
|
+
return CBOOL2RBBOOL((unsigned short)retval.fffi_arg);
|
362
|
+
} else if (sizeof(bool) == sizeof(int)) {
|
363
|
+
return CBOOL2RBBOOL((unsigned int)retval.fffi_arg);
|
364
|
+
} else if (sizeof(bool) == sizeof(long)) {
|
365
|
+
return CBOOL2RBBOOL(retval.ulong);
|
366
|
+
} else {
|
367
|
+
rb_raise(rb_eNotImpError, "bool isn't supported: %u",
|
368
|
+
(unsigned int)sizeof(bool));
|
369
|
+
}
|
317
370
|
default:
|
318
371
|
rb_raise(rb_eRuntimeError, "unknown type %d", type);
|
319
372
|
}
|
data/ext/fiddle/conversions.h
CHANGED
data/ext/fiddle/extconf.rb
CHANGED
@@ -63,6 +63,11 @@ unless bundle
|
|
63
63
|
end
|
64
64
|
if have_ffi_header && (have_library('ffi') || have_library('libffi'))
|
65
65
|
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
|
66
71
|
end
|
67
72
|
end
|
68
73
|
|
data/ext/fiddle/fiddle.c
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
#include <stdbool.h>
|
2
|
+
|
1
3
|
#include <fiddle.h>
|
2
4
|
|
3
5
|
VALUE mFiddle;
|
@@ -58,18 +60,16 @@ rb_fiddle_free(VALUE self, VALUE addr)
|
|
58
60
|
/*
|
59
61
|
* call-seq: Fiddle.dlunwrap(addr)
|
60
62
|
*
|
61
|
-
* Returns the
|
63
|
+
* Returns the Ruby object stored at the memory address +addr+
|
62
64
|
*
|
63
65
|
* Example:
|
64
66
|
*
|
65
|
-
*
|
66
|
-
*
|
67
|
-
*
|
68
|
-
*
|
69
|
-
*
|
70
|
-
*
|
71
|
-
* Fiddle.dlunwrap(Fiddle.dlwrap(lib['strcpy'].to_s(16)))
|
72
|
-
* => "7f59de6dd240"
|
67
|
+
* x = Object.new
|
68
|
+
* # => #<Object:0x0000000107c7d870>
|
69
|
+
* Fiddle.dlwrap(x)
|
70
|
+
* # => 4425504880
|
71
|
+
* Fiddle.dlunwrap(_)
|
72
|
+
* # => #<Object:0x0000000107c7d870>
|
73
73
|
*/
|
74
74
|
VALUE
|
75
75
|
rb_fiddle_ptr2value(VALUE self, VALUE addr)
|
@@ -80,15 +80,22 @@ rb_fiddle_ptr2value(VALUE self, VALUE addr)
|
|
80
80
|
/*
|
81
81
|
* call-seq: Fiddle.dlwrap(val)
|
82
82
|
*
|
83
|
-
* Returns
|
83
|
+
* Returns the memory address of the Ruby object stored at +val+
|
84
84
|
*
|
85
85
|
* Example:
|
86
86
|
*
|
87
|
-
*
|
88
|
-
*
|
87
|
+
* x = Object.new
|
88
|
+
* # => #<Object:0x0000000107c7d870>
|
89
|
+
* Fiddle.dlwrap(x)
|
90
|
+
* # => 4425504880
|
91
|
+
*
|
92
|
+
* In the case +val+ is not a heap allocated object, this method will return
|
93
|
+
* the tagged pointer value.
|
89
94
|
*
|
90
|
-
*
|
91
|
-
*
|
95
|
+
* Example:
|
96
|
+
*
|
97
|
+
* Fiddle.dlwrap(123)
|
98
|
+
* # => 247
|
92
99
|
*/
|
93
100
|
static VALUE
|
94
101
|
rb_fiddle_value2ptr(VALUE self, VALUE val)
|
@@ -352,6 +359,12 @@ Init_fiddle(void)
|
|
352
359
|
*/
|
353
360
|
rb_define_const(mFiddleTypes, "UINTPTR_T", INT2NUM(TYPE_UINTPTR_T));
|
354
361
|
|
362
|
+
/* Document-const: Fiddle::Types::BOOL
|
363
|
+
*
|
364
|
+
* C type - bool
|
365
|
+
*/
|
366
|
+
rb_define_const(mFiddleTypes, "BOOL" , INT2NUM(TYPE_BOOL));
|
367
|
+
|
355
368
|
/* Document-const: ALIGN_VOIDP
|
356
369
|
*
|
357
370
|
* The alignment size of a void*
|
@@ -456,6 +469,12 @@ Init_fiddle(void)
|
|
456
469
|
*/
|
457
470
|
rb_define_const(mFiddle, "ALIGN_UINTPTR_T", INT2NUM(ALIGN_OF(uintptr_t)));
|
458
471
|
|
472
|
+
/* Document-const: ALIGN_BOOL
|
473
|
+
*
|
474
|
+
* The alignment size of a bool
|
475
|
+
*/
|
476
|
+
rb_define_const(mFiddle, "ALIGN_BOOL", INT2NUM(ALIGN_OF(bool)));
|
477
|
+
|
459
478
|
/* Document-const: WINDOWS
|
460
479
|
*
|
461
480
|
* Returns a boolean regarding whether the host is WIN32
|
@@ -630,6 +649,12 @@ Init_fiddle(void)
|
|
630
649
|
*/
|
631
650
|
rb_define_const(mFiddle, "SIZEOF_CONST_STRING", INT2NUM(sizeof(const char*)));
|
632
651
|
|
652
|
+
/* Document-const: SIZEOF_BOOL
|
653
|
+
*
|
654
|
+
* size of a bool
|
655
|
+
*/
|
656
|
+
rb_define_const(mFiddle, "SIZEOF_BOOL", INT2NUM(sizeof(bool)));
|
657
|
+
|
633
658
|
/* Document-const: RUBY_FREE
|
634
659
|
*
|
635
660
|
* Address of the ruby_xfree() function
|
data/ext/fiddle/fiddle.h
CHANGED
@@ -118,7 +118,7 @@
|
|
118
118
|
#define TYPE_UINT -TYPE_INT
|
119
119
|
#define TYPE_LONG 5
|
120
120
|
#define TYPE_ULONG -TYPE_LONG
|
121
|
-
#
|
121
|
+
#ifdef HAVE_LONG_LONG
|
122
122
|
#define TYPE_LONG_LONG 6
|
123
123
|
#define TYPE_ULONG_LONG -TYPE_LONG_LONG
|
124
124
|
#endif
|
@@ -126,6 +126,7 @@
|
|
126
126
|
#define TYPE_DOUBLE 8
|
127
127
|
#define TYPE_VARIADIC 9
|
128
128
|
#define TYPE_CONST_STRING 10
|
129
|
+
#define TYPE_BOOL 11
|
129
130
|
|
130
131
|
#define TYPE_INT8_T TYPE_CHAR
|
131
132
|
#define TYPE_UINT8_T -TYPE_INT8_T
|
@@ -196,7 +197,20 @@
|
|
196
197
|
#endif
|
197
198
|
#define TYPE_UINTPTR_T (-TYPE_INTPTR_T)
|
198
199
|
|
199
|
-
|
200
|
+
/* GCC releases before GCC 4.9 had a bug in _Alignof. See GCC bug 52023
|
201
|
+
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>.
|
202
|
+
clang versions < 8.0.0 have the same bug. */
|
203
|
+
#if defined(HAVE__ALIGNOF)
|
204
|
+
# /* Autoconf detected availability of a sane `_Alignof()`. */
|
205
|
+
# define ALIGN_OF(type) RB_GNUC_EXTENSION(_Alignof(type))
|
206
|
+
#elif (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112 \
|
207
|
+
|| (defined(__GNUC__) && __GNUC__ < 4 + (__GNUC_MINOR__ < 9) \
|
208
|
+
&& !defined(__clang__)) \
|
209
|
+
|| (defined(__clang__) && __clang_major__ < 8))
|
210
|
+
# define ALIGN_OF(type) offsetof(struct {char align_c; type align_x;}, align_x)
|
211
|
+
#else
|
212
|
+
# define ALIGN_OF(type) _Alignof(type)
|
213
|
+
#endif
|
200
214
|
|
201
215
|
#define ALIGN_VOIDP ALIGN_OF(void*)
|
202
216
|
#define ALIGN_CHAR ALIGN_OF(char)
|
data/ext/fiddle/function.c
CHANGED
@@ -53,8 +53,13 @@ function_memsize(const void *p)
|
|
53
53
|
}
|
54
54
|
|
55
55
|
const rb_data_type_t function_data_type = {
|
56
|
-
"fiddle/function",
|
57
|
-
|
56
|
+
.wrap_struct_name = "fiddle/function",
|
57
|
+
.function = {
|
58
|
+
.dmark = 0,
|
59
|
+
.dfree = deallocate,
|
60
|
+
.dsize = function_memsize
|
61
|
+
},
|
62
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
58
63
|
};
|
59
64
|
|
60
65
|
static VALUE
|
data/ext/fiddle/handle.c
CHANGED
@@ -50,8 +50,13 @@ fiddle_handle_memsize(const void *ptr)
|
|
50
50
|
}
|
51
51
|
|
52
52
|
static const rb_data_type_t fiddle_handle_data_type = {
|
53
|
-
"fiddle/handle",
|
54
|
-
|
53
|
+
.wrap_struct_name = "fiddle/handle",
|
54
|
+
.function = {
|
55
|
+
.dmark = 0,
|
56
|
+
.dfree = fiddle_handle_free,
|
57
|
+
.dsize = fiddle_handle_memsize
|
58
|
+
},
|
59
|
+
.flags = RUBY_TYPED_WB_PROTECTED,
|
55
60
|
};
|
56
61
|
|
57
62
|
/*
|
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/lib/fiddle/cparser.rb
CHANGED
@@ -165,18 +165,30 @@ module Fiddle
|
|
165
165
|
raise(RuntimeError, "unsupported type: #{ty}")
|
166
166
|
end
|
167
167
|
return TYPE_ULONG_LONG
|
168
|
-
when /\
|
169
|
-
|
170
|
-
|
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/
|
171
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/
|
177
|
+
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
191
|
return TYPE_UINT
|
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_USHORT
|
180
192
|
when /\A(?:signed\s+)?char(?:\s+\w+)?\z/
|
181
193
|
return TYPE_CHAR
|
182
194
|
when /\Aunsigned\s+char(?:\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
@@ -15,6 +15,7 @@ module Fiddle
|
|
15
15
|
TYPE_USHORT => ALIGN_SHORT,
|
16
16
|
TYPE_UINT => ALIGN_INT,
|
17
17
|
TYPE_ULONG => ALIGN_LONG,
|
18
|
+
TYPE_BOOL => ALIGN_BOOL,
|
18
19
|
}
|
19
20
|
|
20
21
|
PACK_MAP = {
|
@@ -30,6 +31,16 @@ module Fiddle
|
|
30
31
|
TYPE_UINT => "I!",
|
31
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,
|
@@ -43,6 +54,7 @@ module Fiddle
|
|
43
54
|
TYPE_USHORT => SIZEOF_SHORT,
|
44
55
|
TYPE_UINT => SIZEOF_INT,
|
45
56
|
TYPE_ULONG => SIZEOF_LONG,
|
57
|
+
TYPE_BOOL => SIZEOF_BOOL,
|
46
58
|
}
|
47
59
|
if defined?(TYPE_LONG_LONG)
|
48
60
|
ALIGN_MAP[TYPE_LONG_LONG] = ALIGN_MAP[TYPE_ULONG_LONG] = ALIGN_LONG_LONG
|
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
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.1.
|
4
|
+
version: 1.1.2
|
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:
|
12
|
+
date: 2023-11-08 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A libffi wrapper for Ruby.
|
15
15
|
email:
|
@@ -73,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: '0'
|
75
75
|
requirements: []
|
76
|
-
rubygems_version: 3.
|
76
|
+
rubygems_version: 3.5.0.dev
|
77
77
|
signing_key:
|
78
78
|
specification_version: 4
|
79
79
|
summary: A libffi wrapper for Ruby.
|