Bug #5991 ยป fiddle.diff
| w/ext/fiddle/conversions.c | ||
|---|---|---|
| 
     	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; 
   | 
||
| ... | ... | |
| 
     	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: 
   | 
||
| ... | ... | |
| 
     	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: 
   | 
||
| w/ext/fiddle/conversions.h | ||
|---|---|---|
| 
         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; 
   | 
||
| w/ext/fiddle/fiddle.h | ||
|---|---|---|
| 
     #  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 <closure.h> 
   | 
||
| 
     #include <conversions.h> 
   | 
||
| 
     #include <function.h> 
   | 
||