@@ -113,7 +113,7 @@ NOTE: In the interpreter's initialization phase, some globals are currently
113
113
114
114
static inline char * _PyUnicode_UTF8 (PyObject * op )
115
115
{
116
- return (_PyCompactUnicodeObject_CAST (op )-> utf8 );
116
+ return FT_ATOMIC_LOAD_PTR_ACQUIRE (_PyCompactUnicodeObject_CAST (op )-> utf8 );
117
117
}
118
118
119
119
static inline char * PyUnicode_UTF8 (PyObject * op )
@@ -129,7 +129,7 @@ static inline char* PyUnicode_UTF8(PyObject *op)
129
129
130
130
static inline void PyUnicode_SET_UTF8 (PyObject * op , char * utf8 )
131
131
{
132
- _PyCompactUnicodeObject_CAST (op )-> utf8 = utf8 ;
132
+ FT_ATOMIC_STORE_PTR_RELEASE ( _PyCompactUnicodeObject_CAST (op )-> utf8 , utf8 ) ;
133
133
}
134
134
135
135
static inline Py_ssize_t PyUnicode_UTF8_LENGTH (PyObject * op )
@@ -683,7 +683,7 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content)
683
683
|| kind == PyUnicode_2BYTE_KIND
684
684
|| kind == PyUnicode_4BYTE_KIND );
685
685
CHECK (ascii -> state .ascii == 0 );
686
- CHECK (compact -> utf8 != data );
686
+ CHECK (_PyUnicode_UTF8 ( op ) != data );
687
687
}
688
688
else {
689
689
PyUnicodeObject * unicode = _PyUnicodeObject_CAST (op );
@@ -695,16 +695,17 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content)
695
695
CHECK (ascii -> state .compact == 0 );
696
696
CHECK (data != NULL );
697
697
if (ascii -> state .ascii ) {
698
- CHECK (compact -> utf8 == data );
698
+ CHECK (_PyUnicode_UTF8 ( op ) == data );
699
699
CHECK (compact -> utf8_length == ascii -> length );
700
700
}
701
701
else {
702
- CHECK (compact -> utf8 != data );
702
+ CHECK (_PyUnicode_UTF8 ( op ) != data );
703
703
}
704
704
}
705
-
706
- if (compact -> utf8 == NULL )
705
+ #ifndef Py_GIL_DISABLED
706
+ if (_PyUnicode_UTF8 ( op ) == NULL )
707
707
CHECK (compact -> utf8_length == 0 );
708
+ #endif
708
709
}
709
710
710
711
/* check that the best kind is used: O(n) operation */
@@ -1148,8 +1149,8 @@ resize_compact(PyObject *unicode, Py_ssize_t length)
1148
1149
1149
1150
if (_PyUnicode_HAS_UTF8_MEMORY (unicode )) {
1150
1151
PyMem_Free (_PyUnicode_UTF8 (unicode ));
1151
- PyUnicode_SET_UTF8 (unicode , NULL );
1152
1152
PyUnicode_SET_UTF8_LENGTH (unicode , 0 );
1153
+ PyUnicode_SET_UTF8 (unicode , NULL );
1153
1154
}
1154
1155
#ifdef Py_TRACE_REFS
1155
1156
_Py_ForgetReference (unicode );
@@ -1202,8 +1203,8 @@ resize_inplace(PyObject *unicode, Py_ssize_t length)
1202
1203
if (!share_utf8 && _PyUnicode_HAS_UTF8_MEMORY (unicode ))
1203
1204
{
1204
1205
PyMem_Free (_PyUnicode_UTF8 (unicode ));
1205
- PyUnicode_SET_UTF8 (unicode , NULL );
1206
1206
PyUnicode_SET_UTF8_LENGTH (unicode , 0 );
1207
+ PyUnicode_SET_UTF8 (unicode , NULL );
1207
1208
}
1208
1209
1209
1210
data = (PyObject * )PyObject_Realloc (data , new_size );
@@ -1213,8 +1214,8 @@ resize_inplace(PyObject *unicode, Py_ssize_t length)
1213
1214
}
1214
1215
_PyUnicode_DATA_ANY (unicode ) = data ;
1215
1216
if (share_utf8 ) {
1216
- PyUnicode_SET_UTF8 (unicode , data );
1217
1217
PyUnicode_SET_UTF8_LENGTH (unicode , length );
1218
+ PyUnicode_SET_UTF8 (unicode , data );
1218
1219
}
1219
1220
_PyUnicode_LENGTH (unicode ) = length ;
1220
1221
PyUnicode_WRITE (PyUnicode_KIND (unicode ), data , length , 0 );
@@ -4085,6 +4086,21 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr)
4085
4086
4086
4087
static int unicode_fill_utf8 (PyObject * unicode );
4087
4088
4089
+
4090
+ static int
4091
+ unicode_ensure_utf8 (PyObject * unicode )
4092
+ {
4093
+ int err = 0 ;
4094
+ if (PyUnicode_UTF8 (unicode ) == NULL ) {
4095
+ Py_BEGIN_CRITICAL_SECTION (unicode );
4096
+ if (PyUnicode_UTF8 (unicode ) == NULL ) {
4097
+ err = unicode_fill_utf8 (unicode );
4098
+ }
4099
+ Py_END_CRITICAL_SECTION ();
4100
+ }
4101
+ return err ;
4102
+ }
4103
+
4088
4104
const char *
4089
4105
PyUnicode_AsUTF8AndSize (PyObject * unicode , Py_ssize_t * psize )
4090
4106
{
@@ -4096,13 +4112,11 @@ PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *psize)
4096
4112
return NULL ;
4097
4113
}
4098
4114
4099
- if (PyUnicode_UTF8 (unicode ) == NULL ) {
4100
- if (unicode_fill_utf8 (unicode ) == -1 ) {
4101
- if (psize ) {
4102
- * psize = -1 ;
4103
- }
4104
- return NULL ;
4115
+ if (unicode_ensure_utf8 (unicode ) == -1 ) {
4116
+ if (psize ) {
4117
+ * psize = -1 ;
4105
4118
}
4119
+ return NULL ;
4106
4120
}
4107
4121
4108
4122
if (psize ) {
@@ -5434,6 +5448,7 @@ unicode_encode_utf8(PyObject *unicode, _Py_error_handler error_handler,
5434
5448
static int
5435
5449
unicode_fill_utf8 (PyObject * unicode )
5436
5450
{
5451
+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (unicode );
5437
5452
/* the string cannot be ASCII, or PyUnicode_UTF8() would be set */
5438
5453
assert (!PyUnicode_IS_ASCII (unicode ));
5439
5454
@@ -5475,10 +5490,10 @@ unicode_fill_utf8(PyObject *unicode)
5475
5490
PyErr_NoMemory ();
5476
5491
return -1 ;
5477
5492
}
5478
- PyUnicode_SET_UTF8 (unicode , cache );
5479
- PyUnicode_SET_UTF8_LENGTH (unicode , len );
5480
5493
memcpy (cache , start , len );
5481
5494
cache [len ] = '\0' ;
5495
+ PyUnicode_SET_UTF8_LENGTH (unicode , len );
5496
+ PyUnicode_SET_UTF8 (unicode , cache );
5482
5497
_PyBytesWriter_Dealloc (& writer );
5483
5498
return 0 ;
5484
5499
}
0 commit comments