@@ -1289,7 +1289,7 @@ list_extend_set(PyListObject *self, PySetObject *other)
1289
1289
PyObject * * dest = self -> ob_item + m ;
1290
1290
while (_PySet_NextEntry ((PyObject * )other , & setpos , & key , & hash )) {
1291
1291
Py_INCREF (key );
1292
- * dest = key ;
1292
+ FT_ATOMIC_STORE_PTR_RELEASE ( * dest , key ) ;
1293
1293
dest ++ ;
1294
1294
}
1295
1295
Py_SET_SIZE (self , m + n );
@@ -1312,20 +1312,47 @@ list_extend_dict(PyListObject *self, PyDictObject *dict, int which_item)
1312
1312
while (_PyDict_Next ((PyObject * )dict , & pos , & keyvalue [0 ], & keyvalue [1 ], NULL )) {
1313
1313
PyObject * obj = keyvalue [which_item ];
1314
1314
Py_INCREF (obj );
1315
- * dest = obj ;
1315
+ FT_ATOMIC_STORE_PTR_RELEASE ( * dest , obj ) ;
1316
1316
dest ++ ;
1317
1317
}
1318
1318
1319
1319
Py_SET_SIZE (self , m + n );
1320
1320
return 0 ;
1321
1321
}
1322
1322
1323
+ static int
1324
+ list_extend_dictitems (PyListObject * self , PyDictObject * dict )
1325
+ {
1326
+ Py_ssize_t m = Py_SIZE (self );
1327
+ Py_ssize_t n = PyDict_GET_SIZE (dict );
1328
+ if (list_resize (self , m + n ) < 0 ) {
1329
+ return -1 ;
1330
+ }
1331
+
1332
+ PyObject * * dest = self -> ob_item + m ;
1333
+ Py_ssize_t pos = 0 ;
1334
+ Py_ssize_t i = 0 ;
1335
+ PyObject * key , * value ;
1336
+ while (_PyDict_Next ((PyObject * )dict , & pos , & key , & value , NULL )) {
1337
+ PyObject * item = PyTuple_Pack (2 , key , value );
1338
+ if (item == NULL ) {
1339
+ Py_SET_SIZE (self , m + i );
1340
+ return -1 ;
1341
+ }
1342
+ FT_ATOMIC_STORE_PTR_RELEASE (* dest , item );
1343
+ dest ++ ;
1344
+ i ++ ;
1345
+ }
1346
+
1347
+ Py_SET_SIZE (self , m + n );
1348
+ return 0 ;
1349
+ }
1350
+
1323
1351
static int
1324
1352
_list_extend (PyListObject * self , PyObject * iterable )
1325
1353
{
1326
1354
// Special case:
1327
1355
// lists and tuples which can use PySequence_Fast ops
1328
- // TODO(@corona10): Add more special cases for other types.
1329
1356
int res = -1 ;
1330
1357
if ((PyObject * )self == iterable ) {
1331
1358
Py_BEGIN_CRITICAL_SECTION (self );
@@ -1359,6 +1386,12 @@ _list_extend(PyListObject *self, PyObject *iterable)
1359
1386
res = list_extend_dict (self , dict , 1 /*values*/ );
1360
1387
Py_END_CRITICAL_SECTION2 ();
1361
1388
}
1389
+ else if (Py_IS_TYPE (iterable , & PyDictItems_Type )) {
1390
+ PyDictObject * dict = ((_PyDictViewObject * )iterable )-> dv_dict ;
1391
+ Py_BEGIN_CRITICAL_SECTION2 (self , dict );
1392
+ res = list_extend_dictitems (self , dict );
1393
+ Py_END_CRITICAL_SECTION2 ();
1394
+ }
1362
1395
else {
1363
1396
Py_BEGIN_CRITICAL_SECTION (self );
1364
1397
res = list_extend_iter_lock_held (self , iterable );
0 commit comments