summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Rigo <arigo@tunes.org>2013-12-15 09:38:58 +0100
committerArmin Rigo <arigo@tunes.org>2013-12-15 09:38:58 +0100
commitf397f0e23ef5d1aca6be2becffe9b455696f96b6 (patch)
treecbde334bcb064cabc74326b7c58fd7d2a955148e
parent5460111de8f263d846fd01f189ece24132cd5799 (diff)
downloadcffi-f397f0e23ef5d1aca6be2becffe9b455696f96b6.tar.gz
Kill is_{signed,unsigned}_type()
-rw-r--r--cffi/model.py30
-rw-r--r--cffi/vengine_cpy.py46
-rw-r--r--testing/test_verify.py34
3 files changed, 49 insertions, 61 deletions
diff --git a/cffi/model.py b/cffi/model.py
index 45609c2..bf23c22 100644
--- a/cffi/model.py
+++ b/cffi/model.py
@@ -81,29 +81,29 @@ class PrimitiveType(BaseType):
'long': 'i',
'long long': 'i',
'signed char': 'i',
- 'unsigned char': 'u',
- 'unsigned short': 'u',
- 'unsigned int': 'u',
- 'unsigned long': 'u',
- 'unsigned long long': 'u',
+ 'unsigned char': 'i',
+ 'unsigned short': 'i',
+ 'unsigned int': 'i',
+ 'unsigned long': 'i',
+ 'unsigned long long': 'i',
'float': 'f',
'double': 'f',
'long double': 'f',
- '_Bool': 'u',
+ '_Bool': 'i',
# the following types are not primitive in the C sense
'wchar_t': 'c',
'int8_t': 'i',
- 'uint8_t': 'u',
+ 'uint8_t': 'i',
'int16_t': 'i',
- 'uint16_t': 'u',
+ 'uint16_t': 'i',
'int32_t': 'i',
- 'uint32_t': 'u',
+ 'uint32_t': 'i',
'int64_t': 'i',
- 'uint64_t': 'u',
+ 'uint64_t': 'i',
'intptr_t': 'i',
- 'uintptr_t': 'u',
+ 'uintptr_t': 'i',
'ptrdiff_t': 'i',
- 'size_t': 'u',
+ 'size_t': 'i',
'ssize_t': 'i',
}
@@ -114,12 +114,8 @@ class PrimitiveType(BaseType):
def is_char_type(self):
return self.ALL_PRIMITIVE_TYPES[self.name] == 'c'
- def is_signed_type(self):
- return self.ALL_PRIMITIVE_TYPES[self.name] == 'i'
- def is_unsigned_type(self):
- return self.ALL_PRIMITIVE_TYPES[self.name] == 'u'
def is_integer_type(self):
- return self.ALL_PRIMITIVE_TYPES[self.name] in 'iu'
+ return self.ALL_PRIMITIVE_TYPES[self.name] == 'i'
def is_float_type(self):
return self.ALL_PRIMITIVE_TYPES[self.name] == 'f'
diff --git a/cffi/vengine_cpy.py b/cffi/vengine_cpy.py
index 83e3a55..85126fa 100644
--- a/cffi/vengine_cpy.py
+++ b/cffi/vengine_cpy.py
@@ -214,10 +214,7 @@ class VCPythonEngine(object):
extraarg = ''
if isinstance(tp, model.PrimitiveType):
if tp.is_integer_type() and tp.name != '_Bool':
- if tp.is_signed_type():
- converter = '_cffi_to_c_SIGNED'
- else:
- converter = '_cffi_to_c_UNSIGNED'
+ converter = '_cffi_to_c_int'
extraarg = ', %s' % tp.name
else:
converter = '_cffi_to_c_%s' % (tp.name.replace(' ', '_'),)
@@ -270,10 +267,7 @@ class VCPythonEngine(object):
def _convert_expr_from_c(self, tp, var, context):
if isinstance(tp, model.PrimitiveType):
if tp.is_integer_type():
- if tp.is_signed_type():
- return '_cffi_from_c_SIGNED(%s, %s)' % (var, tp.name)
- else:
- return '_cffi_from_c_UNSIGNED(%s, %s)' % (var, tp.name)
+ return '_cffi_from_c_int(%s, %s)' % (var, tp.name)
elif tp.name != 'long double':
return '_cffi_from_c_%s(%s)' % (tp.name.replace(' ', '_'), var)
else:
@@ -801,25 +795,23 @@ typedef unsigned char _Bool;
#define _cffi_to_c_double PyFloat_AsDouble
#define _cffi_to_c_float PyFloat_AsDouble
-#define _cffi_from_c_SIGNED(x, type) \
- (sizeof(type) <= sizeof(long) ? PyInt_FromLong(x) : \
- PyLong_FromLongLong(x))
-#define _cffi_from_c_UNSIGNED(x, type) \
- (sizeof(type) < sizeof(long) ? PyInt_FromLong(x) : \
- sizeof(type) == sizeof(long) ? PyLong_FromUnsignedLong(x) : \
- PyLong_FromUnsignedLongLong(x))
-
-#define _cffi_to_c_SIGNED(o, type) \
- (sizeof(type) == 1 ? _cffi_to_c_i8(o) : \
- sizeof(type) == 2 ? _cffi_to_c_i16(o) : \
- sizeof(type) == 4 ? _cffi_to_c_i32(o) : \
- sizeof(type) == 8 ? _cffi_to_c_i64(o) : \
- (Py_FatalError("unsupported size for type " #type), 0))
-#define _cffi_to_c_UNSIGNED(o, type) \
- (sizeof(type) == 1 ? _cffi_to_c_u8(o) : \
- sizeof(type) == 2 ? _cffi_to_c_u16(o) : \
- sizeof(type) == 4 ? _cffi_to_c_u32(o) : \
- sizeof(type) == 8 ? _cffi_to_c_u64(o) : \
+#define _cffi_from_c_int(x, type) \
+ (((type)-1) > 0 ? /* unsigned */ \
+ (sizeof(type) < sizeof(long) ? PyInt_FromLong(x) : \
+ sizeof(type) == sizeof(long) ? PyLong_FromUnsignedLong(x) : \
+ PyLong_FromUnsignedLongLong(x)) \
+ : (sizeof(type) <= sizeof(long) ? PyInt_FromLong(x) : \
+ PyLong_FromLongLong(x)))
+
+#define _cffi_to_c_int(o, type) \
+ (sizeof(type) == 1 ? (((type)-1) > 0 ? _cffi_to_c_u8(o) \
+ : _cffi_to_c_i8(o)) : \
+ sizeof(type) == 2 ? (((type)-1) > 0 ? _cffi_to_c_u16(o) \
+ : _cffi_to_c_i16(o)) : \
+ sizeof(type) == 4 ? (((type)-1) > 0 ? _cffi_to_c_u32(o) \
+ : _cffi_to_c_i32(o)) : \
+ sizeof(type) == 8 ? (((type)-1) > 0 ? _cffi_to_c_u64(o) \
+ : _cffi_to_c_i64(o)) : \
(Py_FatalError("unsupported size for type " #type), 0))
#define _cffi_to_c_i8 \
diff --git a/testing/test_verify.py b/testing/test_verify.py
index 442c2cb..7027452 100644
--- a/testing/test_verify.py
+++ b/testing/test_verify.py
@@ -148,28 +148,27 @@ def test_longdouble_precision():
all_primitive_types = model.PrimitiveType.ALL_PRIMITIVE_TYPES
-all_signed_integer_types = sorted(tp for tp in all_primitive_types
- if all_primitive_types[tp] == 'i')
-all_unsigned_integer_types = sorted(tp for tp in all_primitive_types
- if all_primitive_types[tp] == 'u')
+all_integer_types = sorted(tp for tp in all_primitive_types
+ if all_primitive_types[tp] == 'i')
all_float_types = sorted(tp for tp in all_primitive_types
if all_primitive_types[tp] == 'f')
+def all_signed_integer_types(ffi):
+ return [x for x in all_integer_types if int(ffi.cast(x, -1)) < 0]
+
+def all_unsigned_integer_types(ffi):
+ return [x for x in all_integer_types if int(ffi.cast(x, -1)) > 0]
+
+
def test_primitive_category():
for typename in all_primitive_types:
tp = model.PrimitiveType(typename)
C = tp.is_char_type()
- U = tp.is_unsigned_type()
- S = tp.is_signed_type()
F = tp.is_float_type()
I = tp.is_integer_type()
assert C == (typename in ('char', 'wchar_t'))
- assert U == (typename.startswith('unsigned ') or
- typename == '_Bool' or typename == 'size_t' or
- typename == 'uintptr_t' or typename.startswith('uint'))
assert F == (typename in ('float', 'double', 'long double'))
- assert S + U + F + C == 1 # one and only one of them is true
- assert I == (S or U)
+ assert I + F + C == 1 # one and only one of them is true
def test_all_integer_and_float_types():
typenames = []
@@ -207,7 +206,7 @@ def test_all_integer_and_float_types():
def test_var_signed_integer_types():
ffi = FFI()
- lst = all_signed_integer_types
+ lst = all_signed_integer_types(ffi)
csource = "\n".join(["%s somevar_%s;" % (tp, tp.replace(' ', '_'))
for tp in lst])
ffi.cdef(csource)
@@ -226,7 +225,7 @@ def test_var_signed_integer_types():
def test_var_unsigned_integer_types():
ffi = FFI()
- lst = all_unsigned_integer_types
+ lst = all_unsigned_integer_types(ffi)
csource = "\n".join(["%s somevar_%s;" % (tp, tp.replace(' ', '_'))
for tp in lst])
ffi.cdef(csource)
@@ -247,7 +246,7 @@ def test_var_unsigned_integer_types():
def test_fn_signed_integer_types():
ffi = FFI()
- lst = all_signed_integer_types
+ lst = all_signed_integer_types(ffi)
cdefsrc = "\n".join(["%s somefn_%s(%s);" % (tp, tp.replace(' ', '_'), tp)
for tp in lst])
ffi.cdef(cdefsrc)
@@ -267,7 +266,7 @@ def test_fn_signed_integer_types():
def test_fn_unsigned_integer_types():
ffi = FFI()
- lst = all_unsigned_integer_types
+ lst = all_unsigned_integer_types(ffi)
cdefsrc = "\n".join(["%s somefn_%s(%s);" % (tp, tp.replace(' ', '_'), tp)
for tp in lst])
ffi.cdef(cdefsrc)
@@ -464,11 +463,12 @@ def test_struct_signedness_ignored():
def test_struct_float_vs_int():
if sys.platform == 'win32':
py.test.skip("XXX fixme: only gives warnings")
- for typename in all_signed_integer_types:
+ ffi = FFI()
+ for typename in all_signed_integer_types(ffi):
for real in all_float_types:
_check_field_match(typename, real, expect_mismatch=True)
for typename in all_float_types:
- for real in all_signed_integer_types:
+ for real in all_signed_integer_types(ffi):
_check_field_match(typename, real, expect_mismatch=True)
def test_struct_array_field():