* listobject.c (list_ass_slice): XDECREF instead of DECREF so
  setlistslice() can be used to cut the unused part out of a freshly made
  slice (as done by bagof()).  [needed by the next mod!]
* structural changes to bagof(), map() etc.
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 67a6185..22eab71 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -401,9 +401,9 @@
 		ihigh = a->ob_size;
 	item = a->ob_item;
 	d = n - (ihigh-ilow);
-	if (d <= 0) { /* Delete -d items; DECREF ihigh-ilow items */
+	if (d <= 0) { /* Delete -d items; XDECREF ihigh-ilow items */
 		for (k = ilow; k < ihigh; k++)
-			DECREF(item[k]);
+			XDECREF(item[k]);
 		if (d < 0) {
 			for (/*k = ihigh*/; k < a->ob_size; k++)
 				item[k+d] = item[k];
@@ -412,7 +412,7 @@
 			a->ob_item = item;
 		}
 	}
-	else { /* Insert d items; DECREF ihigh-ilow items */
+	else { /* Insert d items; XDECREF ihigh-ilow items */
 		RESIZE(item, object *, a->ob_size + d);
 		if (item == NULL) {
 			err_nomem();
@@ -421,13 +421,13 @@
 		for (k = a->ob_size; --k >= ihigh; )
 			item[k+d] = item[k];
 		for (/*k = ihigh-1*/; k >= ilow; --k)
-			DECREF(item[k]);
+			XDECREF(item[k]);
 		a->ob_item = item;
 		a->ob_size += d;
 	}
 	for (k = 0; k < n; k++, ilow++) {
 		object *w = b->ob_item[k];
-		INCREF(w);
+		XINCREF(w);
 		item[ilow] = w;
 	}
 	return 0;