1 /* Wrap void * pointers to be passed between C modules */
5 /* Internal structure of PyCapsule */
11 PyCapsule_Destructor destructor
;
17 _is_legal_capsule(PyCapsule
*capsule
, const char *invalid_capsule
)
19 if (!capsule
|| !PyCapsule_CheckExact(capsule
) || capsule
->pointer
== NULL
) {
20 PyErr_SetString(PyExc_ValueError
, invalid_capsule
);
26 #define is_legal_capsule(capsule, name) \
27 (_is_legal_capsule(capsule, \
28 name " called with invalid PyCapsule object"))
32 name_matches(const char *name1
, const char *name2
) {
33 /* if either is NULL, */
34 if (!name1
|| !name2
) {
35 /* they're only the same if they're both NULL. */
36 return name1
== name2
;
38 return !strcmp(name1
, name2
);
44 PyCapsule_New(void *pointer
, const char *name
, PyCapsule_Destructor destructor
)
49 PyErr_SetString(PyExc_ValueError
, "PyCapsule_New called with null pointer");
53 capsule
= PyObject_NEW(PyCapsule
, &PyCapsule_Type
);
54 if (capsule
== NULL
) {
58 capsule
->pointer
= pointer
;
60 capsule
->context
= NULL
;
61 capsule
->destructor
= destructor
;
63 return (PyObject
*)capsule
;
68 PyCapsule_IsValid(PyObject
*o
, const char *name
)
70 PyCapsule
*capsule
= (PyCapsule
*)o
;
72 return (capsule
!= NULL
&&
73 PyCapsule_CheckExact(capsule
) &&
74 capsule
->pointer
!= NULL
&&
75 name_matches(capsule
->name
, name
));
80 PyCapsule_GetPointer(PyObject
*o
, const char *name
)
82 PyCapsule
*capsule
= (PyCapsule
*)o
;
84 if (!is_legal_capsule(capsule
, "PyCapsule_GetPointer")) {
88 if (!name_matches(name
, capsule
->name
)) {
89 PyErr_SetString(PyExc_ValueError
, "PyCapsule_GetPointer called with incorrect name");
93 return capsule
->pointer
;
98 PyCapsule_GetName(PyObject
*o
)
100 PyCapsule
*capsule
= (PyCapsule
*)o
;
102 if (!is_legal_capsule(capsule
, "PyCapsule_GetName")) {
105 return capsule
->name
;
110 PyCapsule_GetDestructor(PyObject
*o
)
112 PyCapsule
*capsule
= (PyCapsule
*)o
;
114 if (!is_legal_capsule(capsule
, "PyCapsule_GetDestructor")) {
117 return capsule
->destructor
;
122 PyCapsule_GetContext(PyObject
*o
)
124 PyCapsule
*capsule
= (PyCapsule
*)o
;
126 if (!is_legal_capsule(capsule
, "PyCapsule_GetContext")) {
129 return capsule
->context
;
134 PyCapsule_SetPointer(PyObject
*o
, void *pointer
)
136 PyCapsule
*capsule
= (PyCapsule
*)o
;
139 PyErr_SetString(PyExc_ValueError
, "PyCapsule_SetPointer called with null pointer");
143 if (!is_legal_capsule(capsule
, "PyCapsule_SetPointer")) {
147 capsule
->pointer
= pointer
;
153 PyCapsule_SetName(PyObject
*o
, const char *name
)
155 PyCapsule
*capsule
= (PyCapsule
*)o
;
157 if (!is_legal_capsule(capsule
, "PyCapsule_SetName")) {
161 capsule
->name
= name
;
167 PyCapsule_SetDestructor(PyObject
*o
, PyCapsule_Destructor destructor
)
169 PyCapsule
*capsule
= (PyCapsule
*)o
;
171 if (!is_legal_capsule(capsule
, "PyCapsule_SetDestructor")) {
175 capsule
->destructor
= destructor
;
181 PyCapsule_SetContext(PyObject
*o
, void *context
)
183 PyCapsule
*capsule
= (PyCapsule
*)o
;
185 if (!is_legal_capsule(capsule
, "PyCapsule_SetContext")) {
189 capsule
->context
= context
;
195 PyCapsule_Import(const char *name
, int no_block
)
197 PyObject
*object
= NULL
;
198 void *return_value
= NULL
;
200 size_t name_length
= (strlen(name
) + 1) * sizeof(char);
201 char *name_dup
= (char *)PyMem_MALLOC(name_length
);
207 memcpy(name_dup
, name
, name_length
);
211 char *dot
= strchr(trace
, '.');
216 if (object
== NULL
) {
218 object
= PyImport_ImportModuleNoBlock(trace
);
220 object
= PyImport_ImportModule(trace
);
222 PyErr_Format(PyExc_ImportError
, "PyCapsule_Import could not import module \"%s\"", trace
);
226 PyObject
*object2
= PyObject_GetAttrString(object
, trace
);
237 /* compare attribute name to module.name by hand */
238 if (PyCapsule_IsValid(object
, name
)) {
239 PyCapsule
*capsule
= (PyCapsule
*)object
;
240 return_value
= capsule
->pointer
;
242 PyErr_Format(PyExc_AttributeError
,
243 "PyCapsule_Import \"%s\" is not valid",
250 PyMem_FREE(name_dup
);
257 capsule_dealloc(PyObject
*o
)
259 PyCapsule
*capsule
= (PyCapsule
*)o
;
260 if (capsule
->destructor
) {
261 capsule
->destructor(o
);
268 capsule_repr(PyObject
*o
)
270 PyCapsule
*capsule
= (PyCapsule
*)o
;
276 name
= capsule
->name
;
282 return PyString_FromFormat("<capsule object %s%s%s at %p>",
283 quote
, name
, quote
, capsule
);
288 PyDoc_STRVAR(PyCapsule_Type__doc__
,
289 "Capsule objects let you wrap a C \"void *\" pointer in a Python\n\
290 object. They're a way of passing data through the Python interpreter\n\
291 without creating your own custom type.\n\
293 Capsules are used for communication between extension modules.\n\
294 They provide a way for an extension module to export a C interface\n\
295 to other extension modules, so that extension modules can use the\n\
296 Python import mechanism to link to one another.\n\
299 PyTypeObject PyCapsule_Type
= {
300 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
301 "PyCapsule", /*tp_name*/
302 sizeof(PyCapsule
), /*tp_basicsize*/
305 capsule_dealloc
, /*tp_dealloc*/
310 capsule_repr
, /*tp_repr*/
312 0, /*tp_as_sequence*/
321 PyCapsule_Type__doc__
/*tp_doc*/