@@ -18,9 +18,6 @@ class bytes "PyBytesObject *" "&PyBytes_Type"
1818
1919#include "clinic/bytesobject.c.h"
2020
21- static PyBytesObject * characters [UCHAR_MAX + 1 ];
22- static PyBytesObject * nullstring ;
23-
2421_Py_IDENTIFIER (__bytes__ );
2522
2623/* PyBytesObject_SIZE gives the basic size of a string; any memory allocation
@@ -35,6 +32,15 @@ _Py_IDENTIFIER(__bytes__);
3532Py_LOCAL_INLINE (Py_ssize_t ) _PyBytesWriter_GetSize (_PyBytesWriter * writer ,
3633 char * str );
3734
35+
36+ static struct _Py_bytes_state *
37+ get_bytes_state (void )
38+ {
39+ PyInterpreterState * interp = _PyInterpreterState_GET ();
40+ return & interp -> bytes ;
41+ }
42+
43+
3844/*
3945 For PyBytes_FromString(), the parameter `str' points to a null-terminated
4046 string containing exactly `size' bytes.
@@ -63,9 +69,13 @@ _PyBytes_FromSize(Py_ssize_t size, int use_calloc)
6369 PyBytesObject * op ;
6470 assert (size >= 0 );
6571
66- if (size == 0 && (op = nullstring ) != NULL ) {
67- Py_INCREF (op );
68- return (PyObject * )op ;
72+ if (size == 0 ) {
73+ struct _Py_bytes_state * state = get_bytes_state ();
74+ op = state -> empty_string ;
75+ if (op != NULL ) {
76+ Py_INCREF (op );
77+ return (PyObject * )op ;
78+ }
6979 }
7080
7181 if ((size_t )size > (size_t )PY_SSIZE_T_MAX - PyBytesObject_SIZE ) {
@@ -88,8 +98,9 @@ _PyBytes_FromSize(Py_ssize_t size, int use_calloc)
8898 op -> ob_sval [size ] = '\0' ;
8999 /* empty byte string singleton */
90100 if (size == 0 ) {
91- nullstring = op ;
101+ struct _Py_bytes_state * state = get_bytes_state () ;
92102 Py_INCREF (op );
103+ state -> empty_string = op ;
93104 }
94105 return (PyObject * ) op ;
95106}
@@ -103,11 +114,13 @@ PyBytes_FromStringAndSize(const char *str, Py_ssize_t size)
103114 "Negative size passed to PyBytes_FromStringAndSize" );
104115 return NULL ;
105116 }
106- if (size == 1 && str != NULL &&
107- (op = characters [* str & UCHAR_MAX ]) != NULL )
108- {
109- Py_INCREF (op );
110- return (PyObject * )op ;
117+ if (size == 1 && str != NULL ) {
118+ struct _Py_bytes_state * state = get_bytes_state ();
119+ op = state -> characters [* str & UCHAR_MAX ];
120+ if (op != NULL ) {
121+ Py_INCREF (op );
122+ return (PyObject * )op ;
123+ }
111124 }
112125
113126 op = (PyBytesObject * )_PyBytes_FromSize (size , 0 );
@@ -119,8 +132,9 @@ PyBytes_FromStringAndSize(const char *str, Py_ssize_t size)
119132 memcpy (op -> ob_sval , str , size );
120133 /* share short strings */
121134 if (size == 1 ) {
122- characters [ * str & UCHAR_MAX ] = op ;
135+ struct _Py_bytes_state * state = get_bytes_state () ;
123136 Py_INCREF (op );
137+ state -> characters [* str & UCHAR_MAX ] = op ;
124138 }
125139 return (PyObject * ) op ;
126140}
@@ -138,13 +152,21 @@ PyBytes_FromString(const char *str)
138152 "byte string is too long" );
139153 return NULL ;
140154 }
141- if (size == 0 && (op = nullstring ) != NULL ) {
142- Py_INCREF (op );
143- return (PyObject * )op ;
155+
156+ struct _Py_bytes_state * state = get_bytes_state ();
157+ if (size == 0 ) {
158+ op = state -> empty_string ;
159+ if (op != NULL ) {
160+ Py_INCREF (op );
161+ return (PyObject * )op ;
162+ }
144163 }
145- if (size == 1 && (op = characters [* str & UCHAR_MAX ]) != NULL ) {
146- Py_INCREF (op );
147- return (PyObject * )op ;
164+ else if (size == 1 ) {
165+ op = state -> characters [* str & UCHAR_MAX ];
166+ if (op != NULL ) {
167+ Py_INCREF (op );
168+ return (PyObject * )op ;
169+ }
148170 }
149171
150172 /* Inline PyObject_NewVar */
@@ -157,11 +179,12 @@ PyBytes_FromString(const char *str)
157179 memcpy (op -> ob_sval , str , size + 1 );
158180 /* share short strings */
159181 if (size == 0 ) {
160- nullstring = op ;
161182 Py_INCREF (op );
162- } else if (size == 1 ) {
163- characters [* str & UCHAR_MAX ] = op ;
183+ state -> empty_string = op ;
184+ }
185+ else if (size == 1 ) {
164186 Py_INCREF (op );
187+ state -> characters [* str & UCHAR_MAX ] = op ;
165188 }
166189 return (PyObject * ) op ;
167190}
@@ -1249,6 +1272,8 @@ PyBytes_AsStringAndSize(PyObject *obj,
12491272/* -------------------------------------------------------------------- */
12501273/* Methods */
12511274
1275+ #define STRINGLIB_GET_EMPTY () get_bytes_state()->empty_string
1276+
12521277#include "stringlib/stringdefs.h"
12531278
12541279#include "stringlib/fastsearch.h"
@@ -1261,6 +1286,8 @@ PyBytes_AsStringAndSize(PyObject *obj,
12611286
12621287#include "stringlib/transmogrify.h"
12631288
1289+ #undef STRINGLIB_GET_EMPTY
1290+
12641291PyObject *
12651292PyBytes_Repr (PyObject * obj , int smartquotes )
12661293{
@@ -3058,12 +3085,13 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
30583085}
30593086
30603087void
3061- _PyBytes_Fini (void )
3088+ _PyBytes_Fini (PyThreadState * tstate )
30623089{
3063- int i ;
3064- for (i = 0 ; i < UCHAR_MAX + 1 ; i ++ )
3065- Py_CLEAR (characters [i ]);
3066- Py_CLEAR (nullstring );
3090+ struct _Py_bytes_state * state = & tstate -> interp -> bytes ;
3091+ for (int i = 0 ; i < UCHAR_MAX + 1 ; i ++ ) {
3092+ Py_CLEAR (state -> characters [i ]);
3093+ }
3094+ Py_CLEAR (state -> empty_string );
30673095}
30683096
30693097/*********************** Bytes Iterator ****************************/
0 commit comments