summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/ctypes/test/test_bitfields.py63
-rw-r--r--Modules/_ctypes/cfield.c35
2 files changed, 8 insertions, 90 deletions
diff --git a/Lib/ctypes/test/test_bitfields.py b/Lib/ctypes/test/test_bitfields.py
index 68b618a..992b8c4 100644
--- a/Lib/ctypes/test/test_bitfields.py
+++ b/Lib/ctypes/test/test_bitfields.py
@@ -233,69 +233,6 @@ class BitFieldTest(unittest.TestCase):
else:
self.assertEqual(sizeof(X), sizeof(c_int) * 2)
- @unittest.skipIf(os.name == 'nt', reason='Posix only')
- def test_packed_posix(self):
- test_cases = {
- (
- ("a", c_uint8, 4),
- ("b", c_uint8, 4),
- ): 1,
- (
- ("a", c_uint8, 1),
- ("b", c_uint16, 1),
- ("c", c_uint32, 1),
- ("d", c_uint64, 1),
- ): 1,
- (
- ("a", c_uint8, 8),
- ("b", c_uint16, 1),
- ("c", c_uint32, 1),
- ("d", c_uint64, 1),
- ): 2,
- (
- ("a", c_uint32, 9),
- ("b", c_uint16, 10),
- ("c", c_uint32, 25),
- ("d", c_uint64, 1),
- ): 6,
- (
- ("a", c_uint32, 9),
- ("b", c_uint16, 10),
- ("c", c_uint32, 25),
- ("d", c_uint64, 5),
- ): 7,
- (
- ("a", c_uint16),
- ("b", c_uint16, 9),
- ("c", c_uint16, 1),
- ("d", c_uint16, 1),
- ("e", c_uint16, 1),
- ("f", c_uint16, 1),
- ("g", c_uint16, 3),
- ("h", c_uint32, 10),
- ("i", c_uint32, 20),
- ("j", c_uint32, 2),
- ): 8,
- (
- ("a", c_uint16, 9),
- ("b", c_uint16, 10),
- ("d", c_uint16),
- ("c", c_uint8, 8),
- ): 6,
- (
- ("a", c_uint32, 9),
- ("b", c_uint32),
- ("c", c_uint32, 8),
- ): 7,
- }
-
- for fields, size in test_cases.items():
- with self.subTest(fields=fields):
- class X(Structure):
- _pack_ = 1
- _fields_ = list(fields)
- self.assertEqual(sizeof(X), size)
-
def test_anon_bitfields(self):
# anonymous bit-fields gave a strange error message
class X(Structure):
diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c
index 8d0710f..a21a9da 100644
--- a/Modules/_ctypes/cfield.c
+++ b/Modules/_ctypes/cfield.c
@@ -71,18 +71,6 @@ PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
Py_DECREF(self);
return NULL;
}
-
-#ifndef MS_WIN32
- /* if we have a packed bitfield, calculate the minimum number of bytes we
- need to fit it. otherwise use the specified size. */
- if (pack && bitsize) {
- size = (bitsize - 1) / 8 + 1;
- } else
-#endif
- size = dict->size;
-
- proto = desc;
-
if (bitsize /* this is a bitfield request */
&& *pfield_size /* we have a bitfield open */
#ifdef MS_WIN32
@@ -99,9 +87,7 @@ PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
} else if (bitsize /* this is a bitfield request */
&& *pfield_size /* we have a bitfield open */
&& dict->size * 8 >= *pfield_size
- /* if this is a packed bitfield, always expand it.
- otherwise calculate if we need to expand it. */
- && (((*pbitofs + bitsize) <= dict->size * 8) || pack)) {
+ && (*pbitofs + bitsize) <= dict->size * 8) {
/* expand bit field */
fieldtype = EXPAND_BITFIELD;
#endif
@@ -109,9 +95,7 @@ PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
/* start new bitfield */
fieldtype = NEW_BITFIELD;
*pbitofs = 0;
- /* use our calculated size (size) instead of type size (dict->size),
- which can be different for packed bitfields */
- *pfield_size = size * 8;
+ *pfield_size = dict->size * 8;
} else {
/* not a bit field */
fieldtype = NO_BITFIELD;
@@ -119,6 +103,9 @@ PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
*pfield_size = 0;
}
+ size = dict->size;
+ proto = desc;
+
/* Field descriptors for 'c_char * n' are be scpecial cased to
return a Python string instead of an Array object instance...
*/
@@ -183,16 +170,10 @@ PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
break;
case EXPAND_BITFIELD:
- /* increase the size if it is a packed bitfield.
- EXPAND_BITFIELD should not be selected for non-packed fields if the
- current size isn't already enough. */
- if (pack)
- size = (*pbitofs + bitsize - 1) / 8 + 1;
-
- *poffset += size - *pfield_size/8;
- *psize += size - *pfield_size/8;
+ *poffset += dict->size - *pfield_size/8;
+ *psize += dict->size - *pfield_size/8;
- *pfield_size = size * 8;
+ *pfield_size = dict->size * 8;
if (big_endian)
self->size = (bitsize << 16) + *pfield_size - *pbitofs - bitsize;