parsers: statically initializing tp_new to PyType_GenericNew is not portable stable
authorAdrian Buehlmann <adrian@cadifra.com>
Tue, 08 May 2012 11:20:07 +0200
branchstable
changeset 16604 48e42f984074
parent 16598 20a9d823f242
child 16605 54fc9796d75b
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')
mercurial/parsers.c
--- 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);