New submission from STINNER Victor <[EMAIL PROTECTED]>: It's hard to read Objects/longobject.c because the code depends to much on the implementation. I wrote macros to simplify the code: - PyLong_SIGN(x) - PyLong_EQUALS_ZERO(x) - PyLong_FITS_INT(x) - PyLong_GET_INT(x) - PyLong_NDIGITS(x)
Macros are declared in Include/longintrepr.h to be able to use them outside longobject.c. Eg. I used it in Modules/mathmodule.c. The patch also contains extra changes: - create sdigit type (used by PyLong_GET_INT(x)) - use memcpy() in _PyLong_Copy() - use stwodigits in long_mul() - replace many Py_SIZE() hacks by my macros (eg. see long_hash) Using my patch, it will be easier to change long integer implementation, like: - Use 30-bit digits instead of 15-bit digits (issue #4258) - Use GMP for PyLong (issue #1814) Example of changes: i = Py_SIZE(v); x = 0; if (i < 0) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned int"); return (unsigned long) -1; } switch (i) { case 0: return 0; case 1: return v->ob_digit[0]; } while (--i >= 0) { ... is replaced by: if (PyLong_SIGN(v) < 0) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned int"); return (unsigned long) -1; } if (PyLong_FITS_INT(v)) return (unsigned long) PyLong_GET_INT(v); x = 0; i = PyLong_NDIGITS(v); while (--i >= 0) { ... ---------- files: pylong_macros.patch keywords: patch messages: 75694 nosy: haypo severity: normal status: open title: Macros for PyLong: sign, number of digits, fits in an int versions: Python 2.6, Python 3.0 Added file: http://bugs.python.org/file11975/pylong_macros.patch _______________________________________ Python tracker <[EMAIL PROTECTED]> <http://bugs.python.org/issue4294> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com