@@ -2181,6 +2181,72 @@ PySequence_Fast(PyObject *v, const char *m)
2181
2181
return v ;
2182
2182
}
2183
2183
2184
+ static void pysequence_decref_track (void * data )
2185
+ {
2186
+ PyObject * obj = _PyObject_CAST (data );
2187
+ _PyObject_GC_TRACK (obj );
2188
+ Py_DECREF (obj );
2189
+ }
2190
+
2191
+ int
2192
+ PySequence_AsObjectArray (PyObject * v , PyResource * res ,
2193
+ PyObject * * * parray , Py_ssize_t * psize )
2194
+ {
2195
+ if (v == NULL ) {
2196
+ null_error ();
2197
+ goto error ;
2198
+ }
2199
+
2200
+ if (PyTuple_CheckExact (v )) {
2201
+ if (_PyObject_GC_IS_TRACKED (v )) {
2202
+ // Don't track the tuple while it's being used
2203
+ _PyObject_GC_UNTRACK (v );
2204
+ res -> release_func = pysequence_decref_track ;
2205
+ }
2206
+ else {
2207
+ res -> release_func = _PyResource_DECREF ;
2208
+ }
2209
+ res -> data = Py_NewRef (v );
2210
+ * parray = _PyTuple_ITEMS (v );
2211
+ * psize = PyTuple_GET_SIZE (v );
2212
+ return 0 ;
2213
+ }
2214
+
2215
+ if (PyList_CheckExact (v )) {
2216
+ // Don't track the list while it's being used
2217
+ _PyObject_GC_UNTRACK (v );
2218
+ res -> release_func = pysequence_decref_track ;
2219
+ res -> data = Py_NewRef (v );
2220
+ * parray = _PyList_ITEMS (v );
2221
+ * psize = PyList_GET_SIZE (v );
2222
+ return 0 ;
2223
+ }
2224
+
2225
+ PyObject * it = PyObject_GetIter (v );
2226
+ if (it == NULL ) {
2227
+ goto error ;
2228
+ }
2229
+
2230
+ v = PySequence_List (it );
2231
+ Py_DECREF (it );
2232
+ if (v == NULL ) {
2233
+ goto error ;
2234
+ }
2235
+
2236
+ // Don't track the list while it's being used
2237
+ _PyObject_GC_UNTRACK (v );
2238
+ res -> release_func = pysequence_decref_track ;
2239
+ res -> data = v ;
2240
+ * parray = _PyList_ITEMS (v );
2241
+ * psize = PyList_GET_SIZE (v );
2242
+ return 0 ;
2243
+
2244
+ error :
2245
+ * parray = NULL ;
2246
+ * psize = 0 ;
2247
+ return -1 ;
2248
+ }
2249
+
2184
2250
/* Iterate over seq. Result depends on the operation:
2185
2251
PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
2186
2252
PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
0 commit comments