@@ -857,19 +857,13 @@ list_append(PyListObject *self, PyObject *object)
857
857
static int
858
858
list_extend_fast (PyListObject * self , PyObject * iterable )
859
859
{
860
- iterable = PySequence_Fast (iterable , "argument must be iterable" );
861
- if (!iterable ) {
862
- return -1 ;
863
- }
864
-
865
- Py_ssize_t n = PySequence_Fast_GET_SIZE (iterable ); // size of iterable
860
+ Py_ssize_t n = PySequence_Fast_GET_SIZE (iterable );
866
861
if (n == 0 ) {
867
862
/* short circuit when iterable is empty */
868
- Py_DECREF (iterable );
869
863
return 0 ;
870
864
}
871
865
872
- Py_ssize_t m = Py_SIZE (self ); // size of self
866
+ Py_ssize_t m = Py_SIZE (self );
873
867
// It should not be possible to allocate a list large enough to cause
874
868
// an overflow on any relevant platform.
875
869
assert (m < PY_SSIZE_T_MAX - n );
@@ -880,7 +874,6 @@ list_extend_fast(PyListObject *self, PyObject *iterable)
880
874
Py_SET_SIZE (self , n );
881
875
}
882
876
else if (list_resize (self , m + n ) < 0 ) {
883
- Py_DECREF (iterable );
884
877
return -1 ;
885
878
}
886
879
@@ -896,28 +889,26 @@ list_extend_fast(PyListObject *self, PyObject *iterable)
896
889
PyObject * o = src [i ];
897
890
dest [i ] = Py_NewRef (o );
898
891
}
899
- Py_DECREF (iterable );
900
892
return 0 ;
901
893
}
902
894
903
895
static int
904
896
list_extend_iter (PyListObject * self , PyObject * iterable )
905
897
{
906
-
907
- PyObject * it = PyObject_GetIter (iterable ); // iter(v)
898
+ PyObject * it = PyObject_GetIter (iterable );
908
899
if (it == NULL ) {
909
900
return -1 ;
910
901
}
911
902
PyObject * (* iternext )(PyObject * ) = * Py_TYPE (it )-> tp_iternext ;
912
903
913
904
/* Guess a result list size. */
914
- Py_ssize_t n = PyObject_LengthHint (iterable , 8 ); // guess iterable size
905
+ Py_ssize_t n = PyObject_LengthHint (iterable , 8 );
915
906
if (n < 0 ) {
916
907
Py_DECREF (it );
917
908
return -1 ;
918
909
}
919
910
920
- Py_ssize_t m = Py_SIZE (self ); /* size of self */
911
+ Py_ssize_t m = Py_SIZE (self );
921
912
if (m > PY_SSIZE_T_MAX - n ) {
922
913
/* m + n overflowed; on the chance that n lied, and there really
923
914
* is enough room, ignore it. If n was telling the truth, we'll
@@ -930,8 +921,10 @@ list_extend_iter(PyListObject *self, PyObject *iterable)
930
921
}
931
922
else {
932
923
/* Make room. */
933
- if (list_resize (self , m + n ) < 0 )
924
+ if (list_resize (self , m + n ) < 0 ) {
934
925
goto error ;
926
+ }
927
+
935
928
/* Make the list sane again. */
936
929
Py_SET_SIZE (self , m );
937
930
}
@@ -948,10 +941,10 @@ list_extend_iter(PyListObject *self, PyObject *iterable)
948
941
}
949
942
break ;
950
943
}
944
+
951
945
if (Py_SIZE (self ) < self -> allocated ) {
952
- /* steals ref */
953
946
Py_ssize_t len = Py_SIZE (self );
954
- PyList_SET_ITEM (self , len , item );
947
+ PyList_SET_ITEM (self , len , item ); // steals item ref
955
948
Py_SET_SIZE (self , len + 1 );
956
949
}
957
950
else {
@@ -974,6 +967,7 @@ list_extend_iter(PyListObject *self, PyObject *iterable)
974
967
return -1 ;
975
968
}
976
969
970
+
977
971
static int
978
972
list_extend (PyListObject * self , PyObject * iterable )
979
973
{
@@ -984,22 +978,31 @@ list_extend(PyListObject *self, PyObject *iterable)
984
978
|| PyTuple_CheckExact (iterable )
985
979
|| (PyObject * )self == iterable )
986
980
{
987
- return list_extend_fast (self , iterable );
981
+ iterable = PySequence_Fast (iterable , "argument must be iterable" );
982
+ if (!iterable ) {
983
+ return -1 ;
984
+ }
985
+
986
+ int res = list_extend_fast (self , iterable );
987
+ Py_DECREF (iterable );
988
+ return res ;
988
989
}
989
990
else {
990
991
return list_extend_iter (self , iterable );
991
992
}
992
993
}
993
994
994
- static PyObject *
995
- list_extend_method (PyListObject * self , PyObject * iterable )
995
+
996
+ PyObject *
997
+ _PyList_Extend (PyListObject * self , PyObject * iterable )
996
998
{
997
999
if (list_extend (self , iterable ) < 0 ) {
998
1000
return NULL ;
999
1001
}
1000
1002
Py_RETURN_NONE ;
1001
1003
}
1002
1004
1005
+
1003
1006
/*[clinic input]
1004
1007
list.extend as py_list_extend
1005
1008
@@ -1013,14 +1016,9 @@ static PyObject *
1013
1016
py_list_extend (PyListObject * self , PyObject * iterable )
1014
1017
/*[clinic end generated code: output=b8e0bff0ceae2abd input=9a8376a8633ed3ba]*/
1015
1018
{
1016
- return list_extend_method (self , iterable );
1019
+ return _PyList_Extend (self , iterable );
1017
1020
}
1018
1021
1019
- PyObject *
1020
- _PyList_Extend (PyListObject * self , PyObject * iterable )
1021
- {
1022
- return list_extend_method (self , iterable );
1023
- }
1024
1022
1025
1023
int
1026
1024
PyList_Extend (PyObject * self , PyObject * iterable )
@@ -1033,6 +1031,7 @@ PyList_Extend(PyObject *self, PyObject *iterable)
1033
1031
return list_extend ((PyListObject * )self , iterable );
1034
1032
}
1035
1033
1034
+
1036
1035
int
1037
1036
PyList_Clear (PyObject * self )
1038
1037
{
@@ -1045,6 +1044,7 @@ PyList_Clear(PyObject *self)
1045
1044
return 0 ;
1046
1045
}
1047
1046
1047
+
1048
1048
static PyObject *
1049
1049
list_inplace_concat (PyListObject * self , PyObject * other )
1050
1050
{
0 commit comments