diff options
author | Armin Rigo <arigo@tunes.org> | 2013-12-15 09:38:58 +0100 |
---|---|---|
committer | Armin Rigo <arigo@tunes.org> | 2013-12-15 09:38:58 +0100 |
commit | f397f0e23ef5d1aca6be2becffe9b455696f96b6 (patch) | |
tree | cbde334bcb064cabc74326b7c58fd7d2a955148e | |
parent | 5460111de8f263d846fd01f189ece24132cd5799 (diff) | |
download | cffi-f397f0e23ef5d1aca6be2becffe9b455696f96b6.tar.gz |
Kill is_{signed,unsigned}_type()
-rw-r--r-- | cffi/model.py | 30 | ||||
-rw-r--r-- | cffi/vengine_cpy.py | 46 | ||||
-rw-r--r-- | testing/test_verify.py | 34 |
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(): |