summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2010-06-11 21:50:30 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2010-06-11 21:50:30 (GMT)
commitda0eca427aef6c58f3c134c0789f54d7b8fa4210 (patch)
tree035de9f0ffe1bca76631b3459dab6dc64179ca60
parentcc0cfd357611c69a99841f21affa73e829416789 (diff)
downloadcpython-da0eca427aef6c58f3c134c0789f54d7b8fa4210.zip
cpython-da0eca427aef6c58f3c134c0789f54d7b8fa4210.tar.gz
cpython-da0eca427aef6c58f3c134c0789f54d7b8fa4210.tar.bz2
Issue #8966: If a ctypes structure field is an array of c_char, convert its
value to bytes instead of str (as done for c_char and c_char_p).
-rw-r--r--Lib/ctypes/test/test_bytes.py4
-rw-r--r--Lib/ctypes/test/test_structures.py10
-rw-r--r--Misc/NEWS5
-rw-r--r--Modules/_ctypes/cfield.c2
4 files changed, 12 insertions, 9 deletions
diff --git a/Lib/ctypes/test/test_bytes.py b/Lib/ctypes/test/test_bytes.py
index 374b2d7..4a1d0fd 100644
--- a/Lib/ctypes/test/test_bytes.py
+++ b/Lib/ctypes/test/test_bytes.py
@@ -30,8 +30,8 @@ class BytesTest(unittest.TestCase):
X("abc")
x = X(b"abc")
- self.assertEqual(x.a, "abc")
- self.assertEqual(type(x.a), str)
+ self.assertEqual(x.a, b"abc")
+ self.assertEqual(type(x.a), bytes)
def test_struct_W(self):
class X(Structure):
diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py
index c58d949..fb048aa 100644
--- a/Lib/ctypes/test/test_structures.py
+++ b/Lib/ctypes/test/test_structures.py
@@ -209,9 +209,9 @@ class StructureTestCase(unittest.TestCase):
self.assertRaises(TypeError, Person, "Name", "HI")
# short enough
- self.assertEqual(Person("12345", 5).name, "12345")
+ self.assertEqual(Person("12345", 5).name, b"12345")
# exact fit
- self.assertEqual(Person("123456", 5).name, "123456")
+ self.assertEqual(Person("123456", 5).name, b"123456")
# too long
self.assertRaises(ValueError, Person, "1234567", 5)
@@ -269,9 +269,9 @@ class StructureTestCase(unittest.TestCase):
p = Person("Someone", ("1234", "5678"), 5)
- self.assertEqual(p.name, "Someone")
- self.assertEqual(p.phone.areacode, "1234")
- self.assertEqual(p.phone.number, "5678")
+ self.assertEqual(p.name, b"Someone")
+ self.assertEqual(p.phone.areacode, b"1234")
+ self.assertEqual(p.phone.number, b"5678")
self.assertEqual(p.age, 5)
def test_structures_with_wchar(self):
diff --git a/Misc/NEWS b/Misc/NEWS
index b7b4f65..1335dbc 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -421,6 +421,9 @@ C-API
Library
-------
+- Issue #8966: If a ctypes structure field is an array of c_char, convert its
+ value to bytes instead of str (as done for c_char and c_char_p).
+
- Issue #8188: Comparisons between Decimal and Fraction objects are
now permitted, returning a result based on the exact numerical
values of the operands. This builds on issue #2531, which allowed
@@ -1288,7 +1291,7 @@ Extension Modules
-----------------
- Issue #3129: Trailing digits in format string are no longer ignored.
- For example, "1" or "ilib123" are now invalid formats and cause
+ For example, "1" or "ilib123" are now invalid formats and cause
``struct.error`` to be raised.
- Issue #7384: If the system readline library is linked against ncurses,
diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c
index 441ed9e..876e2c0 100644
--- a/Modules/_ctypes/cfield.c
+++ b/Modules/_ctypes/cfield.c
@@ -1333,7 +1333,7 @@ s_get(void *ptr, Py_ssize_t size)
break;
}
- return PyUnicode_FromStringAndSize((char *)ptr, (Py_ssize_t)i);
+ return PyBytes_FromStringAndSize((char *)ptr, (Py_ssize_t)i);
}
static PyObject *