Fix the missing-module-names bug properly.
authorMark Wooding <mdw@distorted.org.uk>
Tue, 26 May 2015 15:02:01 +0000 (16:02 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 26 May 2015 15:04:44 +0000 (16:04 +0100)
Introduce a wrapper `typeready' around `PyType_Ready' which sets the
module name, and call it everywhere it's needed.

catacomb-python.h
util.c

index bf2a840..bb84a74 100644 (file)
@@ -247,6 +247,7 @@ extern PyObject *getulong(unsigned long);
 extern void *newtype(PyTypeObject *, const PyTypeObject *, const char *);
 
 extern PyObject *mkexc(PyObject *, PyObject *, const char *, PyMethodDef *);
+extern void typeready(PyTypeObject *);
 extern PyTypeObject *inittype(PyTypeObject *);
 extern void addmethods(const PyMethodDef *);
 extern PyMethodDef *donemethods(void);
diff --git a/util.c b/util.c
index 717c3d9..8a0c06c 100644 (file)
--- a/util.c
+++ b/util.c
 
 #include "catacomb-python.h"
 
+/*----- External values ---------------------------------------------------*/
+
+static PyObject *modname = 0;
+
 /*----- Conversions -------------------------------------------------------*/
 
 PyObject *getulong(unsigned long w)
@@ -168,14 +172,17 @@ void *newtype(PyTypeObject *metaty,
   return (ty);
 }
 
+void typeready(PyTypeObject *ty)
+{
+  PyType_Ready(ty);
+  PyDict_SetItemString(ty->tp_dict, "__module__", modname);
+}
+
 PyTypeObject *inittype(PyTypeObject *tyskel)
 {
-  static PyObject *modname = 0;
   PyTypeObject *ty = newtype(&PyType_Type, tyskel, 0);
-  if (!modname) modname = PyString_FromString("catacomb");
   ty->tp_flags |= Py_TPFLAGS_HEAPTYPE;
-  PyType_Ready(ty);
-  PyDict_SetItemString(ty->tp_dict, "__module__", modname);
+  typeready(ty);
   return (ty);
 }
 
@@ -637,6 +644,7 @@ PyMethodDef gmap_pymethods[] = {
 
 void util_pyinit(void)
 {
+  modname = PyString_FromString("catacomb");
   INITTYPE(itemiter, root);
   INITTYPE(valiter, root);
 }