|
2 | 2 |
|
3 | 3 | #include <fiddle.h> |
4 | 4 |
|
5 | | -VALUE |
6 | | -rb_fiddle_type_bool(void) |
7 | | -{ |
8 | | - if (sizeof(bool) == sizeof(char)) { |
9 | | - return INT2NUM(TYPE_UCHAR); |
10 | | - } else if (sizeof(bool) == sizeof(short)) { |
11 | | - return INT2NUM(TYPE_USHORT); |
12 | | - } else if (sizeof(bool) == sizeof(int)) { |
13 | | - return INT2NUM(TYPE_UINT); |
14 | | - } else if (sizeof(bool) == sizeof(long)) { |
15 | | - return INT2NUM(TYPE_ULONG); |
16 | | - } else { |
17 | | - rb_raise(rb_eNotImpError, |
18 | | - "bool isn't supported: %u", |
19 | | - (unsigned int)sizeof(bool)); |
20 | | - return RUBY_Qnil; |
21 | | - } |
22 | | -} |
23 | | - |
24 | 5 | VALUE |
25 | 6 | rb_fiddle_type_ensure(VALUE type) |
26 | 7 | { |
@@ -168,7 +149,7 @@ rb_fiddle_type_ensure(VALUE type) |
168 | 149 | return INT2NUM(TYPE_UINTPTR_T); |
169 | 150 | } |
170 | 151 | else if (type_id == bool_id) { |
171 | | - return rb_fiddle_type_bool(); |
| 152 | + return INT2NUM(TYPE_BOOL); |
172 | 153 | } |
173 | 154 | else { |
174 | 155 | type = original_type; |
@@ -213,6 +194,21 @@ rb_fiddle_int_to_ffi_type(int type) |
213 | 194 | return &ffi_type_double; |
214 | 195 | case TYPE_CONST_STRING: |
215 | 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 | + return INT2NUM(TYPE_USHORT); |
| 204 | + } else if (sizeof(bool) == sizeof(int)) { |
| 205 | + return rb_ffi_type_of(int); |
| 206 | + } else if (sizeof(bool) == sizeof(long)) { |
| 207 | + return rb_ffi_type_of(long); |
| 208 | + } else { |
| 209 | + rb_raise(rb_eNotImpError, "bool isn't supported: %u", |
| 210 | + (unsigned int)sizeof(bool)); |
| 211 | + } |
216 | 212 | default: |
217 | 213 | rb_raise(rb_eRuntimeError, "unknown type %d", type); |
218 | 214 | } |
@@ -284,8 +280,23 @@ rb_fiddle_value_to_generic(int type, VALUE *src, fiddle_generic *dst) |
284 | 280 | dst->pointer = rb_string_value_cstr(src); |
285 | 281 | } |
286 | 282 | break; |
| 283 | + case TYPE_BOOL: |
| 284 | + if (sizeof(bool) == sizeof(char)) { |
| 285 | + dst->uchar = RB_TEST(*src); |
| 286 | + } else if (sizeof(bool) == sizeof(short)) { |
| 287 | + dst->ushort = RB_TEST(*src); |
| 288 | + } else if (sizeof(bool) == sizeof(int)) { |
| 289 | + dst->uint = RB_TEST(*src); |
| 290 | + } else if (sizeof(bool) == sizeof(long)) { |
| 291 | + dst->ulong = RB_TEST(*src); |
| 292 | + } else { |
| 293 | + rb_raise(rb_eNotImpError, "bool isn't supported: %u", |
| 294 | + (unsigned int)sizeof(bool)); |
| 295 | + } |
| 296 | + break; |
287 | 297 | default: |
288 | 298 | rb_raise(rb_eRuntimeError, "unknown type %d", type); |
| 299 | + break; |
289 | 300 | } |
290 | 301 | } |
291 | 302 |
|
@@ -344,6 +355,19 @@ rb_fiddle_generic_to_value(VALUE rettype, fiddle_generic retval) |
344 | 355 | else { |
345 | 356 | return Qnil; |
346 | 357 | } |
| 358 | + case TYPE_BOOL: |
| 359 | + if (sizeof(bool) == sizeof(char)) { |
| 360 | + return CBOOL2RBBOOL((unsigned char)retval.fffi_arg); |
| 361 | + } else if (sizeof(bool) == sizeof(short)) { |
| 362 | + return CBOOL2RBBOOL((unsigned short)retval.fffi_arg); |
| 363 | + } else if (sizeof(bool) == sizeof(int)) { |
| 364 | + return CBOOL2RBBOOL((unsigned int)retval.fffi_arg); |
| 365 | + } else if (sizeof(bool) == sizeof(long)) { |
| 366 | + return CBOOL2RBBOOL(retval.ulong); |
| 367 | + } else { |
| 368 | + rb_raise(rb_eNotImpError, "bool isn't supported: %u", |
| 369 | + (unsigned int)sizeof(bool)); |
| 370 | + } |
347 | 371 | default: |
348 | 372 | rb_raise(rb_eRuntimeError, "unknown type %d", type); |
349 | 373 | } |
|
0 commit comments