[PATCH] C extension fails to build on Python 2.5 because of PyUnicode_FromFormat
Arnaud Fontaine <[email protected]> Wed, 31 Mar 2010 01:21:04 +0200
| Newsgroups | gmane.comp.python.cheetah |
|---|---|
| Organization | Debian |
| Message-ID | <[email protected]> |
Hello, Cheetah C extension doesn't build on Python <= 2.5 because of PyUnicode_FromFormat() being only available on Python >= 2.6. I have attached a patch to make it build on Python 2.5 and inferior versions. It builds without warning on Python 2.5, 2.6 and 3.1 and I can import _namemapper on all these versions, moreover all the tests passed. Hope the patch is good as I'm not really familiar with Python C/API. BTW, my question may be silly but I'm wondering why `newExcValue' reference returned by PyUnicode_FromFormat() (wrapInternalNotFoundException() function) is never DECREF whereas it is in setNotFoundException() function for `exceptionStr'. Just curious ;)... Cheers, Arnaud Fontaine ------------------------------------------------------------------------------ Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev _______________________________________________ Cheetahtemplate-discuss mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/cheetahtemplate-discuss
fix_ftbfs_c_extension_python25.patch
(text/x-diff, 1.8 KB)
Description: C extension fails to build because of PyUnicode_FromFormat only available on Python >= 2.6 Author: Arnaud Fontaine <[email protected]> --- a/cheetah/c/cheetah.h 2010-02-08 04:17:23.000000000 +0000 +++ b/cheetah/c/cheetah.h 2010-03-30 22:42:49.000000000 +0100 @@ -37,6 +37,9 @@ #if PY_MAJOR_VERSION >= 3 #define IS_PYTHON3 +#elif PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION <= 5 +/* PyUnicode_FromFormat is only available on Python >= 2.6 */ +#define IS_PYTHON25_OR_LESS #endif #define TRUE 1 --- a/cheetah/c/_namemapper.c 2010-02-08 04:17:23.000000000 +0000 +++ b/cheetah/c/_namemapper.c 2010-03-30 22:40:01.000000000 +0100 @@ -35,7 +35,13 @@ static void setNotFoundException(char *key, PyObject *namespace) { PyObject *exceptionStr = NULL; +#ifdef IS_PYTHON25_OR_LESS + exceptionStr = Py_BuildValue("s", "cannot find '"); + PyString_ConcatAndDel(&exceptionStr, Py_BuildValue("s", key)); + PyString_ConcatAndDel(&exceptionStr, Py_BuildValue("s", "'")); +#else exceptionStr = PyUnicode_FromFormat("cannot find \'%s\'", key); +#endif PyErr_SetObject(NotFound, exceptionStr); Py_XDECREF(exceptionStr); } @@ -58,8 +64,15 @@ if (isAlreadyWrapped != NULL) { if (PyLong_AsLong(isAlreadyWrapped) == -1) { +#ifdef IS_PYTHON25_OR_LESS + newExcValue = Py_BuildValue("U", excValue); + PyString_ConcatAndDel(&newExcValue, Py_BuildValue("s", "while searching for '")); + PyString_ConcatAndDel(&newExcValue, Py_BuildValue("s", fullName)); + PyString_ConcatAndDel(&newExcValue, Py_BuildValue("s", "'")); +#else newExcValue = PyUnicode_FromFormat("%U while searching for \'%s\'", excValue, fullName); +#endif } Py_DECREF(isAlreadyWrapped); }