mirror of
https://github.com/python/cpython.git
synced 2025-08-28 04:35:02 +00:00
Issue #28439: Remove redundant checks in PyUnicode_EncodeLocale and
PyUnicode_DecodeLocaleAndSize. Patch by Xiang Zhang.
This commit is contained in:
parent
d3ff784f2d
commit
2fbc019c8c
1 changed files with 19 additions and 26 deletions
|
@ -3400,11 +3400,9 @@ PyUnicode_EncodeLocale(PyObject *unicode, const char *errors)
|
||||||
{
|
{
|
||||||
Py_ssize_t wlen, wlen2;
|
Py_ssize_t wlen, wlen2;
|
||||||
wchar_t *wstr;
|
wchar_t *wstr;
|
||||||
PyObject *bytes = NULL;
|
|
||||||
char *errmsg;
|
char *errmsg;
|
||||||
PyObject *reason = NULL;
|
PyObject *bytes, *reason, *exc;
|
||||||
PyObject *exc;
|
size_t error_pos, errlen;
|
||||||
size_t error_pos;
|
|
||||||
int surrogateescape;
|
int surrogateescape;
|
||||||
|
|
||||||
if (locale_error_handler(errors, &surrogateescape) < 0)
|
if (locale_error_handler(errors, &surrogateescape) < 0)
|
||||||
|
@ -3459,6 +3457,7 @@ PyUnicode_EncodeLocale(PyObject *unicode, const char *errors)
|
||||||
|
|
||||||
len2 = wcstombs(PyBytes_AS_STRING(bytes), wstr, len+1);
|
len2 = wcstombs(PyBytes_AS_STRING(bytes), wstr, len+1);
|
||||||
if (len2 == (size_t)-1 || len2 > len) {
|
if (len2 == (size_t)-1 || len2 > len) {
|
||||||
|
Py_DECREF(bytes);
|
||||||
error_pos = (size_t)-1;
|
error_pos = (size_t)-1;
|
||||||
goto encode_error;
|
goto encode_error;
|
||||||
}
|
}
|
||||||
|
@ -3474,17 +3473,15 @@ encode_error:
|
||||||
error_pos = wcstombs_errorpos(wstr);
|
error_pos = wcstombs_errorpos(wstr);
|
||||||
|
|
||||||
PyMem_Free(wstr);
|
PyMem_Free(wstr);
|
||||||
Py_XDECREF(bytes);
|
|
||||||
|
|
||||||
if (errmsg != NULL) {
|
|
||||||
size_t errlen;
|
|
||||||
wstr = Py_DecodeLocale(errmsg, &errlen);
|
wstr = Py_DecodeLocale(errmsg, &errlen);
|
||||||
if (wstr != NULL) {
|
if (wstr != NULL) {
|
||||||
reason = PyUnicode_FromWideChar(wstr, errlen);
|
reason = PyUnicode_FromWideChar(wstr, errlen);
|
||||||
PyMem_RawFree(wstr);
|
PyMem_RawFree(wstr);
|
||||||
} else
|
} else {
|
||||||
errmsg = NULL;
|
errmsg = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (errmsg == NULL)
|
if (errmsg == NULL)
|
||||||
reason = PyUnicode_FromString(
|
reason = PyUnicode_FromString(
|
||||||
"wcstombs() encountered an unencodable "
|
"wcstombs() encountered an unencodable "
|
||||||
|
@ -3500,7 +3497,7 @@ encode_error:
|
||||||
Py_DECREF(reason);
|
Py_DECREF(reason);
|
||||||
if (exc != NULL) {
|
if (exc != NULL) {
|
||||||
PyCodec_StrictErrors(exc);
|
PyCodec_StrictErrors(exc);
|
||||||
Py_XDECREF(exc);
|
Py_DECREF(exc);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -3702,10 +3699,9 @@ PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len,
|
||||||
size_t wlen, wlen2;
|
size_t wlen, wlen2;
|
||||||
PyObject *unicode;
|
PyObject *unicode;
|
||||||
int surrogateescape;
|
int surrogateescape;
|
||||||
size_t error_pos;
|
size_t error_pos, errlen;
|
||||||
char *errmsg;
|
char *errmsg;
|
||||||
PyObject *reason = NULL; /* initialize to prevent gcc warning */
|
PyObject *exc, *reason = NULL; /* initialize to prevent gcc warning */
|
||||||
PyObject *exc;
|
|
||||||
|
|
||||||
if (locale_error_handler(errors, &surrogateescape) < 0)
|
if (locale_error_handler(errors, &surrogateescape) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -3763,19 +3759,16 @@ PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len,
|
||||||
return unicode;
|
return unicode;
|
||||||
|
|
||||||
decode_error:
|
decode_error:
|
||||||
reason = NULL;
|
|
||||||
errmsg = strerror(errno);
|
errmsg = strerror(errno);
|
||||||
assert(errmsg != NULL);
|
assert(errmsg != NULL);
|
||||||
|
|
||||||
error_pos = mbstowcs_errorpos(str, len);
|
error_pos = mbstowcs_errorpos(str, len);
|
||||||
if (errmsg != NULL) {
|
|
||||||
size_t errlen;
|
|
||||||
wstr = Py_DecodeLocale(errmsg, &errlen);
|
wstr = Py_DecodeLocale(errmsg, &errlen);
|
||||||
if (wstr != NULL) {
|
if (wstr != NULL) {
|
||||||
reason = PyUnicode_FromWideChar(wstr, errlen);
|
reason = PyUnicode_FromWideChar(wstr, errlen);
|
||||||
PyMem_RawFree(wstr);
|
PyMem_RawFree(wstr);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (reason == NULL)
|
if (reason == NULL)
|
||||||
reason = PyUnicode_FromString(
|
reason = PyUnicode_FromString(
|
||||||
"mbstowcs() encountered an invalid multibyte sequence");
|
"mbstowcs() encountered an invalid multibyte sequence");
|
||||||
|
@ -3790,7 +3783,7 @@ decode_error:
|
||||||
Py_DECREF(reason);
|
Py_DECREF(reason);
|
||||||
if (exc != NULL) {
|
if (exc != NULL) {
|
||||||
PyCodec_StrictErrors(exc);
|
PyCodec_StrictErrors(exc);
|
||||||
Py_XDECREF(exc);
|
Py_DECREF(exc);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue