summaryrefslogtreecommitdiffstats
path: root/Objects/exceptions.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-04-08 06:55:07 (GMT)
committerGitHub <noreply@github.com>2017-04-08 06:55:07 (GMT)
commitb785396ab451b0c9d6ae9ee5a9e56c810209a6cb (patch)
treee84a9440891b8a488be7ef8046fc949a7962837c /Objects/exceptions.c
parentb879fe82e7e5c3f7673c9a7fa4aad42bd05445d8 (diff)
downloadcpython-b785396ab451b0c9d6ae9ee5a9e56c810209a6cb.zip
cpython-b785396ab451b0c9d6ae9ee5a9e56c810209a6cb.tar.gz
cpython-b785396ab451b0c9d6ae9ee5a9e56c810209a6cb.tar.bz2
bpo-29998: Pickling and copying ImportError now preserves name and path (#1010)
attributes.
Diffstat (limited to 'Objects/exceptions.c')
-rw-r--r--Objects/exceptions.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/Objects/exceptions.c b/Objects/exceptions.c
index e5e59b4..0c7b9b2 100644
--- a/Objects/exceptions.c
+++ b/Objects/exceptions.c
@@ -682,6 +682,53 @@ ImportError_str(PyImportErrorObject *self)
}
}
+static PyObject *
+ImportError_getstate(PyImportErrorObject *self)
+{
+ PyObject *dict = ((PyBaseExceptionObject *)self)->dict;
+ if (self->name || self->path) {
+ _Py_IDENTIFIER(name);
+ _Py_IDENTIFIER(path);
+ dict = dict ? PyDict_Copy(dict) : PyDict_New();
+ if (dict == NULL)
+ return NULL;
+ if (self->name && _PyDict_SetItemId(dict, &PyId_name, self->name) < 0) {
+ Py_DECREF(dict);
+ return NULL;
+ }
+ if (self->path && _PyDict_SetItemId(dict, &PyId_path, self->path) < 0) {
+ Py_DECREF(dict);
+ return NULL;
+ }
+ return dict;
+ }
+ else if (dict) {
+ Py_INCREF(dict);
+ return dict;
+ }
+ else {
+ Py_RETURN_NONE;
+ }
+}
+
+/* Pickling support */
+static PyObject *
+ImportError_reduce(PyImportErrorObject *self)
+{
+ PyObject *res;
+ PyObject *args;
+ PyObject *state = ImportError_getstate(self);
+ if (state == NULL)
+ return NULL;
+ args = ((PyBaseExceptionObject *)self)->args;
+ if (state == Py_None)
+ res = PyTuple_Pack(2, Py_TYPE(self), args);
+ else
+ res = PyTuple_Pack(3, Py_TYPE(self), args, state);
+ Py_DECREF(state);
+ return res;
+}
+
static PyMemberDef ImportError_members[] = {
{"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
PyDoc_STR("exception message")},
@@ -693,6 +740,7 @@ static PyMemberDef ImportError_members[] = {
};
static PyMethodDef ImportError_methods[] = {
+ {"__reduce__", (PyCFunction)ImportError_reduce, METH_NOARGS},
{NULL}
};