@@ -30,6 +30,14 @@ get_list_state(void)
30
30
}
31
31
#endif
32
32
33
+ #ifdef Py_GIL_DISABLED
34
+ #define _Py_SET_ITEMREF (op , i , v ) \
35
+ _Py_atomic_store_ptr_relaxed(&((PyListObject *)(op))->ob_item[i], Py_NewRef(v))
36
+ #else
37
+ #define _Py_SET_ITEMREF (op , i , v ) \
38
+ ((PyListObject *)(op))->ob_item[i] = Py_NewRef(v)
39
+ #endif
40
+
33
41
34
42
/* Ensure ob_item has room for at least newsize elements, and set
35
43
* ob_size to newsize. If newsize > ob_size on entry, the content
@@ -221,8 +229,9 @@ PyList_Size(PyObject *op)
221
229
PyErr_BadInternalCall ();
222
230
return -1 ;
223
231
}
224
- else
225
- return Py_SIZE (op );
232
+ else {
233
+ return PyList_GET_SIZE (op );
234
+ }
226
235
}
227
236
228
237
static inline int
@@ -245,12 +254,16 @@ PyList_GetItem(PyObject *op, Py_ssize_t i)
245
254
PyErr_BadInternalCall ();
246
255
return NULL ;
247
256
}
248
- if (!valid_index (i , Py_SIZE (op ))) {
257
+ PyObject * ret = NULL ;
258
+ if (!valid_index (i , PyList_GET_SIZE (op ))) {
249
259
_Py_DECLARE_STR (list_err , "list index out of range" );
250
260
PyErr_SetObject (PyExc_IndexError , & _Py_STR (list_err ));
251
261
return NULL ;
252
262
}
253
- return ((PyListObject * )op ) -> ob_item [i ];
263
+ Py_BEGIN_CRITICAL_SECTION (op );
264
+ ret = ((PyListObject * )op ) -> ob_item [i ];
265
+ Py_END_CRITICAL_SECTION ();
266
+ return ret ;
254
267
}
255
268
256
269
int
@@ -341,11 +354,15 @@ _PyList_AppendTakeRefListResize(PyListObject *self, PyObject *newitem)
341
354
int
342
355
PyList_Append (PyObject * op , PyObject * newitem )
343
356
{
357
+ int ret = -1 ;
344
358
if (PyList_Check (op ) && (newitem != NULL )) {
345
- return _PyList_AppendTakeRef ((PyListObject * )op , Py_NewRef (newitem ));
359
+ Py_BEGIN_CRITICAL_SECTION (op );
360
+ ret = _PyList_AppendTakeRef ((PyListObject * )op , Py_NewRef (newitem ));
361
+ Py_END_CRITICAL_SECTION ();
362
+ return ret ;
346
363
}
347
364
PyErr_BadInternalCall ();
348
- return -1 ;
365
+ return ret ;
349
366
}
350
367
351
368
/* Methods */
@@ -498,7 +515,7 @@ list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
498
515
dest = np -> ob_item ;
499
516
for (i = 0 ; i < len ; i ++ ) {
500
517
PyObject * v = src [i ];
501
- dest [ i ] = Py_NewRef ( v );
518
+ _Py_SET_ITEMREF ( np , i , v );
502
519
}
503
520
Py_SET_SIZE (np , len );
504
521
return (PyObject * )np ;
@@ -511,6 +528,8 @@ PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
511
528
PyErr_BadInternalCall ();
512
529
return NULL ;
513
530
}
531
+ PyObject * ret ;
532
+ Py_BEGIN_CRITICAL_SECTION (a );
514
533
if (ilow < 0 ) {
515
534
ilow = 0 ;
516
535
}
@@ -523,7 +542,9 @@ PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
523
542
else if (ihigh > Py_SIZE (a )) {
524
543
ihigh = Py_SIZE (a );
525
544
}
526
- return list_slice ((PyListObject * )a , ilow , ihigh );
545
+ ret = list_slice ((PyListObject * )a , ilow , ihigh );
546
+ Py_END_CRITICAL_SECTION ();
547
+ return ret ;
527
548
}
528
549
529
550
static PyObject *
0 commit comments