diff --git i/ext/fiddle/conversions.c w/ext/fiddle/conversions.c index 14b444f..b299ad6 100644 --- i/ext/fiddle/conversions.c +++ w/ext/fiddle/conversions.c @@ -27,7 +27,7 @@ int_to_ffi_type(int type) return rb_ffi_type_of(long); #if HAVE_LONG_LONG case TYPE_LONG_LONG: - return rb_ffi_type_of(int64); + return rb_ffi_type_of(long_long); #endif case TYPE_FLOAT: return &ffi_type_float; @@ -56,23 +56,35 @@ value_to_generic(int type, VALUE src, fiddle_generic * dst) dst->pointer = NUM2PTR(rb_Integer(src)); break; case TYPE_CHAR: - dst->schar = NUM2INT(src); + if (signed_p) + dst->schar = NUM2INT(src); + else + dst->uchar = NUM2UINT(src); break; case TYPE_SHORT: - dst->sshort = NUM2INT(src); + if (signed_p) + dst->sshort = NUM2INT(src); + else + dst->ushort = NUM2UINT(src); break; case TYPE_INT: - dst->sint = NUM2INT(src); + if (signed_p) + dst->sint = NUM2INT(src); + else + dst->uint = NUM2UINT(src); break; case TYPE_LONG: if (signed_p) dst->slong = NUM2LONG(src); else - dst->ulong = NUM2LONG(src); + dst->ulong = NUM2ULONG(src); break; #if HAVE_LONG_LONG case TYPE_LONG_LONG: - dst->long_long = NUM2ULL(src); + if (signed_p) + dst->slong_long = NUM2LL(src); + else + dst->ulong_long = NUM2ULL(src); break; #endif case TYPE_FLOAT: @@ -120,7 +132,8 @@ generic_to_value(VALUE rettype, fiddle_generic retval) return ULONG2NUM(retval.ulong); #if HAVE_LONG_LONG case TYPE_LONG_LONG: - return rb_ll2inum(retval.long_long); + if (signed_p) return LL2NUM(retval.slong_long); + return ULL2NUM(retval.ulong_long); break; #endif case TYPE_FLOAT: diff --git i/ext/fiddle/conversions.h w/ext/fiddle/conversions.h index 5a605b3..d0a08d6 100644 --- i/ext/fiddle/conversions.h +++ w/ext/fiddle/conversions.h @@ -18,7 +18,8 @@ typedef union float ffloat; /* ffi_type_float */ double ddouble; /* ffi_type_double */ #if HAVE_LONG_LONG - unsigned LONG_LONG long_long; /* ffi_type_uint64 */ + unsigned LONG_LONG ulong_long; /* ffi_type_ulong_long */ + signed LONG_LONG slong_long; /* ffi_type_ulong_long */ #endif void * pointer; /* ffi_type_pointer */ } fiddle_generic; diff --git i/ext/fiddle/fiddle.h w/ext/fiddle/fiddle.h index 7165969..3a829fe 100644 --- i/ext/fiddle/fiddle.h +++ w/ext/fiddle/fiddle.h @@ -67,6 +67,15 @@ # error "long size not supported" # endif +#if HAVE_LONG_LONG +# if SIZEOF_LONG_LONG == 8 +# define ffi_type_slong_long ffi_type_sint64 +# define ffi_type_ulong_long ffi_type_uint64 +# else +# error "long long size not supported" +# endif +#endif + #include #include #include