@@ -1242,6 +1242,22 @@ set_string(PyObject **attr, const char *value)
12421242}
12431243
12441244
1245+ static PyObject *
1246+ get_bytes (PyObject * attr , const char * name )
1247+ {
1248+ if (!attr ) {
1249+ PyErr_Format (PyExc_TypeError , "%.200s attribute not set" , name );
1250+ return NULL ;
1251+ }
1252+
1253+ if (!PyBytes_Check (attr )) {
1254+ PyErr_Format (PyExc_TypeError , "%.200s attribute must be bytes" , name );
1255+ return NULL ;
1256+ }
1257+ Py_INCREF (attr );
1258+ return attr ;
1259+ }
1260+
12451261static PyObject *
12461262get_unicode (PyObject * attr , const char * name )
12471263{
@@ -1280,7 +1296,7 @@ PyUnicodeEncodeError_GetObject(PyObject *exc)
12801296PyObject *
12811297PyUnicodeDecodeError_GetObject (PyObject * exc )
12821298{
1283- return get_string (((PyUnicodeErrorObject * )exc )-> object , "object" );
1299+ return get_bytes (((PyUnicodeErrorObject * )exc )-> object , "object" );
12841300}
12851301
12861302PyObject *
@@ -1314,10 +1330,10 @@ PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
13141330{
13151331 if (!get_int (((PyUnicodeErrorObject * )exc )-> start , start , "start" )) {
13161332 Py_ssize_t size ;
1317- PyObject * obj = get_string (((PyUnicodeErrorObject * )exc )-> object ,
1333+ PyObject * obj = get_bytes (((PyUnicodeErrorObject * )exc )-> object ,
13181334 "object" );
13191335 if (!obj ) return -1 ;
1320- size = PyString_GET_SIZE (obj );
1336+ size = PyBytes_GET_SIZE (obj );
13211337 if (* start < 0 )
13221338 * start = 0 ;
13231339 if (* start >=size )
@@ -1382,10 +1398,10 @@ PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
13821398{
13831399 if (!get_int (((PyUnicodeErrorObject * )exc )-> end , end , "end" )) {
13841400 Py_ssize_t size ;
1385- PyObject * obj = get_string (((PyUnicodeErrorObject * )exc )-> object ,
1401+ PyObject * obj = get_bytes (((PyUnicodeErrorObject * )exc )-> object ,
13861402 "object" );
13871403 if (!obj ) return -1 ;
1388- size = PyString_GET_SIZE (obj );
1404+ size = PyBytes_GET_SIZE (obj );
13891405 if (* end < 1 )
13901406 * end = 1 ;
13911407 if (* end > size )
@@ -1629,7 +1645,7 @@ UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
16291645 if (BaseException_init ((PyBaseExceptionObject * )self , args , kwds ) == -1 )
16301646 return -1 ;
16311647 return UnicodeError_init ((PyUnicodeErrorObject * )self , args ,
1632- kwds , & PyString_Type );
1648+ kwds , & PyBytes_Type );
16331649}
16341650
16351651static PyObject *
@@ -1648,7 +1664,7 @@ UnicodeDecodeError_str(PyObject *self)
16481664 /* FromFormat does not support %02x, so format that separately */
16491665 char byte [4 ];
16501666 PyOS_snprintf (byte , sizeof (byte ), "%02x" ,
1651- ((int )PyString_AS_STRING (((PyUnicodeErrorObject * )self )-> object )[start ])& 0xff );
1667+ ((int )PyBytes_AS_STRING (((PyUnicodeErrorObject * )self )-> object )[start ])& 0xff );
16521668 return PyString_FromFormat (
16531669 "'%.400s' codec can't decode byte 0x%s in position %zd: %.400s" ,
16541670 PyString_AS_STRING (((PyUnicodeErrorObject * )self )-> encoding ),
@@ -1689,7 +1705,7 @@ PyUnicodeDecodeError_Create(
16891705 assert (length < INT_MAX );
16901706 assert (start < INT_MAX );
16911707 assert (end < INT_MAX );
1692- return PyObject_CallFunction (PyExc_UnicodeDecodeError , "ss #nns" ,
1708+ return PyObject_CallFunction (PyExc_UnicodeDecodeError , "sy #nns" ,
16931709 encoding , object , length , start , end , reason );
16941710}
16951711
0 commit comments