mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-23 00:41:02 +00:00
Depend on libffi to provide the types with the correct size for the buffer used
for small scalar values. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@39880 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
776631838d
commit
c3b5fd3e65
1 changed files with 53 additions and 51 deletions
|
@ -45,20 +45,6 @@
|
|||
#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 */
|
||||
#if GS_SIZEOF_SHORT == 2
|
||||
|
@ -624,26 +610,34 @@ cifframe_decode_arg (const char *type, void* buffer)
|
|||
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 @@ cifframe_encode_arg (const char *type, void* buffer)
|
|||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue