Author: rfm
Date: Sun Jun 19 13:36:12 2016
New Revision: 39880

URL: http://svn.gna.org/viewcvs/gnustep?rev=39880&view=rev
Log:
Depend on libffi to provide the types with the correct size for the buffer used
for small scalar values.

Modified:
    libs/base/trunk/Source/cifframe.m

Modified: libs/base/trunk/Source/cifframe.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/cifframe.m?rev=39880&r1=39879&r2=39880&view=diff
==============================================================================
--- libs/base/trunk/Source/cifframe.m   (original)
+++ libs/base/trunk/Source/cifframe.m   Sun Jun 19 13:36:12 2016
@@ -44,20 +44,6 @@
 #import "Foundation/NSData.h"
 #import "GSInvocation.h"
 #import "GSPrivate.h"
-
-/* For each architecture, we need to know the native word size to
- * which smaller integral types are promoted when they are passed
- * as function arguments or return type.
- */
-#if defined(ALPHA) || (defined(MIPS) && (_MIPS_SIM == _ABIN32))
-typedef long long smallret_t;
-#elif defined(__sparc)
-typedef NSInteger smallret_t;
-#elif defined(__LP64__)
-typedef NSInteger smallret_t;
-#else
-typedef int smallret_t;
-#endif
 
 /* ffi defines types in a very odd way that doesn't map to the
    normal objective-c type (see ffi.h). Here we make up for that */
@@ -624,26 +610,34 @@
   type = objc_skip_type_qualifiers (type);
   switch (*type)
     {
-    case _C_CHR:
-    case _C_UCHR:
-      {
-       *(unsigned char*)buffer = (unsigned char)(*((smallret_t *)buffer));
+      case _C_CHR:
+       *(signed char*)buffer = (signed char)(*((ffi_sarg *)buffer));
+        break;
+      case _C_UCHR:
+       *(unsigned char*)buffer = (unsigned char)(*((ffi_arg *)buffer));
        break;
-      }
-    case _C_SHT:
-    case _C_USHT:
-      {
-       *(unsigned short*)buffer = (unsigned short)(*((smallret_t *)buffer));
+      case _C_SHT:
+       *(signed short*)buffer = (signed short)(*((ffi_sarg *)buffer));
        break;
-      }
-    case _C_INT:
-    case _C_UINT:
-      {
-       *(unsigned int*)buffer = (unsigned int)(*((smallret_t *)buffer));
+      case _C_USHT:
+       *(unsigned short*)buffer = (unsigned short)(*((ffi_arg *)buffer));
        break;
-      }
-    default:
-      return NO;
+      case _C_INT:
+       *(signed int*)buffer = (signed int)(*((ffi_sarg *)buffer));
+       break;
+      case _C_UINT:
+       *(unsigned int*)buffer = (unsigned int)(*((ffi_arg *)buffer));
+       break;
+      case _C_LNG:
+        if (sizeof(signed long) < sizeof(ffi_sarg))
+          *(signed long*)buffer = (signed long)(*((ffi_sarg *)buffer));
+       break;
+      case _C_ULNG:
+        if (sizeof(unsigned long) < sizeof(ffi_arg))
+          *(unsigned long*)buffer = (unsigned long)(*((ffi_arg *)buffer));
+       break;
+      default:
+        return NO;
     }
   return YES;
 }
@@ -654,26 +648,34 @@
   type = objc_skip_type_qualifiers (type);
   switch (*type)
     {
-    case _C_CHR:
-    case _C_UCHR:
-      {
-       *(smallret_t *)buffer = (smallret_t)(*((unsigned char *)buffer));
-       break;
-      }
-    case _C_SHT:
-    case _C_USHT:
-      {
-       *(smallret_t *)buffer = (smallret_t)(*((unsigned short *)buffer));
-       break;
-      }
-    case _C_INT:
-    case _C_UINT:
-      {
-       *(smallret_t *)buffer = (smallret_t)(*((unsigned int *)buffer));
-       break;
-      }
-    default:
-      return NO;
+      case _C_CHR:
+        *(ffi_sarg *)buffer = (ffi_sarg)(*((signed char *)buffer));
+        break;
+      case _C_UCHR:
+        *(ffi_arg *)buffer = (ffi_arg)(*((unsigned char *)buffer));
+        break;
+      case _C_SHT:
+        *(ffi_sarg *)buffer = (ffi_sarg)(*((signed short *)buffer));
+        break;
+      case _C_USHT:
+        *(ffi_arg *)buffer = (ffi_arg)(*((unsigned short *)buffer));
+        break;
+      case _C_INT:
+        *(ffi_sarg *)buffer = (ffi_sarg)(*((signed int *)buffer));
+        break;
+      case _C_UINT:
+        *(ffi_arg *)buffer = (ffi_arg)(*((unsigned int *)buffer));
+        break;
+      case _C_LNG:
+        if (sizeof(signed long) < sizeof(ffi_sarg))
+          *(ffi_sarg *)buffer = (ffi_sarg)(*((signed long *)buffer));
+        break;
+      case _C_ULNG:
+        if (sizeof(unsigned long) < sizeof(ffi_arg))
+          *(ffi_arg *)buffer = (ffi_arg)(*((unsigned int *)buffer));
+        break;
+      default:
+        return NO;
     }
   return YES;
 }


_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to