aboutsummaryrefslogtreecommitdiffstats
path: root/ext/fiddle/closure.c
diff options
context:
space:
mode:
authorngoto <ngoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-08-09 05:31:47 +0000
committerngoto <ngoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-08-09 05:31:47 +0000
commit4d71d348555f75ea705f8a0e4782e0e5935a7094 (patch)
tree4d5a050ca37c0c9b09e0d6afd96fb39495296e91 /ext/fiddle/closure.c
parente26cead1e99e10ab3e672e0894ebdc8c277c833c (diff)
downloadruby-4d71d348555f75ea705f8a0e4782e0e5935a7094.tar.gz
* ext/fiddle/conversions.c (generic_to_value): ffi_arg and ffi_sarg
should be used to handle shorter return value. fix [Bug #3861] [ruby-core:32504] * ext/fiddle/closure.c (callback): ditto * ext/fiddle/conversions.h (fiddle_generic): ditto * ext/fiddle/conversions.c (value_to_generic): char, short and int are strictly distinguished on big-endian CPU, e.g. sparc64. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32895 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/fiddle/closure.c')
-rw-r--r--ext/fiddle/closure.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/ext/fiddle/closure.c b/ext/fiddle/closure.c
index 5f55d6d4f8..48520997bc 100644
--- a/ext/fiddle/closure.c
+++ b/ext/fiddle/closure.c
@@ -110,14 +110,13 @@ callback(ffi_cif *cif, void *resp, void **args, void *ctx)
*(long *)resp = NUM2LONG(ret);
break;
case TYPE_CHAR:
- *(char *)resp = NUM2INT(ret);
+ case TYPE_SHORT:
+ case TYPE_INT:
+ *(ffi_sarg *)resp = NUM2INT(ret);
break;
case TYPE_VOIDP:
*(void **)resp = NUM2PTR(ret);
break;
- case TYPE_INT:
- *(int *)resp = NUM2INT(ret);
- break;
case TYPE_DOUBLE:
*(double *)resp = NUM2DBL(ret);
break;