• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef Py_BUILD_CORE_BUILTIN
2 #  define Py_BUILD_CORE_MODULE 1
3 #endif
4 
5 #include "Python.h"
6 // windows.h must be included before pycore internal headers
7 #ifdef MS_WIN32
8 #  include <windows.h>
9 #endif
10 
11 #include "pycore_bitutils.h"      // _Py_bswap32()
12 #include "pycore_call.h"          // _PyObject_CallNoArgs()
13 
14 #include <ffi.h>
15 #include "ctypes.h"
16 
17 
18 #define CTYPES_CFIELD_CAPSULE_NAME_PYMEM "_ctypes/cfield.c pymem"
19 
pymem_destructor(PyObject * ptr)20 static void pymem_destructor(PyObject *ptr)
21 {
22     void *p = PyCapsule_GetPointer(ptr, CTYPES_CFIELD_CAPSULE_NAME_PYMEM);
23     if (p) {
24         PyMem_Free(p);
25     }
26 }
27 
28 
29 /******************************************************************/
30 /*
31   PyCField_Type
32 */
33 
34 /*
35  * Expects the size, index and offset for the current field in *psize and
36  * *poffset, stores the total size so far in *psize, the offset for the next
37  * field in *poffset, the alignment requirements for the current field in
38  * *palign, and returns a field descriptor for this field.
39  */
40 /*
41  * bitfields extension:
42  * bitsize != 0: this is a bit field.
43  * pbitofs points to the current bit offset, this will be updated.
44  * prev_desc points to the type of the previous bitfield, if any.
45  */
46 PyObject *
PyCField_FromDesc(PyObject * desc,Py_ssize_t index,Py_ssize_t * pfield_size,int bitsize,int * pbitofs,Py_ssize_t * psize,Py_ssize_t * poffset,Py_ssize_t * palign,int pack,int big_endian)47 PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
48                 Py_ssize_t *pfield_size, int bitsize, int *pbitofs,
49                 Py_ssize_t *psize, Py_ssize_t *poffset, Py_ssize_t *palign,
50                 int pack, int big_endian)
51 {
52     CFieldObject *self;
53     PyObject *proto;
54     Py_ssize_t size, align;
55     SETFUNC setfunc = NULL;
56     GETFUNC getfunc = NULL;
57     StgDictObject *dict;
58     int fieldtype;
59 #define NO_BITFIELD 0
60 #define NEW_BITFIELD 1
61 #define CONT_BITFIELD 2
62 #define EXPAND_BITFIELD 3
63 
64     self = (CFieldObject *)PyCField_Type.tp_alloc((PyTypeObject *)&PyCField_Type, 0);
65     if (self == NULL)
66         return NULL;
67     dict = PyType_stgdict(desc);
68     if (!dict) {
69         PyErr_SetString(PyExc_TypeError,
70                         "has no _stginfo_");
71         Py_DECREF(self);
72         return NULL;
73     }
74     if (bitsize /* this is a bitfield request */
75         && *pfield_size /* we have a bitfield open */
76 #ifdef MS_WIN32
77         /* MSVC, GCC with -mms-bitfields */
78         && dict->size * 8 == *pfield_size
79 #else
80         /* GCC */
81         && dict->size * 8 <= *pfield_size
82 #endif
83         && (*pbitofs + bitsize) <= *pfield_size) {
84         /* continue bit field */
85         fieldtype = CONT_BITFIELD;
86 #ifndef MS_WIN32
87     } else if (bitsize /* this is a bitfield request */
88         && *pfield_size /* we have a bitfield open */
89         && dict->size * 8 >= *pfield_size
90         && (*pbitofs + bitsize) <= dict->size * 8) {
91         /* expand bit field */
92         fieldtype = EXPAND_BITFIELD;
93 #endif
94     } else if (bitsize) {
95         /* start new bitfield */
96         fieldtype = NEW_BITFIELD;
97         *pbitofs = 0;
98         *pfield_size = dict->size * 8;
99     } else {
100         /* not a bit field */
101         fieldtype = NO_BITFIELD;
102         *pbitofs = 0;
103         *pfield_size = 0;
104     }
105 
106     size = dict->size;
107     proto = desc;
108 
109     /*  Field descriptors for 'c_char * n' are be scpecial cased to
110         return a Python string instead of an Array object instance...
111     */
112     if (PyCArrayTypeObject_Check(proto)) {
113         StgDictObject *adict = PyType_stgdict(proto);
114         StgDictObject *idict;
115         if (adict && adict->proto) {
116             idict = PyType_stgdict(adict->proto);
117             if (!idict) {
118                 PyErr_SetString(PyExc_TypeError,
119                                 "has no _stginfo_");
120                 Py_DECREF(self);
121                 return NULL;
122             }
123             if (idict->getfunc == _ctypes_get_fielddesc("c")->getfunc) {
124                 struct fielddesc *fd = _ctypes_get_fielddesc("s");
125                 getfunc = fd->getfunc;
126                 setfunc = fd->setfunc;
127             }
128             if (idict->getfunc == _ctypes_get_fielddesc("u")->getfunc) {
129                 struct fielddesc *fd = _ctypes_get_fielddesc("U");
130                 getfunc = fd->getfunc;
131                 setfunc = fd->setfunc;
132             }
133         }
134     }
135 
136     self->setfunc = setfunc;
137     self->getfunc = getfunc;
138     self->index = index;
139 
140     Py_INCREF(proto);
141     self->proto = proto;
142 
143     switch (fieldtype) {
144     case NEW_BITFIELD:
145         if (big_endian)
146             self->size = (bitsize << 16) + *pfield_size - *pbitofs - bitsize;
147         else
148             self->size = (bitsize << 16) + *pbitofs;
149         *pbitofs = bitsize;
150         /* fall through */
151     case NO_BITFIELD:
152         if (pack)
153             align = min(pack, dict->align);
154         else
155             align = dict->align;
156         if (align && *poffset % align) {
157             Py_ssize_t delta = align - (*poffset % align);
158             *psize += delta;
159             *poffset += delta;
160         }
161 
162         if (bitsize == 0)
163             self->size = size;
164         *psize += size;
165 
166         self->offset = *poffset;
167         *poffset += size;
168 
169         *palign = align;
170         break;
171 
172     case EXPAND_BITFIELD:
173         *poffset += dict->size - *pfield_size/8;
174         *psize += dict->size - *pfield_size/8;
175 
176         *pfield_size = dict->size * 8;
177 
178         if (big_endian)
179             self->size = (bitsize << 16) + *pfield_size - *pbitofs - bitsize;
180         else
181             self->size = (bitsize << 16) + *pbitofs;
182 
183         self->offset = *poffset - size; /* poffset is already updated for the NEXT field */
184         *pbitofs += bitsize;
185         break;
186 
187     case CONT_BITFIELD:
188         if (big_endian)
189             self->size = (bitsize << 16) + *pfield_size - *pbitofs - bitsize;
190         else
191             self->size = (bitsize << 16) + *pbitofs;
192 
193         self->offset = *poffset - size; /* poffset is already updated for the NEXT field */
194         *pbitofs += bitsize;
195         break;
196     }
197 
198     return (PyObject *)self;
199 }
200 
201 static int
PyCField_set(CFieldObject * self,PyObject * inst,PyObject * value)202 PyCField_set(CFieldObject *self, PyObject *inst, PyObject *value)
203 {
204     CDataObject *dst;
205     char *ptr;
206     if (!CDataObject_Check(inst)) {
207         PyErr_SetString(PyExc_TypeError,
208                         "not a ctype instance");
209         return -1;
210     }
211     dst = (CDataObject *)inst;
212     ptr = dst->b_ptr + self->offset;
213     if (value == NULL) {
214         PyErr_SetString(PyExc_TypeError,
215                         "can't delete attribute");
216         return -1;
217     }
218     return PyCData_set(inst, self->proto, self->setfunc, value,
219                      self->index, self->size, ptr);
220 }
221 
222 static PyObject *
PyCField_get(CFieldObject * self,PyObject * inst,PyTypeObject * type)223 PyCField_get(CFieldObject *self, PyObject *inst, PyTypeObject *type)
224 {
225     CDataObject *src;
226     if (inst == NULL) {
227         Py_INCREF(self);
228         return (PyObject *)self;
229     }
230     if (!CDataObject_Check(inst)) {
231         PyErr_SetString(PyExc_TypeError,
232                         "not a ctype instance");
233         return NULL;
234     }
235     src = (CDataObject *)inst;
236     return PyCData_get(self->proto, self->getfunc, inst,
237                      self->index, self->size, src->b_ptr + self->offset);
238 }
239 
240 static PyObject *
PyCField_get_offset(PyObject * self,void * data)241 PyCField_get_offset(PyObject *self, void *data)
242 {
243     return PyLong_FromSsize_t(((CFieldObject *)self)->offset);
244 }
245 
246 static PyObject *
PyCField_get_size(PyObject * self,void * data)247 PyCField_get_size(PyObject *self, void *data)
248 {
249     return PyLong_FromSsize_t(((CFieldObject *)self)->size);
250 }
251 
252 static PyGetSetDef PyCField_getset[] = {
253     { "offset", PyCField_get_offset, NULL, "offset in bytes of this field" },
254     { "size", PyCField_get_size, NULL, "size in bytes of this field" },
255     { NULL, NULL, NULL, NULL },
256 };
257 
258 static int
PyCField_traverse(CFieldObject * self,visitproc visit,void * arg)259 PyCField_traverse(CFieldObject *self, visitproc visit, void *arg)
260 {
261     Py_VISIT(self->proto);
262     return 0;
263 }
264 
265 static int
PyCField_clear(CFieldObject * self)266 PyCField_clear(CFieldObject *self)
267 {
268     Py_CLEAR(self->proto);
269     return 0;
270 }
271 
272 static void
PyCField_dealloc(PyObject * self)273 PyCField_dealloc(PyObject *self)
274 {
275     PyObject_GC_UnTrack(self);
276     PyCField_clear((CFieldObject *)self);
277     Py_TYPE(self)->tp_free((PyObject *)self);
278 }
279 
280 static PyObject *
PyCField_repr(CFieldObject * self)281 PyCField_repr(CFieldObject *self)
282 {
283     PyObject *result;
284     Py_ssize_t bits = self->size >> 16;
285     Py_ssize_t size = self->size & 0xFFFF;
286     const char *name;
287 
288     name = ((PyTypeObject *)self->proto)->tp_name;
289 
290     if (bits)
291         result = PyUnicode_FromFormat(
292             "<Field type=%s, ofs=%zd:%zd, bits=%zd>",
293             name, self->offset, size, bits);
294     else
295         result = PyUnicode_FromFormat(
296             "<Field type=%s, ofs=%zd, size=%zd>",
297             name, self->offset, size);
298     return result;
299 }
300 
301 PyTypeObject PyCField_Type = {
302     PyVarObject_HEAD_INIT(NULL, 0)
303     "_ctypes.CField",                                   /* tp_name */
304     sizeof(CFieldObject),                       /* tp_basicsize */
305     0,                                          /* tp_itemsize */
306     PyCField_dealloc,                                   /* tp_dealloc */
307     0,                                          /* tp_vectorcall_offset */
308     0,                                          /* tp_getattr */
309     0,                                          /* tp_setattr */
310     0,                                          /* tp_as_async */
311     (reprfunc)PyCField_repr,                            /* tp_repr */
312     0,                                          /* tp_as_number */
313     0,                                          /* tp_as_sequence */
314     0,                                          /* tp_as_mapping */
315     0,                                          /* tp_hash */
316     0,                                          /* tp_call */
317     0,                                          /* tp_str */
318     0,                                          /* tp_getattro */
319     0,                                          /* tp_setattro */
320     0,                                          /* tp_as_buffer */
321     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
322     PyDoc_STR("Structure/Union member"),        /* tp_doc */
323     (traverseproc)PyCField_traverse,                    /* tp_traverse */
324     (inquiry)PyCField_clear,                            /* tp_clear */
325     0,                                          /* tp_richcompare */
326     0,                                          /* tp_weaklistoffset */
327     0,                                          /* tp_iter */
328     0,                                          /* tp_iternext */
329     0,                                          /* tp_methods */
330     0,                                          /* tp_members */
331     PyCField_getset,                                    /* tp_getset */
332     0,                                          /* tp_base */
333     0,                                          /* tp_dict */
334     (descrgetfunc)PyCField_get,                 /* tp_descr_get */
335     (descrsetfunc)PyCField_set,                 /* tp_descr_set */
336     0,                                          /* tp_dictoffset */
337     0,                                          /* tp_init */
338     0,                                          /* tp_alloc */
339     0,                                          /* tp_new */
340     0,                                          /* tp_free */
341 };
342 
343 
344 /******************************************************************/
345 /*
346   Accessor functions
347 */
348 
349 /* Derived from Modules/structmodule.c:
350    Helper routine to get a Python integer and raise the appropriate error
351    if it isn't one */
352 
353 static int
get_long(PyObject * v,long * p)354 get_long(PyObject *v, long *p)
355 {
356     long x = PyLong_AsUnsignedLongMask(v);
357     if (x == -1 && PyErr_Occurred())
358         return -1;
359     *p = x;
360     return 0;
361 }
362 
363 /* Same, but handling unsigned long */
364 
365 static int
get_ulong(PyObject * v,unsigned long * p)366 get_ulong(PyObject *v, unsigned long *p)
367 {
368     unsigned long x = PyLong_AsUnsignedLongMask(v);
369     if (x == (unsigned long)-1 && PyErr_Occurred())
370         return -1;
371     *p = x;
372     return 0;
373 }
374 
375 /* Same, but handling native long long. */
376 
377 static int
get_longlong(PyObject * v,long long * p)378 get_longlong(PyObject *v, long long *p)
379 {
380     long long x = PyLong_AsUnsignedLongLongMask(v);
381     if (x == -1 && PyErr_Occurred())
382         return -1;
383     *p = x;
384     return 0;
385 }
386 
387 /* Same, but handling native unsigned long long. */
388 
389 static int
get_ulonglong(PyObject * v,unsigned long long * p)390 get_ulonglong(PyObject *v, unsigned long long *p)
391 {
392     unsigned long long x = PyLong_AsUnsignedLongLongMask(v);
393     if (x == (unsigned long long)-1 && PyErr_Occurred())
394         return -1;
395     *p = x;
396     return 0;
397 }
398 
399 /*****************************************************************
400  * Integer fields, with bitfield support
401  */
402 
403 /* how to decode the size field, for integer get/set functions */
404 #define LOW_BIT(x)  ((x) & 0xFFFF)
405 #define NUM_BITS(x) ((x) >> 16)
406 
407 /* Doesn't work if NUM_BITS(size) == 0, but it never happens in SET() call. */
408 #define BIT_MASK(type, size) (((((type)1 << (NUM_BITS(size) - 1)) - 1) << 1) + 1)
409 
410 /* This macro CHANGES the first parameter IN PLACE. For proper sign handling,
411    we must first shift left, then right.
412 */
413 #define GET_BITFIELD(v, size)                                           \
414     if (NUM_BITS(size)) {                                               \
415         v <<= (sizeof(v)*8 - LOW_BIT(size) - NUM_BITS(size));           \
416         v >>= (sizeof(v)*8 - NUM_BITS(size));                           \
417     }
418 
419 /* This macro RETURNS the first parameter with the bit field CHANGED. */
420 #define SET(type, x, v, size)                                                 \
421     (NUM_BITS(size) ?                                                   \
422      ( ( (type)x & ~(BIT_MASK(type, size) << LOW_BIT(size)) ) | ( ((type)v & BIT_MASK(type, size)) << LOW_BIT(size) ) ) \
423      : (type)v)
424 
425 #if SIZEOF_SHORT == 2
426 #  define SWAP_SHORT _Py_bswap16
427 #else
428 #  error "unsupported short size"
429 #endif
430 
431 #if SIZEOF_INT == 4
432 #  define SWAP_INT _Py_bswap32
433 #else
434 #  error "unsupported int size"
435 #endif
436 
437 #if SIZEOF_LONG == 4
438 #  define SWAP_LONG _Py_bswap32
439 #elif SIZEOF_LONG == 8
440 #  define SWAP_LONG _Py_bswap64
441 #else
442 #  error "unsupported long size"
443 #endif
444 
445 #if SIZEOF_LONG_LONG == 8
446 #  define SWAP_LONG_LONG _Py_bswap64
447 #else
448 #  error "unsupported long long size"
449 #endif
450 
451 /*****************************************************************
452  * The setter methods return an object which must be kept alive, to keep the
453  * data valid which has been stored in the memory block.  The ctypes object
454  * instance inserts this object into its 'b_objects' list.
455  *
456  * For simple Python types like integers or characters, there is nothing that
457  * has to been kept alive, so Py_None is returned in these cases.  But this
458  * makes inspecting the 'b_objects' list, which is accessible from Python for
459  * debugging, less useful.
460  *
461  * So, defining the _CTYPES_DEBUG_KEEP symbol returns the original value
462  * instead of Py_None.
463  */
464 
465 #ifdef _CTYPES_DEBUG_KEEP
466 #define _RET(x) Py_INCREF(x); return x
467 #else
468 #define _RET(X) Py_RETURN_NONE
469 #endif
470 
471 /*****************************************************************
472  * integer accessor methods, supporting bit fields
473  */
474 
475 static PyObject *
b_set(void * ptr,PyObject * value,Py_ssize_t size)476 b_set(void *ptr, PyObject *value, Py_ssize_t size)
477 {
478     long val;
479     if (get_long(value, &val) < 0)
480         return NULL;
481     *(signed char *)ptr = SET(signed char, *(signed char *)ptr, val, size);
482     _RET(value);
483 }
484 
485 
486 static PyObject *
b_get(void * ptr,Py_ssize_t size)487 b_get(void *ptr, Py_ssize_t size)
488 {
489     signed char val = *(signed char *)ptr;
490     GET_BITFIELD(val, size);
491     return PyLong_FromLong(val);
492 }
493 
494 static PyObject *
B_set(void * ptr,PyObject * value,Py_ssize_t size)495 B_set(void *ptr, PyObject *value, Py_ssize_t size)
496 {
497     unsigned long val;
498     if (get_ulong(value, &val) < 0)
499         return NULL;
500     *(unsigned char *)ptr = SET(unsigned char, *(unsigned char*)ptr, val, size);
501     _RET(value);
502 }
503 
504 
505 static PyObject *
B_get(void * ptr,Py_ssize_t size)506 B_get(void *ptr, Py_ssize_t size)
507 {
508     unsigned char val = *(unsigned char *)ptr;
509     GET_BITFIELD(val, size);
510     return PyLong_FromLong(val);
511 }
512 
513 static PyObject *
h_set(void * ptr,PyObject * value,Py_ssize_t size)514 h_set(void *ptr, PyObject *value, Py_ssize_t size)
515 {
516     long val;
517     short x;
518     if (get_long(value, &val) < 0)
519         return NULL;
520     memcpy(&x, ptr, sizeof(x));
521     x = SET(short, x, val, size);
522     memcpy(ptr, &x, sizeof(x));
523     _RET(value);
524 }
525 
526 
527 static PyObject *
h_set_sw(void * ptr,PyObject * value,Py_ssize_t size)528 h_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
529 {
530     long val;
531     short field;
532     if (get_long(value, &val) < 0) {
533         return NULL;
534     }
535     memcpy(&field, ptr, sizeof(field));
536     field = SWAP_SHORT(field);
537     field = SET(short, field, val, size);
538     field = SWAP_SHORT(field);
539     memcpy(ptr, &field, sizeof(field));
540     _RET(value);
541 }
542 
543 static PyObject *
h_get(void * ptr,Py_ssize_t size)544 h_get(void *ptr, Py_ssize_t size)
545 {
546     short val;
547     memcpy(&val, ptr, sizeof(val));
548     GET_BITFIELD(val, size);
549     return PyLong_FromLong((long)val);
550 }
551 
552 static PyObject *
h_get_sw(void * ptr,Py_ssize_t size)553 h_get_sw(void *ptr, Py_ssize_t size)
554 {
555     short val;
556     memcpy(&val, ptr, sizeof(val));
557     val = SWAP_SHORT(val);
558     GET_BITFIELD(val, size);
559     return PyLong_FromLong(val);
560 }
561 
562 static PyObject *
H_set(void * ptr,PyObject * value,Py_ssize_t size)563 H_set(void *ptr, PyObject *value, Py_ssize_t size)
564 {
565     unsigned long val;
566     unsigned short x;
567     if (get_ulong(value, &val) < 0)
568         return NULL;
569     memcpy(&x, ptr, sizeof(x));
570     x = SET(unsigned short, x, val, size);
571     memcpy(ptr, &x, sizeof(x));
572     _RET(value);
573 }
574 
575 static PyObject *
H_set_sw(void * ptr,PyObject * value,Py_ssize_t size)576 H_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
577 {
578     unsigned long val;
579     unsigned short field;
580     if (get_ulong(value, &val) < 0) {
581         return NULL;
582     }
583     memcpy(&field, ptr, sizeof(field));
584     field = SWAP_SHORT(field);
585     field = SET(unsigned short, field, val, size);
586     field = SWAP_SHORT(field);
587     memcpy(ptr, &field, sizeof(field));
588     _RET(value);
589 }
590 
591 
592 static PyObject *
H_get(void * ptr,Py_ssize_t size)593 H_get(void *ptr, Py_ssize_t size)
594 {
595     unsigned short val;
596     memcpy(&val, ptr, sizeof(val));
597     GET_BITFIELD(val, size);
598     return PyLong_FromLong(val);
599 }
600 
601 static PyObject *
H_get_sw(void * ptr,Py_ssize_t size)602 H_get_sw(void *ptr, Py_ssize_t size)
603 {
604     unsigned short val;
605     memcpy(&val, ptr, sizeof(val));
606     val = SWAP_SHORT(val);
607     GET_BITFIELD(val, size);
608     return PyLong_FromLong(val);
609 }
610 
611 static PyObject *
i_set(void * ptr,PyObject * value,Py_ssize_t size)612 i_set(void *ptr, PyObject *value, Py_ssize_t size)
613 {
614     long val;
615     int x;
616     if (get_long(value, &val) < 0)
617         return NULL;
618     memcpy(&x, ptr, sizeof(x));
619     x = SET(int, x, val, size);
620     memcpy(ptr, &x, sizeof(x));
621     _RET(value);
622 }
623 
624 static PyObject *
i_set_sw(void * ptr,PyObject * value,Py_ssize_t size)625 i_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
626 {
627     long val;
628     int field;
629     if (get_long(value, &val) < 0) {
630         return NULL;
631     }
632     memcpy(&field, ptr, sizeof(field));
633     field = SWAP_INT(field);
634     field = SET(int, field, val, size);
635     field = SWAP_INT(field);
636     memcpy(ptr, &field, sizeof(field));
637     _RET(value);
638 }
639 
640 
641 static PyObject *
i_get(void * ptr,Py_ssize_t size)642 i_get(void *ptr, Py_ssize_t size)
643 {
644     int val;
645     memcpy(&val, ptr, sizeof(val));
646     GET_BITFIELD(val, size);
647     return PyLong_FromLong(val);
648 }
649 
650 static PyObject *
i_get_sw(void * ptr,Py_ssize_t size)651 i_get_sw(void *ptr, Py_ssize_t size)
652 {
653     int val;
654     memcpy(&val, ptr, sizeof(val));
655     val = SWAP_INT(val);
656     GET_BITFIELD(val, size);
657     return PyLong_FromLong(val);
658 }
659 
660 #ifndef MS_WIN32
661 /* http://msdn.microsoft.com/en-us/library/cc237864.aspx */
662 #define VARIANT_FALSE 0x0000
663 #define VARIANT_TRUE 0xFFFF
664 #endif
665 /* short BOOL - VARIANT_BOOL */
666 static PyObject *
vBOOL_set(void * ptr,PyObject * value,Py_ssize_t size)667 vBOOL_set(void *ptr, PyObject *value, Py_ssize_t size)
668 {
669     switch (PyObject_IsTrue(value)) {
670     case -1:
671         return NULL;
672     case 0:
673         *(short int *)ptr = VARIANT_FALSE;
674         _RET(value);
675     default:
676         *(short int *)ptr = VARIANT_TRUE;
677         _RET(value);
678     }
679 }
680 
681 static PyObject *
vBOOL_get(void * ptr,Py_ssize_t size)682 vBOOL_get(void *ptr, Py_ssize_t size)
683 {
684     return PyBool_FromLong((long)*(short int *)ptr);
685 }
686 
687 static PyObject *
bool_set(void * ptr,PyObject * value,Py_ssize_t size)688 bool_set(void *ptr, PyObject *value, Py_ssize_t size)
689 {
690     switch (PyObject_IsTrue(value)) {
691     case -1:
692         return NULL;
693     case 0:
694         *(_Bool *)ptr = 0;
695         _RET(value);
696     default:
697         *(_Bool *)ptr = 1;
698         _RET(value);
699     }
700 }
701 
702 static PyObject *
bool_get(void * ptr,Py_ssize_t size)703 bool_get(void *ptr, Py_ssize_t size)
704 {
705     return PyBool_FromLong((long)*(_Bool *)ptr);
706 }
707 
708 static PyObject *
I_set(void * ptr,PyObject * value,Py_ssize_t size)709 I_set(void *ptr, PyObject *value, Py_ssize_t size)
710 {
711     unsigned long val;
712     unsigned int x;
713     if (get_ulong(value, &val) < 0)
714         return  NULL;
715     memcpy(&x, ptr, sizeof(x));
716     x = SET(unsigned int, x, val, size);
717     memcpy(ptr, &x, sizeof(x));
718     _RET(value);
719 }
720 
721 static PyObject *
I_set_sw(void * ptr,PyObject * value,Py_ssize_t size)722 I_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
723 {
724     unsigned long val;
725     unsigned int field;
726     if (get_ulong(value, &val) < 0) {
727         return  NULL;
728     }
729     memcpy(&field, ptr, sizeof(field));
730     field = SWAP_INT(field);
731     field = SET(unsigned int, field, (unsigned int)val, size);
732     field = SWAP_INT(field);
733     memcpy(ptr, &field, sizeof(field));
734     _RET(value);
735 }
736 
737 
738 static PyObject *
I_get(void * ptr,Py_ssize_t size)739 I_get(void *ptr, Py_ssize_t size)
740 {
741     unsigned int val;
742     memcpy(&val, ptr, sizeof(val));
743     GET_BITFIELD(val, size);
744     return PyLong_FromUnsignedLong(val);
745 }
746 
747 static PyObject *
I_get_sw(void * ptr,Py_ssize_t size)748 I_get_sw(void *ptr, Py_ssize_t size)
749 {
750     unsigned int val;
751     memcpy(&val, ptr, sizeof(val));
752     val = SWAP_INT(val);
753     GET_BITFIELD(val, size);
754     return PyLong_FromUnsignedLong(val);
755 }
756 
757 static PyObject *
l_set(void * ptr,PyObject * value,Py_ssize_t size)758 l_set(void *ptr, PyObject *value, Py_ssize_t size)
759 {
760     long val;
761     long x;
762     if (get_long(value, &val) < 0)
763         return NULL;
764     memcpy(&x, ptr, sizeof(x));
765     x = SET(long, x, val, size);
766     memcpy(ptr, &x, sizeof(x));
767     _RET(value);
768 }
769 
770 static PyObject *
l_set_sw(void * ptr,PyObject * value,Py_ssize_t size)771 l_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
772 {
773     long val;
774     long field;
775     if (get_long(value, &val) < 0) {
776         return NULL;
777     }
778     memcpy(&field, ptr, sizeof(field));
779     field = SWAP_LONG(field);
780     field = SET(long, field, val, size);
781     field = SWAP_LONG(field);
782     memcpy(ptr, &field, sizeof(field));
783     _RET(value);
784 }
785 
786 
787 static PyObject *
l_get(void * ptr,Py_ssize_t size)788 l_get(void *ptr, Py_ssize_t size)
789 {
790     long val;
791     memcpy(&val, ptr, sizeof(val));
792     GET_BITFIELD(val, size);
793     return PyLong_FromLong(val);
794 }
795 
796 static PyObject *
l_get_sw(void * ptr,Py_ssize_t size)797 l_get_sw(void *ptr, Py_ssize_t size)
798 {
799     long val;
800     memcpy(&val, ptr, sizeof(val));
801     val = SWAP_LONG(val);
802     GET_BITFIELD(val, size);
803     return PyLong_FromLong(val);
804 }
805 
806 static PyObject *
L_set(void * ptr,PyObject * value,Py_ssize_t size)807 L_set(void *ptr, PyObject *value, Py_ssize_t size)
808 {
809     unsigned long val;
810     unsigned long x;
811     if (get_ulong(value, &val) < 0)
812         return  NULL;
813     memcpy(&x, ptr, sizeof(x));
814     x = SET(unsigned long, x, val, size);
815     memcpy(ptr, &x, sizeof(x));
816     _RET(value);
817 }
818 
819 static PyObject *
L_set_sw(void * ptr,PyObject * value,Py_ssize_t size)820 L_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
821 {
822     unsigned long val;
823     unsigned long field;
824     if (get_ulong(value, &val) < 0) {
825         return  NULL;
826     }
827     memcpy(&field, ptr, sizeof(field));
828     field = SWAP_LONG(field);
829     field = SET(unsigned long, field, val, size);
830     field = SWAP_LONG(field);
831     memcpy(ptr, &field, sizeof(field));
832     _RET(value);
833 }
834 
835 
836 static PyObject *
L_get(void * ptr,Py_ssize_t size)837 L_get(void *ptr, Py_ssize_t size)
838 {
839     unsigned long val;
840     memcpy(&val, ptr, sizeof(val));
841     GET_BITFIELD(val, size);
842     return PyLong_FromUnsignedLong(val);
843 }
844 
845 static PyObject *
L_get_sw(void * ptr,Py_ssize_t size)846 L_get_sw(void *ptr, Py_ssize_t size)
847 {
848     unsigned long val;
849     memcpy(&val, ptr, sizeof(val));
850     val = SWAP_LONG(val);
851     GET_BITFIELD(val, size);
852     return PyLong_FromUnsignedLong(val);
853 }
854 
855 static PyObject *
q_set(void * ptr,PyObject * value,Py_ssize_t size)856 q_set(void *ptr, PyObject *value, Py_ssize_t size)
857 {
858     long long val;
859     long long x;
860     if (get_longlong(value, &val) < 0)
861         return NULL;
862     memcpy(&x, ptr, sizeof(x));
863     x = SET(long long, x, val, size);
864     memcpy(ptr, &x, sizeof(x));
865     _RET(value);
866 }
867 
868 static PyObject *
q_set_sw(void * ptr,PyObject * value,Py_ssize_t size)869 q_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
870 {
871     long long val;
872     long long field;
873     if (get_longlong(value, &val) < 0) {
874         return NULL;
875     }
876     memcpy(&field, ptr, sizeof(field));
877     field = SWAP_LONG_LONG(field);
878     field = SET(long long, field, val, size);
879     field = SWAP_LONG_LONG(field);
880     memcpy(ptr, &field, sizeof(field));
881     _RET(value);
882 }
883 
884 static PyObject *
q_get(void * ptr,Py_ssize_t size)885 q_get(void *ptr, Py_ssize_t size)
886 {
887     long long val;
888     memcpy(&val, ptr, sizeof(val));
889     GET_BITFIELD(val, size);
890     return PyLong_FromLongLong(val);
891 }
892 
893 static PyObject *
q_get_sw(void * ptr,Py_ssize_t size)894 q_get_sw(void *ptr, Py_ssize_t size)
895 {
896     long long val;
897     memcpy(&val, ptr, sizeof(val));
898     val = SWAP_LONG_LONG(val);
899     GET_BITFIELD(val, size);
900     return PyLong_FromLongLong(val);
901 }
902 
903 static PyObject *
Q_set(void * ptr,PyObject * value,Py_ssize_t size)904 Q_set(void *ptr, PyObject *value, Py_ssize_t size)
905 {
906     unsigned long long val;
907     unsigned long long x;
908     if (get_ulonglong(value, &val) < 0)
909         return NULL;
910     memcpy(&x, ptr, sizeof(x));
911     x = SET(long long, x, val, size);
912     memcpy(ptr, &x, sizeof(x));
913     _RET(value);
914 }
915 
916 static PyObject *
Q_set_sw(void * ptr,PyObject * value,Py_ssize_t size)917 Q_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
918 {
919     unsigned long long val;
920     unsigned long long field;
921     if (get_ulonglong(value, &val) < 0) {
922         return NULL;
923     }
924     memcpy(&field, ptr, sizeof(field));
925     field = SWAP_LONG_LONG(field);
926     field = SET(unsigned long long, field, val, size);
927     field = SWAP_LONG_LONG(field);
928     memcpy(ptr, &field, sizeof(field));
929     _RET(value);
930 }
931 
932 static PyObject *
Q_get(void * ptr,Py_ssize_t size)933 Q_get(void *ptr, Py_ssize_t size)
934 {
935     unsigned long long val;
936     memcpy(&val, ptr, sizeof(val));
937     GET_BITFIELD(val, size);
938     return PyLong_FromUnsignedLongLong(val);
939 }
940 
941 static PyObject *
Q_get_sw(void * ptr,Py_ssize_t size)942 Q_get_sw(void *ptr, Py_ssize_t size)
943 {
944     unsigned long long val;
945     memcpy(&val, ptr, sizeof(val));
946     val = SWAP_LONG_LONG(val);
947     GET_BITFIELD(val, size);
948     return PyLong_FromUnsignedLongLong(val);
949 }
950 
951 /*****************************************************************
952  * non-integer accessor methods, not supporting bit fields
953  */
954 
955 
956 static PyObject *
g_set(void * ptr,PyObject * value,Py_ssize_t size)957 g_set(void *ptr, PyObject *value, Py_ssize_t size)
958 {
959     long double x;
960 
961     x = PyFloat_AsDouble(value);
962     if (x == -1 && PyErr_Occurred())
963         return NULL;
964     memcpy(ptr, &x, sizeof(long double));
965     _RET(value);
966 }
967 
968 static PyObject *
g_get(void * ptr,Py_ssize_t size)969 g_get(void *ptr, Py_ssize_t size)
970 {
971     long double val;
972     memcpy(&val, ptr, sizeof(long double));
973     return PyFloat_FromDouble(val);
974 }
975 
976 static PyObject *
d_set(void * ptr,PyObject * value,Py_ssize_t size)977 d_set(void *ptr, PyObject *value, Py_ssize_t size)
978 {
979     double x;
980 
981     x = PyFloat_AsDouble(value);
982     if (x == -1 && PyErr_Occurred())
983         return NULL;
984     memcpy(ptr, &x, sizeof(double));
985     _RET(value);
986 }
987 
988 static PyObject *
d_get(void * ptr,Py_ssize_t size)989 d_get(void *ptr, Py_ssize_t size)
990 {
991     double val;
992     memcpy(&val, ptr, sizeof(val));
993     return PyFloat_FromDouble(val);
994 }
995 
996 static PyObject *
d_set_sw(void * ptr,PyObject * value,Py_ssize_t size)997 d_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
998 {
999     double x;
1000 
1001     x = PyFloat_AsDouble(value);
1002     if (x == -1 && PyErr_Occurred())
1003         return NULL;
1004 #ifdef WORDS_BIGENDIAN
1005     if (PyFloat_Pack8(x, ptr, 1))
1006         return NULL;
1007 #else
1008     if (PyFloat_Pack8(x, ptr, 0))
1009         return NULL;
1010 #endif
1011     _RET(value);
1012 }
1013 
1014 static PyObject *
d_get_sw(void * ptr,Py_ssize_t size)1015 d_get_sw(void *ptr, Py_ssize_t size)
1016 {
1017 #ifdef WORDS_BIGENDIAN
1018     return PyFloat_FromDouble(PyFloat_Unpack8(ptr, 1));
1019 #else
1020     return PyFloat_FromDouble(PyFloat_Unpack8(ptr, 0));
1021 #endif
1022 }
1023 
1024 static PyObject *
f_set(void * ptr,PyObject * value,Py_ssize_t size)1025 f_set(void *ptr, PyObject *value, Py_ssize_t size)
1026 {
1027     float x;
1028 
1029     x = (float)PyFloat_AsDouble(value);
1030     if (x == -1 && PyErr_Occurred())
1031         return NULL;
1032     memcpy(ptr, &x, sizeof(x));
1033     _RET(value);
1034 }
1035 
1036 static PyObject *
f_get(void * ptr,Py_ssize_t size)1037 f_get(void *ptr, Py_ssize_t size)
1038 {
1039     float val;
1040     memcpy(&val, ptr, sizeof(val));
1041     return PyFloat_FromDouble(val);
1042 }
1043 
1044 static PyObject *
f_set_sw(void * ptr,PyObject * value,Py_ssize_t size)1045 f_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
1046 {
1047     float x;
1048 
1049     x = (float)PyFloat_AsDouble(value);
1050     if (x == -1 && PyErr_Occurred())
1051         return NULL;
1052 #ifdef WORDS_BIGENDIAN
1053     if (PyFloat_Pack4(x, ptr, 1))
1054         return NULL;
1055 #else
1056     if (PyFloat_Pack4(x, ptr, 0))
1057         return NULL;
1058 #endif
1059     _RET(value);
1060 }
1061 
1062 static PyObject *
f_get_sw(void * ptr,Py_ssize_t size)1063 f_get_sw(void *ptr, Py_ssize_t size)
1064 {
1065 #ifdef WORDS_BIGENDIAN
1066     return PyFloat_FromDouble(PyFloat_Unpack4(ptr, 1));
1067 #else
1068     return PyFloat_FromDouble(PyFloat_Unpack4(ptr, 0));
1069 #endif
1070 }
1071 
1072 /*
1073   py_object refcounts:
1074 
1075   1. If we have a py_object instance, O_get must Py_INCREF the returned
1076   object, of course.  If O_get is called from a function result, no py_object
1077   instance is created - so callproc.c::GetResult has to call Py_DECREF.
1078 
1079   2. The memory block in py_object owns a refcount.  So, py_object must call
1080   Py_DECREF on destruction.  Maybe only when b_needsfree is non-zero.
1081 */
1082 static PyObject *
O_get(void * ptr,Py_ssize_t size)1083 O_get(void *ptr, Py_ssize_t size)
1084 {
1085     PyObject *ob = *(PyObject **)ptr;
1086     if (ob == NULL) {
1087         if (!PyErr_Occurred())
1088             /* Set an error if not yet set */
1089             PyErr_SetString(PyExc_ValueError,
1090                             "PyObject is NULL");
1091         return NULL;
1092     }
1093     Py_INCREF(ob);
1094     return ob;
1095 }
1096 
1097 static PyObject *
O_set(void * ptr,PyObject * value,Py_ssize_t size)1098 O_set(void *ptr, PyObject *value, Py_ssize_t size)
1099 {
1100     /* Hm, does the memory block need it's own refcount or not? */
1101     *(PyObject **)ptr = value;
1102     Py_INCREF(value);
1103     return value;
1104 }
1105 
1106 
1107 static PyObject *
c_set(void * ptr,PyObject * value,Py_ssize_t size)1108 c_set(void *ptr, PyObject *value, Py_ssize_t size)
1109 {
1110     if (PyBytes_Check(value) && PyBytes_GET_SIZE(value) == 1) {
1111         *(char *)ptr = PyBytes_AS_STRING(value)[0];
1112         _RET(value);
1113     }
1114     if (PyByteArray_Check(value) && PyByteArray_GET_SIZE(value) == 1) {
1115         *(char *)ptr = PyByteArray_AS_STRING(value)[0];
1116         _RET(value);
1117     }
1118     if (PyLong_Check(value))
1119     {
1120         long longval = PyLong_AsLong(value);
1121         if (longval < 0 || longval >= 256)
1122             goto error;
1123         *(char *)ptr = (char)longval;
1124         _RET(value);
1125     }
1126   error:
1127     PyErr_Format(PyExc_TypeError,
1128                  "one character bytes, bytearray or integer expected");
1129     return NULL;
1130 }
1131 
1132 
1133 static PyObject *
c_get(void * ptr,Py_ssize_t size)1134 c_get(void *ptr, Py_ssize_t size)
1135 {
1136     return PyBytes_FromStringAndSize((char *)ptr, 1);
1137 }
1138 
1139 /* u - a single wchar_t character */
1140 static PyObject *
u_set(void * ptr,PyObject * value,Py_ssize_t size)1141 u_set(void *ptr, PyObject *value, Py_ssize_t size)
1142 {
1143     Py_ssize_t len;
1144     wchar_t chars[2];
1145     if (!PyUnicode_Check(value)) {
1146         PyErr_Format(PyExc_TypeError,
1147                         "unicode string expected instead of %s instance",
1148                         Py_TYPE(value)->tp_name);
1149         return NULL;
1150     } else
1151         Py_INCREF(value);
1152 
1153     len = PyUnicode_AsWideChar(value, chars, 2);
1154     if (len != 1) {
1155         Py_DECREF(value);
1156         PyErr_SetString(PyExc_TypeError,
1157                         "one character unicode string expected");
1158         return NULL;
1159     }
1160 
1161     *(wchar_t *)ptr = chars[0];
1162     Py_DECREF(value);
1163 
1164     _RET(value);
1165 }
1166 
1167 
1168 static PyObject *
u_get(void * ptr,Py_ssize_t size)1169 u_get(void *ptr, Py_ssize_t size)
1170 {
1171     return PyUnicode_FromWideChar((wchar_t *)ptr, 1);
1172 }
1173 
1174 /* U - a unicode string */
1175 static PyObject *
U_get(void * ptr,Py_ssize_t size)1176 U_get(void *ptr, Py_ssize_t size)
1177 {
1178     Py_ssize_t len;
1179     wchar_t *p;
1180 
1181     size /= sizeof(wchar_t); /* we count character units here, not bytes */
1182 
1183     /* We need 'result' to be able to count the characters with wcslen,
1184        since ptr may not be NUL terminated.  If the length is smaller (if
1185        it was actually NUL terminated, we construct a new one and throw
1186        away the result.
1187     */
1188     /* chop off at the first NUL character, if any. */
1189     p = (wchar_t*)ptr;
1190     for (len = 0; len < size; ++len) {
1191         if (!p[len])
1192             break;
1193     }
1194 
1195     return PyUnicode_FromWideChar((wchar_t *)ptr, len);
1196 }
1197 
1198 static PyObject *
U_set(void * ptr,PyObject * value,Py_ssize_t length)1199 U_set(void *ptr, PyObject *value, Py_ssize_t length)
1200 {
1201     /* It's easier to calculate in characters than in bytes */
1202     length /= sizeof(wchar_t);
1203 
1204     if (!PyUnicode_Check(value)) {
1205         PyErr_Format(PyExc_TypeError,
1206                         "unicode string expected instead of %s instance",
1207                         Py_TYPE(value)->tp_name);
1208         return NULL;
1209     }
1210 
1211     Py_ssize_t size = PyUnicode_AsWideChar(value, NULL, 0);
1212     if (size < 0) {
1213         return NULL;
1214     }
1215     // PyUnicode_AsWideChar() returns number of wchars including trailing null byte,
1216     // when it is called with NULL.
1217     size--;
1218     assert(size >= 0);
1219     if (size > length) {
1220         PyErr_Format(PyExc_ValueError,
1221                      "string too long (%zd, maximum length %zd)",
1222                      size, length);
1223         return NULL;
1224     }
1225     if (PyUnicode_AsWideChar(value, (wchar_t *)ptr, length) == -1) {
1226         return NULL;
1227     }
1228 
1229     Py_INCREF(value);
1230     return value;
1231 }
1232 
1233 
1234 static PyObject *
s_get(void * ptr,Py_ssize_t size)1235 s_get(void *ptr, Py_ssize_t size)
1236 {
1237     Py_ssize_t i;
1238     char *p;
1239 
1240     p = (char *)ptr;
1241     for (i = 0; i < size; ++i) {
1242         if (*p++ == '\0')
1243             break;
1244     }
1245 
1246     return PyBytes_FromStringAndSize((char *)ptr, (Py_ssize_t)i);
1247 }
1248 
1249 static PyObject *
s_set(void * ptr,PyObject * value,Py_ssize_t length)1250 s_set(void *ptr, PyObject *value, Py_ssize_t length)
1251 {
1252     const char *data;
1253     Py_ssize_t size;
1254 
1255     if(!PyBytes_Check(value)) {
1256         PyErr_Format(PyExc_TypeError,
1257                      "expected bytes, %s found",
1258                      Py_TYPE(value)->tp_name);
1259         return NULL;
1260     }
1261 
1262     data = PyBytes_AS_STRING(value);
1263     // bpo-39593: Use strlen() to truncate the string at the first null character.
1264     size = strlen(data);
1265 
1266     if (size < length) {
1267         /* This will copy the terminating NUL character
1268          * if there is space for it.
1269          */
1270         ++size;
1271     } else if (size > length) {
1272         PyErr_Format(PyExc_ValueError,
1273                      "bytes too long (%zd, maximum length %zd)",
1274                      size, length);
1275         return NULL;
1276     }
1277     /* Also copy the terminating NUL character if there is space */
1278     memcpy((char *)ptr, data, size);
1279 
1280     _RET(value);
1281 }
1282 
1283 static PyObject *
z_set(void * ptr,PyObject * value,Py_ssize_t size)1284 z_set(void *ptr, PyObject *value, Py_ssize_t size)
1285 {
1286     if (value == Py_None) {
1287         *(char **)ptr = NULL;
1288         Py_INCREF(value);
1289         return value;
1290     }
1291     if (PyBytes_Check(value)) {
1292         *(const char **)ptr = PyBytes_AsString(value);
1293         Py_INCREF(value);
1294         return value;
1295     } else if (PyLong_Check(value)) {
1296 #if SIZEOF_VOID_P == SIZEOF_LONG_LONG
1297         *(char **)ptr = (char *)PyLong_AsUnsignedLongLongMask(value);
1298 #else
1299         *(char **)ptr = (char *)PyLong_AsUnsignedLongMask(value);
1300 #endif
1301         _RET(value);
1302     }
1303     PyErr_Format(PyExc_TypeError,
1304                  "bytes or integer address expected instead of %s instance",
1305                  Py_TYPE(value)->tp_name);
1306     return NULL;
1307 }
1308 
1309 static PyObject *
z_get(void * ptr,Py_ssize_t size)1310 z_get(void *ptr, Py_ssize_t size)
1311 {
1312     /* XXX What about invalid pointers ??? */
1313     if (*(void **)ptr) {
1314         return PyBytes_FromStringAndSize(*(char **)ptr,
1315                                          strlen(*(char **)ptr));
1316     } else {
1317         Py_RETURN_NONE;
1318     }
1319 }
1320 
1321 static PyObject *
Z_set(void * ptr,PyObject * value,Py_ssize_t size)1322 Z_set(void *ptr, PyObject *value, Py_ssize_t size)
1323 {
1324     PyObject *keep;
1325     wchar_t *buffer;
1326     Py_ssize_t bsize;
1327 
1328     if (value == Py_None) {
1329         *(wchar_t **)ptr = NULL;
1330         Py_INCREF(value);
1331         return value;
1332     }
1333     if (PyLong_Check(value)) {
1334 #if SIZEOF_VOID_P == SIZEOF_LONG_LONG
1335         *(wchar_t **)ptr = (wchar_t *)PyLong_AsUnsignedLongLongMask(value);
1336 #else
1337         *(wchar_t **)ptr = (wchar_t *)PyLong_AsUnsignedLongMask(value);
1338 #endif
1339         Py_RETURN_NONE;
1340     }
1341     if (!PyUnicode_Check(value)) {
1342         PyErr_Format(PyExc_TypeError,
1343                      "unicode string or integer address expected instead of %s instance",
1344                      Py_TYPE(value)->tp_name);
1345         return NULL;
1346     }
1347 
1348     /* We must create a wchar_t* buffer from the unicode object,
1349        and keep it alive */
1350     buffer = PyUnicode_AsWideCharString(value, &bsize);
1351     if (!buffer)
1352         return NULL;
1353     keep = PyCapsule_New(buffer, CTYPES_CFIELD_CAPSULE_NAME_PYMEM, pymem_destructor);
1354     if (!keep) {
1355         PyMem_Free(buffer);
1356         return NULL;
1357     }
1358     *(wchar_t **)ptr = buffer;
1359     return keep;
1360 }
1361 
1362 static PyObject *
Z_get(void * ptr,Py_ssize_t size)1363 Z_get(void *ptr, Py_ssize_t size)
1364 {
1365     wchar_t *p;
1366     p = *(wchar_t **)ptr;
1367     if (p) {
1368         return PyUnicode_FromWideChar(p, wcslen(p));
1369     } else {
1370         Py_RETURN_NONE;
1371     }
1372 }
1373 
1374 
1375 #ifdef MS_WIN32
1376 static PyObject *
BSTR_set(void * ptr,PyObject * value,Py_ssize_t size)1377 BSTR_set(void *ptr, PyObject *value, Py_ssize_t size)
1378 {
1379     BSTR bstr;
1380 
1381     /* convert value into a PyUnicodeObject or NULL */
1382     if (Py_None == value) {
1383         value = NULL;
1384     } else if (!PyUnicode_Check(value)) {
1385         PyErr_Format(PyExc_TypeError,
1386                         "unicode string expected instead of %s instance",
1387                         Py_TYPE(value)->tp_name);
1388         return NULL;
1389     }
1390 
1391     /* create a BSTR from value */
1392     if (value) {
1393         Py_ssize_t wsize;
1394         wchar_t *wvalue = PyUnicode_AsWideCharString(value, &wsize);
1395         if (wvalue == NULL) {
1396             return NULL;
1397         }
1398         if ((unsigned) wsize != wsize) {
1399             PyErr_SetString(PyExc_ValueError, "String too long for BSTR");
1400             PyMem_Free(wvalue);
1401             return NULL;
1402         }
1403         bstr = SysAllocStringLen(wvalue, (unsigned)wsize);
1404         PyMem_Free(wvalue);
1405     } else
1406         bstr = NULL;
1407 
1408     /* free the previous contents, if any */
1409     if (*(BSTR *)ptr)
1410         SysFreeString(*(BSTR *)ptr);
1411 
1412     /* and store it */
1413     *(BSTR *)ptr = bstr;
1414 
1415     /* We don't need to keep any other object */
1416     _RET(value);
1417 }
1418 
1419 
1420 static PyObject *
BSTR_get(void * ptr,Py_ssize_t size)1421 BSTR_get(void *ptr, Py_ssize_t size)
1422 {
1423     BSTR p;
1424     p = *(BSTR *)ptr;
1425     if (p)
1426         return PyUnicode_FromWideChar(p, SysStringLen(p));
1427     else {
1428         /* Hm, it seems NULL pointer and zero length string are the
1429            same in BSTR, see Don Box, p 81
1430         */
1431         Py_RETURN_NONE;
1432     }
1433 }
1434 #endif
1435 
1436 static PyObject *
P_set(void * ptr,PyObject * value,Py_ssize_t size)1437 P_set(void *ptr, PyObject *value, Py_ssize_t size)
1438 {
1439     void *v;
1440     if (value == Py_None) {
1441         *(void **)ptr = NULL;
1442         _RET(value);
1443     }
1444 
1445     if (!PyLong_Check(value)) {
1446         PyErr_SetString(PyExc_TypeError,
1447                         "cannot be converted to pointer");
1448         return NULL;
1449     }
1450 
1451 #if SIZEOF_VOID_P <= SIZEOF_LONG
1452     v = (void *)PyLong_AsUnsignedLongMask(value);
1453 #else
1454 #if SIZEOF_LONG_LONG < SIZEOF_VOID_P
1455 #   error "PyLong_AsVoidPtr: sizeof(long long) < sizeof(void*)"
1456 #endif
1457     v = (void *)PyLong_AsUnsignedLongLongMask(value);
1458 #endif
1459 
1460     if (PyErr_Occurred())
1461         return NULL;
1462 
1463     *(void **)ptr = v;
1464     _RET(value);
1465 }
1466 
1467 static PyObject *
P_get(void * ptr,Py_ssize_t size)1468 P_get(void *ptr, Py_ssize_t size)
1469 {
1470     if (*(void **)ptr == NULL) {
1471         Py_RETURN_NONE;
1472     }
1473     return PyLong_FromVoidPtr(*(void **)ptr);
1474 }
1475 
1476 static struct fielddesc formattable[] = {
1477     { 's', s_set, s_get, NULL},
1478     { 'b', b_set, b_get, NULL},
1479     { 'B', B_set, B_get, NULL},
1480     { 'c', c_set, c_get, NULL},
1481     { 'd', d_set, d_get, NULL, d_set_sw, d_get_sw},
1482     { 'g', g_set, g_get, NULL},
1483     { 'f', f_set, f_get, NULL, f_set_sw, f_get_sw},
1484     { 'h', h_set, h_get, NULL, h_set_sw, h_get_sw},
1485     { 'H', H_set, H_get, NULL, H_set_sw, H_get_sw},
1486     { 'i', i_set, i_get, NULL, i_set_sw, i_get_sw},
1487     { 'I', I_set, I_get, NULL, I_set_sw, I_get_sw},
1488     { 'l', l_set, l_get, NULL, l_set_sw, l_get_sw},
1489     { 'L', L_set, L_get, NULL, L_set_sw, L_get_sw},
1490     { 'q', q_set, q_get, NULL, q_set_sw, q_get_sw},
1491     { 'Q', Q_set, Q_get, NULL, Q_set_sw, Q_get_sw},
1492     { 'P', P_set, P_get, NULL},
1493     { 'z', z_set, z_get, NULL},
1494     { 'u', u_set, u_get, NULL},
1495     { 'U', U_set, U_get, NULL},
1496     { 'Z', Z_set, Z_get, NULL},
1497 #ifdef MS_WIN32
1498     { 'X', BSTR_set, BSTR_get, NULL},
1499 #endif
1500     { 'v', vBOOL_set, vBOOL_get, NULL},
1501 #if SIZEOF__BOOL == SIZEOF_INT
1502     { '?', bool_set, bool_get, NULL, I_set_sw, I_get_sw},
1503 #elif SIZEOF__BOOL == SIZEOF_LONG
1504     { '?', bool_set, bool_get, NULL, L_set_sw, L_get_sw},
1505 #elif SIZEOF__BOOL == SIZEOF_LONG_LONG
1506     { '?', bool_set, bool_get, NULL, Q_set_sw, Q_get_sw},
1507 #else
1508     { '?', bool_set, bool_get, NULL},
1509 #endif /* SIZEOF__BOOL */
1510     { 'O', O_set, O_get, NULL},
1511     { 0, NULL, NULL, NULL},
1512 };
1513 
1514 /*
1515   Ideas: Implement VARIANT in this table, using 'V' code.
1516   Use '?' as code for BOOL.
1517 */
1518 
1519 /* Delayed initialization. Windows cannot statically reference dynamically
1520    loaded addresses from DLLs. */
1521 void
_ctypes_init_fielddesc(void)1522 _ctypes_init_fielddesc(void)
1523 {
1524     struct fielddesc *fd = formattable;
1525     for (; fd->code; ++fd) {
1526         switch (fd->code) {
1527         case 's': fd->pffi_type = &ffi_type_pointer; break;
1528         case 'b': fd->pffi_type = &ffi_type_schar; break;
1529         case 'B': fd->pffi_type = &ffi_type_uchar; break;
1530         case 'c': fd->pffi_type = &ffi_type_schar; break;
1531         case 'd': fd->pffi_type = &ffi_type_double; break;
1532         case 'g': fd->pffi_type = &ffi_type_longdouble; break;
1533         case 'f': fd->pffi_type = &ffi_type_float; break;
1534         case 'h': fd->pffi_type = &ffi_type_sshort; break;
1535         case 'H': fd->pffi_type = &ffi_type_ushort; break;
1536         case 'i': fd->pffi_type = &ffi_type_sint; break;
1537         case 'I': fd->pffi_type = &ffi_type_uint; break;
1538         /* XXX Hm, sizeof(int) == sizeof(long) doesn't hold on every platform */
1539         /* As soon as we can get rid of the type codes, this is no longer a problem */
1540     #if SIZEOF_LONG == 4
1541         case 'l': fd->pffi_type = &ffi_type_sint32; break;
1542         case 'L': fd->pffi_type = &ffi_type_uint32; break;
1543     #elif SIZEOF_LONG == 8
1544         case 'l': fd->pffi_type = &ffi_type_sint64; break;
1545         case 'L': fd->pffi_type = &ffi_type_uint64; break;
1546     #else
1547         #error
1548     #endif
1549     #if SIZEOF_LONG_LONG == 8
1550         case 'q': fd->pffi_type = &ffi_type_sint64; break;
1551         case 'Q': fd->pffi_type = &ffi_type_uint64; break;
1552     #else
1553         #error
1554     #endif
1555         case 'P': fd->pffi_type = &ffi_type_pointer; break;
1556         case 'z': fd->pffi_type = &ffi_type_pointer; break;
1557         case 'u':
1558             if (sizeof(wchar_t) == sizeof(short))
1559                 fd->pffi_type = &ffi_type_sshort;
1560             else if (sizeof(wchar_t) == sizeof(int))
1561                 fd->pffi_type = &ffi_type_sint;
1562             else if (sizeof(wchar_t) == sizeof(long))
1563                 fd->pffi_type = &ffi_type_slong;
1564             else
1565                 Py_UNREACHABLE();
1566             break;
1567         case 'U': fd->pffi_type = &ffi_type_pointer; break;
1568         case 'Z': fd->pffi_type = &ffi_type_pointer; break;
1569     #ifdef MS_WIN32
1570         case 'X': fd->pffi_type = &ffi_type_pointer; break;
1571     #endif
1572         case 'v': fd->pffi_type = &ffi_type_sshort; break;
1573     #if SIZEOF__BOOL == 1
1574         case '?': fd->pffi_type = &ffi_type_uchar; break; /* Also fallback for no native _Bool support */
1575     #elif SIZEOF__BOOL == SIZEOF_SHORT
1576         case '?': fd->pffi_type = &ffi_type_ushort; break;
1577     #elif SIZEOF__BOOL == SIZEOF_INT
1578         case '?': fd->pffi_type = &ffi_type_uint; break;
1579     #elif SIZEOF__BOOL == SIZEOF_LONG
1580         case '?': fd->pffi_type = &ffi_type_ulong; break;
1581     #elif SIZEOF__BOOL == SIZEOF_LONG_LONG
1582         case '?': fd->pffi_type = &ffi_type_ulong; break;
1583     #endif /* SIZEOF__BOOL */
1584         case 'O': fd->pffi_type = &ffi_type_pointer; break;
1585         default:
1586             Py_UNREACHABLE();
1587         }
1588     }
1589 
1590 }
1591 
1592 struct fielddesc *
_ctypes_get_fielddesc(const char * fmt)1593 _ctypes_get_fielddesc(const char *fmt)
1594 {
1595     static int initialized = 0;
1596     struct fielddesc *table = formattable;
1597 
1598     if (!initialized) {
1599         initialized = 1;
1600         _ctypes_init_fielddesc();
1601     }
1602 
1603     for (; table->code; ++table) {
1604         if (table->code == fmt[0])
1605             return table;
1606     }
1607     return NULL;
1608 }
1609 
1610 /*---------------- EOF ----------------*/
1611