mirror of https://github.com/python/cpython
opaque C object a la Jim Fulton
This commit is contained in:
parent
3a50f8a51e
commit
77654a7e5e
|
@ -0,0 +1,61 @@
|
|||
#ifndef Py_COBJECT_H
|
||||
#define Py_COBJECT_H
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***********************************************************
|
||||
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
|
||||
The Netherlands.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the names of Stichting Mathematisch
|
||||
Centrum or CWI not be used in advertising or publicity pertaining to
|
||||
distribution of the software without specific, written prior permission.
|
||||
|
||||
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
||||
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
|
||||
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
/* C objects to be exported from one extension module to another.
|
||||
|
||||
C objects are used for communication between extension modules.
|
||||
They provide a way for an extension module to export a C interface
|
||||
to other extension modules, so that extension modules can use the
|
||||
Python import mechanism to link to one another.
|
||||
|
||||
*/
|
||||
|
||||
extern DL_IMPORT(PyTypeObject) PyCObject_Type;
|
||||
|
||||
#define PyCObject_Check(op) ((op)->ob_type == &PyCObject_Type)
|
||||
|
||||
/* Create a PyCObject from a pointer to a C object and an optional
|
||||
destrutor function. If the second argument is non-null, then it
|
||||
will be called with the first argument if and when the PyCObject is
|
||||
destroyed.
|
||||
|
||||
*/
|
||||
|
||||
extern PyObject *
|
||||
PyCObject_FromVoidPtr Py_PROTO((void *cobj, void (*destruct)(void*)));
|
||||
|
||||
/* Retrieve a pointer to a C object from a PyCObject. */
|
||||
extern void *
|
||||
PyCObject_AsVoidPtr Py_PROTO((PyObject *));
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* !Py_COBJECT_H */
|
|
@ -0,0 +1,100 @@
|
|||
/***********************************************************
|
||||
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
|
||||
The Netherlands.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the names of Stichting Mathematisch
|
||||
Centrum or CWI not be used in advertising or publicity pertaining to
|
||||
distribution of the software without specific, written prior permission.
|
||||
|
||||
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
||||
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
|
||||
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
/* Wrap void* pointers to be passed between C modules */
|
||||
|
||||
#include "Python.h"
|
||||
|
||||
|
||||
/* Declarations for objects of type PyCObject */
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
void *cobject;
|
||||
void (*destructor)(void *);
|
||||
} PyCObject;
|
||||
|
||||
PyObject *
|
||||
PyCObject_FromVoidPtr(cobj, destr)
|
||||
void *cobj;
|
||||
void (*destr)(void *);
|
||||
{
|
||||
PyCObject *self;
|
||||
|
||||
self = PyObject_NEW(PyCObject, &PyCObject_Type);
|
||||
if (self == NULL)
|
||||
return NULL;
|
||||
self->cobject=cobj;
|
||||
self->destructor=destr;
|
||||
return (PyObject *)self;
|
||||
}
|
||||
|
||||
void *
|
||||
PyCObject_AsVoidPtr(self)
|
||||
PyObject *self;
|
||||
{
|
||||
return ((PyCObject *)self)->cobject;
|
||||
}
|
||||
|
||||
static void
|
||||
PyCObject_dealloc(self)
|
||||
PyCObject *self;
|
||||
{
|
||||
if(self->destructor) (self->destructor)(self->cobject);
|
||||
PyMem_DEL(self);
|
||||
}
|
||||
|
||||
static char PyCObject_Type__doc__[] =
|
||||
"C objects to be exported from one extension module to another\n"
|
||||
"\n"
|
||||
"C objects are used for communication between extension modules. They\n"
|
||||
"provide a way for an extension module to export a C interface to other\n"
|
||||
"extension modules, so that extension modules can use the Python import\n"
|
||||
"mechanism to link to one another.\n"
|
||||
;
|
||||
|
||||
PyTypeObject PyCObject_Type = {
|
||||
PyObject_HEAD_INIT(&PyType_Type)
|
||||
0, /*ob_size*/
|
||||
"PyCObject", /*tp_name*/
|
||||
sizeof(PyCObject), /*tp_basicsize*/
|
||||
0, /*tp_itemsize*/
|
||||
/* methods */
|
||||
(destructor)PyCObject_dealloc, /*tp_dealloc*/
|
||||
(printfunc)0, /*tp_print*/
|
||||
(getattrfunc)0, /*tp_getattr*/
|
||||
(setattrfunc)0, /*tp_setattr*/
|
||||
(cmpfunc)0, /*tp_compare*/
|
||||
(reprfunc)0, /*tp_repr*/
|
||||
0, /*tp_as_number*/
|
||||
0, /*tp_as_sequence*/
|
||||
0, /*tp_as_mapping*/
|
||||
(hashfunc)0, /*tp_hash*/
|
||||
(ternaryfunc)0, /*tp_call*/
|
||||
(reprfunc)0, /*tp_str*/
|
||||
|
||||
/* Space for future expansion */
|
||||
0L,0L,0L,0L,
|
||||
PyCObject_Type__doc__ /* Documentation string */
|
||||
};
|
Loading…
Reference in New Issue