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