summaryrefslogtreecommitdiffstats
path: root/Doc/ext
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2002-04-12 19:08:31 (GMT)
committerFred Drake <fdrake@acm.org>2002-04-12 19:08:31 (GMT)
commit63e40a598dafceb3040b620e6fd5dc6fec79fc1c (patch)
tree08ee4fe63217873d6f3d1add339022311f41aa0a /Doc/ext
parente77e5ef2af7f0cb667c32f59bc7cb1c88aac8697 (diff)
downloadcpython-63e40a598dafceb3040b620e6fd5dc6fec79fc1c.zip
cpython-63e40a598dafceb3040b620e6fd5dc6fec79fc1c.tar.gz
cpython-63e40a598dafceb3040b620e6fd5dc6fec79fc1c.tar.bz2
Do not use PyModule_GetDict().
Clean up the example of exporting a C-callable API from an extension module. Add a hyperlink to a related section in the Python/C API reference.
Diffstat (limited to 'Doc/ext')
-rw-r--r--Doc/ext/extending.tex50
1 files changed, 27 insertions, 23 deletions
diff --git a/Doc/ext/extending.tex b/Doc/ext/extending.tex
index 90385e1..41bdab5 100644
--- a/Doc/ext/extending.tex
+++ b/Doc/ext/extending.tex
@@ -217,12 +217,13 @@ the error checking for now):
void
initspam(void)
{
- PyObject *m, *d;
+ PyObject *m;
m = Py_InitModule("spam", SpamMethods);
- d = PyModule_GetDict(m);
+
SpamError = PyErr_NewException("spam.error", NULL, NULL);
- PyDict_SetItemString(d, "error", SpamError);
+ Py_INCREF(SpamError);
+ PyModule_AddObject(m, "error", SpamError);
}
\end{verbatim}
@@ -1277,13 +1278,8 @@ initspam(void)
/* Create a CObject containing the API pointer array's address */
c_api_object = PyCObject_FromVoidPtr((void *)PySpam_API, NULL);
- if (c_api_object != NULL) {
- /* Create a name for this object in the module's namespace */
- PyObject *d = PyModule_GetDict(m);
-
- PyDict_SetItemString(d, "_C_API", c_api_object);
- Py_DECREF(c_api_object);
- }
+ if (c_api_object != NULL)
+ PyModule_AddObject(m, "_C_API", c_api_object);
}
\end{verbatim}
@@ -1324,16 +1320,21 @@ static void **PySpam_API;
#define PySpam_System \
(*(PySpam_System_RETURN (*)PySpam_System_PROTO) PySpam_API[PySpam_System_NUM])
-#define import_spam() \
-{ \
- PyObject *module = PyImport_ImportModule("spam"); \
- if (module != NULL) { \
- PyObject *module_dict = PyModule_GetDict(module); \
- PyObject *c_api_object = PyDict_GetItemString(module_dict, "_C_API"); \
- if (PyCObject_Check(c_api_object)) { \
- PySpam_API = (void **)PyCObject_AsVoidPtr(c_api_object); \
- } \
- } \
+/* Return -1 and set exception on error, 0 on success. */
+static int
+import_spam(void)
+{
+ PyObject *module = PyImport_ImportModule("spam");
+
+ if (module != NULL) {
+ PyObject *c_api_object = PyObject_GetAttrString(module, "_C_API");
+ if (c_api_object == NULL)
+ return -1;
+ if (PyCObject_Check(c_api_object))
+ PySpam_API = (void **)PyCObject_AsVoidPtr(c_api_object);
+ Py_DECREF(c_api_object);
+ }
+ return 0;
}
#endif
@@ -1357,7 +1358,9 @@ initclient(void)
PyObject *m;
Py_InitModule("client", ClientMethods);
- import_spam();
+ if (import_spam() < 0)
+ return;
+ /* additional initialization can happen here */
}
\end{verbatim}
@@ -1370,6 +1373,7 @@ Finally it should be mentioned that CObjects offer additional
functionality, which is especially useful for memory allocation and
deallocation of the pointer stored in a CObject. The details
are described in the \citetitle[../api/api.html]{Python/C API
-Reference Manual} in the section ``CObjects'' and in the
-implementation of CObjects (files \file{Include/cobject.h} and
+Reference Manual} in the section
+``\ulink{CObjects}{../api/cObjects.html}'' and in the implementation
+of CObjects (files \file{Include/cobject.h} and
\file{Objects/cobject.c} in the Python source code distribution).