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