blob: b06ba8ae46b08f6bb03095f44821def90e08c63d [file] [log] [blame]
Georg Brandlca9400f2010-07-31 09:37:03 +00001#if defined (__SVR4) && defined (__sun)
2# include <alloca.h>
3#endif
4
Thomas Hellerd4c93202006-03-08 19:35:11 +00005#ifndef MS_WIN32
6#define max(a, b) ((a) > (b) ? (a) : (b))
7#define min(a, b) ((a) < (b) ? (a) : (b))
8
9#define PARAMFLAG_FIN 0x1
10#define PARAMFLAG_FOUT 0x2
11#define PARAMFLAG_FLCID 0x4
12#endif
13
Thomas Wouters00ee7ba2006-08-21 19:07:27 +000014typedef struct tagPyCArgObject PyCArgObject;
Thomas Hellerd4c93202006-03-08 19:35:11 +000015typedef struct tagCDataObject CDataObject;
Guido van Rossumcd16bf62007-06-13 18:07:49 +000016typedef PyObject *(* GETFUNC)(void *, Py_ssize_t size);
17typedef PyObject *(* SETFUNC)(void *, PyObject *value, Py_ssize_t size);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +000018typedef PyCArgObject *(* PARAMFUNC)(CDataObject *obj);
Thomas Hellerd4c93202006-03-08 19:35:11 +000019
20/* A default buffer in CDataObject, which can be used for small C types. If
21this buffer is too small, PyMem_Malloc will be called to create a larger one,
22and this one is not used.
23
24Making CDataObject a variable size object would be a better solution, but more
Thomas Heller34596a92009-04-24 20:50:00 +000025difficult in the presence of PyCFuncPtrObject. Maybe later.
Thomas Hellerd4c93202006-03-08 19:35:11 +000026*/
27union value {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000028 char c[16];
29 short s;
30 int i;
31 long l;
32 float f;
33 double d;
Thomas Hellerd4c93202006-03-08 19:35:11 +000034#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 PY_LONG_LONG ll;
Thomas Hellerd4c93202006-03-08 19:35:11 +000036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 long double D;
Thomas Hellerd4c93202006-03-08 19:35:11 +000038};
39
40/*
41 Hm. Are there CDataObject's which do not need the b_objects member? In
42 this case we probably should introduce b_flags to mark it as present... If
43 b_objects is not present/unused b_length is unneeded as well.
44*/
45
46struct tagCDataObject {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 PyObject_HEAD
48 char *b_ptr; /* pointer to memory block */
49 int b_needsfree; /* need _we_ free the memory? */
50 CDataObject *b_base; /* pointer to base object or NULL */
51 Py_ssize_t b_size; /* size of memory block in bytes */
52 Py_ssize_t b_length; /* number of references we need */
53 Py_ssize_t b_index; /* index of this object into base's
54 b_object list */
55 PyObject *b_objects; /* dictionary of references we need to keep, or Py_None */
56 union value b_value;
Thomas Hellerd4c93202006-03-08 19:35:11 +000057};
58
59typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 PyObject_VAR_HEAD
Thomas Heller864cc672010-08-08 17:58:53 +000061 ffi_closure *pcl_write; /* the C callable, writeable */
62 void *pcl_exec; /* the C callable, executable */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 ffi_cif cif;
64 int flags;
65 PyObject *converters;
66 PyObject *callable;
67 PyObject *restype;
68 SETFUNC setfunc;
69 ffi_type *ffi_restype;
70 ffi_type *atypes[1];
Thomas Hellere106dc32008-04-24 18:39:36 +000071} CThunkObject;
Thomas Heller34596a92009-04-24 20:50:00 +000072extern PyTypeObject PyCThunk_Type;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073#define CThunk_CheckExact(v) ((v)->ob_type == &PyCThunk_Type)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000074
75typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000076 /* First part identical to tagCDataObject */
77 PyObject_HEAD
78 char *b_ptr; /* pointer to memory block */
79 int b_needsfree; /* need _we_ free the memory? */
80 CDataObject *b_base; /* pointer to base object or NULL */
81 Py_ssize_t b_size; /* size of memory block in bytes */
82 Py_ssize_t b_length; /* number of references we need */
83 Py_ssize_t b_index; /* index of this object into base's
84 b_object list */
85 PyObject *b_objects; /* list of references we need to keep */
86 union value b_value;
87 /* end of tagCDataObject, additional fields follow */
Thomas Hellerd4c93202006-03-08 19:35:11 +000088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 CThunkObject *thunk;
90 PyObject *callable;
Thomas Hellerd4c93202006-03-08 19:35:11 +000091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 /* These two fields will override the ones in the type's stgdict if
93 they are set */
94 PyObject *converters;
95 PyObject *argtypes;
96 PyObject *restype;
97 PyObject *checker;
98 PyObject *errcheck;
Thomas Hellerd4c93202006-03-08 19:35:11 +000099#ifdef MS_WIN32
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 int index;
101 GUID *iid;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000102#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 PyObject *paramflags;
Thomas Heller34596a92009-04-24 20:50:00 +0000104} PyCFuncPtrObject;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000105
Thomas Heller34596a92009-04-24 20:50:00 +0000106extern PyTypeObject PyCStgDict_Type;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107#define PyCStgDict_CheckExact(v) ((v)->ob_type == &PyCStgDict_Type)
108#define PyCStgDict_Check(v) PyObject_TypeCheck(v, &PyCStgDict_Type)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000109
Thomas Heller34596a92009-04-24 20:50:00 +0000110extern int PyCStructUnionType_update_stgdict(PyObject *fields, PyObject *type, int isStruct);
Thomas Hellerfe8f8622006-03-14 19:53:09 +0000111extern int PyType_stginfo(PyTypeObject *self, Py_ssize_t *psize, Py_ssize_t *palign, Py_ssize_t *plength);
112extern int PyObject_stginfo(PyObject *self, Py_ssize_t *psize, Py_ssize_t *palign, Py_ssize_t *plength);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000113
114
115
Thomas Heller34596a92009-04-24 20:50:00 +0000116extern PyTypeObject PyCData_Type;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117#define CDataObject_CheckExact(v) ((v)->ob_type == &PyCData_Type)
118#define CDataObject_Check(v) PyObject_TypeCheck(v, &PyCData_Type)
Antoine Pitrou305e1a72012-12-08 11:05:50 +0100119#define _CDataObject_HasExternalBuffer(v) ((v)->b_ptr != (char *)&(v)->b_value)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000120
Thomas Heller34596a92009-04-24 20:50:00 +0000121extern PyTypeObject PyCSimpleType_Type;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122#define PyCSimpleTypeObject_CheckExact(v) ((v)->ob_type == &PyCSimpleType_Type)
123#define PyCSimpleTypeObject_Check(v) PyObject_TypeCheck(v, &PyCSimpleType_Type)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000124
Thomas Heller34596a92009-04-24 20:50:00 +0000125extern PyTypeObject PyCField_Type;
126extern struct fielddesc *_ctypes_get_fielddesc(const char *fmt);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000127
128
129extern PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +0000130PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 Py_ssize_t *pfield_size, int bitsize, int *pbitofs,
132 Py_ssize_t *psize, Py_ssize_t *poffset, Py_ssize_t *palign,
133 int pack, int is_big_endian);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000134
Thomas Heller34596a92009-04-24 20:50:00 +0000135extern PyObject *PyCData_AtAddress(PyObject *type, void *buf);
136extern PyObject *PyCData_FromBytes(PyObject *type, char *data, Py_ssize_t length);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000137
Thomas Heller34596a92009-04-24 20:50:00 +0000138extern PyTypeObject PyCArrayType_Type;
139extern PyTypeObject PyCArray_Type;
140extern PyTypeObject PyCPointerType_Type;
141extern PyTypeObject PyCPointer_Type;
142extern PyTypeObject PyCFuncPtr_Type;
143extern PyTypeObject PyCFuncPtrType_Type;
144extern PyTypeObject PyCStructType_Type;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146#define PyCArrayTypeObject_Check(v) PyObject_TypeCheck(v, &PyCArrayType_Type)
147#define ArrayObject_Check(v) PyObject_TypeCheck(v, &PyCArray_Type)
148#define PointerObject_Check(v) PyObject_TypeCheck(v, &PyCPointer_Type)
149#define PyCPointerTypeObject_Check(v) PyObject_TypeCheck(v, &PyCPointerType_Type)
150#define PyCFuncPtrObject_Check(v) PyObject_TypeCheck(v, &PyCFuncPtr_Type)
151#define PyCFuncPtrTypeObject_Check(v) PyObject_TypeCheck(v, &PyCFuncPtrType_Type)
152#define PyCStructTypeObject_Check(v) PyObject_TypeCheck(v, &PyCStructType_Type)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000153
154extern PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +0000155PyCArrayType_from_ctype(PyObject *itemtype, Py_ssize_t length);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000156
Thomas Heller34596a92009-04-24 20:50:00 +0000157extern PyMethodDef _ctypes_module_methods[];
Thomas Hellerd4c93202006-03-08 19:35:11 +0000158
Thomas Heller34596a92009-04-24 20:50:00 +0000159extern CThunkObject *_ctypes_alloc_callback(PyObject *callable,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 PyObject *converters,
161 PyObject *restype,
162 int flags);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000163/* a table entry describing a predefined ctypes type */
164struct fielddesc {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 char code;
166 SETFUNC setfunc;
167 GETFUNC getfunc;
168 ffi_type *pffi_type; /* always statically allocated */
169 SETFUNC setfunc_swapped;
170 GETFUNC getfunc_swapped;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000171};
172
173typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 PyObject_HEAD
175 Py_ssize_t offset;
176 Py_ssize_t size;
177 Py_ssize_t index; /* Index into CDataObject's
178 object array */
179 PyObject *proto; /* a type or NULL */
180 GETFUNC getfunc; /* getter function if proto is NULL */
181 SETFUNC setfunc; /* setter function if proto is NULL */
182 int anonymous;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000183} CFieldObject;
184
185/* A subclass of PyDictObject, used as the instance dictionary of ctypes
186 metatypes */
187typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 PyDictObject dict; /* first part identical to PyDictObject */
Thomas Hellerd4c93202006-03-08 19:35:11 +0000189/* The size and align fields are unneeded, they are in ffi_type as well. As
190 an experiment shows, it's trivial to get rid of them, the only thing to
Thomas Heller34596a92009-04-24 20:50:00 +0000191 remember is that in PyCArrayType_new the ffi_type fields must be filled in -
Thomas Hellerd4c93202006-03-08 19:35:11 +0000192 so far it was unneeded because libffi doesn't support arrays at all
193 (because they are passed as pointers to function calls anyway). But it's
Berker Peksag4882cac2015-04-14 09:30:01 +0300194 too much risk to change that now, and there are other fields which doesn't
Thomas Hellerd4c93202006-03-08 19:35:11 +0000195 belong into this structure anyway. Maybe in ctypes 2.0... (ctypes 2000?)
196*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 Py_ssize_t size; /* number of bytes */
198 Py_ssize_t align; /* alignment requirements */
199 Py_ssize_t length; /* number of fields */
200 ffi_type ffi_type_pointer;
201 PyObject *proto; /* Only for Pointer/ArrayObject */
202 SETFUNC setfunc; /* Only for simple objects */
203 GETFUNC getfunc; /* Only for simple objects */
204 PARAMFUNC paramfunc;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 /* Following fields only used by PyCFuncPtrType_Type instances */
207 PyObject *argtypes; /* tuple of CDataObjects */
208 PyObject *converters; /* tuple([t.from_param for t in argtypes]) */
209 PyObject *restype; /* CDataObject or NULL */
210 PyObject *checker;
211 int flags; /* calling convention and such */
Thomas Hellerb041fda2008-04-30 17:11:46 +0000212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 /* pep3118 fields, pointers neeed PyMem_Free */
214 char *format;
215 int ndim;
216 Py_ssize_t *shape;
217/* Py_ssize_t *strides; */ /* unused in ctypes */
218/* Py_ssize_t *suboffsets; */ /* unused in ctypes */
Thomas Hellerb041fda2008-04-30 17:11:46 +0000219
Thomas Hellerd4c93202006-03-08 19:35:11 +0000220} StgDictObject;
221
222/****************************************************************
223 StgDictObject fields
224
225 setfunc and getfunc is only set for simple data types, it is copied from the
226 corresponding fielddesc entry. These are functions to set and get the value
227 in a memory block.
228 They should probably by used by other types as well.
229
230 proto is only used for Pointer and Array types - it points to the item type
231 object.
232
233 Probably all the magic ctypes methods (like from_param) should have C
234 callable wrappers in the StgDictObject. For simple data type, for example,
235 the fielddesc table could have entries for C codec from_param functions or
236 other methods as well, if a subtype overrides this method in Python at
237 construction time, or assigns to it later, tp_setattro should update the
238 StgDictObject function to a generic one.
239
Thomas Heller34596a92009-04-24 20:50:00 +0000240 Currently, PyCFuncPtr types have 'converters' and 'checker' entries in their
Thomas Hellerd4c93202006-03-08 19:35:11 +0000241 type dict. They are only used to cache attributes from other entries, whihc
242 is wrong.
243
244 One use case is the .value attribute that all simple types have. But some
245 complex structures, like VARIANT, represent a single value also, and should
246 have this attribute.
247
248 Another use case is a _check_retval_ function, which is called when a ctypes
249 type is used as return type of a function to validate and compute the return
250 value.
251
252 Common ctypes protocol:
253
254 - setfunc: store a python value in a memory block
255 - getfunc: convert data from a memory block into a python value
256
257 - checkfunc: validate and convert a return value from a function call
258 - toparamfunc: convert a python value into a function argument
259
260*****************************************************************/
261
262/* May return NULL, but does not set an exception! */
263extern StgDictObject *PyType_stgdict(PyObject *obj);
264
265/* May return NULL, but does not set an exception! */
266extern StgDictObject *PyObject_stgdict(PyObject *self);
267
Thomas Heller34596a92009-04-24 20:50:00 +0000268extern int PyCStgDict_clone(StgDictObject *src, StgDictObject *dst);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000269
270typedef int(* PPROC)(void);
271
Thomas Heller34596a92009-04-24 20:50:00 +0000272PyObject *_ctypes_callproc(PPROC pProc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 PyObject *arguments,
Thomas Hellerd4c93202006-03-08 19:35:11 +0000274#ifdef MS_WIN32
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 IUnknown *pIUnk,
276 GUID *iid,
Thomas Hellerd4c93202006-03-08 19:35:11 +0000277#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278 int flags,
279 PyObject *argtypes,
280 PyObject *restype,
281 PyObject *checker);
282
Thomas Hellerd4c93202006-03-08 19:35:11 +0000283
284#define FUNCFLAG_STDCALL 0x0
285#define FUNCFLAG_CDECL 0x1
286#define FUNCFLAG_HRESULT 0x2
287#define FUNCFLAG_PYTHONAPI 0x4
Thomas Heller9cac7b62008-06-06 09:31:40 +0000288#define FUNCFLAG_USE_ERRNO 0x8
289#define FUNCFLAG_USE_LASTERROR 0x10
Thomas Hellerd4c93202006-03-08 19:35:11 +0000290
Thomas Heller13394e92008-02-13 20:40:44 +0000291#define TYPEFLAG_ISPOINTER 0x100
292#define TYPEFLAG_HASPOINTER 0x200
293
Thomas Hellerd4c93202006-03-08 19:35:11 +0000294#define DICTFLAG_FINAL 0x1000
295
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000296struct tagPyCArgObject {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 PyObject_HEAD
298 ffi_type *pffi_type;
299 char tag;
300 union {
301 char c;
302 char b;
303 short h;
304 int i;
305 long l;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000306#ifdef HAVE_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 PY_LONG_LONG q;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000308#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 long double D;
310 double d;
311 float f;
312 void *p;
313 } value;
314 PyObject *obj;
315 Py_ssize_t size; /* for the 'V' tag */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000316};
Thomas Hellerd4c93202006-03-08 19:35:11 +0000317
318extern PyTypeObject PyCArg_Type;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319#define PyCArg_CheckExact(v) ((v)->ob_type == &PyCArg_Type)
Thomas Heller34596a92009-04-24 20:50:00 +0000320extern PyCArgObject *PyCArgObject_new(void);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000321
322extern PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +0000323PyCData_get(PyObject *type, GETFUNC getfunc, PyObject *src,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 Py_ssize_t index, Py_ssize_t size, char *ptr);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000325
326extern int
Thomas Heller34596a92009-04-24 20:50:00 +0000327PyCData_set(PyObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 Py_ssize_t index, Py_ssize_t size, char *ptr);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000329
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200330extern void _ctypes_extend_error(PyObject *exc_class, const char *fmt, ...);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000331
332struct basespec {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 CDataObject *base;
334 Py_ssize_t index;
335 char *adr;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000336};
337
338extern char basespec_string[];
339
Thomas Heller34596a92009-04-24 20:50:00 +0000340extern ffi_type *_ctypes_get_ffi_type(PyObject *obj);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000341
342/* exception classes */
343extern PyObject *PyExc_ArgError;
344
Thomas Heller34596a92009-04-24 20:50:00 +0000345extern char *_ctypes_conversion_encoding;
346extern char *_ctypes_conversion_errors;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000347
Thomas Heller5fa3f052007-07-12 11:00:22 +0000348#if defined(HAVE_WCHAR_H)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000349# define CTYPES_UNICODE
350#endif
351
352
Thomas Heller34596a92009-04-24 20:50:00 +0000353extern void _ctypes_free_closure(void *);
354extern void *_ctypes_alloc_closure(void);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000355
Thomas Heller34596a92009-04-24 20:50:00 +0000356extern PyObject *PyCData_FromBaseObj(PyObject *type, PyObject *base, Py_ssize_t index, char *adr);
357extern char *_ctypes_alloc_format_string(const char *prefix, const char *suffix);
Benjamin Peterson5eb6b392014-05-17 14:59:12 -0700358extern char *_ctypes_alloc_format_string_with_shape(int ndim,
359 const Py_ssize_t *shape,
360 const char *prefix, const char *suffix);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000361
Thomas Heller34596a92009-04-24 20:50:00 +0000362extern int _ctypes_simple_instance(PyObject *obj);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000363
Thomas Heller34596a92009-04-24 20:50:00 +0000364extern PyObject *_ctypes_ptrtype_cache;
365PyObject *_ctypes_get_errobj(int **pspace);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000366
367#ifdef MS_WIN32
368extern PyObject *ComError;
369#endif
370
371/*
372 Local Variables:
373 compile-command: "python setup.py -q build install --home ~"
374 End:
375*/