]> granicus.if.org Git - python/commitdiff
Backport rev 51819 from Thomas Heller
authorNeal Norwitz <nnorwitz@gmail.com>
Mon, 11 Sep 2006 04:01:57 +0000 (04:01 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Mon, 11 Sep 2006 04:01:57 +0000 (04:01 +0000)
Anonymous structure fields that have a bit-width specified did not work,
and they gave a strange error message from PyArg_ParseTuple:
   function takes exactly 2 arguments (3 given).

Lib/ctypes/test/test_bitfields.py
Modules/_ctypes/stgdict.c

index 92c4669b2e3ba2d96118da32ce374ec1e107866e..2867cbf93e6c05855e9b6e2c1673c42295e96d18 100644 (file)
@@ -215,5 +215,14 @@ class BitFieldTest(unittest.TestCase):
                         ("b", c_ubyte, 4)]
         self.failUnlessEqual(sizeof(X), sizeof(c_byte))
 
+    def test_anon_bitfields(self):
+        # anonymous bit-fields gave a strange error message
+        class X(Structure):
+            _fields_ = [("a", c_byte, 4),
+                        ("b", c_ubyte, 4)]
+        class Y(Structure):
+            _anonymous_ = ["_"]
+            _fields_ = [("_", X)]
+
 if __name__ == "__main__":
     unittest.main()
index 182b9af03630b9015d9dea77bcc38726282fb3c4..d701f9ec5d7c2b32fbb5432b2d51ec54879fa52d 100644 (file)
@@ -177,11 +177,11 @@ MakeFields(PyObject *type, CFieldObject *descr,
 
        for (i = 0; i < PySequence_Fast_GET_SIZE(fieldlist); ++i) {
                PyObject *pair = PySequence_Fast_GET_ITEM(fieldlist, i); /* borrowed */
-               PyObject *fname, *ftype;
+               PyObject *fname, *ftype, *bits;
                CFieldObject *fdescr;
                CFieldObject *new_descr;
                /* Convert to PyArg_UnpackTuple... */
-               if (!PyArg_ParseTuple(pair, "OO", &fname, &ftype)) {
+               if (!PyArg_ParseTuple(pair, "OO|O", &fname, &ftype, &bits)) {
                        Py_DECREF(fieldlist);
                        return -1;
                }