[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&#174; 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);
         }