fiddle 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/fiddle/closure.c +104 -31
- data/ext/fiddle/conversions.c +10 -10
- data/ext/fiddle/extconf.rb +6 -22
- data/ext/fiddle/fiddle.c +174 -40
- data/ext/fiddle/fiddle.h +21 -0
- data/ext/fiddle/handle.c +55 -4
- data/fiddle.gemspec +0 -3
- data/lib/fiddle/closure.rb +25 -0
- data/lib/fiddle/cparser.rb +9 -9
- data/lib/fiddle/pack.rb +18 -17
- 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/fiddle.c
CHANGED
@@ -164,137 +164,193 @@ Init_fiddle(void)
|
|
164
164
|
*/
|
165
165
|
rb_eFiddleDLError = rb_define_class_under(mFiddle, "DLError", rb_eFiddleError);
|
166
166
|
|
167
|
-
|
167
|
+
VALUE mFiddleTypes = rb_define_module_under(mFiddle, "Types");
|
168
|
+
|
169
|
+
/* Document-const: Fiddle::Types::VOID
|
168
170
|
*
|
169
171
|
* C type - void
|
170
172
|
*/
|
171
|
-
rb_define_const(
|
173
|
+
rb_define_const(mFiddleTypes, "VOID", INT2NUM(TYPE_VOID));
|
172
174
|
|
173
|
-
/* Document-const:
|
175
|
+
/* Document-const: Fiddle::Types::VOIDP
|
174
176
|
*
|
175
177
|
* C type - void*
|
176
178
|
*/
|
177
|
-
rb_define_const(
|
179
|
+
rb_define_const(mFiddleTypes, "VOIDP", INT2NUM(TYPE_VOIDP));
|
178
180
|
|
179
|
-
/* Document-const:
|
181
|
+
/* Document-const: Fiddle::Types::CHAR
|
180
182
|
*
|
181
183
|
* C type - char
|
182
184
|
*/
|
183
|
-
rb_define_const(
|
185
|
+
rb_define_const(mFiddleTypes, "CHAR", INT2NUM(TYPE_CHAR));
|
184
186
|
|
185
|
-
/* Document-const:
|
187
|
+
/* Document-const: Fiddle::Types::UCHAR
|
188
|
+
*
|
189
|
+
* C type - unsigned char
|
190
|
+
*/
|
191
|
+
rb_define_const(mFiddleTypes, "UCHAR", INT2NUM(TYPE_UCHAR));
|
192
|
+
|
193
|
+
/* Document-const: Fiddle::Types::SHORT
|
186
194
|
*
|
187
195
|
* C type - short
|
188
196
|
*/
|
189
|
-
rb_define_const(
|
197
|
+
rb_define_const(mFiddleTypes, "SHORT", INT2NUM(TYPE_SHORT));
|
190
198
|
|
191
|
-
/* Document-const:
|
199
|
+
/* Document-const: Fiddle::Types::USHORT
|
200
|
+
*
|
201
|
+
* C type - unsigned short
|
202
|
+
*/
|
203
|
+
rb_define_const(mFiddleTypes, "USHORT", INT2NUM(TYPE_USHORT));
|
204
|
+
|
205
|
+
/* Document-const: Fiddle::Types::INT
|
192
206
|
*
|
193
207
|
* C type - int
|
194
208
|
*/
|
195
|
-
rb_define_const(
|
209
|
+
rb_define_const(mFiddleTypes, "INT", INT2NUM(TYPE_INT));
|
210
|
+
|
211
|
+
/* Document-const: Fiddle::Types::UINT
|
212
|
+
*
|
213
|
+
* C type - unsigned int
|
214
|
+
*/
|
215
|
+
rb_define_const(mFiddleTypes, "UINT", INT2NUM(TYPE_UINT));
|
216
|
+
|
217
|
+
/* Document-const: Fiddle::Types::LONG
|
218
|
+
*
|
219
|
+
* C type - long
|
220
|
+
*/
|
221
|
+
rb_define_const(mFiddleTypes, "LONG", INT2NUM(TYPE_LONG));
|
196
222
|
|
197
|
-
/* Document-const:
|
223
|
+
/* Document-const: Fiddle::Types::ULONG
|
198
224
|
*
|
199
225
|
* C type - long
|
200
226
|
*/
|
201
|
-
rb_define_const(
|
227
|
+
rb_define_const(mFiddleTypes, "ULONG", INT2NUM(TYPE_ULONG));
|
202
228
|
|
203
229
|
#if HAVE_LONG_LONG
|
204
|
-
/* Document-const:
|
230
|
+
/* Document-const: Fiddle::Types::LONG_LONG
|
231
|
+
*
|
232
|
+
* C type - long long
|
233
|
+
*/
|
234
|
+
rb_define_const(mFiddleTypes, "LONG_LONG", INT2NUM(TYPE_LONG_LONG));
|
235
|
+
|
236
|
+
/* Document-const: Fiddle::Types::ULONG_LONG
|
205
237
|
*
|
206
238
|
* C type - long long
|
207
239
|
*/
|
208
|
-
rb_define_const(
|
240
|
+
rb_define_const(mFiddleTypes, "ULONG_LONG", INT2NUM(TYPE_ULONG_LONG));
|
209
241
|
#endif
|
210
242
|
|
211
243
|
#ifdef TYPE_INT8_T
|
212
|
-
/* Document-const:
|
244
|
+
/* Document-const: Fiddle::Types::INT8_T
|
213
245
|
*
|
214
246
|
* C type - int8_t
|
215
247
|
*/
|
216
|
-
rb_define_const(
|
248
|
+
rb_define_const(mFiddleTypes, "INT8_T", INT2NUM(TYPE_INT8_T));
|
249
|
+
|
250
|
+
/* Document-const: Fiddle::Types::UINT8_T
|
251
|
+
*
|
252
|
+
* C type - uint8_t
|
253
|
+
*/
|
254
|
+
rb_define_const(mFiddleTypes, "UINT8_T", INT2NUM(TYPE_UINT8_T));
|
217
255
|
#endif
|
218
256
|
|
219
257
|
#ifdef TYPE_INT16_T
|
220
|
-
/* Document-const:
|
258
|
+
/* Document-const: Fiddle::Types::INT16_T
|
221
259
|
*
|
222
260
|
* C type - int16_t
|
223
261
|
*/
|
224
|
-
rb_define_const(
|
262
|
+
rb_define_const(mFiddleTypes, "INT16_T", INT2NUM(TYPE_INT16_T));
|
263
|
+
|
264
|
+
/* Document-const: Fiddle::Types::UINT16_T
|
265
|
+
*
|
266
|
+
* C type - uint16_t
|
267
|
+
*/
|
268
|
+
rb_define_const(mFiddleTypes, "UINT16_T", INT2NUM(TYPE_UINT16_T));
|
225
269
|
#endif
|
226
270
|
|
227
271
|
#ifdef TYPE_INT32_T
|
228
|
-
/* Document-const:
|
272
|
+
/* Document-const: Fiddle::Types::INT32_T
|
229
273
|
*
|
230
274
|
* C type - int32_t
|
231
275
|
*/
|
232
|
-
rb_define_const(
|
276
|
+
rb_define_const(mFiddleTypes, "INT32_T", INT2NUM(TYPE_INT32_T));
|
277
|
+
|
278
|
+
/* Document-const: Fiddle::Types::UINT32_T
|
279
|
+
*
|
280
|
+
* C type - uint32_t
|
281
|
+
*/
|
282
|
+
rb_define_const(mFiddleTypes, "UINT32_T", INT2NUM(TYPE_UINT32_T));
|
233
283
|
#endif
|
234
284
|
|
235
285
|
#ifdef TYPE_INT64_T
|
236
|
-
/* Document-const:
|
286
|
+
/* Document-const: Fiddle::Types::INT64_T
|
237
287
|
*
|
238
288
|
* C type - int64_t
|
239
289
|
*/
|
240
|
-
rb_define_const(
|
290
|
+
rb_define_const(mFiddleTypes, "INT64_T", INT2NUM(TYPE_INT64_T));
|
291
|
+
|
292
|
+
/* Document-const: Fiddle::Types::UINT64_T
|
293
|
+
*
|
294
|
+
* C type - uint64_t
|
295
|
+
*/
|
296
|
+
rb_define_const(mFiddleTypes, "UINT64_T", INT2NUM(TYPE_UINT64_T));
|
241
297
|
#endif
|
242
298
|
|
243
|
-
/* Document-const:
|
299
|
+
/* Document-const: Fiddle::Types::FLOAT
|
244
300
|
*
|
245
301
|
* C type - float
|
246
302
|
*/
|
247
|
-
rb_define_const(
|
303
|
+
rb_define_const(mFiddleTypes, "FLOAT", INT2NUM(TYPE_FLOAT));
|
248
304
|
|
249
|
-
/* Document-const:
|
305
|
+
/* Document-const: Fiddle::Types::DOUBLE
|
250
306
|
*
|
251
307
|
* C type - double
|
252
308
|
*/
|
253
|
-
rb_define_const(
|
309
|
+
rb_define_const(mFiddleTypes, "DOUBLE", INT2NUM(TYPE_DOUBLE));
|
254
310
|
|
255
311
|
#ifdef HAVE_FFI_PREP_CIF_VAR
|
256
|
-
/* Document-const:
|
312
|
+
/* Document-const: Fiddle::Types::VARIADIC
|
257
313
|
*
|
258
314
|
* C type - ...
|
259
315
|
*/
|
260
|
-
rb_define_const(
|
316
|
+
rb_define_const(mFiddleTypes, "VARIADIC", INT2NUM(TYPE_VARIADIC));
|
261
317
|
#endif
|
262
318
|
|
263
|
-
/* Document-const:
|
319
|
+
/* Document-const: Fiddle::Types::CONST_STRING
|
264
320
|
*
|
265
321
|
* C type - const char* ('\0' terminated const char*)
|
266
322
|
*/
|
267
|
-
rb_define_const(
|
323
|
+
rb_define_const(mFiddleTypes, "CONST_STRING", INT2NUM(TYPE_CONST_STRING));
|
268
324
|
|
269
|
-
/* Document-const:
|
325
|
+
/* Document-const: Fiddle::Types::SIZE_T
|
270
326
|
*
|
271
327
|
* C type - size_t
|
272
328
|
*/
|
273
|
-
rb_define_const(
|
329
|
+
rb_define_const(mFiddleTypes, "SIZE_T", INT2NUM(TYPE_SIZE_T));
|
274
330
|
|
275
|
-
/* Document-const:
|
331
|
+
/* Document-const: Fiddle::Types::SSIZE_T
|
276
332
|
*
|
277
333
|
* C type - ssize_t
|
278
334
|
*/
|
279
|
-
rb_define_const(
|
335
|
+
rb_define_const(mFiddleTypes, "SSIZE_T", INT2NUM(TYPE_SSIZE_T));
|
280
336
|
|
281
|
-
/* Document-const:
|
337
|
+
/* Document-const: Fiddle::Types::PTRDIFF_T
|
282
338
|
*
|
283
339
|
* C type - ptrdiff_t
|
284
340
|
*/
|
285
|
-
rb_define_const(
|
341
|
+
rb_define_const(mFiddleTypes, "PTRDIFF_T", INT2NUM(TYPE_PTRDIFF_T));
|
286
342
|
|
287
|
-
/* Document-const:
|
343
|
+
/* Document-const: Fiddle::Types::INTPTR_T
|
288
344
|
*
|
289
345
|
* C type - intptr_t
|
290
346
|
*/
|
291
|
-
rb_define_const(
|
347
|
+
rb_define_const(mFiddleTypes, "INTPTR_T", INT2NUM(TYPE_INTPTR_T));
|
292
348
|
|
293
|
-
/* Document-const:
|
349
|
+
/* Document-const: Fiddle::Types::UINTPTR_T
|
294
350
|
*
|
295
351
|
* C type - uintptr_t
|
296
352
|
*/
|
297
|
-
rb_define_const(
|
353
|
+
rb_define_const(mFiddleTypes, "UINTPTR_T", INT2NUM(TYPE_UINTPTR_T));
|
298
354
|
|
299
355
|
/* Document-const: ALIGN_VOIDP
|
300
356
|
*
|
@@ -422,30 +478,60 @@ Init_fiddle(void)
|
|
422
478
|
*/
|
423
479
|
rb_define_const(mFiddle, "SIZEOF_CHAR", INT2NUM(sizeof(char)));
|
424
480
|
|
481
|
+
/* Document-const: SIZEOF_UCHAR
|
482
|
+
*
|
483
|
+
* size of a unsigned char
|
484
|
+
*/
|
485
|
+
rb_define_const(mFiddle, "SIZEOF_UCHAR", INT2NUM(sizeof(unsigned char)));
|
486
|
+
|
425
487
|
/* Document-const: SIZEOF_SHORT
|
426
488
|
*
|
427
489
|
* size of a short
|
428
490
|
*/
|
429
491
|
rb_define_const(mFiddle, "SIZEOF_SHORT", INT2NUM(sizeof(short)));
|
430
492
|
|
493
|
+
/* Document-const: SIZEOF_USHORT
|
494
|
+
*
|
495
|
+
* size of a unsigned short
|
496
|
+
*/
|
497
|
+
rb_define_const(mFiddle, "SIZEOF_USHORT", INT2NUM(sizeof(unsigned short)));
|
498
|
+
|
431
499
|
/* Document-const: SIZEOF_INT
|
432
500
|
*
|
433
501
|
* size of an int
|
434
502
|
*/
|
435
503
|
rb_define_const(mFiddle, "SIZEOF_INT", INT2NUM(sizeof(int)));
|
436
504
|
|
505
|
+
/* Document-const: SIZEOF_UINT
|
506
|
+
*
|
507
|
+
* size of an unsigned int
|
508
|
+
*/
|
509
|
+
rb_define_const(mFiddle, "SIZEOF_UINT", INT2NUM(sizeof(unsigned int)));
|
510
|
+
|
437
511
|
/* Document-const: SIZEOF_LONG
|
438
512
|
*
|
439
513
|
* size of a long
|
440
514
|
*/
|
441
515
|
rb_define_const(mFiddle, "SIZEOF_LONG", INT2NUM(sizeof(long)));
|
442
516
|
|
517
|
+
/* Document-const: SIZEOF_ULONG
|
518
|
+
*
|
519
|
+
* size of a unsigned long
|
520
|
+
*/
|
521
|
+
rb_define_const(mFiddle, "SIZEOF_ULONG", INT2NUM(sizeof(unsigned long)));
|
522
|
+
|
443
523
|
#if HAVE_LONG_LONG
|
444
524
|
/* Document-const: SIZEOF_LONG_LONG
|
445
525
|
*
|
446
526
|
* size of a long long
|
447
527
|
*/
|
448
528
|
rb_define_const(mFiddle, "SIZEOF_LONG_LONG", INT2NUM(sizeof(LONG_LONG)));
|
529
|
+
|
530
|
+
/* Document-const: SIZEOF_ULONG_LONG
|
531
|
+
*
|
532
|
+
* size of a unsigned long long
|
533
|
+
*/
|
534
|
+
rb_define_const(mFiddle, "SIZEOF_ULONG_LONG", INT2NUM(sizeof(unsigned LONG_LONG)));
|
449
535
|
#endif
|
450
536
|
|
451
537
|
/* Document-const: SIZEOF_INT8_T
|
@@ -454,24 +540,48 @@ Init_fiddle(void)
|
|
454
540
|
*/
|
455
541
|
rb_define_const(mFiddle, "SIZEOF_INT8_T", INT2NUM(sizeof(int8_t)));
|
456
542
|
|
543
|
+
/* Document-const: SIZEOF_UINT8_T
|
544
|
+
*
|
545
|
+
* size of a uint8_t
|
546
|
+
*/
|
547
|
+
rb_define_const(mFiddle, "SIZEOF_UINT8_T", INT2NUM(sizeof(uint8_t)));
|
548
|
+
|
457
549
|
/* Document-const: SIZEOF_INT16_T
|
458
550
|
*
|
459
551
|
* size of a int16_t
|
460
552
|
*/
|
461
553
|
rb_define_const(mFiddle, "SIZEOF_INT16_T", INT2NUM(sizeof(int16_t)));
|
462
554
|
|
555
|
+
/* Document-const: SIZEOF_UINT16_T
|
556
|
+
*
|
557
|
+
* size of a uint16_t
|
558
|
+
*/
|
559
|
+
rb_define_const(mFiddle, "SIZEOF_UINT16_T", INT2NUM(sizeof(uint16_t)));
|
560
|
+
|
463
561
|
/* Document-const: SIZEOF_INT32_T
|
464
562
|
*
|
465
563
|
* size of a int32_t
|
466
564
|
*/
|
467
565
|
rb_define_const(mFiddle, "SIZEOF_INT32_T", INT2NUM(sizeof(int32_t)));
|
468
566
|
|
567
|
+
/* Document-const: SIZEOF_UINT32_T
|
568
|
+
*
|
569
|
+
* size of a uint32_t
|
570
|
+
*/
|
571
|
+
rb_define_const(mFiddle, "SIZEOF_UINT32_T", INT2NUM(sizeof(uint32_t)));
|
572
|
+
|
469
573
|
/* Document-const: SIZEOF_INT64_T
|
470
574
|
*
|
471
575
|
* size of a int64_t
|
472
576
|
*/
|
473
577
|
rb_define_const(mFiddle, "SIZEOF_INT64_T", INT2NUM(sizeof(int64_t)));
|
474
578
|
|
579
|
+
/* Document-const: SIZEOF_UINT64_T
|
580
|
+
*
|
581
|
+
* size of a uint64_t
|
582
|
+
*/
|
583
|
+
rb_define_const(mFiddle, "SIZEOF_UINT64_T", INT2NUM(sizeof(uint64_t)));
|
584
|
+
|
475
585
|
/* Document-const: SIZEOF_FLOAT
|
476
586
|
*
|
477
587
|
* size of a float
|
@@ -540,6 +650,30 @@ Init_fiddle(void)
|
|
540
650
|
rb_define_module_function(mFiddle, "realloc", rb_fiddle_realloc, 2);
|
541
651
|
rb_define_module_function(mFiddle, "free", rb_fiddle_free, 1);
|
542
652
|
|
653
|
+
/* Document-const: Qtrue
|
654
|
+
*
|
655
|
+
* The value of Qtrue
|
656
|
+
*/
|
657
|
+
rb_define_const(mFiddle, "Qtrue", INT2NUM(Qtrue));
|
658
|
+
|
659
|
+
/* Document-const: Qfalse
|
660
|
+
*
|
661
|
+
* The value of Qfalse
|
662
|
+
*/
|
663
|
+
rb_define_const(mFiddle, "Qfalse", INT2NUM(Qfalse));
|
664
|
+
|
665
|
+
/* Document-const: Qnil
|
666
|
+
*
|
667
|
+
* The value of Qnil
|
668
|
+
*/
|
669
|
+
rb_define_const(mFiddle, "Qnil", INT2NUM(Qnil));
|
670
|
+
|
671
|
+
/* Document-const: Qundef
|
672
|
+
*
|
673
|
+
* The value of Qundef
|
674
|
+
*/
|
675
|
+
rb_define_const(mFiddle, "Qundef", INT2NUM(Qundef));
|
676
|
+
|
543
677
|
Init_fiddle_function();
|
544
678
|
Init_fiddle_closure();
|
545
679
|
Init_fiddle_handle();
|
data/ext/fiddle/fiddle.h
CHANGED
@@ -111,11 +111,16 @@
|
|
111
111
|
#define TYPE_VOID 0
|
112
112
|
#define TYPE_VOIDP 1
|
113
113
|
#define TYPE_CHAR 2
|
114
|
+
#define TYPE_UCHAR -TYPE_CHAR
|
114
115
|
#define TYPE_SHORT 3
|
116
|
+
#define TYPE_USHORT -TYPE_SHORT
|
115
117
|
#define TYPE_INT 4
|
118
|
+
#define TYPE_UINT -TYPE_INT
|
116
119
|
#define TYPE_LONG 5
|
120
|
+
#define TYPE_ULONG -TYPE_LONG
|
117
121
|
#if HAVE_LONG_LONG
|
118
122
|
#define TYPE_LONG_LONG 6
|
123
|
+
#define TYPE_ULONG_LONG -TYPE_LONG_LONG
|
119
124
|
#endif
|
120
125
|
#define TYPE_FLOAT 7
|
121
126
|
#define TYPE_DOUBLE 8
|
@@ -123,11 +128,18 @@
|
|
123
128
|
#define TYPE_CONST_STRING 10
|
124
129
|
|
125
130
|
#define TYPE_INT8_T TYPE_CHAR
|
131
|
+
#define TYPE_UINT8_T -TYPE_INT8_T
|
132
|
+
|
126
133
|
#if SIZEOF_SHORT == 2
|
127
134
|
# define TYPE_INT16_T TYPE_SHORT
|
128
135
|
#elif SIZEOF_INT == 2
|
129
136
|
# define TYPE_INT16_T TYPE_INT
|
130
137
|
#endif
|
138
|
+
|
139
|
+
#ifdef TYPE_INT16_T
|
140
|
+
# define TYPE_UINT16_T -TYPE_INT16_T
|
141
|
+
#endif
|
142
|
+
|
131
143
|
#if SIZEOF_SHORT == 4
|
132
144
|
# define TYPE_INT32_T TYPE_SHORT
|
133
145
|
#elif SIZEOF_INT == 4
|
@@ -135,6 +147,11 @@
|
|
135
147
|
#elif SIZEOF_LONG == 4
|
136
148
|
# define TYPE_INT32_T TYPE_LONG
|
137
149
|
#endif
|
150
|
+
|
151
|
+
#ifdef TYPE_INT32_T
|
152
|
+
#define TYPE_UINT32_T -TYPE_INT32_T
|
153
|
+
#endif
|
154
|
+
|
138
155
|
#if SIZEOF_INT == 8
|
139
156
|
# define TYPE_INT64_T TYPE_INT
|
140
157
|
#elif SIZEOF_LONG == 8
|
@@ -143,6 +160,10 @@
|
|
143
160
|
# define TYPE_INT64_T TYPE_LONG_LONG
|
144
161
|
#endif
|
145
162
|
|
163
|
+
#ifdef TYPE_INT64_T
|
164
|
+
#define TYPE_UINT64_T -TYPE_INT64_T
|
165
|
+
#endif
|
166
|
+
|
146
167
|
#ifndef TYPE_SSIZE_T
|
147
168
|
# if SIZEOF_SIZE_T == SIZEOF_INT
|
148
169
|
# define TYPE_SSIZE_T TYPE_INT
|
data/ext/fiddle/handle.c
CHANGED
@@ -321,8 +321,10 @@ rb_fiddle_handle_s_sym(VALUE self, VALUE sym)
|
|
321
321
|
return fiddle_handle_sym(RTLD_NEXT, sym);
|
322
322
|
}
|
323
323
|
|
324
|
-
|
325
|
-
|
324
|
+
typedef void (*fiddle_void_func)(void);
|
325
|
+
|
326
|
+
static fiddle_void_func
|
327
|
+
fiddle_handle_find_func(void *handle, VALUE symbol)
|
326
328
|
{
|
327
329
|
#if defined(HAVE_DLERROR)
|
328
330
|
const char *err;
|
@@ -330,13 +332,13 @@ fiddle_handle_sym(void *handle, VALUE symbol)
|
|
330
332
|
#else
|
331
333
|
# define CHECK_DLERROR
|
332
334
|
#endif
|
333
|
-
|
335
|
+
fiddle_void_func func;
|
334
336
|
const char *name = StringValueCStr(symbol);
|
335
337
|
|
336
338
|
#ifdef HAVE_DLERROR
|
337
339
|
dlerror();
|
338
340
|
#endif
|
339
|
-
func = (
|
341
|
+
func = (fiddle_void_func)(VALUE)dlsym(handle, name);
|
340
342
|
CHECK_DLERROR;
|
341
343
|
#if defined(FUNC_STDCALL)
|
342
344
|
if( !func ){
|
@@ -379,6 +381,53 @@ fiddle_handle_sym(void *handle, VALUE symbol)
|
|
379
381
|
xfree(name_n);
|
380
382
|
}
|
381
383
|
#endif
|
384
|
+
|
385
|
+
return func;
|
386
|
+
}
|
387
|
+
|
388
|
+
static VALUE
|
389
|
+
rb_fiddle_handle_s_sym_defined(VALUE self, VALUE sym)
|
390
|
+
{
|
391
|
+
fiddle_void_func func;
|
392
|
+
|
393
|
+
func = fiddle_handle_find_func(RTLD_NEXT, sym);
|
394
|
+
|
395
|
+
if( func ) {
|
396
|
+
return PTR2NUM(func);
|
397
|
+
}
|
398
|
+
else {
|
399
|
+
return Qnil;
|
400
|
+
}
|
401
|
+
}
|
402
|
+
|
403
|
+
static VALUE
|
404
|
+
rb_fiddle_handle_sym_defined(VALUE self, VALUE sym)
|
405
|
+
{
|
406
|
+
struct dl_handle *fiddle_handle;
|
407
|
+
fiddle_void_func func;
|
408
|
+
|
409
|
+
TypedData_Get_Struct(self, struct dl_handle, &fiddle_handle_data_type, fiddle_handle);
|
410
|
+
if( ! fiddle_handle->open ){
|
411
|
+
rb_raise(rb_eFiddleDLError, "closed handle");
|
412
|
+
}
|
413
|
+
|
414
|
+
func = fiddle_handle_find_func(fiddle_handle->ptr, sym);
|
415
|
+
|
416
|
+
if( func ) {
|
417
|
+
return PTR2NUM(func);
|
418
|
+
}
|
419
|
+
else {
|
420
|
+
return Qnil;
|
421
|
+
}
|
422
|
+
}
|
423
|
+
|
424
|
+
static VALUE
|
425
|
+
fiddle_handle_sym(void *handle, VALUE symbol)
|
426
|
+
{
|
427
|
+
fiddle_void_func func;
|
428
|
+
|
429
|
+
func = fiddle_handle_find_func(handle, symbol);
|
430
|
+
|
382
431
|
if( !func ){
|
383
432
|
rb_raise(rb_eFiddleDLError, "unknown symbol \"%"PRIsVALUE"\"", symbol);
|
384
433
|
}
|
@@ -468,6 +517,7 @@ Init_fiddle_handle(void)
|
|
468
517
|
rb_cHandle = rb_define_class_under(mFiddle, "Handle", rb_cObject);
|
469
518
|
rb_define_alloc_func(rb_cHandle, rb_fiddle_handle_s_allocate);
|
470
519
|
rb_define_singleton_method(rb_cHandle, "sym", rb_fiddle_handle_s_sym, 1);
|
520
|
+
rb_define_singleton_method(rb_cHandle, "sym_defined?", rb_fiddle_handle_s_sym_defined, 1);
|
471
521
|
rb_define_singleton_method(rb_cHandle, "[]", rb_fiddle_handle_s_sym, 1);
|
472
522
|
|
473
523
|
/* Document-const: NEXT
|
@@ -526,6 +576,7 @@ Init_fiddle_handle(void)
|
|
526
576
|
rb_define_method(rb_cHandle, "close", rb_fiddle_handle_close, 0);
|
527
577
|
rb_define_method(rb_cHandle, "sym", rb_fiddle_handle_sym, 1);
|
528
578
|
rb_define_method(rb_cHandle, "[]", rb_fiddle_handle_sym, 1);
|
579
|
+
rb_define_method(rb_cHandle, "sym_defined?", rb_fiddle_handle_sym_defined, 1);
|
529
580
|
rb_define_method(rb_cHandle, "file_name", rb_fiddle_handle_file_name, 0);
|
530
581
|
rb_define_method(rb_cHandle, "disable_close", rb_fiddle_handle_disable_close, 0);
|
531
582
|
rb_define_method(rb_cHandle, "enable_close", rb_fiddle_handle_enable_close, 0);
|
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,23 @@ module Fiddle
|
|
164
164
|
unless Fiddle.const_defined?(:TYPE_LONG_LONG)
|
165
165
|
raise(RuntimeError, "unsupported type: #{ty}")
|
166
166
|
end
|
167
|
-
return
|
167
|
+
return TYPE_ULONG_LONG
|
168
168
|
when /\A(?:signed\s+)?long(?:\s+int\s+)?(?:\s+\w+)?\z/
|
169
169
|
return TYPE_LONG
|
170
170
|
when /\Aunsigned\s+long(?:\s+int\s+)?(?:\s+\w+)?\z/
|
171
|
-
return
|
171
|
+
return TYPE_ULONG
|
172
172
|
when /\A(?:signed\s+)?int(?:\s+\w+)?\z/
|
173
173
|
return TYPE_INT
|
174
174
|
when /\A(?:unsigned\s+int|uint)(?:\s+\w+)?\z/
|
175
|
-
return
|
175
|
+
return TYPE_UINT
|
176
176
|
when /\A(?:signed\s+)?short(?:\s+int\s+)?(?:\s+\w+)?\z/
|
177
177
|
return TYPE_SHORT
|
178
178
|
when /\Aunsigned\s+short(?:\s+int\s+)?(?:\s+\w+)?\z/
|
179
|
-
return
|
179
|
+
return TYPE_USHORT
|
180
180
|
when /\A(?:signed\s+)?char(?:\s+\w+)?\z/
|
181
181
|
return TYPE_CHAR
|
182
182
|
when /\Aunsigned\s+char(?:\s+\w+)?\z/
|
183
|
-
return
|
183
|
+
return TYPE_UCHAR
|
184
184
|
when /\Aint8_t(?:\s+\w+)?\z/
|
185
185
|
unless Fiddle.const_defined?(:TYPE_INT8_T)
|
186
186
|
raise(RuntimeError, "unsupported type: #{ty}")
|
@@ -190,7 +190,7 @@ module Fiddle
|
|
190
190
|
unless Fiddle.const_defined?(:TYPE_INT8_T)
|
191
191
|
raise(RuntimeError, "unsupported type: #{ty}")
|
192
192
|
end
|
193
|
-
return
|
193
|
+
return TYPE_UINT8_T
|
194
194
|
when /\Aint16_t(?:\s+\w+)?\z/
|
195
195
|
unless Fiddle.const_defined?(:TYPE_INT16_T)
|
196
196
|
raise(RuntimeError, "unsupported type: #{ty}")
|
@@ -200,7 +200,7 @@ module Fiddle
|
|
200
200
|
unless Fiddle.const_defined?(:TYPE_INT16_T)
|
201
201
|
raise(RuntimeError, "unsupported type: #{ty}")
|
202
202
|
end
|
203
|
-
return
|
203
|
+
return TYPE_UINT16_T
|
204
204
|
when /\Aint32_t(?:\s+\w+)?\z/
|
205
205
|
unless Fiddle.const_defined?(:TYPE_INT32_T)
|
206
206
|
raise(RuntimeError, "unsupported type: #{ty}")
|
@@ -210,7 +210,7 @@ module Fiddle
|
|
210
210
|
unless Fiddle.const_defined?(:TYPE_INT32_T)
|
211
211
|
raise(RuntimeError, "unsupported type: #{ty}")
|
212
212
|
end
|
213
|
-
return
|
213
|
+
return TYPE_UINT32_T
|
214
214
|
when /\Aint64_t(?:\s+\w+)?\z/
|
215
215
|
unless Fiddle.const_defined?(:TYPE_INT64_T)
|
216
216
|
raise(RuntimeError, "unsupported type: #{ty}")
|
@@ -220,7 +220,7 @@ module Fiddle
|
|
220
220
|
unless Fiddle.const_defined?(:TYPE_INT64_T)
|
221
221
|
raise(RuntimeError, "unsupported type: #{ty}")
|
222
222
|
end
|
223
|
-
return
|
223
|
+
return TYPE_UINT64_T
|
224
224
|
when /\Afloat(?:\s+\w+)?\z/
|
225
225
|
return TYPE_FLOAT
|
226
226
|
when /\Adouble(?:\s+\w+)?\z/
|