Change the example code to prefer PyModule_Add*() instead of using the
module dictionary directly. Also, be more careful about not re-initializing globals in the event of re-initialization of a C extension.
This commit is contained in:
parent
193a3f6d37
commit
1de5a722d6
|
@ -231,7 +231,11 @@ initxx(void)
|
|||
m = Py_InitModule("xx", xx_methods);
|
||||
|
||||
/* Add some symbolic constants to the module */
|
||||
d = PyModule_GetDict(m);
|
||||
ErrorObject = PyErr_NewException("xx.error", NULL, NULL);
|
||||
PyDict_SetItemString(d, "error", ErrorObject);
|
||||
if (ErrorObject == NULL) {
|
||||
ErrorObject = PyErr_NewException("xx.error", NULL, NULL);
|
||||
if (ErrorObject == NULL)
|
||||
return;
|
||||
}
|
||||
Py_INCREF(ErrorObject);
|
||||
PyModule_AddObject(d, "error", ErrorObject);
|
||||
}
|
||||
|
|
|
@ -238,7 +238,7 @@ static PyMethodDef xxsubtype_functions[] = {
|
|||
DL_EXPORT(void)
|
||||
initxxsubtype(void)
|
||||
{
|
||||
PyObject *m, *d;
|
||||
PyObject *m;
|
||||
|
||||
/* Fill in deferred data addresses. This must be done before
|
||||
PyType_Ready() is called. Note that PyType_Ready() automatically
|
||||
|
@ -263,17 +263,13 @@ initxxsubtype(void)
|
|||
if (PyType_Ready(&spamdict_type) < 0)
|
||||
return;
|
||||
|
||||
d = PyModule_GetDict(m);
|
||||
if (d == NULL)
|
||||
return;
|
||||
|
||||
Py_INCREF(&spamlist_type);
|
||||
if (PyDict_SetItemString(d, "spamlist",
|
||||
(PyObject *) &spamlist_type) < 0)
|
||||
if (PyModule_AddObject(m, "spamlist",
|
||||
(PyObject *) &spamlist_type) < 0)
|
||||
return;
|
||||
|
||||
Py_INCREF(&spamdict_type);
|
||||
if (PyDict_SetItemString(d, "spamdict",
|
||||
(PyObject *) &spamdict_type) < 0)
|
||||
if (PyModule_AddObject(m, "spamdict",
|
||||
(PyObject *) &spamdict_type) < 0)
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue