# HG changeset patch # User Adrian Buehlmann # Date 2012-05-08 09:20:07 # Node ID 48e42f9840744f51a0912f280624fa5d06484846 # Parent 20a9d823f242f00c3b8c2f0d7ce4c4e081cf11eb 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') diff --git a/mercurial/parsers.c b/mercurial/parsers.c --- a/mercurial/parsers.c +++ b/mercurial/parsers.c @@ -1092,7 +1092,6 @@ static PyTypeObject indexType = { 0, /* tp_dictoffset */ (initproc)index_init, /* tp_init */ 0, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ }; /* @@ -1150,6 +1149,7 @@ static PyMethodDef methods[] = { static void module_init(PyObject *mod) { + indexType.tp_new = PyType_GenericNew; if (PyType_Ready(&indexType) < 0) return; Py_INCREF(&indexType);