[Python-checkins] gh-60580: Fix a wrong type of `ctypes.wintypes.BYTE` (#97579)

abalkin webhook-mailer at python.org
Thu Jan 26 09:17:09 EST 2023


https://github.com/python/cpython/commit/409f5337a3e466a5ef673797575cbd1745d27ca9
commit: 409f5337a3e466a5ef673797575cbd1745d27ca9
branch: main
author: Oleg Iarygin <oleg at arhadthedev.net>
committer: abalkin <abalkin at users.noreply.github.com>
date: 2023-01-26T18:16:27+04:00
summary:

gh-60580: Fix a wrong type of `ctypes.wintypes.BYTE` (#97579)

Created from a patch file attached to an issue, by Anatoly Techtonik.

files:
A Misc/NEWS.d/next/Library/2022-09-26-21-18-47.gh-issue-60580.0hBgde.rst
M Lib/ctypes/wintypes.py
M Lib/test/test_ctypes/test_wintypes.py

diff --git a/Lib/ctypes/wintypes.py b/Lib/ctypes/wintypes.py
index c619d27596d4..9c4e721438aa 100644
--- a/Lib/ctypes/wintypes.py
+++ b/Lib/ctypes/wintypes.py
@@ -1,7 +1,7 @@
 # The most useful windows datatypes
 import ctypes
 
-BYTE = ctypes.c_byte
+BYTE = ctypes.c_ubyte
 WORD = ctypes.c_ushort
 DWORD = ctypes.c_ulong
 
diff --git a/Lib/test/test_ctypes/test_wintypes.py b/Lib/test/test_ctypes/test_wintypes.py
index 243d5962ffa7..a01b9b1d0f31 100644
--- a/Lib/test/test_ctypes/test_wintypes.py
+++ b/Lib/test/test_ctypes/test_wintypes.py
@@ -1,3 +1,6 @@
+# See <https://learn.microsoft.com/en-us/windows/win32/winprog/windows-data-types>
+# for reference.
+
 import unittest
 
 # also work on POSIX
@@ -38,6 +41,22 @@ def test_variant_bool(self):
         vb.value = []
         self.assertIs(vb.value, False)
 
+    def assertIsSigned(self, ctype):
+        self.assertLess(ctype(-1).value, 0)
+
+    def assertIsUnsigned(self, ctype):
+        self.assertGreater(ctype(-1).value, 0)
+
+    def test_signedness(self):
+        for ctype in (wintypes.BYTE, wintypes.WORD, wintypes.DWORD,
+                     wintypes.BOOLEAN, wintypes.UINT, wintypes.ULONG):
+            with self.subTest(ctype=ctype):
+                self.assertIsUnsigned(ctype)
+
+        for ctype in (wintypes.BOOL, wintypes.INT, wintypes.LONG):
+            with self.subTest(ctype=ctype):
+                self.assertIsSigned(ctype)
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/Misc/NEWS.d/next/Library/2022-09-26-21-18-47.gh-issue-60580.0hBgde.rst b/Misc/NEWS.d/next/Library/2022-09-26-21-18-47.gh-issue-60580.0hBgde.rst
new file mode 100644
index 000000000000..630e56cd2f7b
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-09-26-21-18-47.gh-issue-60580.0hBgde.rst
@@ -0,0 +1,3 @@
+:data:`ctypes.wintypes.BYTE` definition changed from
+:data:`~ctypes.c_byte` to :data:`~ctypes.c_ubyte` to match Windows
+SDK. Patch by Anatoly Techtonik and Oleg Iarygin.



More information about the Python-checkins mailing list