(root)/
Python-3.11.7/
Modules/
_ctypes/
ctypes.h
       1  #if defined (__SVR4) && defined (__sun)
       2  #   include <alloca.h>
       3  #endif
       4  
       5  #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  
      14  /*
      15   * bpo-13097: Max number of arguments CFuncPtr._argtypes_ and
      16   * _ctypes_callproc() will accept.
      17   *
      18   * This limit is enforced for the `alloca()` call in `_ctypes_callproc`,
      19   * to avoid allocating a massive buffer on the stack.
      20   */
      21  #ifndef CTYPES_MAX_ARGCOUNT
      22    #ifdef __EMSCRIPTEN__
      23      #define CTYPES_MAX_ARGCOUNT 1000
      24    #else
      25      #define CTYPES_MAX_ARGCOUNT 1024
      26    #endif
      27  #endif
      28  
      29  #if defined(__has_builtin)
      30  #if __has_builtin(__builtin_available)
      31  #define HAVE_BUILTIN_AVAILABLE 1
      32  #endif
      33  #endif
      34  
      35  typedef struct tagPyCArgObject PyCArgObject;
      36  typedef struct tagCDataObject CDataObject;
      37  typedef PyObject *(* GETFUNC)(void *, Py_ssize_t size);
      38  typedef PyObject *(* SETFUNC)(void *, PyObject *value, Py_ssize_t size);
      39  typedef PyCArgObject *(* PARAMFUNC)(CDataObject *obj);
      40  
      41  /* A default buffer in CDataObject, which can be used for small C types.  If
      42  this buffer is too small, PyMem_Malloc will be called to create a larger one,
      43  and this one is not used.
      44  
      45  Making CDataObject a variable size object would be a better solution, but more
      46  difficult in the presence of PyCFuncPtrObject.  Maybe later.
      47  */
      48  union value {
      49                  char c[16];
      50                  short s;
      51                  int i;
      52                  long l;
      53                  float f;
      54                  double d;
      55                  long long ll;
      56                  long double D;
      57  };
      58  
      59  /*
      60    Hm. Are there CDataObject's which do not need the b_objects member?  In
      61    this case we probably should introduce b_flags to mark it as present...  If
      62    b_objects is not present/unused b_length is unneeded as well.
      63  */
      64  
      65  struct tagCDataObject {
      66      PyObject_HEAD
      67      char *b_ptr;                /* pointer to memory block */
      68      int  b_needsfree;           /* need _we_ free the memory? */
      69      CDataObject *b_base;        /* pointer to base object or NULL */
      70      Py_ssize_t b_size;          /* size of memory block in bytes */
      71      Py_ssize_t b_length;        /* number of references we need */
      72      Py_ssize_t b_index;         /* index of this object into base's
      73                                 b_object list */
      74      PyObject *b_objects;        /* dictionary of references we need to keep, or Py_None */
      75      union value b_value;
      76  };
      77  
      78  typedef struct {
      79      PyObject_VAR_HEAD
      80      ffi_closure *pcl_write; /* the C callable, writeable */
      81      void *pcl_exec;         /* the C callable, executable */
      82      ffi_cif cif;
      83      int flags;
      84      PyObject *converters;
      85      PyObject *callable;
      86      PyObject *restype;
      87      SETFUNC setfunc;
      88      ffi_type *ffi_restype;
      89      ffi_type *atypes[1];
      90  } CThunkObject;
      91  extern PyTypeObject PyCThunk_Type;
      92  #define CThunk_CheckExact(v)        Py_IS_TYPE(v, &PyCThunk_Type)
      93  
      94  typedef struct {
      95      /* First part identical to tagCDataObject */
      96      PyObject_HEAD
      97      char *b_ptr;                /* pointer to memory block */
      98      int  b_needsfree;           /* need _we_ free the memory? */
      99      CDataObject *b_base;        /* pointer to base object or NULL */
     100      Py_ssize_t b_size;          /* size of memory block in bytes */
     101      Py_ssize_t b_length;        /* number of references we need */
     102      Py_ssize_t b_index;         /* index of this object into base's
     103                                 b_object list */
     104      PyObject *b_objects;        /* list of references we need to keep */
     105      union value b_value;
     106      /* end of tagCDataObject, additional fields follow */
     107  
     108      CThunkObject *thunk;
     109      PyObject *callable;
     110  
     111      /* These two fields will override the ones in the type's stgdict if
     112         they are set */
     113      PyObject *converters;
     114      PyObject *argtypes;
     115      PyObject *restype;
     116      PyObject *checker;
     117      PyObject *errcheck;
     118  #ifdef MS_WIN32
     119      int index;
     120      GUID *iid;
     121  #endif
     122      PyObject *paramflags;
     123  } PyCFuncPtrObject;
     124  
     125  extern PyTypeObject PyCStgDict_Type;
     126  #define PyCStgDict_CheckExact(v)            Py_IS_TYPE(v, &PyCStgDict_Type)
     127  #define PyCStgDict_Check(v)         PyObject_TypeCheck(v, &PyCStgDict_Type)
     128  
     129  extern int PyCStructUnionType_update_stgdict(PyObject *fields, PyObject *type, int isStruct);
     130  extern int PyType_stginfo(PyTypeObject *self, Py_ssize_t *psize, Py_ssize_t *palign, Py_ssize_t *plength);
     131  extern int PyObject_stginfo(PyObject *self, Py_ssize_t *psize, Py_ssize_t *palign, Py_ssize_t *plength);
     132  
     133  
     134  
     135  extern PyTypeObject PyCData_Type;
     136  #define CDataObject_CheckExact(v)       Py_IS_TYPE(v, &PyCData_Type)
     137  #define CDataObject_Check(v)            PyObject_TypeCheck(v, &PyCData_Type)
     138  #define _CDataObject_HasExternalBuffer(v)  ((v)->b_ptr != (char *)&(v)->b_value)
     139  
     140  extern PyTypeObject PyCSimpleType_Type;
     141  #define PyCSimpleTypeObject_CheckExact(v)       Py_IS_TYPE(v, &PyCSimpleType_Type)
     142  #define PyCSimpleTypeObject_Check(v)    PyObject_TypeCheck(v, &PyCSimpleType_Type)
     143  
     144  extern PyTypeObject PyCField_Type;
     145  extern struct fielddesc *_ctypes_get_fielddesc(const char *fmt);
     146  
     147  
     148  extern PyObject *
     149  PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
     150                  Py_ssize_t *pfield_size, int bitsize, int *pbitofs,
     151                  Py_ssize_t *psize, Py_ssize_t *poffset, Py_ssize_t *palign,
     152                  int pack, int is_big_endian);
     153  
     154  extern PyObject *PyCData_AtAddress(PyObject *type, void *buf);
     155  extern PyObject *PyCData_FromBytes(PyObject *type, char *data, Py_ssize_t length);
     156  
     157  extern PyTypeObject PyCArrayType_Type;
     158  extern PyTypeObject PyCArray_Type;
     159  extern PyTypeObject PyCPointerType_Type;
     160  extern PyTypeObject PyCPointer_Type;
     161  extern PyTypeObject PyCFuncPtr_Type;
     162  extern PyTypeObject PyCFuncPtrType_Type;
     163  extern PyTypeObject PyCStructType_Type;
     164  
     165  #define PyCArrayTypeObject_Check(v)     PyObject_TypeCheck(v, &PyCArrayType_Type)
     166  #define ArrayObject_Check(v)            PyObject_TypeCheck(v, &PyCArray_Type)
     167  #define PointerObject_Check(v)          PyObject_TypeCheck(v, &PyCPointer_Type)
     168  #define PyCPointerTypeObject_Check(v)   PyObject_TypeCheck(v, &PyCPointerType_Type)
     169  #define PyCFuncPtrObject_Check(v)               PyObject_TypeCheck(v, &PyCFuncPtr_Type)
     170  #define PyCFuncPtrTypeObject_Check(v)   PyObject_TypeCheck(v, &PyCFuncPtrType_Type)
     171  #define PyCStructTypeObject_Check(v)    PyObject_TypeCheck(v, &PyCStructType_Type)
     172  
     173  extern PyObject *
     174  PyCArrayType_from_ctype(PyObject *itemtype, Py_ssize_t length);
     175  
     176  extern PyMethodDef _ctypes_module_methods[];
     177  
     178  extern CThunkObject *_ctypes_alloc_callback(PyObject *callable,
     179                                             PyObject *converters,
     180                                             PyObject *restype,
     181                                             int flags);
     182  /* a table entry describing a predefined ctypes type */
     183  struct fielddesc {
     184      char code;
     185      SETFUNC setfunc;
     186      GETFUNC getfunc;
     187      ffi_type *pffi_type; /* always statically allocated */
     188      SETFUNC setfunc_swapped;
     189      GETFUNC getfunc_swapped;
     190  };
     191  
     192  typedef struct {
     193      PyObject_HEAD
     194      Py_ssize_t offset;
     195      Py_ssize_t size;
     196      Py_ssize_t index;                   /* Index into CDataObject's
     197                                         object array */
     198      PyObject *proto;                    /* a type or NULL */
     199      GETFUNC getfunc;                    /* getter function if proto is NULL */
     200      SETFUNC setfunc;                    /* setter function if proto is NULL */
     201      int anonymous;
     202  } CFieldObject;
     203  
     204  /* A subclass of PyDictObject, used as the instance dictionary of ctypes
     205     metatypes */
     206  typedef struct {
     207      PyDictObject dict;          /* first part identical to PyDictObject */
     208  /* The size and align fields are unneeded, they are in ffi_type as well.  As
     209     an experiment shows, it's trivial to get rid of them, the only thing to
     210     remember is that in PyCArrayType_new the ffi_type fields must be filled in -
     211     so far it was unneeded because libffi doesn't support arrays at all
     212     (because they are passed as pointers to function calls anyway).  But it's
     213     too much risk to change that now, and there are other fields which doesn't
     214     belong into this structure anyway.  Maybe in ctypes 2.0... (ctypes 2000?)
     215  */
     216      Py_ssize_t size;            /* number of bytes */
     217      Py_ssize_t align;           /* alignment requirements */
     218      Py_ssize_t length;          /* number of fields */
     219      ffi_type ffi_type_pointer;
     220      PyObject *proto;            /* Only for Pointer/ArrayObject */
     221      SETFUNC setfunc;            /* Only for simple objects */
     222      GETFUNC getfunc;            /* Only for simple objects */
     223      PARAMFUNC paramfunc;
     224  
     225      /* Following fields only used by PyCFuncPtrType_Type instances */
     226      PyObject *argtypes;         /* tuple of CDataObjects */
     227      PyObject *converters;       /* tuple([t.from_param for t in argtypes]) */
     228      PyObject *restype;          /* CDataObject or NULL */
     229      PyObject *checker;
     230      int flags;                  /* calling convention and such */
     231  
     232      /* pep3118 fields, pointers need PyMem_Free */
     233      char *format;
     234      int ndim;
     235      Py_ssize_t *shape;
     236  /*      Py_ssize_t *strides;    */ /* unused in ctypes */
     237  /*      Py_ssize_t *suboffsets; */ /* unused in ctypes */
     238  
     239  } StgDictObject;
     240  
     241  /****************************************************************
     242   StgDictObject fields
     243  
     244   setfunc and getfunc is only set for simple data types, it is copied from the
     245   corresponding fielddesc entry.  These are functions to set and get the value
     246   in a memory block.
     247   They should probably by used by other types as well.
     248  
     249   proto is only used for Pointer and Array types - it points to the item type
     250   object.
     251  
     252   Probably all the magic ctypes methods (like from_param) should have C
     253   callable wrappers in the StgDictObject.  For simple data type, for example,
     254   the fielddesc table could have entries for C codec from_param functions or
     255   other methods as well, if a subtype overrides this method in Python at
     256   construction time, or assigns to it later, tp_setattro should update the
     257   StgDictObject function to a generic one.
     258  
     259   Currently, PyCFuncPtr types have 'converters' and 'checker' entries in their
     260   type dict.  They are only used to cache attributes from other entries, which
     261   is wrong.
     262  
     263   One use case is the .value attribute that all simple types have.  But some
     264   complex structures, like VARIANT, represent a single value also, and should
     265   have this attribute.
     266  
     267   Another use case is a _check_retval_ function, which is called when a ctypes
     268   type is used as return type of a function to validate and compute the return
     269   value.
     270  
     271   Common ctypes protocol:
     272  
     273    - setfunc: store a python value in a memory block
     274    - getfunc: convert data from a memory block into a python value
     275  
     276    - checkfunc: validate and convert a return value from a function call
     277    - toparamfunc: convert a python value into a function argument
     278  
     279  *****************************************************************/
     280  
     281  /* May return NULL, but does not set an exception! */
     282  extern StgDictObject *PyType_stgdict(PyObject *obj);
     283  
     284  /* May return NULL, but does not set an exception! */
     285  extern StgDictObject *PyObject_stgdict(PyObject *self);
     286  
     287  extern int PyCStgDict_clone(StgDictObject *src, StgDictObject *dst);
     288  
     289  typedef int(* PPROC)(void);
     290  
     291  PyObject *_ctypes_callproc(PPROC pProc,
     292                      PyObject *arguments,
     293  #ifdef MS_WIN32
     294                      IUnknown *pIUnk,
     295                      GUID *iid,
     296  #endif
     297                      int flags,
     298                      PyObject *argtypes,
     299                      PyObject *restype,
     300                      PyObject *checker);
     301  
     302  
     303  #define FUNCFLAG_STDCALL 0x0
     304  #define FUNCFLAG_CDECL   0x1
     305  #define FUNCFLAG_HRESULT 0x2
     306  #define FUNCFLAG_PYTHONAPI 0x4
     307  #define FUNCFLAG_USE_ERRNO 0x8
     308  #define FUNCFLAG_USE_LASTERROR 0x10
     309  
     310  #define TYPEFLAG_ISPOINTER 0x100
     311  #define TYPEFLAG_HASPOINTER 0x200
     312  #define TYPEFLAG_HASUNION 0x400
     313  #define TYPEFLAG_HASBITFIELD 0x800
     314  
     315  #define DICTFLAG_FINAL 0x1000
     316  
     317  struct tagPyCArgObject {
     318      PyObject_HEAD
     319      ffi_type *pffi_type;
     320      char tag;
     321      union {
     322          char c;
     323          char b;
     324          short h;
     325          int i;
     326          long l;
     327          long long q;
     328          long double D;
     329          double d;
     330          float f;
     331          void *p;
     332      } value;
     333      PyObject *obj;
     334      Py_ssize_t size; /* for the 'V' tag */
     335  };
     336  
     337  extern PyTypeObject PyCArg_Type;
     338  #define PyCArg_CheckExact(v)        Py_IS_TYPE(v, &PyCArg_Type)
     339  extern PyCArgObject *PyCArgObject_new(void);
     340  
     341  extern PyObject *
     342  PyCData_get(PyObject *type, GETFUNC getfunc, PyObject *src,
     343            Py_ssize_t index, Py_ssize_t size, char *ptr);
     344  
     345  extern int
     346  PyCData_set(PyObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value,
     347            Py_ssize_t index, Py_ssize_t size, char *ptr);
     348  
     349  extern void _ctypes_extend_error(PyObject *exc_class, const char *fmt, ...);
     350  
     351  struct basespec {
     352      CDataObject *base;
     353      Py_ssize_t index;
     354      char *adr;
     355  };
     356  
     357  extern char basespec_string[];
     358  
     359  extern ffi_type *_ctypes_get_ffi_type(PyObject *obj);
     360  
     361  /* exception classes */
     362  extern PyObject *PyExc_ArgError;
     363  
     364  extern char *_ctypes_conversion_encoding;
     365  extern char *_ctypes_conversion_errors;
     366  
     367  
     368  extern void _ctypes_free_closure(void *);
     369  extern void *_ctypes_alloc_closure(void);
     370  
     371  extern PyObject *PyCData_FromBaseObj(PyObject *type, PyObject *base, Py_ssize_t index, char *adr);
     372  extern char *_ctypes_alloc_format_string(const char *prefix, const char *suffix);
     373  extern char *_ctypes_alloc_format_string_with_shape(int ndim,
     374                                                  const Py_ssize_t *shape,
     375                                                  const char *prefix, const char *suffix);
     376  
     377  extern int _ctypes_simple_instance(PyObject *obj);
     378  
     379  extern PyObject *_ctypes_ptrtype_cache;
     380  PyObject *_ctypes_get_errobj(int **pspace);
     381  
     382  #ifdef MS_WIN32
     383  extern PyObject *ComError;
     384  #endif
     385  
     386  #ifdef USING_MALLOC_CLOSURE_DOT_C
     387  void Py_ffi_closure_free(void *p);
     388  void *Py_ffi_closure_alloc(size_t size, void** codeloc);
     389  #else
     390  #define Py_ffi_closure_free ffi_closure_free
     391  #define Py_ffi_closure_alloc ffi_closure_alloc
     392  #endif
     393  
     394  /*
     395   Local Variables:
     396   compile-command: "python setup.py -q build install --home ~"
     397   End:
     398  */