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