@@ -114,7 +114,7 @@ NOTE: In the interpreter's initialization phase, some globals are currently
114
114
115
115
static inline char * _PyUnicode_UTF8 (PyObject * op )
116
116
{
117
- return (_PyCompactUnicodeObject_CAST (op )-> utf8 );
117
+ return FT_ATOMIC_LOAD_PTR_ACQUIRE (_PyCompactUnicodeObject_CAST (op )-> utf8 );
118
118
}
119
119
120
120
static inline char * PyUnicode_UTF8 (PyObject * op )
@@ -130,7 +130,7 @@ static inline char* PyUnicode_UTF8(PyObject *op)
130
130
131
131
static inline void PyUnicode_SET_UTF8 (PyObject * op , char * utf8 )
132
132
{
133
- _PyCompactUnicodeObject_CAST (op )-> utf8 = utf8 ;
133
+ FT_ATOMIC_STORE_PTR_RELEASE ( _PyCompactUnicodeObject_CAST (op )-> utf8 , utf8 ) ;
134
134
}
135
135
136
136
static inline Py_ssize_t PyUnicode_UTF8_LENGTH (PyObject * op )
@@ -700,15 +700,15 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content)
700
700
CHECK (ascii -> state .compact == 0 );
701
701
CHECK (data != NULL );
702
702
if (ascii -> state .ascii ) {
703
- CHECK (compact -> utf8 == data );
703
+ CHECK (_PyUnicode_UTF8 ( op ) == data );
704
704
CHECK (compact -> utf8_length == ascii -> length );
705
705
}
706
706
else {
707
- CHECK (compact -> utf8 != data );
707
+ CHECK (_PyUnicode_UTF8 ( op ) != data );
708
708
}
709
709
}
710
710
711
- if (compact -> utf8 == NULL )
711
+ if (_PyUnicode_UTF8 ( op ) == NULL )
712
712
CHECK (compact -> utf8_length == 0 );
713
713
}
714
714
@@ -1156,8 +1156,8 @@ resize_compact(PyObject *unicode, Py_ssize_t length)
1156
1156
1157
1157
if (_PyUnicode_HAS_UTF8_MEMORY (unicode )) {
1158
1158
PyMem_Free (_PyUnicode_UTF8 (unicode ));
1159
- PyUnicode_SET_UTF8 (unicode , NULL );
1160
1159
PyUnicode_SET_UTF8_LENGTH (unicode , 0 );
1160
+ PyUnicode_SET_UTF8 (unicode , NULL );
1161
1161
}
1162
1162
#ifdef Py_TRACE_REFS
1163
1163
_Py_ForgetReference (unicode );
@@ -1210,8 +1210,8 @@ resize_inplace(PyObject *unicode, Py_ssize_t length)
1210
1210
if (!share_utf8 && _PyUnicode_HAS_UTF8_MEMORY (unicode ))
1211
1211
{
1212
1212
PyMem_Free (_PyUnicode_UTF8 (unicode ));
1213
- PyUnicode_SET_UTF8 (unicode , NULL );
1214
1213
PyUnicode_SET_UTF8_LENGTH (unicode , 0 );
1214
+ PyUnicode_SET_UTF8 (unicode , NULL );
1215
1215
}
1216
1216
1217
1217
data = (PyObject * )PyObject_Realloc (data , new_size );
@@ -1221,8 +1221,8 @@ resize_inplace(PyObject *unicode, Py_ssize_t length)
1221
1221
}
1222
1222
_PyUnicode_DATA_ANY (unicode ) = data ;
1223
1223
if (share_utf8 ) {
1224
- PyUnicode_SET_UTF8 (unicode , data );
1225
1224
PyUnicode_SET_UTF8_LENGTH (unicode , length );
1225
+ PyUnicode_SET_UTF8 (unicode , data );
1226
1226
}
1227
1227
_PyUnicode_LENGTH (unicode ) = length ;
1228
1228
PyUnicode_WRITE (PyUnicode_KIND (unicode ), data , length , 0 );
@@ -4216,6 +4216,21 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr)
4216
4216
4217
4217
static int unicode_fill_utf8 (PyObject * unicode );
4218
4218
4219
+
4220
+ static int
4221
+ unicode_ensure_utf8 (PyObject * unicode )
4222
+ {
4223
+ int err = 0 ;
4224
+ if (PyUnicode_UTF8 (unicode ) == NULL ) {
4225
+ Py_BEGIN_CRITICAL_SECTION (unicode );
4226
+ if (PyUnicode_UTF8 (unicode ) == NULL ) {
4227
+ err = unicode_fill_utf8 (unicode );
4228
+ }
4229
+ Py_END_CRITICAL_SECTION ();
4230
+ }
4231
+ return err ;
4232
+ }
4233
+
4219
4234
const char *
4220
4235
PyUnicode_AsUTF8AndSize (PyObject * unicode , Py_ssize_t * psize )
4221
4236
{
@@ -4227,13 +4242,11 @@ PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *psize)
4227
4242
return NULL ;
4228
4243
}
4229
4244
4230
- if (PyUnicode_UTF8 (unicode ) == NULL ) {
4231
- if (unicode_fill_utf8 (unicode ) == -1 ) {
4232
- if (psize ) {
4233
- * psize = -1 ;
4234
- }
4235
- return NULL ;
4245
+ if (unicode_ensure_utf8 (unicode ) == -1 ) {
4246
+ if (psize ) {
4247
+ * psize = -1 ;
4236
4248
}
4249
+ return NULL ;
4237
4250
}
4238
4251
4239
4252
if (psize ) {
@@ -5854,6 +5867,7 @@ unicode_encode_utf8(PyObject *unicode, _Py_error_handler error_handler,
5854
5867
static int
5855
5868
unicode_fill_utf8 (PyObject * unicode )
5856
5869
{
5870
+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (unicode );
5857
5871
/* the string cannot be ASCII, or PyUnicode_UTF8() would be set */
5858
5872
assert (!PyUnicode_IS_ASCII (unicode ));
5859
5873
@@ -5895,10 +5909,10 @@ unicode_fill_utf8(PyObject *unicode)
5895
5909
PyErr_NoMemory ();
5896
5910
return -1 ;
5897
5911
}
5898
- PyUnicode_SET_UTF8 (unicode , cache );
5899
- PyUnicode_SET_UTF8_LENGTH (unicode , len );
5900
5912
memcpy (cache , start , len );
5901
5913
cache [len ] = '\0' ;
5914
+ PyUnicode_SET_UTF8_LENGTH (unicode , len );
5915
+ PyUnicode_SET_UTF8 (unicode , cache );
5902
5916
_PyBytesWriter_Dealloc (& writer );
5903
5917
return 0 ;
5904
5918
}
0 commit comments