fiddle 1.0.9 → 1.1.1
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/README.md +1 -1
- data/Rakefile +12 -0
- data/ext/fiddle/closure.c +104 -31
- data/ext/fiddle/conversions.c +10 -10
- data/ext/fiddle/extconf.rb +10 -27
- data/ext/fiddle/fiddle.c +176 -42
- data/ext/fiddle/fiddle.h +28 -4
- data/ext/fiddle/handle.c +114 -5
- data/ext/fiddle/memory_view.c +6 -8
- data/ext/fiddle/pointer.c +17 -9
- data/fiddle.gemspec +1 -8
- data/lib/fiddle/closure.rb +25 -0
- data/lib/fiddle/cparser.rb +9 -9
- data/lib/fiddle/pack.rb +18 -17
- data/lib/fiddle/struct.rb +71 -0
- data/lib/fiddle/version.rb +1 -1
- data/lib/fiddle.rb +34 -1
- metadata +8 -53
- data/bin/downloader.rb +0 -331
- data/bin/extlibs.rb +0 -262
- data/ext/fiddle/extlibs +0 -13
data/ext/fiddle/fiddle.c
CHANGED
@@ -7,7 +7,7 @@ VALUE rb_eFiddleError;
|
|
7
7
|
void Init_fiddle_pointer(void);
|
8
8
|
void Init_fiddle_pinned(void);
|
9
9
|
|
10
|
-
#ifdef
|
10
|
+
#ifdef HAVE_RUBY_MEMORY_VIEW_H
|
11
11
|
void Init_fiddle_memory_view(void);
|
12
12
|
#endif
|
13
13
|
|
@@ -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,13 +650,37 @@ 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();
|
546
680
|
Init_fiddle_pointer();
|
547
681
|
Init_fiddle_pinned();
|
548
682
|
|
549
|
-
#ifdef
|
683
|
+
#ifdef HAVE_RUBY_MEMORY_VIEW_H
|
550
684
|
Init_fiddle_memory_view();
|
551
685
|
#endif
|
552
686
|
}
|
data/ext/fiddle/fiddle.h
CHANGED
@@ -12,6 +12,10 @@
|
|
12
12
|
#include <sys/mman.h>
|
13
13
|
#endif
|
14
14
|
|
15
|
+
#if defined(HAVE_LINK_H)
|
16
|
+
# include <link.h>
|
17
|
+
#endif
|
18
|
+
|
15
19
|
#if defined(HAVE_DLFCN_H)
|
16
20
|
# include <dlfcn.h>
|
17
21
|
# /* some stranger systems may not define all of these */
|
@@ -107,11 +111,16 @@
|
|
107
111
|
#define TYPE_VOID 0
|
108
112
|
#define TYPE_VOIDP 1
|
109
113
|
#define TYPE_CHAR 2
|
114
|
+
#define TYPE_UCHAR -TYPE_CHAR
|
110
115
|
#define TYPE_SHORT 3
|
116
|
+
#define TYPE_USHORT -TYPE_SHORT
|
111
117
|
#define TYPE_INT 4
|
118
|
+
#define TYPE_UINT -TYPE_INT
|
112
119
|
#define TYPE_LONG 5
|
120
|
+
#define TYPE_ULONG -TYPE_LONG
|
113
121
|
#if HAVE_LONG_LONG
|
114
122
|
#define TYPE_LONG_LONG 6
|
123
|
+
#define TYPE_ULONG_LONG -TYPE_LONG_LONG
|
115
124
|
#endif
|
116
125
|
#define TYPE_FLOAT 7
|
117
126
|
#define TYPE_DOUBLE 8
|
@@ -119,11 +128,18 @@
|
|
119
128
|
#define TYPE_CONST_STRING 10
|
120
129
|
|
121
130
|
#define TYPE_INT8_T TYPE_CHAR
|
131
|
+
#define TYPE_UINT8_T -TYPE_INT8_T
|
132
|
+
|
122
133
|
#if SIZEOF_SHORT == 2
|
123
134
|
# define TYPE_INT16_T TYPE_SHORT
|
124
135
|
#elif SIZEOF_INT == 2
|
125
136
|
# define TYPE_INT16_T TYPE_INT
|
126
137
|
#endif
|
138
|
+
|
139
|
+
#ifdef TYPE_INT16_T
|
140
|
+
# define TYPE_UINT16_T -TYPE_INT16_T
|
141
|
+
#endif
|
142
|
+
|
127
143
|
#if SIZEOF_SHORT == 4
|
128
144
|
# define TYPE_INT32_T TYPE_SHORT
|
129
145
|
#elif SIZEOF_INT == 4
|
@@ -131,6 +147,11 @@
|
|
131
147
|
#elif SIZEOF_LONG == 4
|
132
148
|
# define TYPE_INT32_T TYPE_LONG
|
133
149
|
#endif
|
150
|
+
|
151
|
+
#ifdef TYPE_INT32_T
|
152
|
+
#define TYPE_UINT32_T -TYPE_INT32_T
|
153
|
+
#endif
|
154
|
+
|
134
155
|
#if SIZEOF_INT == 8
|
135
156
|
# define TYPE_INT64_T TYPE_INT
|
136
157
|
#elif SIZEOF_LONG == 8
|
@@ -139,6 +160,10 @@
|
|
139
160
|
# define TYPE_INT64_T TYPE_LONG_LONG
|
140
161
|
#endif
|
141
162
|
|
163
|
+
#ifdef TYPE_INT64_T
|
164
|
+
#define TYPE_UINT64_T -TYPE_INT64_T
|
165
|
+
#endif
|
166
|
+
|
142
167
|
#ifndef TYPE_SSIZE_T
|
143
168
|
# if SIZEOF_SIZE_T == SIZEOF_INT
|
144
169
|
# define TYPE_SSIZE_T TYPE_INT
|
@@ -189,14 +214,13 @@
|
|
189
214
|
#define ALIGN_INT32_T ALIGN_OF(int32_t)
|
190
215
|
#define ALIGN_INT64_T ALIGN_OF(int64_t)
|
191
216
|
|
192
|
-
#ifdef HAVE_TYPE_RB_MEMORY_VIEW_T
|
193
|
-
# define FIDDLE_MEMORY_VIEW
|
194
|
-
#endif
|
195
|
-
|
196
217
|
extern VALUE mFiddle;
|
197
218
|
extern VALUE rb_eFiddleDLError;
|
198
219
|
|
199
220
|
VALUE rb_fiddle_new_function(VALUE address, VALUE arg_types, VALUE ret_type);
|
200
221
|
|
222
|
+
typedef void (*rb_fiddle_freefunc_t)(void*);
|
223
|
+
VALUE rb_fiddle_ptr_new_wrap(void *ptr, long size, rb_fiddle_freefunc_t func, VALUE wrap0, VALUE wrap1);
|
224
|
+
|
201
225
|
#endif
|
202
226
|
/* vim: set noet sws=4 sw=4: */
|
data/ext/fiddle/handle.c
CHANGED
@@ -259,7 +259,21 @@ rb_fiddle_handle_to_i(VALUE self)
|
|
259
259
|
struct dl_handle *fiddle_handle;
|
260
260
|
|
261
261
|
TypedData_Get_Struct(self, struct dl_handle, &fiddle_handle_data_type, fiddle_handle);
|
262
|
-
return PTR2NUM(fiddle_handle);
|
262
|
+
return PTR2NUM(fiddle_handle->ptr);
|
263
|
+
}
|
264
|
+
|
265
|
+
/*
|
266
|
+
* call-seq: to_ptr
|
267
|
+
*
|
268
|
+
* Returns the Fiddle::Pointer of this handle.
|
269
|
+
*/
|
270
|
+
static VALUE
|
271
|
+
rb_fiddle_handle_to_ptr(VALUE self)
|
272
|
+
{
|
273
|
+
struct dl_handle *fiddle_handle;
|
274
|
+
|
275
|
+
TypedData_Get_Struct(self, struct dl_handle, &fiddle_handle_data_type, fiddle_handle);
|
276
|
+
return rb_fiddle_ptr_new_wrap(fiddle_handle->ptr, 0, 0, self, 0);
|
263
277
|
}
|
264
278
|
|
265
279
|
static VALUE fiddle_handle_sym(void *handle, VALUE symbol);
|
@@ -307,8 +321,10 @@ rb_fiddle_handle_s_sym(VALUE self, VALUE sym)
|
|
307
321
|
return fiddle_handle_sym(RTLD_NEXT, sym);
|
308
322
|
}
|
309
323
|
|
310
|
-
|
311
|
-
|
324
|
+
typedef void (*fiddle_void_func)(void);
|
325
|
+
|
326
|
+
static fiddle_void_func
|
327
|
+
fiddle_handle_find_func(void *handle, VALUE symbol)
|
312
328
|
{
|
313
329
|
#if defined(HAVE_DLERROR)
|
314
330
|
const char *err;
|
@@ -316,13 +332,13 @@ fiddle_handle_sym(void *handle, VALUE symbol)
|
|
316
332
|
#else
|
317
333
|
# define CHECK_DLERROR
|
318
334
|
#endif
|
319
|
-
|
335
|
+
fiddle_void_func func;
|
320
336
|
const char *name = StringValueCStr(symbol);
|
321
337
|
|
322
338
|
#ifdef HAVE_DLERROR
|
323
339
|
dlerror();
|
324
340
|
#endif
|
325
|
-
func = (
|
341
|
+
func = (fiddle_void_func)(VALUE)dlsym(handle, name);
|
326
342
|
CHECK_DLERROR;
|
327
343
|
#if defined(FUNC_STDCALL)
|
328
344
|
if( !func ){
|
@@ -365,6 +381,53 @@ fiddle_handle_sym(void *handle, VALUE symbol)
|
|
365
381
|
xfree(name_n);
|
366
382
|
}
|
367
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
|
+
|
368
431
|
if( !func ){
|
369
432
|
rb_raise(rb_eFiddleDLError, "unknown symbol \"%"PRIsVALUE"\"", symbol);
|
370
433
|
}
|
@@ -372,6 +435,48 @@ fiddle_handle_sym(void *handle, VALUE symbol)
|
|
372
435
|
return PTR2NUM(func);
|
373
436
|
}
|
374
437
|
|
438
|
+
/*
|
439
|
+
* call-seq: file_name
|
440
|
+
*
|
441
|
+
* Returns the file name of this handle.
|
442
|
+
*/
|
443
|
+
static VALUE
|
444
|
+
rb_fiddle_handle_file_name(VALUE self)
|
445
|
+
{
|
446
|
+
struct dl_handle *fiddle_handle;
|
447
|
+
|
448
|
+
TypedData_Get_Struct(self, struct dl_handle, &fiddle_handle_data_type, fiddle_handle);
|
449
|
+
|
450
|
+
#if defined(HAVE_DLINFO) && defined(HAVE_CONST_RTLD_DI_LINKMAP)
|
451
|
+
{
|
452
|
+
struct link_map *lm = NULL;
|
453
|
+
int res = dlinfo(fiddle_handle->ptr, RTLD_DI_LINKMAP, &lm);
|
454
|
+
if (res == 0 && lm != NULL) {
|
455
|
+
return rb_str_new_cstr(lm->l_name);
|
456
|
+
}
|
457
|
+
else {
|
458
|
+
#if defined(HAVE_DLERROR)
|
459
|
+
rb_raise(rb_eFiddleDLError, "could not get handle file name: %s", dlerror());
|
460
|
+
#else
|
461
|
+
rb_raise(rb_eFiddleDLError, "could not get handle file name");
|
462
|
+
#endif
|
463
|
+
}
|
464
|
+
}
|
465
|
+
#elif defined(HAVE_GETMODULEFILENAME)
|
466
|
+
{
|
467
|
+
char filename[MAX_PATH];
|
468
|
+
DWORD res = GetModuleFileName(fiddle_handle->ptr, filename, MAX_PATH);
|
469
|
+
if (res == 0) {
|
470
|
+
rb_raise(rb_eFiddleDLError, "could not get handle file name: %s", dlerror());
|
471
|
+
}
|
472
|
+
return rb_str_new_cstr(filename);
|
473
|
+
}
|
474
|
+
#else
|
475
|
+
(void)fiddle_handle;
|
476
|
+
return Qnil;
|
477
|
+
#endif
|
478
|
+
}
|
479
|
+
|
375
480
|
void
|
376
481
|
Init_fiddle_handle(void)
|
377
482
|
{
|
@@ -412,6 +517,7 @@ Init_fiddle_handle(void)
|
|
412
517
|
rb_cHandle = rb_define_class_under(mFiddle, "Handle", rb_cObject);
|
413
518
|
rb_define_alloc_func(rb_cHandle, rb_fiddle_handle_s_allocate);
|
414
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);
|
415
521
|
rb_define_singleton_method(rb_cHandle, "[]", rb_fiddle_handle_s_sym, 1);
|
416
522
|
|
417
523
|
/* Document-const: NEXT
|
@@ -466,9 +572,12 @@ Init_fiddle_handle(void)
|
|
466
572
|
|
467
573
|
rb_define_method(rb_cHandle, "initialize", rb_fiddle_handle_initialize, -1);
|
468
574
|
rb_define_method(rb_cHandle, "to_i", rb_fiddle_handle_to_i, 0);
|
575
|
+
rb_define_method(rb_cHandle, "to_ptr", rb_fiddle_handle_to_ptr, 0);
|
469
576
|
rb_define_method(rb_cHandle, "close", rb_fiddle_handle_close, 0);
|
470
577
|
rb_define_method(rb_cHandle, "sym", rb_fiddle_handle_sym, 1);
|
471
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);
|
580
|
+
rb_define_method(rb_cHandle, "file_name", rb_fiddle_handle_file_name, 0);
|
472
581
|
rb_define_method(rb_cHandle, "disable_close", rb_fiddle_handle_disable_close, 0);
|
473
582
|
rb_define_method(rb_cHandle, "enable_close", rb_fiddle_handle_enable_close, 0);
|
474
583
|
rb_define_method(rb_cHandle, "close_enabled?", rb_fiddle_handle_close_enabled_p, 0);
|
data/ext/fiddle/memory_view.c
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
+
#include <fiddle.h>
|
2
|
+
|
3
|
+
#ifdef HAVE_RUBY_MEMORY_VIEW_H
|
4
|
+
|
1
5
|
#include <stdbool.h>
|
2
6
|
#include <ruby/ruby.h>
|
3
7
|
#include <ruby/encoding.h>
|
4
|
-
|
5
|
-
#ifdef HAVE_RUBY_MEMORY_VIEW_H
|
6
|
-
# include <ruby/memory_view.h>
|
7
|
-
#endif
|
8
|
+
#include <ruby/memory_view.h>
|
8
9
|
|
9
10
|
#if SIZEOF_INTPTR_T == SIZEOF_LONG_LONG
|
10
11
|
# define INTPTR2NUM LL2NUM
|
@@ -17,9 +18,6 @@
|
|
17
18
|
# define UINTPTR2NUM UINT2NUM
|
18
19
|
#endif
|
19
20
|
|
20
|
-
#include <fiddle.h>
|
21
|
-
|
22
|
-
#ifdef FIDDLE_MEMORY_VIEW
|
23
21
|
VALUE rb_cMemoryView = Qnil;
|
24
22
|
|
25
23
|
struct memview_data {
|
@@ -320,4 +318,4 @@ Init_fiddle_memory_view(void)
|
|
320
318
|
rb_define_method(rb_cMemoryView, "to_s", rb_fiddle_memview_to_s, 0);
|
321
319
|
}
|
322
320
|
|
323
|
-
#endif /*
|
321
|
+
#endif /* HAVE_RUBY_MEMORY_VIEW_H */
|