From 7a00b931c468a99b85a5464e69c3be735ff6b072 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Sat, 9 Mar 2013 16:26:35 +0100 Subject: [PATCH] speed up unpacking of small integers in Py3 --- Cython/Compiler/PyrexTypes.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Cython/Compiler/PyrexTypes.py b/Cython/Compiler/PyrexTypes.py index 52bf076..dddcd79 100755 --- a/Cython/Compiler/PyrexTypes.py +++ b/Cython/Compiler/PyrexTypes.py @@ -1385,6 +1385,9 @@ proto=""" static CYTHON_INLINE %(type)s __Pyx_PyInt_As%(SignWord)s%(TypeName)s(PyObject *); """, impl=""" +#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 +#include "longintrepr.h" +#endif static CYTHON_INLINE %(type)s __Pyx_PyInt_As%(SignWord)s%(TypeName)s(PyObject* x) { const %(type)s neg_one = (%(type)s)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; @@ -1406,8 +1409,33 @@ static CYTHON_INLINE %(type)s __Pyx_PyInt_As%(SignWord)s%(TypeName)s(PyObject* x "can't convert negative value to %(type)s"); return (%(type)s)-1; } +#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 + switch (Py_SIZE(x)) { + case 0: return 0; + case 1: { + digit d = ((PyLongObject*)x)->ob_digit[0]; + if (sizeof(digit) < sizeof(%(type)s) || likely(d == (digit)(%(type)s)d)) + return (%(type)s)d; + } + } +#endif return (%(type)s)PyLong_AsUnsigned%(TypeName)s(x); } else { +#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 + switch (Py_SIZE(x)) { + case 0: return 0; + case 1: { + digit d = ((PyLongObject*)x)->ob_digit[0]; + if (sizeof(digit) < sizeof(%(type)s) || likely((((%(type)s)d) > 0) && (d == (digit)(%(type)s)d))) + return (%(type)s)d; + } + case -1: { + digit d = ((PyLongObject*)x)->ob_digit[0]; + if (sizeof(digit) < sizeof(%(type)s) || likely((((%(type)s)d) > 0) && (d == (digit)(%(type)s)d))) + return -(%(type)s)d; + } + } +#endif return (%(type)s)PyLong_As%(TypeName)s(x); } } else { -- 2.7.4