Index: Objects/setobject.c =================================================================== --- Objects/setobject.c (revision 82374) +++ Objects/setobject.c (working copy) @@ -1935,14 +1935,19 @@ static PyObject * set_reduce(PySetObject *so) { - PyObject *keys=NULL, *args=NULL, *result=NULL, *dict=NULL; + PyObject *args=NULL, *result=NULL, *dict=NULL; - keys = PySequence_List((PyObject *)so); - if (keys == NULL) - goto done; - args = PyTuple_Pack(1, keys); + if (PySet_GET_SIZE(so) == 0) + args = PyTuple_New(0); + else { + PyObject *keys = PySequence_List((PyObject *)so); + if (keys == NULL) + return NULL; + args = PyTuple_Pack(1, keys); + Py_DECREF(keys); + } if (args == NULL) - goto done; + return NULL; dict = PyObject_GetAttrString((PyObject *)so, "__dict__"); if (dict == NULL) { PyErr_Clear(); @@ -1950,10 +1955,8 @@ Py_INCREF(dict); } result = PyTuple_Pack(3, Py_TYPE(so), args, dict); -done: - Py_XDECREF(args); - Py_XDECREF(keys); - Py_XDECREF(dict); + Py_DECREF(args); + Py_DECREF(dict); return result; }