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/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.
|
94
|
+
*
|
95
|
+
* Example:
|
89
96
|
*
|
90
|
-
*
|
91
|
-
*
|
97
|
+
* Fiddle.dlwrap(123)
|
98
|
+
* # => 247
|
92
99
|
*/
|
93
100
|
static VALUE
|
94
101
|
rb_fiddle_value2ptr(VALUE self, VALUE val)
|
@@ -164,137 +171,199 @@ Init_fiddle(void)
|
|
164
171
|
*/
|
165
172
|
rb_eFiddleDLError = rb_define_class_under(mFiddle, "DLError", rb_eFiddleError);
|
166
173
|
|
167
|
-
|
174
|
+
VALUE mFiddleTypes = rb_define_module_under(mFiddle, "Types");
|
175
|
+
|
176
|
+
/* Document-const: Fiddle::Types::VOID
|
168
177
|
*
|
169
178
|
* C type - void
|
170
179
|
*/
|
171
|
-
rb_define_const(
|
180
|
+
rb_define_const(mFiddleTypes, "VOID", INT2NUM(TYPE_VOID));
|
172
181
|
|
173
|
-
/* Document-const:
|
182
|
+
/* Document-const: Fiddle::Types::VOIDP
|
174
183
|
*
|
175
184
|
* C type - void*
|
176
185
|
*/
|
177
|
-
rb_define_const(
|
186
|
+
rb_define_const(mFiddleTypes, "VOIDP", INT2NUM(TYPE_VOIDP));
|
178
187
|
|
179
|
-
/* Document-const:
|
188
|
+
/* Document-const: Fiddle::Types::CHAR
|
180
189
|
*
|
181
190
|
* C type - char
|
182
191
|
*/
|
183
|
-
rb_define_const(
|
192
|
+
rb_define_const(mFiddleTypes, "CHAR", INT2NUM(TYPE_CHAR));
|
184
193
|
|
185
|
-
/* Document-const:
|
194
|
+
/* Document-const: Fiddle::Types::UCHAR
|
195
|
+
*
|
196
|
+
* C type - unsigned char
|
197
|
+
*/
|
198
|
+
rb_define_const(mFiddleTypes, "UCHAR", INT2NUM(TYPE_UCHAR));
|
199
|
+
|
200
|
+
/* Document-const: Fiddle::Types::SHORT
|
186
201
|
*
|
187
202
|
* C type - short
|
188
203
|
*/
|
189
|
-
rb_define_const(
|
204
|
+
rb_define_const(mFiddleTypes, "SHORT", INT2NUM(TYPE_SHORT));
|
190
205
|
|
191
|
-
/* Document-const:
|
206
|
+
/* Document-const: Fiddle::Types::USHORT
|
207
|
+
*
|
208
|
+
* C type - unsigned short
|
209
|
+
*/
|
210
|
+
rb_define_const(mFiddleTypes, "USHORT", INT2NUM(TYPE_USHORT));
|
211
|
+
|
212
|
+
/* Document-const: Fiddle::Types::INT
|
192
213
|
*
|
193
214
|
* C type - int
|
194
215
|
*/
|
195
|
-
rb_define_const(
|
216
|
+
rb_define_const(mFiddleTypes, "INT", INT2NUM(TYPE_INT));
|
217
|
+
|
218
|
+
/* Document-const: Fiddle::Types::UINT
|
219
|
+
*
|
220
|
+
* C type - unsigned int
|
221
|
+
*/
|
222
|
+
rb_define_const(mFiddleTypes, "UINT", INT2NUM(TYPE_UINT));
|
196
223
|
|
197
|
-
/* Document-const:
|
224
|
+
/* Document-const: Fiddle::Types::LONG
|
198
225
|
*
|
199
226
|
* C type - long
|
200
227
|
*/
|
201
|
-
rb_define_const(
|
228
|
+
rb_define_const(mFiddleTypes, "LONG", INT2NUM(TYPE_LONG));
|
229
|
+
|
230
|
+
/* Document-const: Fiddle::Types::ULONG
|
231
|
+
*
|
232
|
+
* C type - long
|
233
|
+
*/
|
234
|
+
rb_define_const(mFiddleTypes, "ULONG", INT2NUM(TYPE_ULONG));
|
202
235
|
|
203
236
|
#if HAVE_LONG_LONG
|
204
|
-
/* Document-const:
|
237
|
+
/* Document-const: Fiddle::Types::LONG_LONG
|
238
|
+
*
|
239
|
+
* C type - long long
|
240
|
+
*/
|
241
|
+
rb_define_const(mFiddleTypes, "LONG_LONG", INT2NUM(TYPE_LONG_LONG));
|
242
|
+
|
243
|
+
/* Document-const: Fiddle::Types::ULONG_LONG
|
205
244
|
*
|
206
245
|
* C type - long long
|
207
246
|
*/
|
208
|
-
rb_define_const(
|
247
|
+
rb_define_const(mFiddleTypes, "ULONG_LONG", INT2NUM(TYPE_ULONG_LONG));
|
209
248
|
#endif
|
210
249
|
|
211
250
|
#ifdef TYPE_INT8_T
|
212
|
-
/* Document-const:
|
251
|
+
/* Document-const: Fiddle::Types::INT8_T
|
213
252
|
*
|
214
253
|
* C type - int8_t
|
215
254
|
*/
|
216
|
-
rb_define_const(
|
255
|
+
rb_define_const(mFiddleTypes, "INT8_T", INT2NUM(TYPE_INT8_T));
|
256
|
+
|
257
|
+
/* Document-const: Fiddle::Types::UINT8_T
|
258
|
+
*
|
259
|
+
* C type - uint8_t
|
260
|
+
*/
|
261
|
+
rb_define_const(mFiddleTypes, "UINT8_T", INT2NUM(TYPE_UINT8_T));
|
217
262
|
#endif
|
218
263
|
|
219
264
|
#ifdef TYPE_INT16_T
|
220
|
-
/* Document-const:
|
265
|
+
/* Document-const: Fiddle::Types::INT16_T
|
221
266
|
*
|
222
267
|
* C type - int16_t
|
223
268
|
*/
|
224
|
-
rb_define_const(
|
269
|
+
rb_define_const(mFiddleTypes, "INT16_T", INT2NUM(TYPE_INT16_T));
|
270
|
+
|
271
|
+
/* Document-const: Fiddle::Types::UINT16_T
|
272
|
+
*
|
273
|
+
* C type - uint16_t
|
274
|
+
*/
|
275
|
+
rb_define_const(mFiddleTypes, "UINT16_T", INT2NUM(TYPE_UINT16_T));
|
225
276
|
#endif
|
226
277
|
|
227
278
|
#ifdef TYPE_INT32_T
|
228
|
-
/* Document-const:
|
279
|
+
/* Document-const: Fiddle::Types::INT32_T
|
229
280
|
*
|
230
281
|
* C type - int32_t
|
231
282
|
*/
|
232
|
-
rb_define_const(
|
283
|
+
rb_define_const(mFiddleTypes, "INT32_T", INT2NUM(TYPE_INT32_T));
|
284
|
+
|
285
|
+
/* Document-const: Fiddle::Types::UINT32_T
|
286
|
+
*
|
287
|
+
* C type - uint32_t
|
288
|
+
*/
|
289
|
+
rb_define_const(mFiddleTypes, "UINT32_T", INT2NUM(TYPE_UINT32_T));
|
233
290
|
#endif
|
234
291
|
|
235
292
|
#ifdef TYPE_INT64_T
|
236
|
-
/* Document-const:
|
293
|
+
/* Document-const: Fiddle::Types::INT64_T
|
237
294
|
*
|
238
295
|
* C type - int64_t
|
239
296
|
*/
|
240
|
-
rb_define_const(
|
297
|
+
rb_define_const(mFiddleTypes, "INT64_T", INT2NUM(TYPE_INT64_T));
|
298
|
+
|
299
|
+
/* Document-const: Fiddle::Types::UINT64_T
|
300
|
+
*
|
301
|
+
* C type - uint64_t
|
302
|
+
*/
|
303
|
+
rb_define_const(mFiddleTypes, "UINT64_T", INT2NUM(TYPE_UINT64_T));
|
241
304
|
#endif
|
242
305
|
|
243
|
-
/* Document-const:
|
306
|
+
/* Document-const: Fiddle::Types::FLOAT
|
244
307
|
*
|
245
308
|
* C type - float
|
246
309
|
*/
|
247
|
-
rb_define_const(
|
310
|
+
rb_define_const(mFiddleTypes, "FLOAT", INT2NUM(TYPE_FLOAT));
|
248
311
|
|
249
|
-
/* Document-const:
|
312
|
+
/* Document-const: Fiddle::Types::DOUBLE
|
250
313
|
*
|
251
314
|
* C type - double
|
252
315
|
*/
|
253
|
-
rb_define_const(
|
316
|
+
rb_define_const(mFiddleTypes, "DOUBLE", INT2NUM(TYPE_DOUBLE));
|
254
317
|
|
255
318
|
#ifdef HAVE_FFI_PREP_CIF_VAR
|
256
|
-
/* Document-const:
|
319
|
+
/* Document-const: Fiddle::Types::VARIADIC
|
257
320
|
*
|
258
321
|
* C type - ...
|
259
322
|
*/
|
260
|
-
rb_define_const(
|
323
|
+
rb_define_const(mFiddleTypes, "VARIADIC", INT2NUM(TYPE_VARIADIC));
|
261
324
|
#endif
|
262
325
|
|
263
|
-
/* Document-const:
|
326
|
+
/* Document-const: Fiddle::Types::CONST_STRING
|
264
327
|
*
|
265
328
|
* C type - const char* ('\0' terminated const char*)
|
266
329
|
*/
|
267
|
-
rb_define_const(
|
330
|
+
rb_define_const(mFiddleTypes, "CONST_STRING", INT2NUM(TYPE_CONST_STRING));
|
268
331
|
|
269
|
-
/* Document-const:
|
332
|
+
/* Document-const: Fiddle::Types::SIZE_T
|
270
333
|
*
|
271
334
|
* C type - size_t
|
272
335
|
*/
|
273
|
-
rb_define_const(
|
336
|
+
rb_define_const(mFiddleTypes, "SIZE_T", INT2NUM(TYPE_SIZE_T));
|
274
337
|
|
275
|
-
/* Document-const:
|
338
|
+
/* Document-const: Fiddle::Types::SSIZE_T
|
276
339
|
*
|
277
340
|
* C type - ssize_t
|
278
341
|
*/
|
279
|
-
rb_define_const(
|
342
|
+
rb_define_const(mFiddleTypes, "SSIZE_T", INT2NUM(TYPE_SSIZE_T));
|
280
343
|
|
281
|
-
/* Document-const:
|
344
|
+
/* Document-const: Fiddle::Types::PTRDIFF_T
|
282
345
|
*
|
283
346
|
* C type - ptrdiff_t
|
284
347
|
*/
|
285
|
-
rb_define_const(
|
348
|
+
rb_define_const(mFiddleTypes, "PTRDIFF_T", INT2NUM(TYPE_PTRDIFF_T));
|
286
349
|
|
287
|
-
/* Document-const:
|
350
|
+
/* Document-const: Fiddle::Types::INTPTR_T
|
288
351
|
*
|
289
352
|
* C type - intptr_t
|
290
353
|
*/
|
291
|
-
rb_define_const(
|
354
|
+
rb_define_const(mFiddleTypes, "INTPTR_T", INT2NUM(TYPE_INTPTR_T));
|
292
355
|
|
293
|
-
/* Document-const:
|
356
|
+
/* Document-const: Fiddle::Types::UINTPTR_T
|
294
357
|
*
|
295
358
|
* C type - uintptr_t
|
296
359
|
*/
|
297
|
-
rb_define_const(
|
360
|
+
rb_define_const(mFiddleTypes, "UINTPTR_T", INT2NUM(TYPE_UINTPTR_T));
|
361
|
+
|
362
|
+
/* Document-const: Fiddle::Types::BOOL
|
363
|
+
*
|
364
|
+
* C type - bool
|
365
|
+
*/
|
366
|
+
rb_define_const(mFiddleTypes, "BOOL" , INT2NUM(TYPE_BOOL));
|
298
367
|
|
299
368
|
/* Document-const: ALIGN_VOIDP
|
300
369
|
*
|
@@ -400,6 +469,12 @@ Init_fiddle(void)
|
|
400
469
|
*/
|
401
470
|
rb_define_const(mFiddle, "ALIGN_UINTPTR_T", INT2NUM(ALIGN_OF(uintptr_t)));
|
402
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
|
+
|
403
478
|
/* Document-const: WINDOWS
|
404
479
|
*
|
405
480
|
* Returns a boolean regarding whether the host is WIN32
|
@@ -422,30 +497,60 @@ Init_fiddle(void)
|
|
422
497
|
*/
|
423
498
|
rb_define_const(mFiddle, "SIZEOF_CHAR", INT2NUM(sizeof(char)));
|
424
499
|
|
500
|
+
/* Document-const: SIZEOF_UCHAR
|
501
|
+
*
|
502
|
+
* size of a unsigned char
|
503
|
+
*/
|
504
|
+
rb_define_const(mFiddle, "SIZEOF_UCHAR", INT2NUM(sizeof(unsigned char)));
|
505
|
+
|
425
506
|
/* Document-const: SIZEOF_SHORT
|
426
507
|
*
|
427
508
|
* size of a short
|
428
509
|
*/
|
429
510
|
rb_define_const(mFiddle, "SIZEOF_SHORT", INT2NUM(sizeof(short)));
|
430
511
|
|
512
|
+
/* Document-const: SIZEOF_USHORT
|
513
|
+
*
|
514
|
+
* size of a unsigned short
|
515
|
+
*/
|
516
|
+
rb_define_const(mFiddle, "SIZEOF_USHORT", INT2NUM(sizeof(unsigned short)));
|
517
|
+
|
431
518
|
/* Document-const: SIZEOF_INT
|
432
519
|
*
|
433
520
|
* size of an int
|
434
521
|
*/
|
435
522
|
rb_define_const(mFiddle, "SIZEOF_INT", INT2NUM(sizeof(int)));
|
436
523
|
|
524
|
+
/* Document-const: SIZEOF_UINT
|
525
|
+
*
|
526
|
+
* size of an unsigned int
|
527
|
+
*/
|
528
|
+
rb_define_const(mFiddle, "SIZEOF_UINT", INT2NUM(sizeof(unsigned int)));
|
529
|
+
|
437
530
|
/* Document-const: SIZEOF_LONG
|
438
531
|
*
|
439
532
|
* size of a long
|
440
533
|
*/
|
441
534
|
rb_define_const(mFiddle, "SIZEOF_LONG", INT2NUM(sizeof(long)));
|
442
535
|
|
536
|
+
/* Document-const: SIZEOF_ULONG
|
537
|
+
*
|
538
|
+
* size of a unsigned long
|
539
|
+
*/
|
540
|
+
rb_define_const(mFiddle, "SIZEOF_ULONG", INT2NUM(sizeof(unsigned long)));
|
541
|
+
|
443
542
|
#if HAVE_LONG_LONG
|
444
543
|
/* Document-const: SIZEOF_LONG_LONG
|
445
544
|
*
|
446
545
|
* size of a long long
|
447
546
|
*/
|
448
547
|
rb_define_const(mFiddle, "SIZEOF_LONG_LONG", INT2NUM(sizeof(LONG_LONG)));
|
548
|
+
|
549
|
+
/* Document-const: SIZEOF_ULONG_LONG
|
550
|
+
*
|
551
|
+
* size of a unsigned long long
|
552
|
+
*/
|
553
|
+
rb_define_const(mFiddle, "SIZEOF_ULONG_LONG", INT2NUM(sizeof(unsigned LONG_LONG)));
|
449
554
|
#endif
|
450
555
|
|
451
556
|
/* Document-const: SIZEOF_INT8_T
|
@@ -454,24 +559,48 @@ Init_fiddle(void)
|
|
454
559
|
*/
|
455
560
|
rb_define_const(mFiddle, "SIZEOF_INT8_T", INT2NUM(sizeof(int8_t)));
|
456
561
|
|
562
|
+
/* Document-const: SIZEOF_UINT8_T
|
563
|
+
*
|
564
|
+
* size of a uint8_t
|
565
|
+
*/
|
566
|
+
rb_define_const(mFiddle, "SIZEOF_UINT8_T", INT2NUM(sizeof(uint8_t)));
|
567
|
+
|
457
568
|
/* Document-const: SIZEOF_INT16_T
|
458
569
|
*
|
459
570
|
* size of a int16_t
|
460
571
|
*/
|
461
572
|
rb_define_const(mFiddle, "SIZEOF_INT16_T", INT2NUM(sizeof(int16_t)));
|
462
573
|
|
574
|
+
/* Document-const: SIZEOF_UINT16_T
|
575
|
+
*
|
576
|
+
* size of a uint16_t
|
577
|
+
*/
|
578
|
+
rb_define_const(mFiddle, "SIZEOF_UINT16_T", INT2NUM(sizeof(uint16_t)));
|
579
|
+
|
463
580
|
/* Document-const: SIZEOF_INT32_T
|
464
581
|
*
|
465
582
|
* size of a int32_t
|
466
583
|
*/
|
467
584
|
rb_define_const(mFiddle, "SIZEOF_INT32_T", INT2NUM(sizeof(int32_t)));
|
468
585
|
|
586
|
+
/* Document-const: SIZEOF_UINT32_T
|
587
|
+
*
|
588
|
+
* size of a uint32_t
|
589
|
+
*/
|
590
|
+
rb_define_const(mFiddle, "SIZEOF_UINT32_T", INT2NUM(sizeof(uint32_t)));
|
591
|
+
|
469
592
|
/* Document-const: SIZEOF_INT64_T
|
470
593
|
*
|
471
594
|
* size of a int64_t
|
472
595
|
*/
|
473
596
|
rb_define_const(mFiddle, "SIZEOF_INT64_T", INT2NUM(sizeof(int64_t)));
|
474
597
|
|
598
|
+
/* Document-const: SIZEOF_UINT64_T
|
599
|
+
*
|
600
|
+
* size of a uint64_t
|
601
|
+
*/
|
602
|
+
rb_define_const(mFiddle, "SIZEOF_UINT64_T", INT2NUM(sizeof(uint64_t)));
|
603
|
+
|
475
604
|
/* Document-const: SIZEOF_FLOAT
|
476
605
|
*
|
477
606
|
* size of a float
|
@@ -520,6 +649,12 @@ Init_fiddle(void)
|
|
520
649
|
*/
|
521
650
|
rb_define_const(mFiddle, "SIZEOF_CONST_STRING", INT2NUM(sizeof(const char*)));
|
522
651
|
|
652
|
+
/* Document-const: SIZEOF_BOOL
|
653
|
+
*
|
654
|
+
* size of a bool
|
655
|
+
*/
|
656
|
+
rb_define_const(mFiddle, "SIZEOF_BOOL", INT2NUM(sizeof(bool)));
|
657
|
+
|
523
658
|
/* Document-const: RUBY_FREE
|
524
659
|
*
|
525
660
|
* Address of the ruby_xfree() function
|
@@ -540,6 +675,30 @@ Init_fiddle(void)
|
|
540
675
|
rb_define_module_function(mFiddle, "realloc", rb_fiddle_realloc, 2);
|
541
676
|
rb_define_module_function(mFiddle, "free", rb_fiddle_free, 1);
|
542
677
|
|
678
|
+
/* Document-const: Qtrue
|
679
|
+
*
|
680
|
+
* The value of Qtrue
|
681
|
+
*/
|
682
|
+
rb_define_const(mFiddle, "Qtrue", INT2NUM(Qtrue));
|
683
|
+
|
684
|
+
/* Document-const: Qfalse
|
685
|
+
*
|
686
|
+
* The value of Qfalse
|
687
|
+
*/
|
688
|
+
rb_define_const(mFiddle, "Qfalse", INT2NUM(Qfalse));
|
689
|
+
|
690
|
+
/* Document-const: Qnil
|
691
|
+
*
|
692
|
+
* The value of Qnil
|
693
|
+
*/
|
694
|
+
rb_define_const(mFiddle, "Qnil", INT2NUM(Qnil));
|
695
|
+
|
696
|
+
/* Document-const: Qundef
|
697
|
+
*
|
698
|
+
* The value of Qundef
|
699
|
+
*/
|
700
|
+
rb_define_const(mFiddle, "Qundef", INT2NUM(Qundef));
|
701
|
+
|
543
702
|
Init_fiddle_function();
|
544
703
|
Init_fiddle_closure();
|
545
704
|
Init_fiddle_handle();
|
data/ext/fiddle/fiddle.h
CHANGED
@@ -111,23 +111,36 @@
|
|
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
|
117
|
-
#
|
120
|
+
#define TYPE_ULONG -TYPE_LONG
|
121
|
+
#ifdef 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
|
122
127
|
#define TYPE_VARIADIC 9
|
123
128
|
#define TYPE_CONST_STRING 10
|
129
|
+
#define TYPE_BOOL 11
|
124
130
|
|
125
131
|
#define TYPE_INT8_T TYPE_CHAR
|
132
|
+
#define TYPE_UINT8_T -TYPE_INT8_T
|
133
|
+
|
126
134
|
#if SIZEOF_SHORT == 2
|
127
135
|
# define TYPE_INT16_T TYPE_SHORT
|
128
136
|
#elif SIZEOF_INT == 2
|
129
137
|
# define TYPE_INT16_T TYPE_INT
|
130
138
|
#endif
|
139
|
+
|
140
|
+
#ifdef TYPE_INT16_T
|
141
|
+
# define TYPE_UINT16_T -TYPE_INT16_T
|
142
|
+
#endif
|
143
|
+
|
131
144
|
#if SIZEOF_SHORT == 4
|
132
145
|
# define TYPE_INT32_T TYPE_SHORT
|
133
146
|
#elif SIZEOF_INT == 4
|
@@ -135,6 +148,11 @@
|
|
135
148
|
#elif SIZEOF_LONG == 4
|
136
149
|
# define TYPE_INT32_T TYPE_LONG
|
137
150
|
#endif
|
151
|
+
|
152
|
+
#ifdef TYPE_INT32_T
|
153
|
+
#define TYPE_UINT32_T -TYPE_INT32_T
|
154
|
+
#endif
|
155
|
+
|
138
156
|
#if SIZEOF_INT == 8
|
139
157
|
# define TYPE_INT64_T TYPE_INT
|
140
158
|
#elif SIZEOF_LONG == 8
|
@@ -143,6 +161,10 @@
|
|
143
161
|
# define TYPE_INT64_T TYPE_LONG_LONG
|
144
162
|
#endif
|
145
163
|
|
164
|
+
#ifdef TYPE_INT64_T
|
165
|
+
#define TYPE_UINT64_T -TYPE_INT64_T
|
166
|
+
#endif
|
167
|
+
|
146
168
|
#ifndef TYPE_SSIZE_T
|
147
169
|
# if SIZEOF_SIZE_T == SIZEOF_INT
|
148
170
|
# define TYPE_SSIZE_T TYPE_INT
|
@@ -175,7 +197,20 @@
|
|
175
197
|
#endif
|
176
198
|
#define TYPE_UINTPTR_T (-TYPE_INTPTR_T)
|
177
199
|
|
178
|
-
|
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
|
179
214
|
|
180
215
|
#define ALIGN_VOIDP ALIGN_OF(void*)
|
181
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
|
/*
|
@@ -321,8 +326,10 @@ rb_fiddle_handle_s_sym(VALUE self, VALUE sym)
|
|
321
326
|
return fiddle_handle_sym(RTLD_NEXT, sym);
|
322
327
|
}
|
323
328
|
|
324
|
-
|
325
|
-
|
329
|
+
typedef void (*fiddle_void_func)(void);
|
330
|
+
|
331
|
+
static fiddle_void_func
|
332
|
+
fiddle_handle_find_func(void *handle, VALUE symbol)
|
326
333
|
{
|
327
334
|
#if defined(HAVE_DLERROR)
|
328
335
|
const char *err;
|
@@ -330,13 +337,13 @@ fiddle_handle_sym(void *handle, VALUE symbol)
|
|
330
337
|
#else
|
331
338
|
# define CHECK_DLERROR
|
332
339
|
#endif
|
333
|
-
|
340
|
+
fiddle_void_func func;
|
334
341
|
const char *name = StringValueCStr(symbol);
|
335
342
|
|
336
343
|
#ifdef HAVE_DLERROR
|
337
344
|
dlerror();
|
338
345
|
#endif
|
339
|
-
func = (
|
346
|
+
func = (fiddle_void_func)(VALUE)dlsym(handle, name);
|
340
347
|
CHECK_DLERROR;
|
341
348
|
#if defined(FUNC_STDCALL)
|
342
349
|
if( !func ){
|
@@ -379,6 +386,53 @@ fiddle_handle_sym(void *handle, VALUE symbol)
|
|
379
386
|
xfree(name_n);
|
380
387
|
}
|
381
388
|
#endif
|
389
|
+
|
390
|
+
return func;
|
391
|
+
}
|
392
|
+
|
393
|
+
static VALUE
|
394
|
+
rb_fiddle_handle_s_sym_defined(VALUE self, VALUE sym)
|
395
|
+
{
|
396
|
+
fiddle_void_func func;
|
397
|
+
|
398
|
+
func = fiddle_handle_find_func(RTLD_NEXT, sym);
|
399
|
+
|
400
|
+
if( func ) {
|
401
|
+
return PTR2NUM(func);
|
402
|
+
}
|
403
|
+
else {
|
404
|
+
return Qnil;
|
405
|
+
}
|
406
|
+
}
|
407
|
+
|
408
|
+
static VALUE
|
409
|
+
rb_fiddle_handle_sym_defined(VALUE self, VALUE sym)
|
410
|
+
{
|
411
|
+
struct dl_handle *fiddle_handle;
|
412
|
+
fiddle_void_func func;
|
413
|
+
|
414
|
+
TypedData_Get_Struct(self, struct dl_handle, &fiddle_handle_data_type, fiddle_handle);
|
415
|
+
if( ! fiddle_handle->open ){
|
416
|
+
rb_raise(rb_eFiddleDLError, "closed handle");
|
417
|
+
}
|
418
|
+
|
419
|
+
func = fiddle_handle_find_func(fiddle_handle->ptr, sym);
|
420
|
+
|
421
|
+
if( func ) {
|
422
|
+
return PTR2NUM(func);
|
423
|
+
}
|
424
|
+
else {
|
425
|
+
return Qnil;
|
426
|
+
}
|
427
|
+
}
|
428
|
+
|
429
|
+
static VALUE
|
430
|
+
fiddle_handle_sym(void *handle, VALUE symbol)
|
431
|
+
{
|
432
|
+
fiddle_void_func func;
|
433
|
+
|
434
|
+
func = fiddle_handle_find_func(handle, symbol);
|
435
|
+
|
382
436
|
if( !func ){
|
383
437
|
rb_raise(rb_eFiddleDLError, "unknown symbol \"%"PRIsVALUE"\"", symbol);
|
384
438
|
}
|
@@ -468,6 +522,7 @@ Init_fiddle_handle(void)
|
|
468
522
|
rb_cHandle = rb_define_class_under(mFiddle, "Handle", rb_cObject);
|
469
523
|
rb_define_alloc_func(rb_cHandle, rb_fiddle_handle_s_allocate);
|
470
524
|
rb_define_singleton_method(rb_cHandle, "sym", rb_fiddle_handle_s_sym, 1);
|
525
|
+
rb_define_singleton_method(rb_cHandle, "sym_defined?", rb_fiddle_handle_s_sym_defined, 1);
|
471
526
|
rb_define_singleton_method(rb_cHandle, "[]", rb_fiddle_handle_s_sym, 1);
|
472
527
|
|
473
528
|
/* Document-const: NEXT
|
@@ -526,6 +581,7 @@ Init_fiddle_handle(void)
|
|
526
581
|
rb_define_method(rb_cHandle, "close", rb_fiddle_handle_close, 0);
|
527
582
|
rb_define_method(rb_cHandle, "sym", rb_fiddle_handle_sym, 1);
|
528
583
|
rb_define_method(rb_cHandle, "[]", rb_fiddle_handle_sym, 1);
|
584
|
+
rb_define_method(rb_cHandle, "sym_defined?", rb_fiddle_handle_sym_defined, 1);
|
529
585
|
rb_define_method(rb_cHandle, "file_name", rb_fiddle_handle_file_name, 0);
|
530
586
|
rb_define_method(rb_cHandle, "disable_close", rb_fiddle_handle_disable_close, 0);
|
531
587
|
rb_define_method(rb_cHandle, "enable_close", rb_fiddle_handle_enable_close, 0);
|