Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2fb5ac7

Browse files
author
Thomas Heller
committed
Fix the ctypes tests. Patch from Victor Stinner. He writes:
The problem is that ctypes c_char (and c_char_p) creates unicode string instead of byte string. I attached a proposition (patch) to change this behaviour (use bytes for c_char). So in next example, it will display 'bytes' and not 'str': from ctypes import c_buffer, c_char buf = c_buffer("abcdef") print (type(buf[0])) Other behaviour changes: - repr(c_char) adds a "b" eg. repr(c_char('x')) is "c_char(b'x')" instead of "c_char('x')" - bytes is mutable whereas str is not: this may break some modules based on ctypes
1 parent df5f6b5 commit 2fb5ac7

7 files changed

Lines changed: 18 additions & 18 deletions

File tree

Lib/ctypes/test/test_arrays.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ def test_simple(self):
4848
# CharArray("abc")
4949
self.assertRaises(TypeError, CharArray, "abc")
5050

51-
self.failUnlessEqual(ca[0], "a")
52-
self.failUnlessEqual(ca[1], "b")
53-
self.failUnlessEqual(ca[2], "c")
54-
self.failUnlessEqual(ca[-3], "a")
55-
self.failUnlessEqual(ca[-2], "b")
56-
self.failUnlessEqual(ca[-1], "c")
51+
self.failUnlessEqual(ca[0], b"a")
52+
self.failUnlessEqual(ca[1], b"b")
53+
self.failUnlessEqual(ca[2], b"c")
54+
self.failUnlessEqual(ca[-3], b"a")
55+
self.failUnlessEqual(ca[-2], b"b")
56+
self.failUnlessEqual(ca[-1], b"c")
5757

5858
self.failUnlessEqual(len(ca), 3)
5959

Lib/ctypes/test/test_buffers.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,21 @@ def test_buffer(self):
77
b = create_string_buffer(32)
88
self.failUnlessEqual(len(b), 32)
99
self.failUnlessEqual(sizeof(b), 32 * sizeof(c_char))
10-
self.failUnless(type(b[0]) is str)
10+
self.failUnless(type(b[0]) is bytes)
1111

1212
b = create_string_buffer("abc")
1313
self.failUnlessEqual(len(b), 4) # trailing nul char
1414
self.failUnlessEqual(sizeof(b), 4 * sizeof(c_char))
15-
self.failUnless(type(b[0]) is str)
16-
self.failUnlessEqual(b[0], "a")
15+
self.failUnless(type(b[0]) is bytes)
16+
self.failUnlessEqual(b[0], b"a")
1717
self.failUnlessEqual(b[:], "abc\0")
1818

1919
def test_string_conversion(self):
2020
b = create_string_buffer("abc")
2121
self.failUnlessEqual(len(b), 4) # trailing nul char
2222
self.failUnlessEqual(sizeof(b), 4 * sizeof(c_char))
23-
self.failUnless(type(b[0]) is str)
24-
self.failUnlessEqual(b[0], "a")
23+
self.failUnless(type(b[0]) is bytes)
24+
self.failUnlessEqual(b[0], b"a")
2525
self.failUnlessEqual(b[:], "abc\0")
2626

2727
try:

Lib/ctypes/test/test_callbacks.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ def test_double(self):
7878
self.check_type(c_double, -3.14)
7979

8080
def test_char(self):
81-
self.check_type(c_char, "x")
82-
self.check_type(c_char, "a")
81+
self.check_type(c_char, b"x")
82+
self.check_type(c_char, b"a")
8383

8484
# disabled: would now (correctly) raise a RuntimeWarning about
8585
# a memory leak. A callback function cannot return a non-integral

Lib/ctypes/test/test_numbers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,11 +177,11 @@ def test_char_from_address(self):
177177
a = array('b', [0])
178178
a[0] = ord('x')
179179
v = c_char.from_address(a.buffer_info()[0])
180-
self.failUnlessEqual(v.value, 'x')
180+
self.failUnlessEqual(v.value, b'x')
181181
self.failUnless(type(v) is c_char)
182182

183183
a[0] = ord('?')
184-
self.failUnlessEqual(v.value, '?')
184+
self.failUnlessEqual(v.value, b'?')
185185

186186
# array does not support c_bool / 't'
187187
# def test_bool_from_address(self):

Lib/ctypes/test/test_repr.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def test_numbers(self):
2222
self.failUnlessEqual("<X object at", repr(typ(42))[:12])
2323

2424
def test_char(self):
25-
self.failUnlessEqual("c_char('x')", repr(c_char('x')))
25+
self.failUnlessEqual("c_char(b'x')", repr(c_char('x')))
2626
self.failUnlessEqual("<X object at", repr(X('x'))[:12])
2727

2828
if __name__ == "__main__":

Lib/ctypes/test/test_stringptr.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def test_functions(self):
6666
buf = c_buffer("abcdef")
6767
r = strchr(buf, "c")
6868
x = r[0], r[1], r[2], r[3], r[4]
69-
self.failUnlessEqual(x, ("c", "d", "e", "f", "\000"))
69+
self.failUnlessEqual(x, (b"c", b"d", b"e", b"f", b"\000"))
7070
del buf
7171
# x1 will NOT be the same as x, usually:
7272
x1 = r[0], r[1], r[2], r[3], r[4]

Modules/_ctypes/cfield.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1156,7 +1156,7 @@ c_set(void *ptr, PyObject *value, Py_ssize_t size)
11561156
static PyObject *
11571157
c_get(void *ptr, Py_ssize_t size)
11581158
{
1159-
return PyUnicode_FromStringAndSize((char *)ptr, 1);
1159+
return PyBytes_FromStringAndSize((char *)ptr, 1);
11601160
}
11611161

11621162
#ifdef CTYPES_UNICODE

0 commit comments

Comments
 (0)