diff options
author | Fred Drake <fdrake@acm.org> | 2002-04-12 19:08:31 +0000 |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2002-04-12 19:08:31 +0000 |
commit | 42c0f8d9bc9b44dce37496ae7969b0011ab767a5 (patch) | |
tree | c43ccd40764b066ef5da5e7256702344c5c944ea /Doc/ext/extending.tex | |
parent | 38c9ec679babb6b5b8f2d84362febefd6cfd29c8 (diff) | |
download | cpython-42c0f8d9bc9b44dce37496ae7969b0011ab767a5.tar.gz |
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/extending.tex')
-rw-r--r-- | Doc/ext/extending.tex | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/Doc/ext/extending.tex b/Doc/ext/extending.tex index 90385e1016..41bdab5860 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). |