diff options
author | Brandt Bucher <brandtbucher@microsoft.com> | 2023-08-04 23:24:50 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-04 23:24:50 (GMT) |
commit | 05a824f294f1409f33e32f1799d5b413dcf24445 (patch) | |
tree | 173417047763313af6cc1a3c4c54f1d510d28d62 /Objects/bytesobject.c | |
parent | ec0a0d2bd9faa247d5b3208a8138e4399b2da890 (diff) | |
download | cpython-05a824f294f1409f33e32f1799d5b413dcf24445.zip cpython-05a824f294f1409f33e32f1799d5b413dcf24445.tar.gz cpython-05a824f294f1409f33e32f1799d5b413dcf24445.tar.bz2 |
GH-84436: Skip refcounting for known immortals (GH-107605)
Diffstat (limited to 'Objects/bytesobject.c')
-rw-r--r-- | Objects/bytesobject.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 6b9231a..afe9192 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -41,17 +41,12 @@ Py_LOCAL_INLINE(Py_ssize_t) _PyBytesWriter_GetSize(_PyBytesWriter *writer, #define EMPTY (&_Py_SINGLETON(bytes_empty)) -// Return a borrowed reference to the empty bytes string singleton. +// Return a reference to the immortal empty bytes string singleton. static inline PyObject* bytes_get_empty(void) { - return &EMPTY->ob_base.ob_base; -} - - -// Return a strong reference to the empty bytes string singleton. -static inline PyObject* bytes_new_empty(void) -{ - return Py_NewRef(EMPTY); + PyObject *empty = &EMPTY->ob_base.ob_base; + assert(_Py_IsImmortal(empty)); + return empty; } @@ -84,7 +79,7 @@ _PyBytes_FromSize(Py_ssize_t size, int use_calloc) assert(size >= 0); if (size == 0) { - return bytes_new_empty(); + return bytes_get_empty(); } if ((size_t)size > (size_t)PY_SSIZE_T_MAX - PyBytesObject_SIZE) { @@ -123,10 +118,11 @@ PyBytes_FromStringAndSize(const char *str, Py_ssize_t size) } if (size == 1 && str != NULL) { op = CHARACTER(*str & 255); - return Py_NewRef(op); + assert(_Py_IsImmortal(op)); + return (PyObject *)op; } if (size == 0) { - return bytes_new_empty(); + return bytes_get_empty(); } op = (PyBytesObject *)_PyBytes_FromSize(size, 0); @@ -154,11 +150,12 @@ PyBytes_FromString(const char *str) } if (size == 0) { - return bytes_new_empty(); + return bytes_get_empty(); } else if (size == 1) { op = CHARACTER(*str & 255); - return Py_NewRef(op); + assert(_Py_IsImmortal(op)); + return (PyObject *)op; } /* Inline PyObject_NewVar */ @@ -3065,7 +3062,7 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize) goto error; } if (newsize == 0) { - *pv = bytes_new_empty(); + *pv = bytes_get_empty(); Py_DECREF(v); return 0; } |