@@ -3326,11 +3326,11 @@ PyObject *
33263326PyCData_get (ctypes_state * st , PyObject * type , GETFUNC getfunc , PyObject * src ,
33273327 Py_ssize_t index , Py_ssize_t size , char * adr )
33283328{
3329+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (src );
3330+
33293331 if (getfunc ) {
33303332 PyObject * res ;
3331- Py_BEGIN_CRITICAL_SECTION (src );
33323333 res = getfunc (adr , size );
3333- Py_END_CRITICAL_SECTION ();
33343334 return res ;
33353335 }
33363336 assert (type );
@@ -3340,9 +3340,7 @@ PyCData_get(ctypes_state *st, PyObject *type, GETFUNC getfunc, PyObject *src,
33403340 }
33413341 if (info && info -> getfunc && !_ctypes_simple_instance (st , type )) {
33423342 PyObject * res ;
3343- Py_BEGIN_CRITICAL_SECTION (src );
33443343 res = info -> getfunc (adr , size );
3345- Py_END_CRITICAL_SECTION ();
33463344 return res ;
33473345 }
33483346 return PyCData_FromBaseObj (st , type , src , index , adr );
@@ -4892,8 +4890,10 @@ Array_init(PyObject *self, PyObject *args, PyObject *kw)
48924890}
48934891
48944892static PyObject *
4895- Array_item (PyObject * myself , Py_ssize_t index )
4893+ Array_item_lock_held (PyObject * myself , Py_ssize_t index )
48964894{
4895+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (myself );
4896+
48974897 CDataObject * self = _CDataObject_CAST (myself );
48984898 Py_ssize_t offset , size ;
48994899
@@ -4920,8 +4920,20 @@ Array_item(PyObject *myself, Py_ssize_t index)
49204920}
49214921
49224922static PyObject *
4923- Array_subscript (PyObject * myself , PyObject * item )
4923+ Array_item (PyObject * myself , Py_ssize_t index )
49244924{
4925+ PyObject * result ;
4926+ Py_BEGIN_CRITICAL_SECTION (myself );
4927+ result = Array_item_lock_held (myself , index );
4928+ Py_END_CRITICAL_SECTION ();
4929+ return result ;
4930+ }
4931+
4932+ static PyObject *
4933+ Array_subscript_lock_held (PyObject * myself , PyObject * item )
4934+ {
4935+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (myself );
4936+
49254937 CDataObject * self = _CDataObject_CAST (myself );
49264938
49274939 if (PyIndex_Check (item )) {
@@ -4931,7 +4943,7 @@ Array_subscript(PyObject *myself, PyObject *item)
49314943 return NULL ;
49324944 if (i < 0 )
49334945 i += self -> b_length ;
4934- return Array_item (myself , i );
4946+ return Array_item_lock_held (myself , i );
49354947 }
49364948 else if (PySlice_Check (item )) {
49374949 PyObject * proto ;
@@ -4966,23 +4978,19 @@ Array_subscript(PyObject *myself, PyObject *item)
49664978 return Py_GetConstant (Py_CONSTANT_EMPTY_BYTES );
49674979 if (step == 1 ) {
49684980 PyObject * res ;
4969- Py_BEGIN_CRITICAL_SECTION (self );
49704981 res = PyBytes_FromStringAndSize (ptr + start ,
49714982 slicelen );
4972- Py_END_CRITICAL_SECTION ();
49734983 return res ;
49744984 }
49754985 dest = (char * )PyMem_Malloc (slicelen );
49764986
49774987 if (dest == NULL )
49784988 return PyErr_NoMemory ();
49794989
4980- Py_BEGIN_CRITICAL_SECTION (self );
49814990 for (cur = start , i = 0 ; i < slicelen ;
49824991 cur += step , i ++ ) {
49834992 dest [i ] = ptr [cur ];
49844993 }
4985- Py_END_CRITICAL_SECTION ();
49864994
49874995 np = PyBytes_FromStringAndSize (dest , slicelen );
49884996 PyMem_Free (dest );
@@ -4996,10 +5004,8 @@ Array_subscript(PyObject *myself, PyObject *item)
49965004 return Py_GetConstant (Py_CONSTANT_EMPTY_STR );
49975005 if (step == 1 ) {
49985006 PyObject * res ;
4999- Py_BEGIN_CRITICAL_SECTION (self );
50005007 res = PyUnicode_FromWideChar (ptr + start ,
50015008 slicelen );
5002- Py_END_CRITICAL_SECTION ();
50035009 return res ;
50045010 }
50055011
@@ -5009,12 +5015,10 @@ Array_subscript(PyObject *myself, PyObject *item)
50095015 return NULL ;
50105016 }
50115017
5012- Py_BEGIN_CRITICAL_SECTION (self );
50135018 for (cur = start , i = 0 ; i < slicelen ;
50145019 cur += step , i ++ ) {
50155020 dest [i ] = ptr [cur ];
50165021 }
5017- Py_END_CRITICAL_SECTION ();
50185022
50195023 np = PyUnicode_FromWideChar (dest , slicelen );
50205024 PyMem_Free (dest );
@@ -5027,7 +5031,7 @@ Array_subscript(PyObject *myself, PyObject *item)
50275031
50285032 for (cur = start , i = 0 ; i < slicelen ;
50295033 cur += step , i ++ ) {
5030- PyObject * v = Array_item (myself , cur );
5034+ PyObject * v = Array_item_lock_held (myself , cur );
50315035 if (v == NULL ) {
50325036 Py_DECREF (np );
50335037 return NULL ;
@@ -5041,12 +5045,24 @@ Array_subscript(PyObject *myself, PyObject *item)
50415045 "indices must be integers" );
50425046 return NULL ;
50435047 }
5048+ }
50445049
5050+
5051+ static PyObject *
5052+ Array_subscript (PyObject * myself , PyObject * item )
5053+ {
5054+ PyObject * result ;
5055+ Py_BEGIN_CRITICAL_SECTION (myself );
5056+ result = Array_subscript_lock_held (myself , item );
5057+ Py_END_CRITICAL_SECTION ();
5058+ return result ;
50455059}
50465060
50475061static int
5048- Array_ass_item (PyObject * myself , Py_ssize_t index , PyObject * value )
5062+ Array_ass_item_lock_held (PyObject * myself , Py_ssize_t index , PyObject * value )
50495063{
5064+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (myself );
5065+
50505066 CDataObject * self = _CDataObject_CAST (myself );
50515067 Py_ssize_t size , offset ;
50525068 char * ptr ;
@@ -5078,7 +5094,18 @@ Array_ass_item(PyObject *myself, Py_ssize_t index, PyObject *value)
50785094}
50795095
50805096static int
5081- Array_ass_subscript (PyObject * myself , PyObject * item , PyObject * value )
5097+ Array_ass_item (PyObject * myself , Py_ssize_t index , PyObject * value )
5098+ {
5099+ int result ;
5100+ Py_BEGIN_CRITICAL_SECTION (myself );
5101+ result = Array_ass_item_lock_held (myself , index , value );
5102+ Py_END_CRITICAL_SECTION ();
5103+ return result ;
5104+ }
5105+
5106+
5107+ static int
5108+ Array_ass_subscript_lock_held (PyObject * myself , PyObject * item , PyObject * value )
50825109{
50835110 CDataObject * self = _CDataObject_CAST (myself );
50845111
@@ -5095,7 +5122,7 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
50955122 return -1 ;
50965123 if (i < 0 )
50975124 i += self -> b_length ;
5098- return Array_ass_item (myself , i , value );
5125+ return Array_ass_item_lock_held (myself , i , value );
50995126 }
51005127 else if (PySlice_Check (item )) {
51015128 Py_ssize_t start , stop , step , slicelen , otherlen , i ;
@@ -5120,7 +5147,7 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
51205147 int result ;
51215148 if (item == NULL )
51225149 return -1 ;
5123- result = Array_ass_item (myself , cur , item );
5150+ result = Array_ass_item_lock_held (myself , cur , item );
51245151 Py_DECREF (item );
51255152 if (result == -1 )
51265153 return -1 ;
@@ -5134,6 +5161,17 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
51345161 }
51355162}
51365163
5164+ static int
5165+ Array_ass_subscript (PyObject * myself , PyObject * item , PyObject * value )
5166+ {
5167+ int result ;
5168+ Py_BEGIN_CRITICAL_SECTION (myself );
5169+ result = Array_ass_subscript_lock_held (myself , item , value );
5170+ Py_END_CRITICAL_SECTION ();
5171+ return result ;
5172+ }
5173+
5174+
51375175static Py_ssize_t
51385176Array_length (PyObject * myself )
51395177{
0 commit comments