@@ -4892,8 +4892,10 @@ Array_init(PyObject *self, PyObject *args, PyObject *kw)
4892
4892
}
4893
4893
4894
4894
static PyObject *
4895
- Array_item (PyObject * myself , Py_ssize_t index )
4895
+ Array_item_lock_held (PyObject * myself , Py_ssize_t index )
4896
4896
{
4897
+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (myself );
4898
+
4897
4899
CDataObject * self = _CDataObject_CAST (myself );
4898
4900
Py_ssize_t offset , size ;
4899
4901
@@ -4920,8 +4922,20 @@ Array_item(PyObject *myself, Py_ssize_t index)
4920
4922
}
4921
4923
4922
4924
static PyObject *
4923
- Array_subscript (PyObject * myself , PyObject * item )
4925
+ Array_item (PyObject * myself , Py_ssize_t index )
4924
4926
{
4927
+ PyObject * result ;
4928
+ Py_BEGIN_CRITICAL_SECTION (myself );
4929
+ result = Array_item_lock_held (myself , index );
4930
+ Py_END_CRITICAL_SECTION ();
4931
+ return result ;
4932
+ }
4933
+
4934
+ static PyObject *
4935
+ Array_subscript_lock_held (PyObject * myself , PyObject * item )
4936
+ {
4937
+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (myself );
4938
+
4925
4939
CDataObject * self = _CDataObject_CAST (myself );
4926
4940
4927
4941
if (PyIndex_Check (item )) {
@@ -4931,7 +4945,7 @@ Array_subscript(PyObject *myself, PyObject *item)
4931
4945
return NULL ;
4932
4946
if (i < 0 )
4933
4947
i += self -> b_length ;
4934
- return Array_item (myself , i );
4948
+ return Array_item_lock_held (myself , i );
4935
4949
}
4936
4950
else if (PySlice_Check (item )) {
4937
4951
PyObject * proto ;
@@ -4966,23 +4980,19 @@ Array_subscript(PyObject *myself, PyObject *item)
4966
4980
return Py_GetConstant (Py_CONSTANT_EMPTY_BYTES );
4967
4981
if (step == 1 ) {
4968
4982
PyObject * res ;
4969
- Py_BEGIN_CRITICAL_SECTION (self );
4970
4983
res = PyBytes_FromStringAndSize (ptr + start ,
4971
4984
slicelen );
4972
- Py_END_CRITICAL_SECTION ();
4973
4985
return res ;
4974
4986
}
4975
4987
dest = (char * )PyMem_Malloc (slicelen );
4976
4988
4977
4989
if (dest == NULL )
4978
4990
return PyErr_NoMemory ();
4979
4991
4980
- Py_BEGIN_CRITICAL_SECTION (self );
4981
4992
for (cur = start , i = 0 ; i < slicelen ;
4982
4993
cur += step , i ++ ) {
4983
4994
dest [i ] = ptr [cur ];
4984
4995
}
4985
- Py_END_CRITICAL_SECTION ();
4986
4996
4987
4997
np = PyBytes_FromStringAndSize (dest , slicelen );
4988
4998
PyMem_Free (dest );
@@ -4996,10 +5006,8 @@ Array_subscript(PyObject *myself, PyObject *item)
4996
5006
return Py_GetConstant (Py_CONSTANT_EMPTY_STR );
4997
5007
if (step == 1 ) {
4998
5008
PyObject * res ;
4999
- Py_BEGIN_CRITICAL_SECTION (self );
5000
5009
res = PyUnicode_FromWideChar (ptr + start ,
5001
5010
slicelen );
5002
- Py_END_CRITICAL_SECTION ();
5003
5011
return res ;
5004
5012
}
5005
5013
@@ -5009,12 +5017,10 @@ Array_subscript(PyObject *myself, PyObject *item)
5009
5017
return NULL ;
5010
5018
}
5011
5019
5012
- Py_BEGIN_CRITICAL_SECTION (self );
5013
5020
for (cur = start , i = 0 ; i < slicelen ;
5014
5021
cur += step , i ++ ) {
5015
5022
dest [i ] = ptr [cur ];
5016
5023
}
5017
- Py_END_CRITICAL_SECTION ();
5018
5024
5019
5025
np = PyUnicode_FromWideChar (dest , slicelen );
5020
5026
PyMem_Free (dest );
@@ -5027,7 +5033,7 @@ Array_subscript(PyObject *myself, PyObject *item)
5027
5033
5028
5034
for (cur = start , i = 0 ; i < slicelen ;
5029
5035
cur += step , i ++ ) {
5030
- PyObject * v = Array_item (myself , cur );
5036
+ PyObject * v = Array_item_lock_held (myself , cur );
5031
5037
if (v == NULL ) {
5032
5038
Py_DECREF (np );
5033
5039
return NULL ;
@@ -5041,12 +5047,24 @@ Array_subscript(PyObject *myself, PyObject *item)
5041
5047
"indices must be integers" );
5042
5048
return NULL ;
5043
5049
}
5050
+ }
5044
5051
5052
+
5053
+ static PyObject *
5054
+ Array_subscript (PyObject * myself , PyObject * item )
5055
+ {
5056
+ PyObject * result ;
5057
+ Py_BEGIN_CRITICAL_SECTION (myself );
5058
+ result = Array_subscript_lock_held (myself , item );
5059
+ Py_END_CRITICAL_SECTION ();
5060
+ return result ;
5045
5061
}
5046
5062
5047
5063
static int
5048
- Array_ass_item (PyObject * myself , Py_ssize_t index , PyObject * value )
5064
+ Array_ass_item_lock_held (PyObject * myself , Py_ssize_t index , PyObject * value )
5049
5065
{
5066
+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (myself );
5067
+
5050
5068
CDataObject * self = _CDataObject_CAST (myself );
5051
5069
Py_ssize_t size , offset ;
5052
5070
char * ptr ;
@@ -5078,7 +5096,18 @@ Array_ass_item(PyObject *myself, Py_ssize_t index, PyObject *value)
5078
5096
}
5079
5097
5080
5098
static int
5081
- Array_ass_subscript (PyObject * myself , PyObject * item , PyObject * value )
5099
+ Array_ass_item (PyObject * myself , Py_ssize_t index , PyObject * value )
5100
+ {
5101
+ int result ;
5102
+ Py_BEGIN_CRITICAL_SECTION (myself );
5103
+ result = Array_ass_item_lock_held (myself , index , value );
5104
+ Py_END_CRITICAL_SECTION ();
5105
+ return result ;
5106
+ }
5107
+
5108
+
5109
+ static int
5110
+ Array_ass_subscript_lock_held (PyObject * myself , PyObject * item , PyObject * value )
5082
5111
{
5083
5112
CDataObject * self = _CDataObject_CAST (myself );
5084
5113
@@ -5095,7 +5124,7 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
5095
5124
return -1 ;
5096
5125
if (i < 0 )
5097
5126
i += self -> b_length ;
5098
- return Array_ass_item (myself , i , value );
5127
+ return Array_ass_item_lock_held (myself , i , value );
5099
5128
}
5100
5129
else if (PySlice_Check (item )) {
5101
5130
Py_ssize_t start , stop , step , slicelen , otherlen , i ;
@@ -5120,7 +5149,7 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
5120
5149
int result ;
5121
5150
if (item == NULL )
5122
5151
return -1 ;
5123
- result = Array_ass_item (myself , cur , item );
5152
+ result = Array_ass_item_lock_held (myself , cur , item );
5124
5153
Py_DECREF (item );
5125
5154
if (result == -1 )
5126
5155
return -1 ;
@@ -5134,6 +5163,17 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
5134
5163
}
5135
5164
}
5136
5165
5166
+ static int
5167
+ Array_ass_subscript (PyObject * myself , PyObject * item , PyObject * value )
5168
+ {
5169
+ int result ;
5170
+ Py_BEGIN_CRITICAL_SECTION (myself );
5171
+ result = Array_ass_subscript_lock_held (myself , item , value );
5172
+ Py_END_CRITICAL_SECTION ();
5173
+ return result ;
5174
+ }
5175
+
5176
+
5137
5177
static Py_ssize_t
5138
5178
Array_length (PyObject * myself )
5139
5179
{
0 commit comments