From 8243e467e511dfb04cdf23167154f13488cb8137 Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Sat, 24 Aug 2013 13:36:47 -0700 Subject: [PATCH] CIntToPy functions. --- Cython/Compiler/PyrexTypes.py | 9 ++++++++- Cython/Utility/TypeConversion.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/Cython/Compiler/PyrexTypes.py b/Cython/Compiler/PyrexTypes.py index 9041997..99affb9 100755 --- a/Cython/Compiler/PyrexTypes.py +++ b/Cython/Compiler/PyrexTypes.py @@ -1566,12 +1566,19 @@ class CIntType(CNumericType): self.get_from_py_type_conversion() def create_from_py_utility_code(self, env): - self.from_py_function = "__Pyx_PyInt_As" + self.specialization_name() + self.from_py_function = "__Pyx_PyInt_to_py_" + self.specialization_name() env.use_utility_code(TempitaUtilityCode.load( "CIntFromPy", "TypeConversion.c", context={"TYPE": self.declaration_code(''), "FROM_PY_FUNCTION": self.from_py_function})) return True + def create_to_py_utility_code(self, env): + self.from_to_function = "__Pyx_PyInt_As" + self.specialization_name() + env.use_utility_code(TempitaUtilityCode.load( + "CIntToPy", "TypeConversion.c", + context={"TYPE": self.declaration_code(''), "TO_PY_FUNCTION": self.from_to_function})) + return True + def get_to_py_type_conversion(self): if self.rank < list(rank_to_type_name).index('int'): # This assumes sizeof(short) < sizeof(int) diff --git a/Cython/Utility/TypeConversion.c b/Cython/Utility/TypeConversion.c index 8677875..ef7dd1d 100644 --- a/Cython/Utility/TypeConversion.c +++ b/Cython/Utility/TypeConversion.c @@ -449,10 +449,40 @@ static CYTHON_INLINE Py_UNICODE __Pyx_PyObject_AsPy_UNICODE(PyObject* x) { return (Py_UNICODE)ival; } + /////////////// CIntToPy.proto /////////////// +static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value); + /////////////// CIntToPy /////////////// +static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value) { + const {{TYPE}} neg_one = ({{TYPE}}) -1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof({{TYPE}}) < sizeof(unsigned long)) { + return PyInt_FromLong(value); + } else if (sizeof({{TYPE}}) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong(value); + } else if (sizeof({{TYPE}}) <= sizeof(unsigned long long)) { + return PyLong_FromUnsignedLongLong(value); + } + } else { + if (sizeof({{TYPE}}) <= sizeof(long)) { + return PyInt_FromLong(value); + } else if (sizeof({{TYPE}}) <= sizeof(long long)) { + return PyLong_FromLong(value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof({{TYPE}}), + little, !is_unsigned); + } +} + + /////////////// CIntFromPyVerify /////////////// #define __PYX_VERIFY_RETURN_INT(type, value_type, func) \ @@ -470,6 +500,7 @@ static CYTHON_INLINE Py_UNICODE __Pyx_PyObject_AsPy_UNICODE(PyObject* x) { return (type) value; \ } + /////////////// CIntFromPy.proto /////////////// static CYTHON_INLINE {{TYPE}} {{FROM_PY_FUNCTION}}(PyObject *); -- 2.7.4