From e0e696282feea175d82920e0cf13e90bd7a9252e Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 22 Jan 1997 20:48:48 +0000 Subject: [PATCH] Added PyCObject_Import. --- Include/cobject.h | 4 ++++ Objects/cobject.c | 57 ++++++++++++++++++++++++++++++++--------------- PC/python_nt.def | 1 + 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/Include/cobject.h b/Include/cobject.h index db2ce23ae95..672e029e49d 100644 --- a/Include/cobject.h +++ b/Include/cobject.h @@ -62,6 +62,10 @@ PyCObject_FromVoidPtr Py_PROTO((void *cobj, void (*destruct)(void*))); extern void * PyCObject_AsVoidPtr Py_PROTO((PyObject *)); +/* Import a pointer to a C object from a module using a PyCObject. */ +extern void * +PyCObject_Import Py_PROTO((char *module_name, char *cobject_name)); + #ifdef __cplusplus } #endif diff --git a/Objects/cobject.c b/Objects/cobject.c index 4016b91c4f2..49b7bc98258 100644 --- a/Objects/cobject.c +++ b/Objects/cobject.c @@ -57,6 +57,44 @@ PyCObject_FromVoidPtr(cobj, destr) return (PyObject *)self; } +void * +PyCObject_AsVoidPtr(self) + PyObject *self; +{ + if(self) + { + if(self->ob_type == &PyCObject_Type) + return ((PyCObject *)self)->cobject; + PyErr_SetString(PyExc_TypeError, + "PyCObject_AsVoidPtr with non-C-object"); + } + if(! PyErr_Occurred()) + PyErr_SetString(PyExc_TypeError, + "PyCObject_AsVoidPtr called with null pointer"); + return NULL; +} + +void * +PyCObject_Import(module_name, name) + char *module_name; + char *name; +{ + PyObject *m, *c; + void *r=NULL; + + if(m=PyImport_ImportModule(module_name)) + { + if(c=PyObject_GetAttrString(m,name)) + { + r=PyCObject_AsVoidPtr(c); + Py_DECREF(c); + } + Py_DECREF(m); + } + + return r; +} + static void PyCObject_dealloc(self) PyCObject *self; @@ -65,6 +103,7 @@ PyCObject_dealloc(self) PyMem_DEL(self); } + static char PyCObject_Type__doc__[] = "C objects to be exported from one extension module to another\n\ \n\ @@ -98,21 +137,3 @@ PyTypeObject PyCObject_Type = { 0L,0L,0L,0L, PyCObject_Type__doc__ /* Documentation string */ }; - -void * -PyCObject_AsVoidPtr(self) - PyObject *self; -{ - if(self) - { - if(self->ob_type == &PyCObject_Type) - return ((PyCObject *)self)->cobject; - PyErr_SetString(PyExc_TypeError, - "PyCObject_AsVoidPtr with non-C-object"); - } - if(! PyErr_Occurred()) - PyErr_SetString( - PyExc_TypeError, - "PyCObject_AsVoidPtr called with null pointer"); - return NULL; -} diff --git a/PC/python_nt.def b/PC/python_nt.def index ee282b1a7ca..b05696ee992 100644 --- a/PC/python_nt.def +++ b/PC/python_nt.def @@ -351,4 +351,5 @@ EXPORTS _Py_c_diff PyCObject_FromVoidPtr PyCObject_AsVoidPtr + PyCObject_Import Py_GetBuildInfo