[Python-checkins] r46585 - python/trunk/Objects/exceptions.c
georg.brandl
python-checkins at python.org
Thu Jun 1 08:39:20 CEST 2006
Author: georg.brandl
Date: Thu Jun 1 08:39:19 2006
New Revision: 46585
Modified:
python/trunk/Objects/exceptions.c
Log:
Correctly unpickle 2.4 exceptions via __setstate__ (patch #1498571)
Modified: python/trunk/Objects/exceptions.c
==============================================================================
--- python/trunk/Objects/exceptions.c (original)
+++ python/trunk/Objects/exceptions.c Thu Jun 1 08:39:19 2006
@@ -150,6 +150,29 @@
return PyTuple_Pack(2, self->ob_type, self->args);
}
+/*
+ * Needed for backward compatibility, since exceptions used to store
+ * all their attributes in the __dict__. Code is taken from cPickle's
+ * load_build function.
+ */
+static PyObject *
+BaseException_setstate(PyObject *self, PyObject *state)
+{
+ PyObject *d_key, *d_value;
+ Py_ssize_t i = 0;
+
+ if (state != Py_None) {
+ if (!PyDict_Check(state)) {
+ PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
+ return NULL;
+ }
+ while (PyDict_Next(state, &i, &d_key, &d_value)) {
+ if (PyObject_SetAttr(self, d_key, d_value) < 0)
+ return NULL;
+ }
+ }
+ Py_RETURN_NONE;
+}
#ifdef Py_USING_UNICODE
/* while this method generates fairly uninspired output, it a least
@@ -168,6 +191,7 @@
static PyMethodDef BaseException_methods[] = {
{"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
+ {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
#ifdef Py_USING_UNICODE
{"__unicode__", (PyCFunction)BaseException_unicode, METH_NOARGS },
#endif
More information about the Python-checkins
mailing list