summaryrefslogtreecommitdiffstats
path: root/Tools/clinic
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2024-05-28 09:01:37 (GMT)
committerGitHub <noreply@github.com>2024-05-28 09:01:37 (GMT)
commitb313cc68d50de5fb5f43acffd402c5c4da6516fc (patch)
tree3d25305bb921d8e3748db524ec9267e65ecb242f /Tools/clinic
parentbf08f0a5fe5750904aa4a239945db16d2c43f6e7 (diff)
downloadcpython-b313cc68d50de5fb5f43acffd402c5c4da6516fc.zip
cpython-b313cc68d50de5fb5f43acffd402c5c4da6516fc.tar.gz
cpython-b313cc68d50de5fb5f43acffd402c5c4da6516fc.tar.bz2
gh-117557: Improve error messages when a string, bytes or bytearray of length 1 are expected (GH-117631)
Diffstat (limited to 'Tools/clinic')
-rw-r--r--Tools/clinic/libclinic/converters.py25
1 files changed, 22 insertions, 3 deletions
diff --git a/Tools/clinic/libclinic/converters.py b/Tools/clinic/libclinic/converters.py
index 0778961..bd5c2a2 100644
--- a/Tools/clinic/libclinic/converters.py
+++ b/Tools/clinic/libclinic/converters.py
@@ -89,10 +89,24 @@ class char_converter(CConverter):
def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None:
if self.format_unit == 'c':
return self.format_code("""
- if (PyBytes_Check({argname}) && PyBytes_GET_SIZE({argname}) == 1) {{{{
+ if (PyBytes_Check({argname})) {{{{
+ if (PyBytes_GET_SIZE({argname}) != 1) {{{{
+ PyErr_Format(PyExc_TypeError,
+ "{{name}}(): {displayname} must be a byte string of length 1, "
+ "not a bytes object of length %zd",
+ PyBytes_GET_SIZE({argname}));
+ goto exit;
+ }}}}
{paramname} = PyBytes_AS_STRING({argname})[0];
}}}}
- else if (PyByteArray_Check({argname}) && PyByteArray_GET_SIZE({argname}) == 1) {{{{
+ else if (PyByteArray_Check({argname})) {{{{
+ if (PyByteArray_GET_SIZE({argname}) != 1) {{{{
+ PyErr_Format(PyExc_TypeError,
+ "{{name}}(): {displayname} must be a byte string of length 1, "
+ "not a bytearray object of length %zd",
+ PyByteArray_GET_SIZE({argname}));
+ goto exit;
+ }}}}
{paramname} = PyByteArray_AS_STRING({argname})[0];
}}}}
else {{{{
@@ -101,6 +115,7 @@ class char_converter(CConverter):
}}}}
""",
argname=argname,
+ displayname=displayname,
bad_argument=self.bad_argument(displayname, 'a byte string of length 1', limited_capi=limited_capi),
)
return super().parse_arg(argname, displayname, limited_capi=limited_capi)
@@ -272,12 +287,16 @@ class int_converter(CConverter):
goto exit;
}}}}
if (PyUnicode_GET_LENGTH({argname}) != 1) {{{{
- {bad_argument}
+ PyErr_Format(PyExc_TypeError,
+ "{{name}}(): {displayname} must be a unicode character, "
+ "not a string of length %zd",
+ PyUnicode_GET_LENGTH({argname}));
goto exit;
}}}}
{paramname} = PyUnicode_READ_CHAR({argname}, 0);
""",
argname=argname,
+ displayname=displayname,
bad_argument=self.bad_argument(displayname, 'a unicode character', limited_capi=limited_capi),
)
return super().parse_arg(argname, displayname, limited_capi=limited_capi)