[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

AltStyle によって変換されたページ (->オリジナル) /