mirror of https://github.com/python/cpython.git
Issue #28808: PyUnicode_CompareWithASCIIString() now never raises exceptions.
This commit is contained in:
commit
9a953dbb34
|
@ -1657,8 +1657,7 @@ They all return *NULL* or ``-1`` if an exception occurs.
|
||||||
ASCII-encoded strings, but the function interprets the input string as
|
ASCII-encoded strings, but the function interprets the input string as
|
||||||
ISO-8859-1 if it contains non-ASCII characters.
|
ISO-8859-1 if it contains non-ASCII characters.
|
||||||
|
|
||||||
This function returns ``-1`` upon failure, so one should call
|
This function does not raise exceptions.
|
||||||
:c:func:`PyErr_Occurred` to check for errors.
|
|
||||||
|
|
||||||
|
|
||||||
.. c:function:: PyObject* PyUnicode_RichCompare(PyObject *left, PyObject *right, int op)
|
.. c:function:: PyObject* PyUnicode_RichCompare(PyObject *left, PyObject *right, int op)
|
||||||
|
|
|
@ -2051,7 +2051,7 @@ PyAPI_FUNC(int) _PyUnicode_EqualToASCIIId(
|
||||||
equal, and greater than, respectively. It is best to pass only
|
equal, and greater than, respectively. It is best to pass only
|
||||||
ASCII-encoded strings, but the function interprets the input string as
|
ASCII-encoded strings, but the function interprets the input string as
|
||||||
ISO-8859-1 if it contains non-ASCII characters.
|
ISO-8859-1 if it contains non-ASCII characters.
|
||||||
Raise an exception and return -1 on error. */
|
This function does not raise exceptions. */
|
||||||
|
|
||||||
PyAPI_FUNC(int) PyUnicode_CompareWithASCIIString(
|
PyAPI_FUNC(int) PyUnicode_CompareWithASCIIString(
|
||||||
PyObject *left,
|
PyObject *left,
|
||||||
|
|
|
@ -36,6 +36,11 @@ Library
|
||||||
|
|
||||||
- Issue #28843: Fix asyncio C Task to handle exceptions __traceback__.
|
- Issue #28843: Fix asyncio C Task to handle exceptions __traceback__.
|
||||||
|
|
||||||
|
C API
|
||||||
|
-----
|
||||||
|
|
||||||
|
- Issue #28808: PyUnicode_CompareWithASCIIString() now never raises exceptions.
|
||||||
|
|
||||||
Documentation
|
Documentation
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
|
|
@ -11011,10 +11011,24 @@ PyUnicode_CompareWithASCIIString(PyObject* uni, const char* str)
|
||||||
Py_ssize_t i;
|
Py_ssize_t i;
|
||||||
int kind;
|
int kind;
|
||||||
Py_UCS4 chr;
|
Py_UCS4 chr;
|
||||||
|
const unsigned char *ustr = (const unsigned char *)str;
|
||||||
|
|
||||||
assert(_PyUnicode_CHECK(uni));
|
assert(_PyUnicode_CHECK(uni));
|
||||||
if (PyUnicode_READY(uni) == -1)
|
if (!PyUnicode_IS_READY(uni)) {
|
||||||
return -1;
|
const wchar_t *ws = _PyUnicode_WSTR(uni);
|
||||||
|
/* Compare Unicode string and source character set string */
|
||||||
|
for (i = 0; (chr = ws[i]) && ustr[i]; i++) {
|
||||||
|
if (chr != ustr[i])
|
||||||
|
return (chr < ustr[i]) ? -1 : 1;
|
||||||
|
}
|
||||||
|
/* This check keeps Python strings that end in '\0' from comparing equal
|
||||||
|
to C strings identical up to that point. */
|
||||||
|
if (_PyUnicode_WSTR_LENGTH(uni) != i || chr)
|
||||||
|
return 1; /* uni is longer */
|
||||||
|
if (ustr[i])
|
||||||
|
return -1; /* str is longer */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
kind = PyUnicode_KIND(uni);
|
kind = PyUnicode_KIND(uni);
|
||||||
if (kind == PyUnicode_1BYTE_KIND) {
|
if (kind == PyUnicode_1BYTE_KIND) {
|
||||||
const void *data = PyUnicode_1BYTE_DATA(uni);
|
const void *data = PyUnicode_1BYTE_DATA(uni);
|
||||||
|
|
Loading…
Reference in New Issue