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

Skip to content

Commit 97f9d4f

Browse files
committed
Patch #1318 by Amaury Forgeot d'Arc.
Updates to ctypes for python 3.0 to make the tests pass. Notable changes are: - return bytes instead of str8 - integers in range(256) are accepted as "one char string": libc.strchr("abcdef", 98) is now valid. - directly use the wide-char version of the win32 function LoadLibrary.
1 parent b98cda4 commit 97f9d4f

14 files changed

Lines changed: 106 additions & 108 deletions

Lib/ctypes/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@
5252
"""
5353

5454
def create_string_buffer(init, size=None):
55-
"""create_string_buffer(aString) -> character array
55+
"""create_string_buffer(aBytes) -> character array
5656
create_string_buffer(anInteger) -> character array
5757
create_string_buffer(aString, anInteger) -> character array
5858
"""
59-
if isinstance(init, str):
59+
if isinstance(init, (str, bytes)):
6060
if size is None:
6161
size = len(init)+1
6262
buftype = c_char * size

Lib/ctypes/test/test_arrays.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,12 @@ def test_from_address(self):
9494
# Failed with 0.9.8, reported by JUrner
9595
p = create_string_buffer("foo")
9696
sz = (c_char * 3).from_address(addressof(p))
97-
self.failUnlessEqual(sz[:], "foo")
98-
self.failUnlessEqual(sz[::], "foo")
99-
self.failUnlessEqual(sz[::-1], "oof")
100-
self.failUnlessEqual(sz[::3], "f")
101-
self.failUnlessEqual(sz[1:4:2], "o")
102-
self.failUnlessEqual(sz.value, "foo")
97+
self.failUnlessEqual(sz[:], b"foo")
98+
self.failUnlessEqual(sz[::], b"foo")
99+
self.failUnlessEqual(sz[::-1], b"oof")
100+
self.failUnlessEqual(sz[::3], b"f")
101+
self.failUnlessEqual(sz[1:4:2], b"o")
102+
self.failUnlessEqual(sz.value, b"foo")
103103

104104
try:
105105
create_unicode_buffer

Lib/ctypes/test/test_buffers.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,23 @@ def test_buffer(self):
1414
self.failUnlessEqual(sizeof(b), 4 * sizeof(c_char))
1515
self.failUnless(type(b[0]) is bytes)
1616
self.failUnlessEqual(b[0], b"a")
17-
self.failUnlessEqual(b[:], "abc\0")
18-
self.failUnlessEqual(b[::], "abc\0")
19-
self.failUnlessEqual(b[::-1], "\0cba")
20-
self.failUnlessEqual(b[::2], "ac")
21-
self.failUnlessEqual(b[::5], "a")
17+
self.failUnlessEqual(b[:], b"abc\0")
18+
self.failUnlessEqual(b[::], b"abc\0")
19+
self.failUnlessEqual(b[::-1], b"\0cba")
20+
self.failUnlessEqual(b[::2], b"ac")
21+
self.failUnlessEqual(b[::5], b"a")
2222

2323
def test_string_conversion(self):
2424
b = create_string_buffer("abc")
2525
self.failUnlessEqual(len(b), 4) # trailing nul char
2626
self.failUnlessEqual(sizeof(b), 4 * sizeof(c_char))
2727
self.failUnless(type(b[0]) is bytes)
2828
self.failUnlessEqual(b[0], b"a")
29-
self.failUnlessEqual(b[:], "abc\0")
30-
self.failUnlessEqual(b[::], "abc\0")
31-
self.failUnlessEqual(b[::-1], "\0cba")
32-
self.failUnlessEqual(b[::2], "ac")
33-
self.failUnlessEqual(b[::5], "a")
29+
self.failUnlessEqual(b[:], b"abc\0")
30+
self.failUnlessEqual(b[::], b"abc\0")
31+
self.failUnlessEqual(b[::-1], b"\0cba")
32+
self.failUnlessEqual(b[::2], b"ac")
33+
self.failUnlessEqual(b[::5], b"a")
3434

3535
try:
3636
c_wchar

Lib/ctypes/test/test_libc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def sort(a, b):
2424

2525
chars = create_string_buffer("spam, spam, and spam")
2626
lib.my_qsort(chars, len(chars)-1, sizeof(c_char), comparefunc(sort))
27-
self.failUnlessEqual(chars.raw, " ,,aaaadmmmnpppsss\x00")
27+
self.failUnlessEqual(chars.raw, b" ,,aaaadmmmnpppsss\x00")
2828

2929
if __name__ == "__main__":
3030
unittest.main()

Lib/ctypes/test/test_memfunctions.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@ def test_memmove(self):
99
a = create_string_buffer(1000000)
1010
p = b"Hello, World"
1111
result = memmove(a, p, len(p))
12-
self.failUnlessEqual(a.value, "Hello, World")
12+
self.failUnlessEqual(a.value, b"Hello, World")
1313

14-
self.failUnlessEqual(string_at(result), "Hello, World")
15-
self.failUnlessEqual(string_at(result, 5), "Hello")
16-
self.failUnlessEqual(string_at(result, 16), "Hello, World\0\0\0\0")
17-
self.failUnlessEqual(string_at(result, 0), "")
14+
self.failUnlessEqual(string_at(result), b"Hello, World")
15+
self.failUnlessEqual(string_at(result, 5), b"Hello")
16+
self.failUnlessEqual(string_at(result, 16), b"Hello, World\0\0\0\0")
17+
self.failUnlessEqual(string_at(result, 0), b"")
1818

1919
def test_memset(self):
2020
a = create_string_buffer(1000000)
2121
result = memset(a, ord('x'), 16)
22-
self.failUnlessEqual(a.value, "xxxxxxxxxxxxxxxx")
22+
self.failUnlessEqual(a.value, b"xxxxxxxxxxxxxxxx")
2323

24-
self.failUnlessEqual(string_at(result), "xxxxxxxxxxxxxxxx")
25-
self.failUnlessEqual(string_at(a), "xxxxxxxxxxxxxxxx")
26-
self.failUnlessEqual(string_at(a, 20), "xxxxxxxxxxxxxxxx\0\0\0\0")
24+
self.failUnlessEqual(string_at(result), b"xxxxxxxxxxxxxxxx")
25+
self.failUnlessEqual(string_at(a), b"xxxxxxxxxxxxxxxx")
26+
self.failUnlessEqual(string_at(a, 20), b"xxxxxxxxxxxxxxxx\0\0\0\0")
2727

2828
def test_cast(self):
2929
a = (c_ubyte * 32)(*map(ord, "abcdef"))
@@ -46,8 +46,8 @@ def test_string_at(self):
4646
self.failUnlessEqual(2, sys.getrefcount(s))
4747
self.failUnless(s, "foo bar")
4848

49-
self.failUnlessEqual(string_at(b"foo bar", 7), "foo bar")
50-
self.failUnlessEqual(string_at(b"foo bar", 3), "foo")
49+
self.failUnlessEqual(string_at(b"foo bar", 7), b"foo bar")
50+
self.failUnlessEqual(string_at(b"foo bar", 3), b"foo")
5151

5252
try:
5353
create_unicode_buffer

Lib/ctypes/test/test_python_api.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ def test_PyString_FromStringAndSize(self):
2323
PyString_FromStringAndSize.restype = py_object
2424
PyString_FromStringAndSize.argtypes = c_char_p, c_py_ssize_t
2525

26-
self.failUnlessEqual(PyString_FromStringAndSize("abcdefghi", 3), "abc")
26+
self.failUnlessEqual(PyString_FromStringAndSize(b"abcdefghi", 3), b"abc")
2727

2828
def test_PyString_FromString(self):
2929
pythonapi.PyString_FromString.restype = py_object
3030
pythonapi.PyString_FromString.argtypes = (c_char_p,)
3131

32-
s = "abc"
32+
s = b"abc"
3333
refcnt = grc(s)
3434
pyob = pythonapi.PyString_FromString(s)
3535
self.failUnlessEqual(grc(s), refcnt)
@@ -73,10 +73,10 @@ def test_PyOS_snprintf(self):
7373

7474
buf = c_buffer(256)
7575
PyOS_snprintf(buf, sizeof(buf), "Hello from %s", b"ctypes")
76-
self.failUnlessEqual(buf.value, "Hello from ctypes")
76+
self.failUnlessEqual(buf.value, b"Hello from ctypes")
7777

7878
PyOS_snprintf(buf, sizeof(buf), "Hello from %s (%d, %d, %d)", b"ctypes", 1, 2, 3)
79-
self.failUnlessEqual(buf.value, "Hello from ctypes (1, 2, 3)")
79+
self.failUnlessEqual(buf.value, b"Hello from ctypes (1, 2, 3)")
8080

8181
# not enough arguments
8282
self.failUnlessRaises(TypeError, PyOS_snprintf, buf)

Lib/ctypes/test/test_returnfuncptrs.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ def test_with_prototype(self):
1414
strchr = get_strchr()
1515
self.failUnlessEqual(strchr("abcdef", "b"), "bcdef")
1616
self.failUnlessEqual(strchr("abcdef", "x"), None)
17-
self.assertRaises(ArgumentError, strchr, "abcdef", 3)
17+
self.failUnlessEqual(strchr("abcdef", 98), "bcdef")
18+
self.failUnlessEqual(strchr("abcdef", 107), None)
19+
self.assertRaises(ArgumentError, strchr, "abcdef", 3.0)
1820
self.assertRaises(TypeError, strchr, "abcdef")
1921

2022
def test_without_prototype(self):
@@ -28,7 +30,7 @@ def test_without_prototype(self):
2830
strchr = CFUNCTYPE(c_char_p, c_char_p, c_char)(addr)
2931
self.failUnless(strchr("abcdef", "b"), "bcdef")
3032
self.failUnlessEqual(strchr("abcdef", "x"), None)
31-
self.assertRaises(ArgumentError, strchr, "abcdef", 3)
33+
self.assertRaises(ArgumentError, strchr, "abcdef", 3.0)
3234
self.assertRaises(TypeError, strchr, "abcdef")
3335

3436
if __name__ == "__main__":

Lib/ctypes/test/test_slicing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def errcheck(result, func, args):
121121

122122

123123
def test_char_array(self):
124-
s = "abcdefghijklmnopqrstuvwxyz\0"
124+
s = b"abcdefghijklmnopqrstuvwxyz\0"
125125

126126
p = (c_char * 27)(*s)
127127
self.failUnlessEqual(p[:], s)

Lib/ctypes/test/test_strings.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,29 @@ def test(self):
66
BUF = c_char * 4
77

88
buf = BUF("a", "b", "c")
9-
self.failUnlessEqual(buf.value, "abc")
10-
self.failUnlessEqual(buf.raw, "abc\000")
9+
self.failUnlessEqual(buf.value, b"abc")
10+
self.failUnlessEqual(buf.raw, b"abc\000")
1111

1212
buf.value = "ABCD"
13-
self.failUnlessEqual(buf.value, "ABCD")
14-
self.failUnlessEqual(buf.raw, "ABCD")
13+
self.failUnlessEqual(buf.value, b"ABCD")
14+
self.failUnlessEqual(buf.raw, b"ABCD")
1515

1616
buf.value = "x"
17-
self.failUnlessEqual(buf.value, "x")
18-
self.failUnlessEqual(buf.raw, "x\000CD")
17+
self.failUnlessEqual(buf.value, b"x")
18+
self.failUnlessEqual(buf.raw, b"x\000CD")
1919

2020
buf[1] = "Z"
21-
self.failUnlessEqual(buf.value, "xZCD")
22-
self.failUnlessEqual(buf.raw, "xZCD")
21+
self.failUnlessEqual(buf.value, b"xZCD")
22+
self.failUnlessEqual(buf.raw, b"xZCD")
2323

2424
self.assertRaises(ValueError, setattr, buf, "value", "aaaaaaaa")
2525
self.assertRaises(TypeError, setattr, buf, "value", 42)
2626

2727
def test_c_buffer_value(self):
2828
buf = c_buffer(32)
2929

30-
buf.value = "Hello, World"
31-
self.failUnlessEqual(buf.value, "Hello, World")
30+
buf.value = b"Hello, World"
31+
self.failUnlessEqual(buf.value, b"Hello, World")
3232

3333
self.failUnlessRaises(TypeError, setattr, buf, "value", memoryview(b"Hello, World"))
3434
self.assertRaises(TypeError, setattr, buf, "value", memoryview(b"abc"))
@@ -38,7 +38,7 @@ def test_c_buffer_raw(self):
3838
buf = c_buffer(32)
3939

4040
buf.raw = memoryview(b"Hello, World")
41-
self.failUnlessEqual(buf.value, "Hello, World")
41+
self.failUnlessEqual(buf.value, b"Hello, World")
4242
self.assertRaises(TypeError, setattr, buf, "value", memoryview(b"abc"))
4343
self.assertRaises(ValueError, setattr, buf, "raw", memoryview(b"x" * 100))
4444

Lib/ctypes/test/test_unicode.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -111,18 +111,18 @@ def test_buffers(self):
111111

112112
ctypes.set_conversion_mode("ascii", "replace")
113113
buf = ctypes.create_string_buffer("ab\xe4\xf6\xfc")
114-
self.failUnlessEqual(buf[:], "ab???\0")
115-
self.failUnlessEqual(buf[::], "ab???\0")
116-
self.failUnlessEqual(buf[::-1], "\0???ba")
117-
self.failUnlessEqual(buf[::2], "a??")
118-
self.failUnlessEqual(buf[6:5:-1], "")
114+
self.failUnlessEqual(buf[:], b"ab???\0")
115+
self.failUnlessEqual(buf[::], b"ab???\0")
116+
self.failUnlessEqual(buf[::-1], b"\0???ba")
117+
self.failUnlessEqual(buf[::2], b"a??")
118+
self.failUnlessEqual(buf[6:5:-1], b"")
119119

120120
ctypes.set_conversion_mode("ascii", "ignore")
121121
buf = ctypes.create_string_buffer("ab\xe4\xf6\xfc")
122122
# is that correct? not sure. But with 'ignore', you get what you pay for..
123-
self.failUnlessEqual(buf[:], "ab\0\0\0\0")
124-
self.failUnlessEqual(buf[::], "ab\0\0\0\0")
125-
self.failUnlessEqual(buf[::-1], "\0\0\0\0ba")
123+
self.failUnlessEqual(buf[:], b"ab\0\0\0\0")
124+
self.failUnlessEqual(buf[::], b"ab\0\0\0\0")
125+
self.failUnlessEqual(buf[::-1], b"\0\0\0\0ba")
126126

127127
if __name__ == '__main__':
128128
unittest.main()

0 commit comments

Comments
 (0)