mirror of https://github.com/python/cpython
PyUnicode_WriteChar() raises IndexError on invalid index
PyUnicode_WriteChar() raises also a ValueError if the string has more than 1 reference.
This commit is contained in:
parent
2fe5ced752
commit
cd9950fd09
|
@ -647,7 +647,9 @@ PyAPI_FUNC(Py_UCS4) PyUnicode_ReadChar(
|
|||
);
|
||||
|
||||
/* Write a character to the string. The string must have been created through
|
||||
PyUnicode_New, must not be shared, and must not have been hashed yet. */
|
||||
PyUnicode_New, must not be shared, and must not have been hashed yet.
|
||||
|
||||
Return 0 on success, -1 on error. */
|
||||
|
||||
PyAPI_FUNC(int) PyUnicode_WriteChar(
|
||||
PyObject *unicode,
|
||||
|
|
|
@ -622,6 +622,19 @@ unicode_convert_wchar_to_ucs4(const wchar_t *begin, const wchar_t *end,
|
|||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
_PyUnicode_Dirty(PyObject *unicode)
|
||||
{
|
||||
assert(PyUnicode_Check(unicode));
|
||||
if (Py_REFCNT(unicode) != 1) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"Cannot modify a string having more than 1 reference");
|
||||
return -1;
|
||||
}
|
||||
_PyUnicode_DIRTY(unicode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Py_ssize_t
|
||||
PyUnicode_CopyCharacters(PyObject *to, Py_ssize_t to_start,
|
||||
PyObject *from, Py_ssize_t from_start,
|
||||
|
@ -651,12 +664,8 @@ PyUnicode_CopyCharacters(PyObject *to, Py_ssize_t to_start,
|
|||
if (how_many == 0)
|
||||
return 0;
|
||||
|
||||
if (Py_REFCNT(to) != 1) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"Cannot modify a string having more than 1 reference");
|
||||
if (_PyUnicode_Dirty(to))
|
||||
return -1;
|
||||
}
|
||||
_PyUnicode_DIRTY(to);
|
||||
|
||||
from_kind = PyUnicode_KIND(from);
|
||||
from_data = PyUnicode_DATA(from);
|
||||
|
@ -2855,10 +2864,15 @@ int
|
|||
PyUnicode_WriteChar(PyObject *unicode, Py_ssize_t index, Py_UCS4 ch)
|
||||
{
|
||||
if (!PyUnicode_Check(unicode) || !PyUnicode_IS_COMPACT(unicode)) {
|
||||
return PyErr_BadArgument();
|
||||
PyErr_BadArgument();
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (index < 0 || index >= _PyUnicode_LENGTH(unicode)) {
|
||||
PyErr_SetString(PyExc_IndexError, "string index out of range");
|
||||
return -1;
|
||||
}
|
||||
if (_PyUnicode_Dirty(unicode))
|
||||
return -1;
|
||||
PyUnicode_WRITE(PyUnicode_KIND(unicode), PyUnicode_DATA(unicode),
|
||||
index, ch);
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue