@@ -702,48 +702,46 @@ PyObject *PyCodec_IgnoreErrors(PyObject *exc)
702
702
703
703
PyObject * PyCodec_ReplaceErrors (PyObject * exc )
704
704
{
705
- Py_ssize_t start , end , i , len ;
705
+ Py_ssize_t start , end , slen ;
706
706
707
707
if (PyObject_TypeCheck (exc , (PyTypeObject * )PyExc_UnicodeEncodeError )) {
708
- PyObject * res ;
709
- Py_UCS1 * outp ;
710
- if (PyUnicodeEncodeError_GetStart (exc , & start ))
708
+ if (_PyUnicodeError_GetParams (exc , NULL , NULL ,
709
+ & start , & end , & slen , false) < 0 ) {
711
710
return NULL ;
712
- if (PyUnicodeEncodeError_GetEnd (exc , & end ))
713
- return NULL ;
714
- len = end - start ;
715
- res = PyUnicode_New (len , '?' );
716
- if (res == NULL )
711
+ }
712
+ PyObject * res = PyUnicode_New (slen , '?' );
713
+ if (res == NULL ) {
717
714
return NULL ;
715
+ }
718
716
assert (PyUnicode_KIND (res ) == PyUnicode_1BYTE_KIND );
719
- outp = PyUnicode_1BYTE_DATA (res );
720
- for (i = 0 ; i < len ; ++ i )
721
- outp [i ] = '?' ;
717
+ Py_UCS1 * outp = PyUnicode_1BYTE_DATA (res );
718
+ memset (outp , '?' , sizeof (Py_UCS1 ) * slen );
722
719
assert (_PyUnicode_CheckConsistency (res , 1 ));
723
720
return Py_BuildValue ("(Nn)" , res , end );
724
721
}
725
722
else if (PyObject_TypeCheck (exc , (PyTypeObject * )PyExc_UnicodeDecodeError )) {
726
- if (PyUnicodeDecodeError_GetEnd (exc , & end ))
723
+ if (_PyUnicodeError_GetParams (exc , NULL , NULL ,
724
+ NULL , & end , NULL , true) < 0 ) {
727
725
return NULL ;
726
+ }
728
727
return Py_BuildValue ("(Cn)" ,
729
728
(int )Py_UNICODE_REPLACEMENT_CHARACTER ,
730
729
end );
731
730
}
732
731
else if (PyObject_TypeCheck (exc , (PyTypeObject * )PyExc_UnicodeTranslateError )) {
733
- PyObject * res ;
734
- Py_UCS2 * outp ;
735
- if (PyUnicodeTranslateError_GetStart (exc , & start ))
736
- return NULL ;
737
- if (PyUnicodeTranslateError_GetEnd (exc , & end ))
732
+ if (_PyUnicodeError_GetParams (exc , NULL , NULL ,
733
+ & start , & end , & slen , false) < 0 ) {
738
734
return NULL ;
739
- len = end - start ;
740
- res = PyUnicode_New (len , Py_UNICODE_REPLACEMENT_CHARACTER );
741
- if (res == NULL )
735
+ }
736
+ PyObject * res = PyUnicode_New (slen , Py_UNICODE_REPLACEMENT_CHARACTER );
737
+ if (res == NULL ) {
742
738
return NULL ;
743
- assert (PyUnicode_KIND (res ) == PyUnicode_2BYTE_KIND );
744
- outp = PyUnicode_2BYTE_DATA (res );
745
- for (i = 0 ; i < len ; i ++ )
739
+ }
740
+ assert (slen == 0 || PyUnicode_KIND (res ) == PyUnicode_2BYTE_KIND );
741
+ Py_UCS2 * outp = PyUnicode_2BYTE_DATA (res );
742
+ for (Py_ssize_t i = 0 ; i < slen ; ++ i ) {
746
743
outp [i ] = Py_UNICODE_REPLACEMENT_CHARACTER ;
744
+ }
747
745
assert (_PyUnicode_CheckConsistency (res , 1 ));
748
746
return Py_BuildValue ("(Nn)" , res , end );
749
747
}
0 commit comments