parsers: statically initializing tp_new to PyType_GenericNew is not portable
As detailed on http://docs.python.org/extending/newtypes.html (quote):
"In this case, we can just use the default implementation provided by the API
function PyType_GenericNew(). We’d like to just assign this to the
tp_new slot, but we can’t, for portability sake. On some platforms or
compilers, we can’t statically initialize a structure member with a function
defined in another C module, so, instead, we’ll assign the tp_new slot in the
module initialization function just before calling PyType_Ready()."
Fixes "gcc (GCC) 3.4.5 (mingw-vista special r3)" complaining with:
mercurial/parsers.c:1096: error: initializer element is not constant
mercurial/parsers.c:1096: error: (near initialization for `indexType.tp_new')
--- a/mercurial/parsers.c Mon May 07 21:49:45 2012 +0200
+++ b/mercurial/parsers.c Tue May 08 11:20:07 2012 +0200
@@ -1092,7 +1092,6 @@
0, /* tp_dictoffset */
(initproc)index_init, /* tp_init */
0, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
};
/*
@@ -1150,6 +1149,7 @@
static void module_init(PyObject *mod)
{
+ indexType.tp_new = PyType_GenericNew;
if (PyType_Ready(&indexType) < 0)
return;
Py_INCREF(&indexType);