[前][次][番号順一覧][スレッド一覧]

ruby-changes:20846

From: ngoto <ko1@a...>
Date: Tue, 9 Aug 2011 14:31:57 +0900 (JST)
Subject: [ruby-changes:20846] ngoto:r32895 (trunk): * ext/fiddle/conversions.c (generic_to_value): ffi_arg and ffi_sarg

ngoto	2011-08-09 14:31:47 +0900 (Tue, 09 Aug 2011)

  New Revision: 32895

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32895

  Log:
    * 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.

  Modified files:
    trunk/ChangeLog
    trunk/ext/fiddle/closure.c
    trunk/ext/fiddle/conversions.c
    trunk/ext/fiddle/conversions.h

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32894)
+++ ChangeLog	(revision 32895)
@@ -1,3 +1,16 @@
+Tue Aug  9 14:25:47 2011  Naohisa Goto  <ngotogenome@g...>
+
+	* 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.
+
 Tue Aug  9 11:21:08 2011  Narihiro Nakamura  <authornari@g...>
 
 	* gc.c (gc_lazy_sweep): if sweep target slots are not found, we
Index: ext/fiddle/conversions.c
===================================================================
--- ext/fiddle/conversions.c	(revision 32894)
+++ ext/fiddle/conversions.c	(revision 32895)
@@ -56,7 +56,11 @@
 	dst->pointer = NUM2PTR(rb_Integer(src));
 	break;
       case TYPE_CHAR:
+	dst->schar = NUM2INT(src);
+	break;
       case TYPE_SHORT:
+	dst->sshort = NUM2INT(src);
+	break;
       case TYPE_INT:
 	dst->sint = NUM2INT(src);
 	break;
@@ -103,9 +107,14 @@
         return rb_funcall(cPointer, rb_intern("[]"), 1,
           PTR2NUM((void *)retval.pointer));
       case TYPE_CHAR:
+	if (signed_p) return INT2NUM((char)retval.fffi_sarg);
+	return INT2NUM((unsigned char)retval.fffi_arg);
       case TYPE_SHORT:
+	if (signed_p) return INT2NUM((short)retval.fffi_sarg);
+	return INT2NUM((unsigned short)retval.fffi_arg);
       case TYPE_INT:
-	return INT2NUM(retval.sint);
+	if (signed_p) return INT2NUM((int)retval.fffi_sarg);
+	return UINT2NUM((unsigned int)retval.fffi_arg);
       case TYPE_LONG:
 	if (signed_p) return LONG2NUM(retval.slong);
 	return ULONG2NUM(retval.ulong);
Index: ext/fiddle/closure.c
===================================================================
--- ext/fiddle/closure.c	(revision 32894)
+++ ext/fiddle/closure.c	(revision 32895)
@@ -110,14 +110,13 @@
 	*(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;
Index: ext/fiddle/conversions.h
===================================================================
--- ext/fiddle/conversions.h	(revision 32894)
+++ ext/fiddle/conversions.h	(revision 32895)
@@ -5,6 +5,8 @@
 
 typedef union
 {
+    ffi_arg  fffi_arg;     /* rvalue smaller than unsigned long */
+    ffi_sarg fffi_sarg;    /* rvalue smaller than signed long */
     unsigned char uchar;   /* ffi_type_uchar */
     signed char   schar;   /* ffi_type_schar */
     unsigned short ushort; /* ffi_type_sshort */

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]