mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	Issue #28808: PyUnicode_CompareWithASCIIString() now never raises exceptions.
This commit is contained in:
		
						commit
						9a953dbb34
					
				
					 4 changed files with 23 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
   ISO-8859-1 if it contains non-ASCII characters.
 | 
			
		||||
 | 
			
		||||
   This function returns ``-1`` upon failure, so one should call
 | 
			
		||||
   :c:func:`PyErr_Occurred` to check for errors.
 | 
			
		||||
   This function does not raise exceptions.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. 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
 | 
			
		||||
   ASCII-encoded strings, but the function interprets the input string as
 | 
			
		||||
   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(
 | 
			
		||||
    PyObject *left,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,11 @@ Library
 | 
			
		|||
 | 
			
		||||
- Issue #28843: Fix asyncio C Task to handle exceptions __traceback__.
 | 
			
		||||
 | 
			
		||||
C API
 | 
			
		||||
-----
 | 
			
		||||
 | 
			
		||||
- Issue #28808: PyUnicode_CompareWithASCIIString() now never raises exceptions.
 | 
			
		||||
 | 
			
		||||
Documentation
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11011,10 +11011,24 @@ PyUnicode_CompareWithASCIIString(PyObject* uni, const char* str)
 | 
			
		|||
    Py_ssize_t i;
 | 
			
		||||
    int kind;
 | 
			
		||||
    Py_UCS4 chr;
 | 
			
		||||
    const unsigned char *ustr = (const unsigned char *)str;
 | 
			
		||||
 | 
			
		||||
    assert(_PyUnicode_CHECK(uni));
 | 
			
		||||
    if (PyUnicode_READY(uni) == -1)
 | 
			
		||||
        return -1;
 | 
			
		||||
    if (!PyUnicode_IS_READY(uni)) {
 | 
			
		||||
        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);
 | 
			
		||||
    if (kind == PyUnicode_1BYTE_KIND) {
 | 
			
		||||
        const void *data = PyUnicode_1BYTE_DATA(uni);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue