mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
[3.13] gh-132070: Use _PyObject_IsUniquelyReferenced in unicodeobject (gh-133039) (gh-133126)
* gh-132070: Use _PyObject_IsUniquelyReferenced in unicodeobject (gh-133039)
---------
(cherry picked from commit 75cbb8d89e
)
Co-authored-by: Donghee Na <donghee.na@python.org>
Co-authored-by: Kumar Aditya <kumaraditya@python.org>
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
* Add _PyObject_IsUniquelyReferenced
---------
Co-authored-by: Kumar Aditya <kumaraditya@python.org>
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
64dcbb0c31
commit
7ffef8d07b
2 changed files with 42 additions and 18 deletions
|
@ -1121,6 +1121,21 @@ unicode_fill_invalid(PyObject *unicode, Py_ssize_t old_length)
|
|||
}
|
||||
#endif
|
||||
|
||||
static PyObject*
|
||||
resize_copy(PyObject *unicode, Py_ssize_t length)
|
||||
{
|
||||
Py_ssize_t copy_length;
|
||||
PyObject *copy;
|
||||
|
||||
copy = PyUnicode_New(length, PyUnicode_MAX_CHAR_VALUE(unicode));
|
||||
if (copy == NULL)
|
||||
return NULL;
|
||||
|
||||
copy_length = Py_MIN(length, PyUnicode_GET_LENGTH(unicode));
|
||||
_PyUnicode_FastCopyCharacters(copy, 0, unicode, 0, copy_length);
|
||||
return copy;
|
||||
}
|
||||
|
||||
static PyObject*
|
||||
resize_compact(PyObject *unicode, Py_ssize_t length)
|
||||
{
|
||||
|
@ -1132,7 +1147,14 @@ resize_compact(PyObject *unicode, Py_ssize_t length)
|
|||
Py_ssize_t old_length = _PyUnicode_LENGTH(unicode);
|
||||
#endif
|
||||
|
||||
assert(unicode_modifiable(unicode));
|
||||
if (!unicode_modifiable(unicode)) {
|
||||
PyObject *copy = resize_copy(unicode, length);
|
||||
if (copy == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
Py_DECREF(unicode);
|
||||
return copy;
|
||||
}
|
||||
assert(PyUnicode_IS_COMPACT(unicode));
|
||||
|
||||
char_size = PyUnicode_KIND(unicode);
|
||||
|
@ -1232,21 +1254,6 @@ resize_inplace(PyObject *unicode, Py_ssize_t length)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static PyObject*
|
||||
resize_copy(PyObject *unicode, Py_ssize_t length)
|
||||
{
|
||||
Py_ssize_t copy_length;
|
||||
PyObject *copy;
|
||||
|
||||
copy = PyUnicode_New(length, PyUnicode_MAX_CHAR_VALUE(unicode));
|
||||
if (copy == NULL)
|
||||
return NULL;
|
||||
|
||||
copy_length = Py_MIN(length, PyUnicode_GET_LENGTH(unicode));
|
||||
_PyUnicode_FastCopyCharacters(copy, 0, unicode, 0, copy_length);
|
||||
return copy;
|
||||
}
|
||||
|
||||
static const char*
|
||||
unicode_kind_name(PyObject *unicode)
|
||||
{
|
||||
|
@ -1836,7 +1843,7 @@ static int
|
|||
unicode_modifiable(PyObject *unicode)
|
||||
{
|
||||
assert(_PyUnicode_CHECK(unicode));
|
||||
if (Py_REFCNT(unicode) != 1)
|
||||
if (!_PyObject_IsUniquelyReferenced(unicode))
|
||||
return 0;
|
||||
if (PyUnicode_HASH(unicode) != -1)
|
||||
return 0;
|
||||
|
@ -14025,7 +14032,7 @@ _PyUnicode_FormatLong(PyObject *val, int alt, int prec, int type)
|
|||
assert(PyUnicode_IS_ASCII(result));
|
||||
|
||||
/* To modify the string in-place, there can only be one reference. */
|
||||
if (Py_REFCNT(result) != 1) {
|
||||
if (!_PyObject_IsUniquelyReferenced(result)) {
|
||||
Py_DECREF(result);
|
||||
PyErr_BadInternalCall();
|
||||
return NULL;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue