Commit 7a00b931 authored by Stefan Behnel's avatar Stefan Behnel

speed up unpacking of small integers in Py3

parent 97f8a229
...@@ -1385,6 +1385,9 @@ proto=""" ...@@ -1385,6 +1385,9 @@ proto="""
static CYTHON_INLINE %(type)s __Pyx_PyInt_As%(SignWord)s%(TypeName)s(PyObject *); static CYTHON_INLINE %(type)s __Pyx_PyInt_As%(SignWord)s%(TypeName)s(PyObject *);
""", """,
impl=""" 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) { 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 %(type)s neg_one = (%(type)s)-1, const_zero = 0;
const int is_unsigned = neg_one > const_zero; 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 ...@@ -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"); "can't convert negative value to %(type)s");
return (%(type)s)-1; 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); return (%(type)s)PyLong_AsUnsigned%(TypeName)s(x);
} else { } 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); return (%(type)s)PyLong_As%(TypeName)s(x);
} }
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment