summaryrefslogtreecommitdiffstats
path: root/Objects/bytesobject.c
diff options
context:
space:
mode:
authorBrandt Bucher <brandtbucher@microsoft.com>2023-08-04 23:24:50 (GMT)
committerGitHub <noreply@github.com>2023-08-04 23:24:50 (GMT)
commit05a824f294f1409f33e32f1799d5b413dcf24445 (patch)
tree173417047763313af6cc1a3c4c54f1d510d28d62 /Objects/bytesobject.c
parentec0a0d2bd9faa247d5b3208a8138e4399b2da890 (diff)
downloadcpython-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.c27
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;
}