@@ -448,14 +448,22 @@ list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
448
448
list. :-( */
449
449
PyObject * * recycle , * * p ;
450
450
PyObject * * item ;
451
+ PyObject * v_as_SF = NULL ; /* PySequence_Fast(v) */
451
452
int n ; /* Size of replacement list */
452
453
int d ; /* Change in size */
453
454
int k ; /* Loop index */
454
455
#define b ((PyListObject *)v)
455
456
if (v == NULL )
456
457
n = 0 ;
457
- else if (PyList_Check (v )) {
458
- n = b -> ob_size ;
458
+ else {
459
+ char msg [256 ];
460
+ sprintf (msg , "must assign sequence (not \"%.200s\") to slice" ,
461
+ v -> ob_type -> tp_name );
462
+ v_as_SF = PySequence_Fast (v , msg );
463
+ if (v_as_SF == NULL )
464
+ return -1 ;
465
+ n = PySequence_Fast_GET_SIZE (v_as_SF );
466
+
459
467
if (a == b ) {
460
468
/* Special case "a[i:j] = a" -- copy b first */
461
469
int ret ;
@@ -465,12 +473,6 @@ list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
465
473
return ret ;
466
474
}
467
475
}
468
- else {
469
- PyErr_Format (PyExc_TypeError ,
470
- "must assign list (not \"%.200s\") to slice" ,
471
- v -> ob_type -> tp_name );
472
- return -1 ;
473
- }
474
476
if (ilow < 0 )
475
477
ilow = 0 ;
476
478
else if (ilow > a -> ob_size )
@@ -512,7 +514,7 @@ list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
512
514
a -> ob_size += d ;
513
515
}
514
516
for (k = 0 ; k < n ; k ++ , ilow ++ ) {
515
- PyObject * w = b -> ob_item [ k ] ;
517
+ PyObject * w = PySequence_Fast_GET_ITEM ( v_as_SF , k ) ;
516
518
Py_XINCREF (w );
517
519
item [ilow ] = w ;
518
520
}
@@ -525,6 +527,7 @@ list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
525
527
PyMem_FREE (a -> ob_item );
526
528
a -> ob_item = NULL ;
527
529
}
530
+ Py_XDECREF (v_as_SF );
528
531
return 0 ;
529
532
#undef b
530
533
}
0 commit comments