summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--ext/dl/dl_conversions.c50
2 files changed, 30 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index fa486da1da..8041ca94c3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,7 @@
-Wed Feb 17 14:26:30 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Feb 17 15:34:45 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/dl/dl_conversions.c (rb_dl_type_to_ffi_type): support signed
+ long long.
* ext/dl/cfunc.c (rb_dlcfunc_inspect): get rid of overflow.
diff --git a/ext/dl/dl_conversions.c b/ext/dl/dl_conversions.c
index 01d6218f7d..1331006507 100644
--- a/ext/dl/dl_conversions.c
+++ b/ext/dl/dl_conversions.c
@@ -1,38 +1,40 @@
#include <dl_conversions.h>
-ffi_type * rb_dl_type_to_ffi_type(int dl_type)
+ffi_type *
+rb_dl_type_to_ffi_type(int dl_type)
{
int signed_p = 1;
- if(dl_type < 0) {
+ if (dl_type < 0) {
dl_type = -1 * dl_type;
signed_p = 0;
}
- switch(dl_type) {
- case DLTYPE_VOID:
- return &ffi_type_void;
- case DLTYPE_VOIDP:
- return &ffi_type_pointer;
- case DLTYPE_CHAR:
- return signed_p ? &ffi_type_schar : &ffi_type_uchar;
- case DLTYPE_SHORT:
- return signed_p ? &ffi_type_sshort : &ffi_type_ushort;
- case DLTYPE_INT:
- return signed_p ? &ffi_type_sint : &ffi_type_uint;
- case DLTYPE_LONG:
- return signed_p ? &ffi_type_slong : &ffi_type_ulong;
+#define rb_ffi_type_of(t) (signed_p ? &ffi_type_s##t : &ffi_type_u##t)
+
+ switch (dl_type) {
+ case DLTYPE_VOID:
+ return &ffi_type_void;
+ case DLTYPE_VOIDP:
+ return &ffi_type_pointer;
+ case DLTYPE_CHAR:
+ return rb_ffi_type_of(char);
+ case DLTYPE_SHORT:
+ return rb_ffi_type_of(short);
+ case DLTYPE_INT:
+ return rb_ffi_type_of(int);
+ case DLTYPE_LONG:
+ return rb_ffi_type_of(long);
#if HAVE_LONG_LONG
- case DLTYPE_LONG_LONG:
- return &ffi_type_uint64;
- break;
+ case DLTYPE_LONG_LONG:
+ return rb_ffi_type_of(int64);
#endif
- case DLTYPE_FLOAT:
- return &ffi_type_float;
- case DLTYPE_DOUBLE:
- return &ffi_type_double;
- default:
- rb_raise(rb_eRuntimeError, "unknown type %d", dl_type);
+ case DLTYPE_FLOAT:
+ return &ffi_type_float;
+ case DLTYPE_DOUBLE:
+ return &ffi_type_double;
+ default:
+ rb_raise(rb_eRuntimeError, "unknown type %d", dl_type);
}
return &ffi_type_pointer;
}