Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitfa6a814

Browse files
authored
gh-129173: refactorPyCodec_ReplaceErrors into separate functions (#129893)
The logic of `PyCodec_ReplaceErrors` is now split into separate functions,each of which handling a specific exception type.
1 parent4d3a7ea commitfa6a814

File tree

1 file changed

+83
-40
lines changed

1 file changed

+83
-40
lines changed

‎Python/codecs.c‎

Lines changed: 83 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,27 @@ codec_handler_write_unicode_hex(Py_UCS1 **p, Py_UCS4 ch)
730730
}
731731

732732

733+
/*
734+
* Create a Unicode string containing 'count' copies of the official
735+
* Unicode REPLACEMENT CHARACTER (0xFFFD).
736+
*/
737+
staticPyObject*
738+
codec_handler_unicode_replacement_character(Py_ssize_tcount)
739+
{
740+
PyObject*res=PyUnicode_New(count,Py_UNICODE_REPLACEMENT_CHARACTER);
741+
if (res==NULL) {
742+
returnNULL;
743+
}
744+
assert(count==0||PyUnicode_KIND(res)==PyUnicode_2BYTE_KIND);
745+
Py_UCS2*outp=PyUnicode_2BYTE_DATA(res);
746+
for (Py_ssize_ti=0;i<count;++i) {
747+
outp[i]=Py_UNICODE_REPLACEMENT_CHARACTER;
748+
}
749+
assert(_PyUnicode_CheckConsistency(res,1));
750+
returnres;
751+
}
752+
753+
733754
// --- handler: 'strict' ------------------------------------------------------
734755

735756
PyObject*PyCodec_StrictErrors(PyObject*exc)
@@ -774,50 +795,71 @@ PyObject *PyCodec_IgnoreErrors(PyObject *exc)
774795
}
775796

776797

777-
PyObject*PyCodec_ReplaceErrors(PyObject*exc)
798+
// --- handler: 'replace' -----------------------------------------------------
799+
800+
staticPyObject*
801+
_PyCodec_ReplaceUnicodeEncodeError(PyObject*exc)
778802
{
779803
Py_ssize_tstart,end,slen;
804+
if (_PyUnicodeError_GetParams(exc,NULL,NULL,
805+
&start,&end,&slen, false)<0)
806+
{
807+
returnNULL;
808+
}
809+
PyObject*res=PyUnicode_New(slen,'?');
810+
if (res==NULL) {
811+
returnNULL;
812+
}
813+
assert(PyUnicode_KIND(res)==PyUnicode_1BYTE_KIND);
814+
Py_UCS1*outp=PyUnicode_1BYTE_DATA(res);
815+
memset(outp,'?',sizeof(Py_UCS1)*slen);
816+
assert(_PyUnicode_CheckConsistency(res,1));
817+
returnPy_BuildValue("(Nn)",res,end);
818+
}
780819

781-
if (PyObject_TypeCheck(exc, (PyTypeObject*)PyExc_UnicodeEncodeError)) {
782-
if (_PyUnicodeError_GetParams(exc,NULL,NULL,
783-
&start,&end,&slen, false)<0) {
784-
returnNULL;
785-
}
786-
PyObject*res=PyUnicode_New(slen,'?');
787-
if (res==NULL) {
788-
returnNULL;
789-
}
790-
assert(PyUnicode_KIND(res)==PyUnicode_1BYTE_KIND);
791-
Py_UCS1*outp=PyUnicode_1BYTE_DATA(res);
792-
memset(outp,'?',sizeof(Py_UCS1)*slen);
793-
assert(_PyUnicode_CheckConsistency(res,1));
794-
returnPy_BuildValue("(Nn)",res,end);
820+
821+
staticPyObject*
822+
_PyCodec_ReplaceUnicodeDecodeError(PyObject*exc)
823+
{
824+
Py_ssize_tend;
825+
if (PyUnicodeDecodeError_GetEnd(exc,&end)<0) {
826+
returnNULL;
795827
}
796-
elseif (PyObject_TypeCheck(exc, (PyTypeObject*)PyExc_UnicodeDecodeError)) {
797-
if (_PyUnicodeError_GetParams(exc,NULL,NULL,
798-
NULL,&end,NULL, true)<0) {
799-
returnNULL;
800-
}
801-
returnPy_BuildValue("(Cn)",
802-
(int)Py_UNICODE_REPLACEMENT_CHARACTER,
803-
end);
828+
PyObject*res=codec_handler_unicode_replacement_character(1);
829+
if (res==NULL) {
830+
returnNULL;
804831
}
805-
elseif (PyObject_TypeCheck(exc, (PyTypeObject*)PyExc_UnicodeTranslateError)) {
806-
if (_PyUnicodeError_GetParams(exc,NULL,NULL,
807-
&start,&end,&slen, false)<0) {
808-
returnNULL;
809-
}
810-
PyObject*res=PyUnicode_New(slen,Py_UNICODE_REPLACEMENT_CHARACTER);
811-
if (res==NULL) {
812-
returnNULL;
813-
}
814-
assert(slen==0||PyUnicode_KIND(res)==PyUnicode_2BYTE_KIND);
815-
Py_UCS2*outp=PyUnicode_2BYTE_DATA(res);
816-
for (Py_ssize_ti=0;i<slen;++i) {
817-
outp[i]=Py_UNICODE_REPLACEMENT_CHARACTER;
818-
}
819-
assert(_PyUnicode_CheckConsistency(res,1));
820-
returnPy_BuildValue("(Nn)",res,end);
832+
returnPy_BuildValue("(Nn)",res,end);
833+
}
834+
835+
836+
staticPyObject*
837+
_PyCodec_ReplaceUnicodeTranslateError(PyObject*exc)
838+
{
839+
Py_ssize_tstart,end,slen;
840+
if (_PyUnicodeError_GetParams(exc,NULL,NULL,
841+
&start,&end,&slen, false)<0)
842+
{
843+
returnNULL;
844+
}
845+
PyObject*res=codec_handler_unicode_replacement_character(slen);
846+
if (res==NULL) {
847+
returnNULL;
848+
}
849+
returnPy_BuildValue("(Nn)",res,end);
850+
}
851+
852+
853+
PyObject*PyCodec_ReplaceErrors(PyObject*exc)
854+
{
855+
if (_PyIsUnicodeEncodeError(exc)) {
856+
return_PyCodec_ReplaceUnicodeEncodeError(exc);
857+
}
858+
elseif (_PyIsUnicodeDecodeError(exc)) {
859+
return_PyCodec_ReplaceUnicodeDecodeError(exc);
860+
}
861+
elseif (_PyIsUnicodeTranslateError(exc)) {
862+
return_PyCodec_ReplaceUnicodeTranslateError(exc);
821863
}
822864
else {
823865
wrong_exception_type(exc);
@@ -1468,7 +1510,8 @@ ignore_errors(PyObject *Py_UNUSED(self), PyObject *exc)
14681510
}
14691511

14701512

1471-
staticPyObject*replace_errors(PyObject*self,PyObject*exc)
1513+
staticinlinePyObject*
1514+
replace_errors(PyObject*Py_UNUSED(self),PyObject*exc)
14721515
{
14731516
returnPyCodec_ReplaceErrors(exc);
14741517
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp