Skip to content

Commit

Permalink
[ruby/fiddle] Add support for bool
Browse files Browse the repository at this point in the history
GitHub: fix ruby/fiddle#130

Reported by Benoit Daloze. Thanks!!!

ruby/fiddle@bc6c66bbb9
  • Loading branch information
kou authored and hsbt committed Aug 2, 2023
1 parent 10588fa commit 15e8cf7
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 0 deletions.
24 changes: 24 additions & 0 deletions ext/fiddle/conversions.c
@@ -1,5 +1,24 @@
#include <fiddle.h>

VALUE
rb_fiddle_type_bool(void)
{
if (sizeof(bool) == sizeof(char)) {
return INT2NUM(TYPE_UCHAR);
} else if (sizeof(bool) == sizeof(short)) {
return INT2NUM(TYPE_USHORT);
} else if (sizeof(bool) == sizeof(int)) {
return INT2NUM(TYPE_UINT);
} else if (sizeof(bool) == sizeof(long)) {
return INT2NUM(TYPE_ULONG);
} else {
rb_raise(rb_eNotImpError,
"bool isn't supported: %u",
(unsigned int)sizeof(bool));
return RUBY_Qnil;
}
}

VALUE
rb_fiddle_type_ensure(VALUE type)
{
Expand Down Expand Up @@ -44,6 +63,7 @@ rb_fiddle_type_ensure(VALUE type)
ID ptrdiff_t_id;
ID intptr_t_id;
ID uintptr_t_id;
ID bool_id;
RUBY_CONST_ID(void_id, "void");
RUBY_CONST_ID(voidp_id, "voidp");
RUBY_CONST_ID(char_id, "char");
Expand Down Expand Up @@ -74,6 +94,7 @@ rb_fiddle_type_ensure(VALUE type)
RUBY_CONST_ID(ptrdiff_t_id, "ptrdiff_t");
RUBY_CONST_ID(intptr_t_id, "intptr_t");
RUBY_CONST_ID(uintptr_t_id, "uintptr_t");
RUBY_CONST_ID(bool_id, "bool");
if (type_id == void_id) {
return INT2NUM(TYPE_VOID);
}
Expand Down Expand Up @@ -144,6 +165,9 @@ rb_fiddle_type_ensure(VALUE type)
else if (type_id == uintptr_t_id) {
return INT2NUM(TYPE_UINTPTR_T);
}
else if (type_id == bool_id) {
return rb_fiddle_type_bool();
}
else {
type = original_type;
}
Expand Down
1 change: 1 addition & 0 deletions ext/fiddle/conversions.h
Expand Up @@ -24,6 +24,7 @@ typedef union
void * pointer; /* ffi_type_pointer */
} fiddle_generic;

VALUE rb_fiddle_type_bool(void);
VALUE rb_fiddle_type_ensure(VALUE type);
ffi_type * rb_fiddle_int_to_ffi_type(int type);
void rb_fiddle_value_to_generic(int type, VALUE *src, fiddle_generic *dst);
Expand Down
12 changes: 12 additions & 0 deletions ext/fiddle/fiddle.c
Expand Up @@ -357,6 +357,12 @@ Init_fiddle(void)
*/
rb_define_const(mFiddleTypes, "UINTPTR_T", INT2NUM(TYPE_UINTPTR_T));

/* Document-const: Fiddle::Types::BOOL
*
* C type - bool
*/
rb_define_const(mFiddleTypes, "BOOL" , rb_fiddle_type_bool());

/* Document-const: ALIGN_VOIDP
*
* The alignment size of a void*
Expand Down Expand Up @@ -635,6 +641,12 @@ Init_fiddle(void)
*/
rb_define_const(mFiddle, "SIZEOF_CONST_STRING", INT2NUM(sizeof(const char*)));

/* Document-const: SIZEOF_BOOL
*
* size of a bool
*/
rb_define_const(mFiddle, "SIZEOF_BOOL", INT2NUM(sizeof(bool)));

/* Document-const: RUBY_FREE
*
* Address of the ruby_xfree() function
Expand Down
2 changes: 2 additions & 0 deletions ext/fiddle/lib/fiddle/cparser.rb
Expand Up @@ -247,6 +247,8 @@ def parse_ctype(ty, tymap=nil)
return TYPE_INTPTR_T
when /\Auintptr_t(?:\s+\w+)?\z/
return TYPE_UINTPTR_T
when "bool"
return TYPE_BOOL
when /\*/, /\[[\s\d]*\]/
return TYPE_VOIDP
when "..."
Expand Down
4 changes: 4 additions & 0 deletions test/fiddle/test_cparser.rb
Expand Up @@ -121,6 +121,10 @@ def test_uintptr_t_ctype
assert_equal(TYPE_UINTPTR_T, parse_ctype("const uintptr_t"))
end

def test_bool_ctype
assert_equal(TYPE_BOOL, parse_ctype('bool'))
end

def test_undefined_ctype
assert_raise(DLError) { parse_ctype('DWORD') }
end
Expand Down

0 comments on commit 15e8cf7

Please sign in to comment.