summaryrefslogtreecommitdiffstats
path: root/Objects/listobject.c
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2004-07-31 02:54:42 (GMT)
committerTim Peters <tim.peters@gmail.com>2004-07-31 02:54:42 (GMT)
commit7357222d0e441725d6d8ccd7269a542ac340de89 (patch)
treecae59dd4fbc00af2714b3ae3926ddd5347a4cfa1 /Objects/listobject.c
parent8d9eb10c299cfaf2f4f8c887ead55da0d24d5050 (diff)
downloadcpython-7357222d0e441725d6d8ccd7269a542ac340de89.zip
cpython-7357222d0e441725d6d8ccd7269a542ac340de89.tar.gz
cpython-7357222d0e441725d6d8ccd7269a542ac340de89.tar.bz2
list_ass_slice(): The difference between "recycle" and "recycled" was
impossible to remember, so renamed one to something obvious. Headed off potential signed-vs-unsigned compiler complaints I introduced by changing the type of a vrbl to unsigned. Removed the need for the tedious explanation about "backward pointer loops" by looping on an int instead.
Diffstat (limited to 'Objects/listobject.c')
-rw-r--r--Objects/listobject.c27
1 files changed, 10 insertions, 17 deletions
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 179dd14..91c0a1c 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -528,15 +528,15 @@ list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
we must allocate an additional array, 'recycle', into which
we temporarily copy the items that are deleted from the
list. :-( */
- PyObject *recycled[8];
- PyObject **recycle = recycled; /* will allocate more if needed */
+ PyObject *recycle_on_stack[8];
+ PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
PyObject **item;
PyObject **vitem = NULL;
PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
int n; /* # of elements in replacement list */
int norig; /* # of elements in list getting replaced */
int d; /* Change in size */
- int k; /* Loop index */
+ int k;
size_t s;
int result = -1; /* guilty until proved innocent */
#define b ((PyListObject *)v)
@@ -578,7 +578,7 @@ list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
item = a->ob_item;
/* recycle the items that we are about to remove */
s = norig * sizeof(PyObject *);
- if (s > sizeof(recycled)) {
+ if (s > sizeof(recycle_on_stack)) {
recycle = (PyObject **)PyMem_MALLOC(s);
if (recycle == NULL) {
PyErr_NoMemory();
@@ -594,30 +594,23 @@ list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v)
item = a->ob_item;
}
else if (d > 0) { /* Insert d items */
- s = a->ob_size;
- if (list_resize(a, s+d) < 0)
+ k = a->ob_size;
+ if (list_resize(a, k+d) < 0)
goto Error;
item = a->ob_item;
memmove(&item[ihigh+d], &item[ihigh],
- (s - ihigh)*sizeof(PyObject *));
+ (k - ihigh)*sizeof(PyObject *));
}
for (k = 0; k < n; k++, ilow++) {
PyObject *w = vitem[k];
Py_XINCREF(w);
item[ilow] = w;
}
- /* Convoluted: there's some obscure reason for wanting to do
- * the decrefs "backwards", but C doesn't guarantee you can compute
- * a pointer to one slot *before* an allocated vector. So checking
- * for item >= recycle is incorrect.
- */
- for (item = recycle + norig; item > recycle; ) {
- --item;
- Py_XDECREF(*item);
- }
+ for (k = norig - 1; k >= 0; --k)
+ Py_XDECREF(recycle[k]);
result = 0;
Error:
- if (recycle != recycled)
+ if (recycle != recycle_on_stack)
PyMem_FREE(recycle);
Py_XDECREF(v_as_SF);
return result;