Issue #19099: The struct module now supports Unicode format strings.

This commit is contained in:
Serhiy Storchaka 2013-12-08 17:44:50 +02:00
parent 337c50b8cb
commit 5493d5ea2a
3 changed files with 33 additions and 4 deletions

View File

@ -574,6 +574,18 @@ class StructTest(unittest.TestCase):
self.check_sizeof('0s', 1)
self.check_sizeof('0c', 0)
def test_unicode_format(self):
try:
unicode
except NameError:
self.skipTest('no unicode support')
# Issue #19099
s = struct.Struct(unichr(ord('I')))
self.assertEqual(s.format, 'I')
self.assertIs(type(s.format), str)
self.assertRaises(ValueError, struct.Struct, unichr(0x80))
def test_main():
support.run_unittest(StructTest)

View File

@ -15,6 +15,8 @@ Core and Builtins
Library
-------
- Issue #19099: The struct module now supports Unicode format strings.
- Issue #19878: Fix segfault in bz2 module after calling __init__ twice with
non-existent filename. Initial patch by Vajrasky Kok.

View File

@ -1371,13 +1371,28 @@ s_init(PyObject *self, PyObject *args, PyObject *kwds)
assert(PyStruct_Check(self));
if (!PyArg_ParseTupleAndKeywords(args, kwds, "S:Struct", kwlist,
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:Struct", kwlist,
&o_format))
return -1;
Py_INCREF(o_format);
Py_CLEAR(soself->s_format);
soself->s_format = o_format;
if (PyString_Check(o_format)) {
Py_INCREF(o_format);
Py_CLEAR(soself->s_format);
soself->s_format = o_format;
}
else if (PyUnicode_Check(o_format)) {
PyObject *str = PyUnicode_AsEncodedString(o_format, "ascii", NULL);
if (str == NULL)
return -1;
Py_CLEAR(soself->s_format);
soself->s_format = str;
}
else {
PyErr_Format(PyExc_TypeError,
"Struct() argument 1 must be string, not %s",
Py_TYPE(o_format)->tp_name);
return -1;
}
ret = prepare_s(soself);
return ret;