Skip to content

Commit 49fa723

Browse files
tenderlovekou
andauthored
Move "type" constants to Fiddle::Types (#112)
This helps to reduce repetition in code. Instead of doing "TYPE_*" everywhere, you can do `include Fiddle::Types`, and write the type name directly. This PR is to help reduce repetition when writing Fiddle code. Right now we have to type `TYPE_` everywhere, and you also have to include all of `Fiddle` to access `TYPE_*` constants. With this change, you can just include `Fiddle::Types` and it will shorten your code and also you only have to include those constants. Here is an example before: ```ruby require "fiddle" module MMAP # All Fiddle constants included include Fiddle def self.make_function name, args, ret ptr = Handle::DEFAULT[name] func = Function.new ptr, args, ret, name: name define_singleton_method name, &func.to_proc end make_function "munmap", [TYPE_VOIDP, # addr TYPE_SIZE_T], # len TYPE_INT make_function "mmap", [TYPE_VOIDP, TYPE_SIZE_T, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT], TYPE_VOIDP make_function "mprotect", [TYPE_VOIDP, TYPE_SIZE_T, TYPE_INT], TYPE_INT end ``` After: ```ruby require "fiddle" module MMAP # Only type names included include Fiddle::Types def self.make_function name, args, ret ptr = Fiddle::Handle::DEFAULT[name] func = Fiddle::Function.new ptr, args, ret, name: name define_singleton_method name, &func.to_proc end make_function "munmap", [VOIDP, # addr SIZE_T], # len INT make_function "mmap", [VOIDP, SIZE_T, INT, INT, INT, INT], VOIDP make_function "mprotect", [VOIDP, SIZE_T, INT], INT end ``` We only need to import the type names, and you don't have to type `TYPE_` over and over. I think this makes Fiddle code easier to read. Co-authored-by: Sutou Kouhei <kou@clear-code.com>
1 parent 881b156 commit 49fa723

File tree

3 files changed

+70
-58
lines changed

3 files changed

+70
-58
lines changed

ext/fiddle/fiddle.c

Lines changed: 60 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -164,191 +164,193 @@ Init_fiddle(void)
164164
*/
165165
rb_eFiddleDLError = rb_define_class_under(mFiddle, "DLError", rb_eFiddleError);
166166

167-
/* Document-const: TYPE_VOID
167+
VALUE mFiddleTypes = rb_define_module_under(mFiddle, "Types");
168+
169+
/* Document-const: Fiddle::Types::VOID
168170
*
169171
* C type - void
170172
*/
171-
rb_define_const(mFiddle, "TYPE_VOID", INT2NUM(TYPE_VOID));
173+
rb_define_const(mFiddleTypes, "VOID", INT2NUM(TYPE_VOID));
172174

173-
/* Document-const: TYPE_VOIDP
175+
/* Document-const: Fiddle::Types::VOIDP
174176
*
175177
* C type - void*
176178
*/
177-
rb_define_const(mFiddle, "TYPE_VOIDP", INT2NUM(TYPE_VOIDP));
179+
rb_define_const(mFiddleTypes, "VOIDP", INT2NUM(TYPE_VOIDP));
178180

179-
/* Document-const: TYPE_CHAR
181+
/* Document-const: Fiddle::Types::CHAR
180182
*
181183
* C type - char
182184
*/
183-
rb_define_const(mFiddle, "TYPE_CHAR", INT2NUM(TYPE_CHAR));
185+
rb_define_const(mFiddleTypes, "CHAR", INT2NUM(TYPE_CHAR));
184186

185-
/* Document-const: TYPE_UCHAR
187+
/* Document-const: Fiddle::Types::UCHAR
186188
*
187189
* C type - unsigned char
188190
*/
189-
rb_define_const(mFiddle, "TYPE_UCHAR", INT2NUM(TYPE_UCHAR));
191+
rb_define_const(mFiddleTypes, "UCHAR", INT2NUM(TYPE_UCHAR));
190192

191-
/* Document-const: TYPE_SHORT
193+
/* Document-const: Fiddle::Types::SHORT
192194
*
193195
* C type - short
194196
*/
195-
rb_define_const(mFiddle, "TYPE_SHORT", INT2NUM(TYPE_SHORT));
197+
rb_define_const(mFiddleTypes, "SHORT", INT2NUM(TYPE_SHORT));
196198

197-
/* Document-const: TYPE_USHORT
199+
/* Document-const: Fiddle::Types::USHORT
198200
*
199201
* C type - unsigned short
200202
*/
201-
rb_define_const(mFiddle, "TYPE_USHORT", INT2NUM(TYPE_USHORT));
203+
rb_define_const(mFiddleTypes, "USHORT", INT2NUM(TYPE_USHORT));
202204

203-
/* Document-const: TYPE_INT
205+
/* Document-const: Fiddle::Types::INT
204206
*
205207
* C type - int
206208
*/
207-
rb_define_const(mFiddle, "TYPE_INT", INT2NUM(TYPE_INT));
209+
rb_define_const(mFiddleTypes, "INT", INT2NUM(TYPE_INT));
208210

209-
/* Document-const: TYPE_UINT
211+
/* Document-const: Fiddle::Types::UINT
210212
*
211213
* C type - unsigned int
212214
*/
213-
rb_define_const(mFiddle, "TYPE_UINT", INT2NUM(TYPE_UINT));
215+
rb_define_const(mFiddleTypes, "UINT", INT2NUM(TYPE_UINT));
214216

215-
/* Document-const: TYPE_LONG
217+
/* Document-const: Fiddle::Types::LONG
216218
*
217219
* C type - long
218220
*/
219-
rb_define_const(mFiddle, "TYPE_LONG", INT2NUM(TYPE_LONG));
221+
rb_define_const(mFiddleTypes, "LONG", INT2NUM(TYPE_LONG));
220222

221-
/* Document-const: TYPE_ULONG
223+
/* Document-const: Fiddle::Types::ULONG
222224
*
223225
* C type - long
224226
*/
225-
rb_define_const(mFiddle, "TYPE_ULONG", INT2NUM(TYPE_ULONG));
227+
rb_define_const(mFiddleTypes, "ULONG", INT2NUM(TYPE_ULONG));
226228

227229
#if HAVE_LONG_LONG
228-
/* Document-const: TYPE_LONG_LONG
230+
/* Document-const: Fiddle::Types::LONG_LONG
229231
*
230232
* C type - long long
231233
*/
232-
rb_define_const(mFiddle, "TYPE_LONG_LONG", INT2NUM(TYPE_LONG_LONG));
234+
rb_define_const(mFiddleTypes, "LONG_LONG", INT2NUM(TYPE_LONG_LONG));
233235

234-
/* Document-const: TYPE_ULONG_LONG
236+
/* Document-const: Fiddle::Types::ULONG_LONG
235237
*
236238
* C type - long long
237239
*/
238-
rb_define_const(mFiddle, "TYPE_ULONG_LONG", INT2NUM(TYPE_ULONG_LONG));
240+
rb_define_const(mFiddleTypes, "ULONG_LONG", INT2NUM(TYPE_ULONG_LONG));
239241
#endif
240242

241243
#ifdef TYPE_INT8_T
242-
/* Document-const: TYPE_INT8_T
244+
/* Document-const: Fiddle::Types::INT8_T
243245
*
244246
* C type - int8_t
245247
*/
246-
rb_define_const(mFiddle, "TYPE_INT8_T", INT2NUM(TYPE_INT8_T));
248+
rb_define_const(mFiddleTypes, "INT8_T", INT2NUM(TYPE_INT8_T));
247249

248-
/* Document-const: TYPE_UINT8_T
250+
/* Document-const: Fiddle::Types::UINT8_T
249251
*
250252
* C type - uint8_t
251253
*/
252-
rb_define_const(mFiddle, "TYPE_UINT8_T", INT2NUM(TYPE_UINT8_T));
254+
rb_define_const(mFiddleTypes, "UINT8_T", INT2NUM(TYPE_UINT8_T));
253255
#endif
254256

255257
#ifdef TYPE_INT16_T
256-
/* Document-const: TYPE_INT16_T
258+
/* Document-const: Fiddle::Types::INT16_T
257259
*
258260
* C type - int16_t
259261
*/
260-
rb_define_const(mFiddle, "TYPE_INT16_T", INT2NUM(TYPE_INT16_T));
262+
rb_define_const(mFiddleTypes, "INT16_T", INT2NUM(TYPE_INT16_T));
261263

262-
/* Document-const: TYPE_UINT16_T
264+
/* Document-const: Fiddle::Types::UINT16_T
263265
*
264266
* C type - uint16_t
265267
*/
266-
rb_define_const(mFiddle, "TYPE_UINT16_T", INT2NUM(TYPE_UINT16_T));
268+
rb_define_const(mFiddleTypes, "UINT16_T", INT2NUM(TYPE_UINT16_T));
267269
#endif
268270

269271
#ifdef TYPE_INT32_T
270-
/* Document-const: TYPE_INT32_T
272+
/* Document-const: Fiddle::Types::INT32_T
271273
*
272274
* C type - int32_t
273275
*/
274-
rb_define_const(mFiddle, "TYPE_INT32_T", INT2NUM(TYPE_INT32_T));
276+
rb_define_const(mFiddleTypes, "INT32_T", INT2NUM(TYPE_INT32_T));
275277

276-
/* Document-const: TYPE_UINT32_T
278+
/* Document-const: Fiddle::Types::UINT32_T
277279
*
278280
* C type - uint32_t
279281
*/
280-
rb_define_const(mFiddle, "TYPE_UINT32_T", INT2NUM(TYPE_UINT32_T));
282+
rb_define_const(mFiddleTypes, "UINT32_T", INT2NUM(TYPE_UINT32_T));
281283
#endif
282284

283285
#ifdef TYPE_INT64_T
284-
/* Document-const: TYPE_INT64_T
286+
/* Document-const: Fiddle::Types::INT64_T
285287
*
286288
* C type - int64_t
287289
*/
288-
rb_define_const(mFiddle, "TYPE_INT64_T", INT2NUM(TYPE_INT64_T));
290+
rb_define_const(mFiddleTypes, "INT64_T", INT2NUM(TYPE_INT64_T));
289291

290-
/* Document-const: TYPE_UINT64_T
292+
/* Document-const: Fiddle::Types::UINT64_T
291293
*
292294
* C type - uint64_t
293295
*/
294-
rb_define_const(mFiddle, "TYPE_UINT64_T", INT2NUM(TYPE_UINT64_T));
296+
rb_define_const(mFiddleTypes, "UINT64_T", INT2NUM(TYPE_UINT64_T));
295297
#endif
296298

297-
/* Document-const: TYPE_FLOAT
299+
/* Document-const: Fiddle::Types::FLOAT
298300
*
299301
* C type - float
300302
*/
301-
rb_define_const(mFiddle, "TYPE_FLOAT", INT2NUM(TYPE_FLOAT));
303+
rb_define_const(mFiddleTypes, "FLOAT", INT2NUM(TYPE_FLOAT));
302304

303-
/* Document-const: TYPE_DOUBLE
305+
/* Document-const: Fiddle::Types::DOUBLE
304306
*
305307
* C type - double
306308
*/
307-
rb_define_const(mFiddle, "TYPE_DOUBLE", INT2NUM(TYPE_DOUBLE));
309+
rb_define_const(mFiddleTypes, "DOUBLE", INT2NUM(TYPE_DOUBLE));
308310

309311
#ifdef HAVE_FFI_PREP_CIF_VAR
310-
/* Document-const: TYPE_VARIADIC
312+
/* Document-const: Fiddle::Types::VARIADIC
311313
*
312314
* C type - ...
313315
*/
314-
rb_define_const(mFiddle, "TYPE_VARIADIC", INT2NUM(TYPE_VARIADIC));
316+
rb_define_const(mFiddleTypes, "VARIADIC", INT2NUM(TYPE_VARIADIC));
315317
#endif
316318

317-
/* Document-const: TYPE_CONST_STRING
319+
/* Document-const: Fiddle::Types::CONST_STRING
318320
*
319321
* C type - const char* ('\0' terminated const char*)
320322
*/
321-
rb_define_const(mFiddle, "TYPE_CONST_STRING", INT2NUM(TYPE_CONST_STRING));
323+
rb_define_const(mFiddleTypes, "CONST_STRING", INT2NUM(TYPE_CONST_STRING));
322324

323-
/* Document-const: TYPE_SIZE_T
325+
/* Document-const: Fiddle::Types::SIZE_T
324326
*
325327
* C type - size_t
326328
*/
327-
rb_define_const(mFiddle, "TYPE_SIZE_T", INT2NUM(TYPE_SIZE_T));
329+
rb_define_const(mFiddleTypes, "SIZE_T", INT2NUM(TYPE_SIZE_T));
328330

329-
/* Document-const: TYPE_SSIZE_T
331+
/* Document-const: Fiddle::Types::SSIZE_T
330332
*
331333
* C type - ssize_t
332334
*/
333-
rb_define_const(mFiddle, "TYPE_SSIZE_T", INT2NUM(TYPE_SSIZE_T));
335+
rb_define_const(mFiddleTypes, "SSIZE_T", INT2NUM(TYPE_SSIZE_T));
334336

335-
/* Document-const: TYPE_PTRDIFF_T
337+
/* Document-const: Fiddle::Types::PTRDIFF_T
336338
*
337339
* C type - ptrdiff_t
338340
*/
339-
rb_define_const(mFiddle, "TYPE_PTRDIFF_T", INT2NUM(TYPE_PTRDIFF_T));
341+
rb_define_const(mFiddleTypes, "PTRDIFF_T", INT2NUM(TYPE_PTRDIFF_T));
340342

341-
/* Document-const: TYPE_INTPTR_T
343+
/* Document-const: Fiddle::Types::INTPTR_T
342344
*
343345
* C type - intptr_t
344346
*/
345-
rb_define_const(mFiddle, "TYPE_INTPTR_T", INT2NUM(TYPE_INTPTR_T));
347+
rb_define_const(mFiddleTypes, "INTPTR_T", INT2NUM(TYPE_INTPTR_T));
346348

347-
/* Document-const: TYPE_UINTPTR_T
349+
/* Document-const: Fiddle::Types::UINTPTR_T
348350
*
349351
* C type - uintptr_t
350352
*/
351-
rb_define_const(mFiddle, "TYPE_UINTPTR_T", INT2NUM(TYPE_UINTPTR_T));
353+
rb_define_const(mFiddleTypes, "UINTPTR_T", INT2NUM(TYPE_UINTPTR_T));
352354

353355
/* Document-const: ALIGN_VOIDP
354356
*

lib/fiddle.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,8 @@ def dlopen library
9696
RTLD_GLOBAL = Handle::RTLD_GLOBAL # :nodoc:
9797
RTLD_LAZY = Handle::RTLD_LAZY # :nodoc:
9898
RTLD_NOW = Handle::RTLD_NOW # :nodoc:
99+
100+
Fiddle::Types.constants.each do |type|
101+
const_set "TYPE_#{type}", Fiddle::Types.const_get(type)
102+
end
99103
end

test/fiddle/test_import.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,12 @@ def test_unsigned_equals_negative_signed
139139
end
140140
end
141141

142+
def test_type_constants
143+
Fiddle::Types.constants.each do |const|
144+
assert_equal Fiddle::Types.const_get(const), Fiddle.const_get("TYPE_#{const}")
145+
end
146+
end
147+
142148
def test_unsigned_result()
143149
d = (2 ** 31) + 1
144150

0 commit comments

Comments
 (0)