summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/cobject.h4
-rw-r--r--Objects/cobject.c57
-rw-r--r--PC/python_nt.def1
3 files changed, 44 insertions, 18 deletions
diff --git a/Include/cobject.h b/Include/cobject.h
index db2ce23..672e029 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 4016b91..49b7bc9 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 ee282b1..b05696e 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