Factor out more duplicate code.
diff --git a/Objects/setobject.c b/Objects/setobject.c
index 74b9761..ce3f84e 100644
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -10,46 +10,67 @@
 */
 
 static PyObject *
-make_new_set(PyTypeObject *type, PyObject *iterable)
+set_update(PySetObject *so, PyObject *other)
 {
-	PyObject *data = NULL;
-	PyObject *it = NULL;
-	PyObject *item;
-	PySetObject *so = NULL;
+	PyObject *item, *data, *it;
 
-	/* Get iterator. */
-	if (iterable != NULL) {
-		it = PyObject_GetIter(iterable);
-		if (it == NULL)
-			goto done;
+	if (PyAnySet_Check(other)) {
+		if (PyDict_Merge(so->data, ((PySetObject *)other)->data, 0) == -1) 
+			return NULL;
+		Py_RETURN_NONE;
 	}
 
-	data = PyDict_New();
-	if (data == NULL) 
-		goto done;
+	it = PyObject_GetIter(other);
+	if (it == NULL)
+		return NULL;
+	data = so->data;
 
-	while (it != NULL && (item = PyIter_Next(it)) != NULL) {
+	while ((item = PyIter_Next(it)) != NULL) {
                 if (PyDict_SetItem(data, item, Py_True) == -1) {
+			Py_DECREF(it);
 			Py_DECREF(item);
-			goto done;
+			return NULL;
                 } 
 		Py_DECREF(item);
 	}
+	Py_DECREF(it);
 	if (PyErr_Occurred())
-		goto done;
+		return NULL;
+	Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(update_doc, 
+"Update a set with the union of itself and another.");
+
+static PyObject *
+make_new_set(PyTypeObject *type, PyObject *iterable)
+{
+	PyObject *data = NULL;
+	PyObject *tmp;
+	PySetObject *so = NULL;
+
+	data = PyDict_New();
+	if (data == NULL) 
+		return NULL;
 
 	/* create PySetObject structure */
 	so = (PySetObject *)type->tp_alloc(type, 0);
-	if (so == NULL) 
-		goto done;
-
-	Py_INCREF(data);
+	if (so == NULL) {
+		Py_DECREF(data);
+		return NULL;
+	}
 	so->data = data;
 	so->hash = -1;
 
-done:
-	Py_XDECREF(data);
-	Py_XDECREF(it);
+	if (iterable != NULL) {
+		tmp = set_update(so, iterable);
+		if (tmp == NULL) {
+			Py_DECREF(so);
+			return NULL;
+		}
+		Py_DECREF(tmp);
+	}
+
 	return (PyObject *)so;
 }
 
@@ -123,7 +144,7 @@
 	int result;
 
 	result = PySequence_Contains(so->data, key);
-	if (result == -1 && PyType_IsSubtype(key->ob_type, &PySet_Type)) {
+	if (result == -1 && PyAnySet_Check(key)) {
 		PyErr_Clear();
 		tmp = frozenset_dict_wrapper(((PySetObject *)(key))->data);
 		if (tmp == NULL)
@@ -137,21 +158,7 @@
 static PyObject *
 set_copy(PySetObject *so)
 {
-	PyObject *data;
-	PySetObject *newso;
-
-	data = PyDict_Copy(so->data);
-	if (data == NULL)
-		return NULL;
-
-	newso = (PySetObject *)(so->ob_type->tp_alloc(so->ob_type, 0));
-	if (newso == NULL) {
-		Py_DECREF(data);
-		return NULL;
-	}
-	newso->data = data;
-	newso->hash = so->hash;
-	return (PyObject *)newso;
+	return make_new_set(so->ob_type, (PyObject *)so);
 }
 
 static PyObject *
@@ -167,39 +174,6 @@
 PyDoc_STRVAR(copy_doc, "Return a shallow copy of a set.");
 
 static PyObject *
-set_union_update(PySetObject *so, PyObject *other)
-{
-	PyObject *item, *data, *it;
-
-	if (PyAnySet_Check(other)) {
-		if (PyDict_Merge(so->data, ((PySetObject *)other)->data, 0) == -1) 
-			return NULL;
-		Py_RETURN_NONE;
-	}
-
-	it = PyObject_GetIter(other);
-	if (it == NULL)
-		return NULL;
-	data = so->data;
-
-	while ((item = PyIter_Next(it)) != NULL) {
-                if (PyDict_SetItem(data, item, Py_True) == -1) {
-			Py_DECREF(it);
-			Py_DECREF(item);
-			return NULL;
-                } 
-		Py_DECREF(item);
-	}
-	Py_DECREF(it);
-	if (PyErr_Occurred())
-		return NULL;
-	Py_RETURN_NONE;
-}
-
-PyDoc_STRVAR(union_update_doc, 
-"Update a set with the union of itself and another.");
-
-static PyObject *
 set_union(PySetObject *so, PyObject *other)
 {
 	PySetObject *result;
@@ -208,7 +182,7 @@
 	result = (PySetObject *)set_copy(so);
 	if (result == NULL)
 		return NULL;
-	rv = set_union_update(result, other);
+	rv = set_update(result, other);
 	if (rv == NULL) {
 		Py_DECREF(result);
 		return NULL;
@@ -241,7 +215,7 @@
 		Py_INCREF(Py_NotImplemented);
 		return Py_NotImplemented;
 	}
-	result = set_union_update(so, other);
+	result = set_update(so, other);
 	if (result == NULL)
 		return NULL;
 	Py_DECREF(result);
@@ -968,7 +942,7 @@
 	self->hash = -1;
 	if (iterable == NULL)
 		return 0;
-	result = set_union_update(self, iterable);
+	result = set_update(self, iterable);
 	if (result != NULL) {
 		Py_DECREF(result);
 		return 0;
@@ -1024,8 +998,8 @@
 	 symmetric_difference_update_doc},
 	{"union",	(PyCFunction)set_union,		METH_O,
 	 union_doc},
-	{"update",	(PyCFunction)set_union_update,	METH_O,
-	 union_update_doc},
+	{"update",	(PyCFunction)set_update,	METH_O,
+	 update_doc},
 	{NULL,		NULL}	/* sentinel */
 };