|
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