Skip to content

Commit 330181b

Browse files
Raise ValueError instead of UnicodeDecodeError.
1 parent f22d34d commit 330181b

File tree

3 files changed

+9
-10
lines changed

3 files changed

+9
-10
lines changed

Lib/test/test_struct.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -930,13 +930,13 @@ def __init__(self, newargs, initargs):
930930
MyStruct(('>h',), ('$',))
931931
with self.assertRaises(ValueError):
932932
MyStruct(('\udc00',), ('>h',))
933-
with self.assertRaises(UnicodeDecodeError):
933+
with self.assertRaises(ValueError):
934934
MyStruct((b'\xa4',), ('>h',))
935935
with self.assertWarns(FutureWarning):
936936
with self.assertRaises(ValueError):
937937
MyStruct(('>h',), ('\udc00',))
938938
with self.assertWarns(FutureWarning):
939-
with self.assertRaises(UnicodeDecodeError):
939+
with self.assertRaises(ValueError):
940940
MyStruct(('>h',), (b'\xa4',))
941941
with self.assertWarns(FutureWarning):
942942
my_struct = MyStruct(('>h',), ('<h',))
@@ -961,7 +961,7 @@ class MyStruct(struct.Struct):
961961
MyStruct('$')
962962
with self.assertRaises(ValueError):
963963
MyStruct('\udc00')
964-
with self.assertRaises(UnicodeDecodeError):
964+
with self.assertRaises(ValueError):
965965
MyStruct(b'\xa4')
966966
with self.assertRaises(TypeError):
967967
MyStruct('>h', 42)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Changed some implementation details in :class:`struct.Struct`: calling it
22
with non-ASCII string format will now raise a :exc:`ValueError` instead of
33
:exc:`UnicodeEncodeError`, calling it with non-ASCII bytes format will now
4-
raise a :exc:`UnicodeDecodeError` instead of :exc:`struct.error`, getting
4+
raise a :exc:`ValueError` instead of :exc:`struct.error`, getting
55
the :attr:`!format` attribute of uninitialized object will now raise an
66
:exc:`AttributeError` instead of :exc:`RuntimeError`.

Modules/_struct.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1635,7 +1635,10 @@ prepare_s(PyStructObject *self, PyObject *format)
16351635

16361636
_structmodulestate *state = get_struct_state_structinst(self);
16371637

1638-
assert(PyUnicode_IS_ASCII(format));
1638+
if (!PyUnicode_IS_ASCII(format)) {
1639+
PyErr_SetString(PyExc_ValueError, "non-ASCII character in struct format");
1640+
return -1;
1641+
}
16391642
fmt = (const char *)PyUnicode_1BYTE_DATA(format);
16401643
if (strlen(fmt) != (size_t)PyUnicode_GET_LENGTH(format)) {
16411644
PyErr_SetString(state->StructError,
@@ -1781,15 +1784,11 @@ static int
17811784
set_format(PyStructObject *self, PyObject *format)
17821785
{
17831786
if (PyUnicode_Check(format)) {
1784-
if (!PyUnicode_IS_ASCII(format)) {
1785-
PyErr_SetString(PyExc_ValueError, "non-ASCII character in struct format");
1786-
return -1;
1787-
}
17881787
format = PyUnicode_FromObject(format);
17891788
}
17901789
else if (PyBytes_Check(format)) {
17911790
format = PyUnicode_DecodeASCII(PyBytes_AS_STRING(format),
1792-
PyBytes_GET_SIZE(format), NULL);
1791+
PyBytes_GET_SIZE(format), "surrogateescape");
17931792
}
17941793
else {
17951794
PyErr_Format(PyExc_TypeError,

0 commit comments

Comments
 (0)